mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-18 12:45:45 -04:00
Initial community commit
This commit is contained in:
145
Src/replicant/nswasabi/ComponentManagerBase.cpp
Normal file
145
Src/replicant/nswasabi/ComponentManagerBase.cpp
Normal file
@ -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;
|
||||
}
|
Reference in New Issue
Block a user