225 lines
4.6 KiB
C++
225 lines
4.6 KiB
C++
|
#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;
|
||
|
}
|