File: nsMetaModule.cpp.in

package info (click to toggle)
mozilla-firefox 1.0.4-2sarge17
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 255,356 kB
  • ctags: 267,207
  • sloc: cpp: 1,623,961; ansic: 792,828; xml: 85,380; makefile: 41,934; perl: 27,802; asm: 14,884; sh: 14,807; cs: 4,507; python: 4,398; java: 4,004; yacc: 1,380; lex: 409; pascal: 354; php: 244; csh: 132; objc: 73; ada: 44; sql: 4
file content (120 lines) | stat: -rw-r--r-- 3,838 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 *   Christopher Seawood <cls@seawood.org> 
 *   Doug Turner <dougt@netscape.com>
 *   Chris Waterson <waterson@netscape.com>
 */

#line 27 "nsMetaModule.cpp.in"
#include "nsError.h"
#include "nsIModule.h"
#include "nsIFile.h"
#include "nsIGenericFactory.h"
#include "prmem.h"

%DECLARE_SUBMODULE_INFOS%
#line 35 "nsMetaModule.cpp.in"

static nsModuleInfo* gSubModules[] = {
    %SUBMODULE_INFOS%
#line 39 "nsMetaModule.cpp.in"
};

#define NUM_SUB_MODULES (sizeof(gSubModules) / sizeof(gSubModules[0]))

static nsModuleComponentInfo* gComponentInfo;
static PRBool gInitialized = PR_FALSE;

PR_STATIC_CALLBACK(nsresult)
Initialize(nsIModule *self)
{
    if (! gInitialized) {
        // Run the ctor for each sub-module
        gInitialized = PR_TRUE;

        nsModuleInfo** module = gSubModules;
        nsModuleInfo** limit = module + NUM_SUB_MODULES;
        for ( ; module < limit; ++module) {
            if ((*module)->mCtor)
                ((*module)->mCtor)(self);
        }
    }

    return NS_OK;
}

PR_STATIC_CALLBACK(void)
Shutdown(nsIModule *self)
{
    if (gInitialized) {
        // Run the dtor for each sub-module
        gInitialized = PR_FALSE;

        nsModuleInfo** module = gSubModules;
        nsModuleInfo** limit = module + NUM_SUB_MODULES;
        for ( ; module < limit; ++module) {
            if ((*module)->mDtor)
                ((*module)->mDtor)(self);
        }
    }
}

extern "C" NS_EXPORT nsresult
NSGetModule(nsIComponentManager *servMgr,      
            nsIFile *location,                 
            nsIModule **result)                
{                                                                            
    // Count the number of components contained in all of the
    // sub-modules
    nsModuleInfo** info = gSubModules;
    nsModuleInfo** limit = info + NUM_SUB_MODULES;
    PRUint32 count = 0;
    for ( ; info < limit; ++info)
        count += (*info)->mCount;

    // Allocate an nsModuleComponentInfo array large enough to contain
    // all of them. This will be permanently leaked.
    gComponentInfo = new nsModuleComponentInfo[count];
    if (! gComponentInfo)
        return NS_ERROR_OUT_OF_MEMORY;

    // Copy the module component info into the contiguous array
    nsModuleComponentInfo *comps = gComponentInfo;
    for (info = gSubModules; info < limit; ++info) {
        PRUint32 n = (*info)->mCount;
        ::memcpy(comps, (*info)->mComponents, sizeof(nsModuleComponentInfo) * n);
        comps += n;
    }

    // Dummy up an nsModuleInfo struct to register us as a generic
    // module that contains all our sub-module's components.
    nsModuleInfo metainfo;
    memset(&metainfo, 0, sizeof(metainfo));
    metainfo.mVersion    = NS_MODULEINFO_VERSION;
    metainfo.mModuleName = META_MODULE " meta module";
    metainfo.mComponents = gComponentInfo;
    metainfo.mCount      = count;
    metainfo.mCtor       = Initialize;
    metainfo.mDtor       = Shutdown;

    return NS_NewGenericModule2(&metainfo, result);
}