コード例 #1
0
ファイル: AddonBuilder.cpp プロジェクト: voguemaster/xbmc
std::shared_ptr<IAddon> CAddonBuilder::Build()
{
  if (m_built)
    throw std::logic_error("Already built");

  if (m_addonInfo.m_id.empty())
    return nullptr;

  m_built = true;

  if (m_addonInfo.m_mainType == ADDON_UNKNOWN)
    return std::make_shared<CAddon>(std::move(m_addonInfo));

  if (m_extPoint == nullptr)
    return FromProps(std::move(m_addonInfo));

  const TYPE type(m_addonInfo.m_mainType);

  // Handle screensaver special cases
  if (type == ADDON_SCREENSAVER)
  {
    // built in screensaver or python screensaver
    if (StringUtils::StartsWithNoCase(m_extPoint->plugin->identifier, "screensaver.xbmc.builtin.") ||
        URIUtils::HasExtension(CAddonMgr::GetInstance().GetExtValue(m_extPoint->configuration, "@library"), ".py"))
      return std::make_shared<CAddon>(std::move(m_addonInfo));
  }

  // Handle audio encoder special cases
  if (type == ADDON_AUDIOENCODER)
  {
    // built in audio encoder
    if (StringUtils::StartsWithNoCase(m_extPoint->plugin->identifier, "audioencoder.kodi.builtin."))
      return std::make_shared<CAddonDll>(std::move(m_addonInfo));
  }

  // Ensure binary types have a valid library for the platform
  if (type == ADDON_VIZ ||
      type == ADDON_SCREENSAVER ||
      type == ADDON_PVRDLL ||
      type == ADDON_ADSPDLL ||
      type == ADDON_AUDIOENCODER ||
      type == ADDON_AUDIODECODER ||
      type == ADDON_VFS ||
      type == ADDON_IMAGEDECODER ||
      type == ADDON_INPUTSTREAM ||
      type == ADDON_PERIPHERALDLL ||
      type == ADDON_GAMEDLL)
  {
    std::string value = CAddonMgr::GetInstance().GetPlatformLibraryName(m_extPoint->plugin->extensions->configuration);
    if (value.empty())
      return AddonPtr();
  }

  switch (type)
  {
    case ADDON_PLUGIN:
    case ADDON_SCRIPT:
      return CPluginSource::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_SCRIPT_LIBRARY:
    case ADDON_SCRIPT_LYRICS:
    case ADDON_SCRIPT_MODULE:
    case ADDON_SUBTITLE_MODULE:
    case ADDON_SCRIPT_WEATHER:
      return std::make_shared<CAddon>(std::move(m_addonInfo));
    case ADDON_WEB_INTERFACE:
      return CWebinterface::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_SERVICE:
      return CService::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_SCRAPER_ALBUMS:
    case ADDON_SCRAPER_ARTISTS:
    case ADDON_SCRAPER_MOVIES:
    case ADDON_SCRAPER_MUSICVIDEOS:
    case ADDON_SCRAPER_TVSHOWS:
    case ADDON_SCRAPER_LIBRARY:
      return CScraper::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_ADSPDLL:
    case ADDON_AUDIOENCODER:
    case ADDON_IMAGEDECODER:
    case ADDON_VIZ:
    case ADDON_SCREENSAVER:
      return std::make_shared<CAddonDll>(std::move(m_addonInfo));
    case ADDON_PVRDLL:
      return std::make_shared<PVR::CPVRClient>(std::move(m_addonInfo));
    case ADDON_AUDIODECODER:
      return CAudioDecoder::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_INPUTSTREAM:
      return CInputStream::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_PERIPHERALDLL:
      return PERIPHERALS::CPeripheralAddon::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_GAMEDLL:
      return GAME::CGameClient::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_VFS:
      return CVFSEntry::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_SKIN:
      return CSkinInfo::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_RESOURCE_IMAGES:
      return CImageResource::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_RESOURCE_GAMES:
      return CGameResource::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_RESOURCE_LANGUAGE:
      return CLanguageResource::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_RESOURCE_UISOUNDS:
      return std::make_shared<CUISoundsResource>(std::move(m_addonInfo));
    case ADDON_REPOSITORY:
      return CRepository::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_CONTEXT_ITEM:
      return CContextMenuAddon::FromExtension(std::move(m_addonInfo), m_extPoint);
    case ADDON_GAME_CONTROLLER:
      return GAME::CController::FromExtension(std::move(m_addonInfo), m_extPoint);
    default:
      break;
  }
  return AddonPtr();
}
コード例 #2
0
ファイル: AddonBuilder.cpp プロジェクト: Adeelb/xbmc
std::shared_ptr<IAddon> CAddonBuilder::Build()
{
  if (m_built)
    throw std::logic_error("Already built");

  if (m_props.id.empty())
    return nullptr;

  m_built = true;

  if (m_props.type == ADDON_UNKNOWN)
    return std::make_shared<CAddon>(std::move(m_props));

  if (m_extPoint == nullptr)
    return FromProps(std::move(m_props));

  const TYPE type(m_props.type);
  switch (type)
  {
    case ADDON_PLUGIN:
    case ADDON_SCRIPT:
      return CPluginSource::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_SCRIPT_LIBRARY:
    case ADDON_SCRIPT_LYRICS:
    case ADDON_SCRIPT_MODULE:
    case ADDON_SUBTITLE_MODULE:
    case ADDON_SCRIPT_WEATHER:
      return std::make_shared<CAddon>(std::move(m_props));
    case ADDON_WEB_INTERFACE:
      return CWebinterface::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_SERVICE:
      return CService::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_SCRAPER_ALBUMS:
    case ADDON_SCRAPER_ARTISTS:
    case ADDON_SCRAPER_MOVIES:
    case ADDON_SCRAPER_MUSICVIDEOS:
    case ADDON_SCRAPER_TVSHOWS:
    case ADDON_SCRAPER_LIBRARY:
      return CScraper::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_VIZ:
    case ADDON_SCREENSAVER:
    case ADDON_PVRDLL:
    case ADDON_ADSPDLL:
    case ADDON_AUDIOENCODER:
    case ADDON_AUDIODECODER:
    case ADDON_INPUTSTREAM:
    case ADDON_PERIPHERALDLL:
    { // begin temporary platform handling for Dlls
      // ideally platforms issues will be handled by C-Pluff
      // this is not an attempt at a solution
      std::string value;
      if (type == ADDON_SCREENSAVER && 0 == strnicmp(m_extPoint->plugin->identifier, "screensaver.xbmc.builtin.", 25))
      { // built in screensaver
        return std::make_shared<CAddon>(std::move(m_props));
      }
      if (type == ADDON_SCREENSAVER)
      { // Python screensaver
        std::string library = CAddonMgr::GetInstance().GetExtValue(m_extPoint->configuration, "@library");
        if (URIUtils::HasExtension(library, ".py"))
          return std::make_shared<CScreenSaver>(std::move(m_props));
      }
      if (type == ADDON_AUDIOENCODER && 0 == strncmp(m_extPoint->plugin->identifier,
          "audioencoder.xbmc.builtin.", 26))
      { // built in audio encoder
        return CAudioEncoder::FromExtension(std::move(m_props), m_extPoint);
      }

      value = CAddonMgr::GetInstance().GetPlatformLibraryName(m_extPoint->plugin->extensions->configuration);
      if (value.empty())
        break;
      if (type == ADDON_VIZ)
      {
#if defined(HAS_VISUALISATION)
        return std::make_shared<CVisualisation>(std::move(m_props));
#endif
      }
      else if (type == ADDON_PVRDLL)
      {
#ifdef HAS_PVRCLIENTS
        return PVR::CPVRClient::FromExtension(std::move(m_props), m_extPoint);
#endif
      }
      else if (type == ADDON_ADSPDLL)
      {
        return std::make_shared<ActiveAE::CActiveAEDSPAddon>(std::move(m_props));
      }
      else if (type == ADDON_AUDIOENCODER)
        return CAudioEncoder::FromExtension(std::move(m_props), m_extPoint);
      else if (type == ADDON_AUDIODECODER)
        return CAudioDecoder::FromExtension(std::move(m_props), m_extPoint);
      else if (type == ADDON_INPUTSTREAM)
        return CInputStream::FromExtension(std::move(m_props), m_extPoint);
      else if (type == ADDON_SCREENSAVER)
        return std::make_shared<CScreenSaver>(std::move(m_props));
      else if (type == ADDON_PERIPHERALDLL)
        return PERIPHERALS::CPeripheralAddon::FromExtension(std::move(m_props), m_extPoint);
      break;
    }
    case ADDON_SKIN:
      return CSkinInfo::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_RESOURCE_IMAGES:
      return CImageResource::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_RESOURCE_LANGUAGE:
      return CLanguageResource::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_RESOURCE_UISOUNDS:
      return std::make_shared<CUISoundsResource>(std::move(m_props));
    case ADDON_REPOSITORY:
      return CRepository::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_CONTEXT_ITEM:
      return CContextMenuAddon::FromExtension(std::move(m_props), m_extPoint);
    case ADDON_GAME_CONTROLLER:
      return GAME::CController::FromExtension(std::move(m_props), m_extPoint);
    default:
      break;
  }
  return AddonPtr();
}