123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #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;
- }
|