rlogplin.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #define INITGUID
  36. #include "rlogplin.h"
  37. #include "hxprefutil.h"
  38. #include "hxprefs.h"
  39. #include "chxpckts.h" // CHXHeader
  40. class HXRLPErrorSink : public IHXErrorSink
  41. {
  42. public:
  43.     HXRLPErrorSink(HXRemoteLoggerPlugin* pRLP);
  44.     ~HXRLPErrorSink();
  45.     /*
  46.      *  IUnknown methods
  47.      */
  48.     STDMETHOD(QueryInterface) (THIS_
  49. REFIID riid,
  50. void** ppvObj);
  51.     STDMETHOD_(ULONG32,AddRef) (THIS);
  52.     STDMETHOD_(ULONG32,Release) (THIS);
  53.     /*
  54.      *  IHXErrorSink methods
  55.      */
  56.     /************************************************************************
  57.      * Method:
  58.      *     IHXErrorSink::ErrorOccurred
  59.      * Purpose:
  60.      *     After you have registered your error sink with an
  61.      *     IHXErrorSinkControl (either in the server or player core) this
  62.      *     method will be called to report an error, event, or status message.
  63.      *
  64.      *     The meaning of the arguments is exactly as described in
  65.      *     hxerror.h
  66.      */
  67.     STDMETHOD(ErrorOccurred) (THIS_
  68. const UINT8 unSeverity,  
  69. const ULONG32 ulHXCode,
  70. const ULONG32 ulUserCode,
  71. const char* pUserString,
  72. const char* pMoreInfoURL
  73. );
  74. private:
  75.     ULONG32 m_lRefCount;
  76.     HXRemoteLoggerPlugin* m_pRLP;
  77. };
  78. HXRLPErrorSink::HXRLPErrorSink(HXRemoteLoggerPlugin* pRLP) :
  79.     m_pRLP(pRLP)
  80. {}
  81. HXRLPErrorSink::~HXRLPErrorSink()
  82. {}
  83. /*
  84.  *  IUnknown methods
  85.  */
  86. STDMETHODIMP HXRLPErrorSink::QueryInterface(THIS_
  87.     REFIID riid,
  88.     void** ppvObj)
  89. {
  90.     QInterfaceList qiList[] =
  91.     {
  92. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)this },
  93. { GET_IIDHANDLE(IID_IHXErrorSink), (IHXErrorSink*) this }
  94.     };
  95.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  96. }
  97. STDMETHODIMP_(ULONG32) HXRLPErrorSink::AddRef(THIS)
  98. {
  99.     return InterlockedIncrement(&m_lRefCount);
  100. }
  101. STDMETHODIMP_(ULONG32) HXRLPErrorSink::Release(THIS)
  102. {
  103.     if (InterlockedDecrement(&m_lRefCount) > 0)
  104.     {
  105.         return m_lRefCount;
  106.     }
  107.     
  108.     delete this;
  109.     return 0;
  110. }
  111.     /*
  112.      *  IHXErrorSink methods
  113.      */
  114.     /************************************************************************
  115.      * Method:
  116.      *     IHXErrorSink::ErrorOccurred
  117.      * Purpose:
  118.      *     After you have registered your error sink with an
  119.      *     IHXErrorSinkControl (either in the server or player core) this
  120.      *     method will be called to report an error, event, or status message.
  121.      *
  122.      *     The meaning of the arguments is exactly as described in
  123.      *     hxerror.h
  124.      */
  125. STDMETHODIMP HXRLPErrorSink::ErrorOccurred(THIS_
  126.    const UINT8 unSeverity,  
  127.    const ULONG32 ulHXCode,
  128.    const ULONG32 ulUserCode,
  129.    const char* pUserString,
  130.    const char* pMoreInfoURL)
  131. {
  132.     HX_RESULT res = HXR_OK ;
  133.     if (m_pRLP)
  134.     {
  135. res = m_pRLP->ErrorOccurred(unSeverity, ulHXCode, ulUserCode,
  136.     pUserString, pMoreInfoURL);
  137.     }
  138.     return res;
  139. }
  140. HXRemoteLoggerPlugin::HXRemoteLoggerPlugin() :
  141.     m_lRefCount(0),
  142.     m_pErrorSink(NULL),
  143.     m_pRemoteLogger(NULL)    
  144. {}
  145. HXRemoteLoggerPlugin::~HXRemoteLoggerPlugin()
  146. {
  147.     HX_RELEASE(m_pErrorSink);
  148.     
  149.     if (m_pRemoteLogger)
  150.     {
  151. m_pRemoteLogger->Close();
  152.     }
  153.     HX_RELEASE(m_pRemoteLogger);
  154. }
  155. /*
  156.  * IUnknown methods
  157.  */
  158. STDMETHODIMP HXRemoteLoggerPlugin::QueryInterface(THIS_
  159.   REFIID riid,
  160.   void** ppvObj)
  161. {
  162.     QInterfaceList qiList[] =
  163.     {
  164. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPlugin*)this },
  165. { GET_IIDHANDLE(IID_IHXPlugin), (IHXPlugin*) this },
  166. { GET_IIDHANDLE(IID_IHXGenericPlugin), (IHXGenericPlugin*) this },
  167. { GET_IIDHANDLE(IID_IHXPlayerCreationSink), (IHXPlayerCreationSink*) this },
  168. { GET_IIDHANDLE(IID_IHXComponentPlugin), (IHXComponentPlugin*) this }
  169.     };
  170.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  171. }
  172. STDMETHODIMP_(ULONG32) HXRemoteLoggerPlugin::AddRef(THIS)
  173. {
  174.     return InterlockedIncrement(&m_lRefCount);
  175. }
  176. STDMETHODIMP_(ULONG32) HXRemoteLoggerPlugin::Release(THIS)
  177. {
  178.     if (InterlockedDecrement(&m_lRefCount) > 0)
  179.     {
  180.         return m_lRefCount;
  181.     }
  182.     
  183.     delete this;
  184.     return 0;
  185. }
  186. /*
  187.  * IHXPlugin methods
  188.  */
  189. /************************************************************************
  190.  * Method:
  191.  *     IHXPlugin::GetPluginInfo
  192.  * Purpose:
  193.  *     Returns the basic information about this plugin. Including:
  194.  *
  195.  *     bMultipleLoad Whether or not this plugin can be instantiated
  196.  * multiple times. All File Formats must set
  197.  * this value to TRUE.  The only other type of
  198.  * plugin that can specify bMultipleLoad=TRUE is
  199.  * a filesystem plugin.  Any plugin that sets
  200.  * this flag to TRUE must not use global variables
  201.  * of any type.
  202.  *
  203.  * Setting this flag to TRUE implies that you
  204.  * accept that your plugin may be instantiated
  205.  * multiple times (possibly in different
  206.  * address spaces).  Plugins are instantiated
  207.  * multiple times only in the server (for
  208.  * performance reasons).
  209.  *
  210.  * An example of a plugin, that must set this
  211.  * flag to FALSE is a filesystem plugin that 
  212.  * uses a single TCP connection to communicate
  213.  * with a database.
  214.  *
  215.  *     pDescription which is used in about UIs (can be NULL)
  216.  *     pCopyright which is used in about UIs (can be NULL)
  217.  *     pMoreInfoURL which is used in about UIs (can be NULL)
  218.  *     ulVersionNumber The version of this plugin.
  219.  */
  220. static const char z_pDescription[] = "Helix Remote Logger Plugin";
  221. static const char z_pCopyright[] = "RealNetworks 2003";
  222. static const char z_pMoreInfoURL[] = "";
  223. STDMETHODIMP HXRemoteLoggerPlugin::GetPluginInfo(THIS_
  224. REF(BOOL)  /*OUT*/ bMultipleLoad,
  225. REF(const char*) /*OUT*/ pDescription,
  226. REF(const char*) /*OUT*/ pCopyright,
  227. REF(const char*) /*OUT*/ pMoreInfoURL,
  228. REF(ULONG32)  /*OUT*/ ulVersionNumber)
  229. {
  230.     bMultipleLoad = FALSE;
  231.     pDescription = z_pDescription;
  232.     pCopyright = z_pCopyright;
  233.     pMoreInfoURL = z_pMoreInfoURL;
  234.     ulVersionNumber = 1;
  235.     return HXR_OK;
  236. }
  237. /************************************************************************
  238.  * Method:
  239.  *     IHXPlugin::InitPlugin
  240.  * Purpose:
  241.  *     Initializes the plugin for use. This interface must always be
  242.  *     called before any other method is called. This is primarily needed 
  243.  *     so that the plugin can have access to the context for creation of
  244.  *     IHXBuffers and IMalloc.
  245.  */
  246. STDMETHODIMP HXRemoteLoggerPlugin::InitPlugin(THIS_
  247.       IUnknown*   /*IN*/  pContext)
  248. {
  249.     HX_RESULT res = HXR_FAILED;
  250.     if (pContext)
  251.     {
  252. IHXPlayerSinkControl* pPSinkCtl = NULL;
  253. if (HXR_OK == pContext->QueryInterface(IID_IHXPlayerSinkControl,
  254.        (void**)&pPSinkCtl))
  255. {
  256.     pPSinkCtl->AddSink(this);
  257. }
  258. HX_RELEASE(pPSinkCtl);
  259. m_pErrorSink = new HXRLPErrorSink(this);
  260. HX_ADDREF(m_pErrorSink);
  261. IHXPreferences* pPrefs = NULL;
  262. if (HXR_OK == pContext->QueryInterface(IID_IHXPreferences,
  263.        (void**)&pPrefs))
  264. {
  265.     IHXBuffer* pRemoteHost = NULL;
  266.     IHXBuffer* pRemoteFile = NULL;
  267.     UINT32 ulPort = 0;
  268.     if ((HXR_OK == pPrefs->ReadPref("RemoteLoggerHost", pRemoteHost))&&
  269. (HXR_OK == ReadPrefINT32(pPrefs, "RemoteLoggerPort", ulPort))&&
  270. (HXR_OK == pPrefs->ReadPref("RemoteLoggerFile", pRemoteFile)))
  271.     {
  272. m_pRemoteLogger = new HXRemoteLogger();
  273. if (m_pRemoteLogger)
  274. {
  275.     m_pRemoteLogger->AddRef();
  276.     res = m_pRemoteLogger->Init(pContext,
  277. (char*)pRemoteHost->GetBuffer(),
  278. (UINT16)ulPort,
  279. (char*)pRemoteFile->GetBuffer());
  280.     if (HXR_OK == res)
  281.     {
  282. m_pRemoteLogger->Log("logger startedn");
  283.     }
  284. }
  285.     }
  286.     HX_RELEASE(pRemoteHost);
  287.     HX_RELEASE(pRemoteFile);
  288.     
  289. }
  290. HX_RELEASE(pPrefs);
  291.     }
  292.     return res;
  293. }
  294. /*
  295.  * IHXGenericPlugin methods
  296.  */
  297. STDMETHODIMP HXRemoteLoggerPlugin::IsGeneric(THIS_
  298.      REF(BOOL)  /*OUT*/ bIsGeneric)
  299. {
  300.     bIsGeneric = TRUE;
  301.     return HXR_OK;
  302. }
  303. /*
  304.  * IHXPlayerCreationSink Methods
  305.  */
  306. /************************************************************************
  307.  * Method:
  308.  *     IHXPlayerCreationSink::PlayerCreated
  309.  * Purpose:
  310.  *     Notification when a new player is created
  311.  *
  312.  */
  313. STDMETHODIMP HXRemoteLoggerPlugin::PlayerCreated(THIS_
  314.  IHXPlayer* pPlayer)
  315. {
  316.     IHXErrorSinkControl* pSinkControl = NULL;
  317.     if (m_pErrorSink &&
  318. (HXR_OK == pPlayer->QueryInterface(IID_IHXErrorSinkControl,
  319.    (void**)&pSinkControl)))
  320.     {
  321. pSinkControl->AddErrorSink(m_pErrorSink, 
  322.    HXLOG_EMERG, HXLOG_DEBUG);
  323.     }
  324.     HX_RELEASE(pSinkControl);
  325.     return HXR_OK;
  326. }
  327. /************************************************************************
  328.  * Method:
  329.  *     IHXPlayerCreationSink::PlayerClosed
  330.  * Purpose:
  331.  *     Notification when an exisitng player is closed
  332.  *
  333.  */
  334. STDMETHODIMP HXRemoteLoggerPlugin::PlayerClosed(THIS_
  335. IHXPlayer* pPlayer)
  336. {
  337.     IHXErrorSinkControl* pSinkControl = NULL;
  338.     if (m_pErrorSink &&
  339. (HXR_OK == pPlayer->QueryInterface(IID_IHXErrorSinkControl,
  340.    (void**)&pSinkControl)))
  341.     {
  342. pSinkControl->RemoveErrorSink(m_pErrorSink);
  343.     }
  344.     HX_RELEASE(pSinkControl);
  345.     return HXR_OK;
  346. }
  347. /*
  348.  * IHXComponentPlugin methods
  349.  */
  350. /************************************************************************
  351.  * Method:
  352.  *     IHXComponentPlugin::GetNumberComponents
  353.  * Purpose:
  354.  */
  355. STDMETHODIMP_(UINT32) HXRemoteLoggerPlugin::GetNumComponents(THIS)
  356. {
  357.     return 1;
  358. }
  359. /************************************************************************
  360.  * Method:
  361.  *     IHXComponentPlugin::GetPackageName
  362.  * Purpose:
  363.  */
  364. STDMETHODIMP_(char const*) HXRemoteLoggerPlugin::GetPackageName(THIS) CONSTMETHOD
  365. {
  366.     return "RemoteLogger";
  367. }
  368. /************************************************************************
  369.  *  Method:
  370.  *     IHXComponentPlugin::GetComponentInfoAtIndex
  371.  *  Purpose:
  372.  */
  373. STDMETHODIMP HXRemoteLoggerPlugin::GetComponentInfoAtIndex(THIS_
  374.                   UINT32 /*IN*/  nIndex,
  375.        REF(IHXValues*)  /*OUT*/ pInfo)
  376. {
  377.     pInfo = NULL;
  378.     if (nIndex  == 0)
  379.     {
  380. pInfo = new CHXHeader();
  381. if (pInfo)
  382. {
  383.     pInfo->AddRef();
  384. }
  385.     }
  386.     return (pInfo) ? HXR_OK : HXR_FAILED;
  387. }
  388. /************************************************************************
  389.  *  Method:
  390.  *     IHXComponentPlugin::CreateComponentInstance
  391.  *  Purpose:
  392.  */
  393. STDMETHODIMP HXRemoteLoggerPlugin::CreateComponentInstance(THIS_
  394.    REFCLSID     /*IN*/  rclsid,
  395.    REF(IUnknown*)  /*OUT*/ ppUnknown,
  396.    IUnknown*     /*IN*/  pUnkOuter)
  397. {
  398.     ppUnknown = NULL;
  399.     return HXR_NOINTERFACE;
  400. }
  401. HX_RESULT HXRemoteLoggerPlugin::ErrorOccurred(const UINT8 unSeverity,  
  402.       const ULONG32 ulHXCode,
  403.       const ULONG32 ulUserCode,
  404.       const char* pUserString,
  405.       const char* pMoreInfoURL)
  406. {
  407.     if (m_pRemoteLogger)
  408.     {
  409. if (pUserString)
  410. {
  411.     int length = strlen(pUserString);
  412.     char* pBuf = new char[length + 2];
  413.     if (pBuf)
  414.     {
  415. strcpy(pBuf, pUserString);
  416. pBuf[length] = 'n';
  417. pBuf[length + 1] = '';
  418. m_pRemoteLogger->Log(pBuf);
  419.     }
  420.     delete [] pBuf;
  421. }
  422.     }
  423.     return HXR_OK;
  424. }
  425. /****************************************************************************
  426.  * 
  427.  *  Function:
  428.  * 
  429.  *        HXCreateInstance()
  430.  * 
  431.  *  Purpose:
  432.  * 
  433.  *        Function implemented by all plugin DLL's to create an instance of 
  434.  *        any of the objects supported by the DLL. This method is similar to 
  435.  *        Window's CoCreateInstance() in its purpose, except that it only 
  436.  *        creates objects from this plugin DLL.
  437.  *
  438.  *        NOTE: Aggregation is never used. Therefore and outer unknown is
  439.  *        not passed to this function, and you do not need to code for this
  440.  *        situation.
  441.  * 
  442.  */
  443. STDAPI ENTRYPOINT(HXCREATEINSTANCE)
  444. (
  445.     IUnknown**  /*OUT*/        ppIUnknown
  446. )
  447. {
  448.     *ppIUnknown = (IUnknown*)(IHXPlugin*)new HXRemoteLoggerPlugin;
  449.     if (*ppIUnknown)
  450.     {
  451.         (*ppIUnknown)->AddRef();
  452.         return HXR_OK;
  453.     }
  454.     return HXR_OUTOFMEMORY;
  455. }
  456. /****************************************************************************
  457.  * 
  458.  *  Function:
  459.  * 
  460.  *        CanUnload()
  461.  * 
  462.  *  Purpose:
  463.  * 
  464.  *        Function implemented by all plugin DLL's if it returns HXR_OK 
  465.  *        then the pluginhandler can unload the DLL
  466.  *
  467.  */
  468. STDAPI ENTRYPOINT(CanUnload2)(void)
  469. {
  470.     return HXR_FAIL;
  471. }