chxclientenginemanager.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:7k
源码类别:

Symbian

开发平台:

Visual C++

  1. /*============================================================================*
  2.  *
  3.  * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
  4.  *
  5.  *============================================================================*/
  6. #include "hxassert.h"
  7. #include "hxtypes.h"
  8. #include "hxcom.h"
  9. #include "hxcomm.h"
  10. #include "hxcore.h"
  11. #include "dllacces.h"
  12. #include "dllpath.h"
  13. #include "hxengin.h"
  14. #include "hxcore.h"
  15. #include "....symbianplayer.ver"
  16. #include "chxavconfignames.h"
  17. #include "comptr_traits.h"
  18. #include "chxavfileutil.h"
  19. #include "chxavcleanstring.h"
  20. #include "chxavcleanupstack.h"
  21. #include "chxavmisc.h"
  22. #include "hxsym_leaveutil.h"
  23. #include "hxsym_debug.h"
  24. #include "hxapihelp.h"
  25. #include "chxclientenginemanager.h"
  26. struct GlobalData
  27. {
  28.     DLLAccessPath        accessPath;
  29. };
  30. GlobalData*& GetGlobal()
  31. {
  32. #if defined(HELIX_CONFIG_NOSTATICS)
  33.     static const int key = 0; // address of static var (we hope) comprises unique key id
  34.     GlobalData*& g_pGlobalData = (GlobalData*&)HXGlobalPtr::Get(&key);
  35. #else
  36.     static GlobalData* g_pGlobalData = NULL;
  37. #endif    
  38.     
  39.     if(!g_pGlobalData)
  40.     {
  41.         g_pGlobalData = new GlobalData();
  42.     }
  43.     return g_pGlobalData;
  44. }
  45. // required for class DLLAccess
  46. DLLAccessPath* GetDLLAccessPath()
  47. {
  48.     return &(GetGlobal()->accessPath);
  49. }
  50. ///////////////////////////////////
  51. // ctor
  52. CHXClientEngineManager::CHXClientEngineManager()
  53. : m_fpCreateEngine(0)
  54. , m_fpCloseEngine(0)
  55. , m_fpSetDLLAccessPath(0)
  56. , m_pDllAccess(0)
  57. {
  58. }
  59. ///////////////////////////////////
  60. // dtor
  61. CHXClientEngineManager::~CHXClientEngineManager()
  62. {
  63.     if(m_fpCloseEngine)
  64.     {
  65.         HX_ASSERT(m_clientEngine);
  66.         m_fpCloseEngine(m_clientEngine);
  67.         m_clientEngine = 0;
  68.     }
  69.     m_prefs = 0;
  70.     m_factory = 0;
  71.     //
  72.     // We are unloading the client core dll. All interfaces to objects 
  73.     // implemented in the client core dll *must* be released by now.
  74.     //
  75.     if (m_pDllAccess )
  76.     {
  77. m_pDllAccess->close();
  78. HX_DELETE(m_pDllAccess);
  79.     }
  80.     GlobalData* pGlobal = GetGlobal();
  81.     delete pGlobal;
  82.     m_fpCloseEngine = 0;
  83.     m_fpCreateEngine = 0;
  84.     m_fpSetDLLAccessPath = 0;
  85. }
  86. // ConstructL helper
  87. void CHXClientEngineManager::LoadClientCoreL()
  88. {
  89.     // this must be hardcoded (relative to player app folder)
  90.     _LIT(KClientCoreLib, "lib\clntcore.dll"); 
  91.     // get full path to client core dll
  92.     TFileName* pFullPathClientCore = CHXAvFile::AllocAppFolderPathL(KClientCoreLib);
  93.     AUTO_PUSH_POP_DEL(pFullPathClientCore);
  94.     CHXString strLibPath = CHXAvStringUtils::DescToString(*pFullPathClientCore);
  95.     // open the dll
  96.     m_pDllAccess = new (ELeave) DLLAccess();
  97.     int res = m_pDllAccess->open(strLibPath);
  98.     if (DLLAccess::OUT_OF_MEMORY == res)
  99.     {
  100. HXSYM_LEAVE(KErrNoMemory);
  101.     }
  102.     else if (DLLAccess::DLL_OK != res)
  103.     {
  104. HXSYM_LEAVE(KErrGeneral);
  105.     }
  106.     
  107.     // get the functions from the dll
  108.     m_fpCreateEngine = (FPRMCREATEENGINE) m_pDllAccess->getSymbol("CreateEngine");
  109.     m_fpCloseEngine = (FPRMCLOSEENGINE)  m_pDllAccess->getSymbol("CloseEngine");
  110.     m_fpSetDLLAccessPath = (FPRMSETDLLACCESSPATH) m_pDllAccess->getSymbol("SetDLLAccessPath");
  111.     HXSYM_LEAVE_IF_FALSE(m_fpCreateEngine != 0);
  112.     HXSYM_LEAVE_IF_FALSE(m_fpCloseEngine != 0);
  113.     HXSYM_LEAVE_IF_FALSE(m_fpSetDLLAccessPath != 0);
  114. }
  115. namespace
  116. {
  117. void AddAccessPath(CHXString& str, const CHXString& lhs, const CHXString& rhs)
  118. {
  119.     CHXString strAdd(lhs);
  120.     strAdd += "=";
  121.     strAdd += rhs;
  122.     // append key-val pair followed by terminator
  123.     str += strAdd;
  124.     str += 'n';
  125. }
  126. }
  127. ////////////////////////////////
  128. // ConstructL helper
  129. void CHXClientEngineManager::InitLibSearchPathL()
  130. {
  131.     // get full path to location for player dlls (plugin, codecs, etc.)
  132.     TFileName* pFullPathLibRoot = CHXAvFile::AllocFullPrefPathL(m_prefs, CHXAV_PlayerLibPath);
  133.     HXSYM_LEAVE_IF_FALSE(pFullPathLibRoot != 0);
  134.     AUTO_PUSH_POP_DEL(pFullPathLibRoot);
  135.     CHXString strFullLibRoot = CHXAvStringUtils::DescToString(*pFullPathLibRoot);
  136.     // set dll search path
  137.     CHXString strAccessPath;
  138.     AddAccessPath(strAccessPath, "DT_Common", strFullLibRoot);
  139.     AddAccessPath(strAccessPath, "DT_Plugins", strFullLibRoot);
  140.     AddAccessPath(strAccessPath, "DT_Codecs", strFullLibRoot);
  141.     strAccessPath += 'n'; 
  142.     
  143.     // replace newlines with null-terminators
  144.     for(TInt idx = 0; idx < strAccessPath.GetLength(); ++idx)
  145.     {
  146.         if(strAccessPath[idx] == 'n')
  147.         {
  148.             strAccessPath.SetAt(idx, '');
  149.         }
  150.     }
  151.    
  152.     m_fpSetDLLAccessPath(strAccessPath); 
  153. }
  154. void CHXClientEngineManager::ConstructL()
  155. {
  156.     // load engine dll
  157.     LoadClientCoreL();
  158.     // create the engine; note: this function does not add-ref returned com pointer for us (so we do it ourselves)!
  159.     IHXClientEngine* pEngine = 0;
  160.     m_fpCreateEngine(&pEngine);
  161.     m_clientEngine = pEngine;
  162.     HXSYM_LEAVE_IF_FALSE(m_clientEngine != 0);
  163.    
  164.     // get the factory from the engine
  165.     m_factory.From(m_clientEngine);
  166.     // create prefs to override core default (see below)
  167.     CreatePrefsL();
  168.     // this is earliest we can set up log sink and mask to proper values (from registry)
  169.     dbg::SetupDebug(m_prefs);
  170.     DPRINTF(SYMP_INFO, ("CHXClientEngineManager()::ConstructL(): just initialized debug maskn"));
  171.     // configure paths (based on preferences) for finding libraries
  172.     InitLibSearchPathL();
  173.     // ensure 'PluginArchiveFileName' path is set
  174.     CHXString strArchiveFileName = prefs::GetString(m_prefs, CHXAV_PluginArchiveFileName);
  175.     if( strArchiveFileName.IsEmpty() )
  176.     {
  177.         // we need to set this so plugin manager can use it to write plugin state information
  178.         TFileName* pFullPath = CHXAvFile::AllocAppFolderPathL(CHXAvUtil::KPlayerDataFolder);
  179.         AUTO_PUSH_POP_DEL(pFullPath);
  180.         CHXAvFile::AppendPath(*pFullPath, KPluginArchiveName, CHXAvFile::ntFile);
  181.         strArchiveFileName = CHXAvStringUtils::DescToString(*pFullPath);
  182.         prefs::Write(m_factory, m_prefs, CHXAV_PluginArchiveFileName, strArchiveFileName);
  183.     }
  184.     //
  185.     // initialize the client core; engine will look for interfaces that override its
  186.     // default implementation, including
  187.     //
  188.     //  preferences
  189.     //  hypernavigate
  190.     // 
  191.     // then it will load plugins
  192.     //
  193.     comptr<IHXClientEngineSetup> clientEngineSetup;
  194.     clientEngineSetup.From(m_clientEngine);
  195.    
  196.     clientEngineSetup->Setup(static_cast<IHXPreferences*>(m_prefs)); // arbitrary unknown
  197. }
  198. //
  199. //
  200. //
  201. void CHXClientEngineManager::CreatePrefsL()
  202. {
  203.     HX_ASSERT(m_factory);
  204.     TFileName* pFullPathConfig = CHXAvFile::AllocAppFolderPathL(CHXAvUtil::KPlayerDataFolder);
  205.     AUTO_PUSH_POP_DEL(pFullPathConfig);
  206.     CHXString strConfigPath = CHXAvStringUtils::DescToString(*pFullPathConfig);
  207.     m_prefs = new (ELeave) CHXLitePrefs(strConfigPath);
  208.     m_prefs->SetContext(m_factory);
  209.     
  210.     CHXAvCleanString productName(R_AVP_PRODUCT_NAME);
  211.     CHXString productNameStr = CHXAvStringUtils::DescToString(productName());
  212.     CHXAvCleanString companyName(R_AVP_COMPANY_NAME);
  213.     CHXString companyNameStr = CHXAvStringUtils::DescToString(companyName());
  214.     
  215.     m_prefs->Open(companyNameStr, productNameStr, TARVER_MAJOR_VERSION, TARVER_MINOR_VERSION);
  216. }