1 /**
2 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 * storing and accessing finite element mesh data.
4 *
5 * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 * retains certain rights in this software.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 */
15
16 #ifdef WIN32
17 #ifdef _DEBUG
18 // turn off warnings that say they debugging identifier has been truncated
19 // this warning comes up when using some STL containers
20 #pragma warning( disable : 4786 )
21 #endif
22 #endif
23
24 #include "moab/Core.hpp"
25
26 #ifdef XPCOM_MB
27
28 #include "nsIGenericFactory.h"
29
30 // define constructor function for Core
31 NS_GENERIC_FACTORY_CONSTRUCTOR( moab::Core )
32
33 // support for nsIClassInfo
34 NS_DECL_CLASSINFO( moab::Core )
35
36 MB_EXPORT const char* MoabVersion();
37 MB_EXPORT void GetInterface( MBuuid& interface_requested, UnknownInterface** iface );
38 MB_EXPORT void DeInitialize();
39 MB_EXPORT void ReleaseInterface( UnknownInterface* iface );
40
41 static const nsModuleComponentInfo components[] = {
42 { "MOAB Interface", CORE_CID, CORE_CONTRACTID, CoreConstructor, NULL /* NULL if you dont need one */,
43 NULL /* NULL if you dont need one */, NULL /* no factory destructor */, NS_CI_INTERFACE_GETTER_NAME( moab::Core ),
44 NULL /* no language helper */, &NS_CLASSINFO_NAME( moab::Core ), 0 } };
45
46 // implement NSGetModule()
47 NS_IMPL_NSGETMODULE( moab::Core, components );
48
49 #endif
50
51 #ifndef WIN32
52 #define MB_EXPORT extern "C"
53 #else
54 #define MB_EXPORT extern "C" __declspec( dllexport )
55 #endif
56
57 #include <list>
58
59 namespace moab
60 {
61
62 class ComponentFactory : public UnknownInterface
63 {
64 public:
65 ComponentFactory() {}
66 virtual ~ComponentFactory() {}
67 // returns the interface requested from an object
68 virtual int QueryInterface( const MBuuid&, UnknownInterface** );
69 // keep track of the objects this component factory creates
70 static std::list< UnknownInterface* > objects_in_use;
71 };
72
73 // the list that keeps track of all the interfaces generated by this server
74 std::list< UnknownInterface* > ComponentFactory::objects_in_use;
75
76 // this QueryInterface function is supposed to create an instance of the object
77 // that contains the interface requested
78 //
79 // note: the object is not the same as the interface, therefore
80 // we ask the object for the interface that was requested
81 //
82
83 int ComponentFactory::QueryInterface( const MBuuid& uuid, UnknownInterface** iface )
84 {
85 // this is an unknown interface that was requested
86 // if wanted, we could provide a default interface
87 // if IDD_MBUnknown is specified
88 if( uuid == IDD_MBUnknown ) return 0;
89 // IDD_MBVerde interface was requested
90 // create an Verde object and have it return the interface
91 // requested
92 else if( uuid == IDD_MBCore )
93 {
94 Core* mdb = new Core;
95 // if the object does not contain the interface requested, delete the object
96 if( !mdb->QueryInterface( uuid, iface ) )
97 {
98 delete mdb;
99 return 0;
100 }
101 return 1;
102 }
103 else
104 return 0;
105 }
106
107 // returns the interface version
108 MB_EXPORT const char* MoabVersion()
109 {
110 return MB_INTERFACE_VERSION;
111 }
112
113 // Initialize function is accessed by the MBClient when asking for interfaces
114 MB_EXPORT void GetInterface( MBuuid& interface_requested, UnknownInterface** iface )
115 {
116 // create an instance of our component factory
117 ComponentFactory server;
118 // ask the component factory to give us the interface we want
119 server.QueryInterface( interface_requested, iface );
120 // if the interface existed, put it on our list
121 if( iface && *iface ) ComponentFactory::objects_in_use.push_front( *iface );
122 }
123
124 // DeInitialize function is accessed by the MBClient when disconnecting from this library
125 // this will clean everything up prior to a disconnection
126 // from this library
127 MB_EXPORT void DeInitialize()
128 {
129 // delete all instances of objects
130 while( ComponentFactory::objects_in_use.size() )
131 {
132 UnknownInterface* iface = ComponentFactory::objects_in_use.front();
133 ComponentFactory::objects_in_use.pop_front();
134 if( iface ) delete iface;
135 }
136 }
137
138 // ReleaseInterface function is accessed by the MBClient when deleting an interface
139
140 // ReleaseInterface will delete this interface
141 MB_EXPORT void ReleaseInterface( UnknownInterface* iface )
142 {
143 if( !iface ) return;
144 // remove this object from our list and delete it
145 ComponentFactory::objects_in_use.remove( iface );
146 delete iface;
147 }
148
149 } // namespace moab