Example #1
0
Object* ServiceLocator::GetService(const QString& key)
{
  if (disposed)
  {
    return NULL;
  }

  KeyToServiceMapType::const_iterator iter = services.find(key);
  Object* service = NULL;

  if (iter != services.end())
  {
    service = iter.value();
  }
  else
  {
    // if we don't have a service in our cache then:
    // 1. check our local factory
    // 2. go to the registry
    // or 3. use the parent service
    IServiceLocator::Pointer factoryParent = WorkbenchServiceRegistry::GLOBAL_PARENT;
    if (parent)
    {
      factoryParent = new ParentLocator(parent, key);
    }
    if (factory)
    {
      service = factory->Create(key, factoryParent.GetPointer(), this);
    }
    if (!service)
    {
      Object::Pointer factoryService =
          WorkbenchServiceRegistry::GetRegistry()->GetService(key,
                                                              factoryParent.GetPointer(),
                                                              this);
      if (factoryService)
      {
        managedFactoryServices.push_back(factoryService);
      }
      service = factoryService.GetPointer();
    }
    if (!service)
    {
      service = factoryParent->GetService(key);
    }
    else
    {
      this->RegisterService(key, service);
    }
  }
  return service;
}