diff options
Diffstat (limited to 'Src/replicant/component/ComponentManagerBase.cpp')
-rw-r--r-- | Src/replicant/component/ComponentManagerBase.cpp | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/Src/replicant/component/ComponentManagerBase.cpp b/Src/replicant/component/ComponentManagerBase.cpp new file mode 100644 index 00000000..d375f088 --- /dev/null +++ b/Src/replicant/component/ComponentManagerBase.cpp @@ -0,0 +1,224 @@ +#include "ComponentManagerBase.h" +#include "foundation/error.h" +#include "nx/nxuri.h" + +ComponentManagerBase::ComponentManagerBase() +{ + phase=PHASE_INITIALIZE; + service_api=0; + component_sync=0; + framework_guid = INVALID_GUID; + application_guid = INVALID_GUID; +} + +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); + itr = components.erase(itr); + } + else + { + 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); + itr = components.erase(itr); + } + else + { + 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->OnLoaded(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); + itr = components.erase(itr); + } + else + { + itr++; // = next; + } + } + + phase = PHASE_LOADED; + + return NErr_Success; +} + +int ComponentManagerBase::AddComponent(ifc_component *component) +{ + int err; + + if (NULL == component) + return NErr_BadParameter; + + if (phase > PHASE_LOADED) + return NErr_Error; + + if (component->component_info.wasabi_version != wasabi2_component_version + || component->component_info.nx_api_version != nx_api_version + || component->component_info.nx_platform_guid != nx_platform_guid) + { + return NErr_IncompatibleVersion; + } + + if (component->component_info.framework_guid != INVALID_GUID + && framework_guid != component->component_info.framework_guid) + { + return NErr_IncompatibleVersion; + } + + if (component->component_info.application_guid != INVALID_GUID + && application_guid != component->component_info.application_guid) + { + return NErr_IncompatibleVersion; + } + + for (ComponentList::iterator itr = components.begin(); itr != components.end(); itr++) + { + ifc_component *registered_component = *itr; + if (registered_component->component_info.component_guid == component->component_info.component_guid) + return NErr_Error; + } + + err = component->Initialize(service_api); + if (NErr_Success != err) + return err; + + /* if the component was added late, we'll need to run some extra stages */ + err = LateLoad(component); + if (NErr_Success != err) + return err; + + components.push_back(component); + + return NErr_Success; +} + +void ComponentManagerBase::SetFrameworkGUID(GUID guid) +{ + framework_guid = guid; +} + +GUID ComponentManagerBase::GetFrameworkGUID() +{ + return framework_guid; +} + +void ComponentManagerBase::SetApplicationGUID(GUID guid) +{ + application_guid = guid; +} + +GUID ComponentManagerBase::GetApplicationGUID() +{ + return application_guid; +} |