aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nswasabi/ComponentManagerBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/nswasabi/ComponentManagerBase.cpp')
-rw-r--r--Src/replicant/nswasabi/ComponentManagerBase.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/Src/replicant/nswasabi/ComponentManagerBase.cpp b/Src/replicant/nswasabi/ComponentManagerBase.cpp
new file mode 100644
index 00000000..aa8d3f43
--- /dev/null
+++ b/Src/replicant/nswasabi/ComponentManagerBase.cpp
@@ -0,0 +1,145 @@
+#include "ComponentManagerBase.h"
+#include "foundation/error.h"
+#include "nx/nxuri.h"
+
+ComponentManagerBase::ComponentManagerBase()
+{
+ phase=PHASE_INITIALIZE;
+ service_api=0;
+ component_sync=0;
+}
+
+int ComponentManagerBase::LateLoad(ifc_component *component)
+{
+ int ret;
+
+ if (phase >= PHASE_REGISTERED)
+ {
+ ret = component->RegisterServices(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ return ret;
+ }
+ }
+
+ if (phase >= PHASE_LOADING)
+ {
+ ret = component->OnLoading(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ return ret;
+ }
+ }
+
+ if (phase >= PHASE_LOADED)
+ {
+ ret = component->OnLoaded(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ return ret;
+ }
+ }
+ return NErr_Success;
+}
+
+void ComponentManagerBase::SetServiceAPI(api_service *service_api)
+{
+ this->service_api = service_api;
+ service_api->QueryInterface(&component_sync);
+}
+
+int ComponentManagerBase::Load()
+{
+ if (phase != PHASE_INITIALIZE)
+ return NErr_Error;
+
+ int ret;
+
+ /* RegisterServices phase */
+ for (ComponentList::iterator itr=components.begin();itr!=components.end();)
+ {
+ ifc_component *component = *itr;
+ ComponentList::iterator next=itr;
+ next++;
+ ret = component->RegisterServices(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ NXURIRelease(component->component_info.filename);
+ CloseComponent(component);
+ components.erase(component);
+
+ }
+ itr=next;
+ }
+
+ phase = PHASE_REGISTERED;
+
+ /* OnLoading phase */
+ for (ComponentList::iterator itr=components.begin();itr!=components.end();)
+ {
+ ifc_component *component = *itr;
+ ComponentList::iterator next=itr;
+ next++;
+ ret = component->OnLoading(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ NXURIRelease(component->component_info.filename);
+ CloseComponent(component);
+ components.erase(component);
+
+ }
+ itr=next;
+ }
+
+ phase = PHASE_LOADING;
+
+ /* OnLoaded phase */
+ for (ComponentList::iterator itr=components.begin();itr!=components.end();)
+ {
+ ifc_component *component = *itr;
+ ComponentList::iterator next=itr;
+ next++;
+ ret = component->OnLoading(service_api);
+ if (ret != NErr_Success)
+ {
+ int ret2 = component->Quit(service_api);
+ if (ret2 == NErr_TryAgain)
+ {
+ component_sync->Wait(1);
+ }
+ NXURIRelease(component->component_info.filename);
+ CloseComponent(component);
+ components.erase(component);
+ }
+ itr=next;
+ }
+
+ phase = PHASE_LOADED;
+
+ return NErr_Success;
+}