winamp/Src/replicant/nswasabi/ComponentManagerBase.cpp

146 lines
2.9 KiB
C++

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