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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: dllpath.cpp,v 1.7.28.3 2004/07/09 01:44:03 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hlxclib/stdlib.h"
  50. #include "hlxclib/stdio.h"
  51. #include "dllpath.h"
  52. #include "hxdir.h"
  53. #ifdef _MACINTOSH
  54. #include "maclibrary.h"
  55. #endif
  56. #include "hxheap.h"
  57. #ifdef _DEBUG
  58. #undef HX_THIS_FILE
  59. static const char HX_THIS_FILE[] = __FILE__;
  60. #endif
  61. const char* const DLLAccessPath::zm_pszDllTypeNames[DLLTYPE_NUMBER] = 
  62. {
  63.     "DT_NotDef",              // Arbitrary DLLs 
  64.     "DT_Plugins",       // Plug-ins
  65.     "DT_Codecs",       // Codecs 
  66.     "DT_EncSDK",       // Encoder SDK DLLs
  67.     "DT_Common",       // Common libraries
  68.     "DT_Update_OB",       // Setup/Upgrade libraries
  69.     "DT_Objbrokr",       // Special entry for the object broker
  70.     "DT_RCAPlugins"       // Gemini plugins
  71. };
  72. DLLAccessPath::DLLAccessPath()
  73.     : m_lRefCount(0)
  74. {
  75. }
  76. DLLAccessPath::~DLLAccessPath()
  77. {
  78.     RestoreEnvironment();
  79. }
  80. /////////////////////////////////////////////////////////////////////////
  81. //  Method:
  82. // AddRef
  83. //  Purpose:
  84. // Everyone usually implements this the same... feel free to use
  85. // this implementation.
  86. //
  87. STDMETHODIMP_(ULONG32) DLLAccessPath::AddRef()
  88. {
  89.     return InterlockedIncrement(&m_lRefCount);
  90. }
  91. /////////////////////////////////////////////////////////////////////////
  92. //  Method:
  93. // Release
  94. //  Purpose:
  95. // Everyone usually implements this the same... feel free to use
  96. // this implementation.
  97. //
  98. STDMETHODIMP_(ULONG32) DLLAccessPath::Release()
  99. {
  100.     if (InterlockedDecrement(&m_lRefCount) > 0)
  101.     {
  102.         return m_lRefCount;
  103.     }
  104.     delete this;
  105.     return 0;
  106. }
  107. HX_RESULT 
  108. DLLAccessPath::SetAccessPaths(const char* pPathDescriptor)
  109. {
  110.     CHXString strNameValue;
  111.     HX_RESULT theError = HXR_OK;
  112.     
  113.     if(pPathDescriptor)
  114. strNameValue = pPathDescriptor;
  115.     while(theError == HXR_OK && !strNameValue.IsEmpty())
  116.     {
  117. int nIndex = strNameValue.Find('=');
  118. if(nIndex != -1)
  119. {
  120.     theError = SetPath(strNameValue.Left(nIndex), 
  121. strNameValue.Right(strNameValue.GetLength() - nIndex - 1));
  122. }
  123. pPathDescriptor += strNameValue.GetLength() + 1;
  124. strNameValue = pPathDescriptor;
  125.     }
  126.     return theError;
  127. }
  128. HX_RESULT 
  129. DLLAccessPath::SetPath(UINT16 nLibType, const char* szPath)
  130. {     
  131.     if(nLibType >= DLLTYPE_NUMBER)
  132. return HXR_FAILED;
  133.     return SetPath(zm_pszDllTypeNames[nLibType], szPath);
  134. }
  135. HX_RESULT 
  136. DLLAccessPath::SetPath(const char* szLibType, const char* szPath)
  137. {
  138.     if(szPath)
  139.     {
  140. CHXString strPath = szPath;
  141. if(!strPath.IsEmpty())
  142. {
  143. #ifdef _MACINTOSH
  144.          ResolveIndependentPath(strPath);
  145. #endif
  146.     if(strPath.GetAt(strPath.GetLength() - 1) != OS_SEPARATOR_CHAR)
  147. strPath += OS_SEPARATOR_STRING;
  148.     m_mapPathes.SetAt(szLibType, strPath);
  149. }
  150.     }
  151.     return HXR_OK;
  152. }
  153. const char* 
  154. DLLAccessPath::GetPath(UINT16 nLibType)
  155. {
  156.     if(nLibType >= DLLTYPE_NUMBER)
  157. return NULL;
  158.     return GetPath(zm_pszDllTypeNames[nLibType]);
  159. }
  160. const char* 
  161. DLLAccessPath::GetPath(const char* szLibType)
  162. {
  163.     CHXString strTemp;
  164.     if(!m_mapPathes.Lookup(szLibType, strTemp))
  165. return NULL;
  166.     return(const char*)m_mapPathes[szLibType];
  167. }
  168. HX_RESULT
  169. DLLAccessPath::PassDLLAccessPath(FPSETDLLACCESSPATH pSetDLLAccessPath)
  170. {
  171.     POSITION pos = m_mapPathes.GetStartPosition();
  172.     UINT32 nBufLength = 0;
  173.     while(pos)
  174.     {
  175. CHXString strLibType, strPath;
  176. m_mapPathes.GetNextAssoc(pos, strLibType, strPath);
  177. nBufLength += strLibType.GetLength() + strPath.GetLength() + 2;
  178.     }
  179.     if(!nBufLength)
  180. return HXR_OK;
  181.     nBufLength++;
  182.     char* pBuffer = new char[nBufLength];
  183.     if(!pBuffer)
  184. return HXR_FAILED;
  185.     pos = m_mapPathes.GetStartPosition();
  186.     UINT32 nPosition = 0;
  187.     while(pos)
  188.     {
  189. CHXString strLibType, strPath;
  190. m_mapPathes.GetNextAssoc(pos, strLibType, strPath);
  191. CHXString strEntry = strLibType + "=" + strPath;
  192.         UINT32 ulBytesToCopy = strEntry.GetLength() + 1;
  193. memcpy(pBuffer + nPosition, (const char*)strEntry, 
  194.             (ulBytesToCopy <= nBufLength - nPosition ? ulBytesToCopy : nBufLength - nPosition));
  195. nPosition += strEntry.GetLength() + 1;
  196.     }
  197.     pBuffer[nPosition] = 0;
  198.     HX_ASSERT(nPosition + 1 == nBufLength);
  199.     pSetDLLAccessPath(pBuffer);
  200.     delete[] pBuffer;
  201.     return HXR_OK;
  202. }
  203. HX_RESULT 
  204. DLLAccessPath::AddPathToEnvironment(const char* szPath)
  205. {
  206.     HX_RESULT theError = HXR_OK;
  207. #if !defined(_MACINTOSH) && !defined(WIN32_PLATFORM_PSPC)
  208.     if(szPath)
  209.     {
  210. char* pPathEnvVar = getenv("PATH");
  211. CHXString strPathEnvVar;
  212. if(pPathEnvVar)
  213.     strPathEnvVar = pPathEnvVar;
  214.     
  215. if(m_strPathEnvVar.IsEmpty())
  216.     m_strPathEnvVar = "PATH=" + strPathEnvVar;
  217. CHXString strResultPath = "PATH=";
  218. strResultPath += szPath;
  219. if(!strPathEnvVar.IsEmpty())
  220. {
  221.     strResultPath += ";";
  222.     strResultPath += strPathEnvVar;
  223. }
  224. #if defined (_AIX) || defined (_LINUX)
  225. {
  226.   char *ptr = (char *) ((const char *)strResultPath);
  227.   if(putenv(ptr))
  228.     theError = HXR_FAILED;
  229. }
  230. #elif defined (_SOLARIS)
  231. if(putenv((char *)(const char*)strResultPath))
  232.     theError = HXR_FAILED;
  233. #else
  234. if(putenv((const char *)strResultPath))
  235.     theError = HXR_FAILED;
  236. #endif
  237.     }
  238. #endif
  239.     return theError;
  240. }
  241. HX_RESULT 
  242. DLLAccessPath::RestoreEnvironment()
  243. {
  244.     HX_RESULT theError = HXR_OK;
  245. #if !defined(_MACINTOSH) && !defined(WIN32_PLATFORM_PSPC)
  246.     if(!m_strPathEnvVar.IsEmpty())
  247.     {
  248. #if defined(_AIX) || defined(_LINUX)
  249.       char *ptr = (char *)((const char *)m_strPathEnvVar);
  250. if(putenv(ptr))
  251.     theError = HXR_FAILED;
  252. #elif defined (_SOLARIS)
  253. if(putenv((char*)(const char *)m_strPathEnvVar))
  254.     theError = HXR_FAILED;
  255. #else
  256. if(putenv((const char *)m_strPathEnvVar))
  257.     theError = HXR_FAILED;
  258. #endif
  259. m_strPathEnvVar.Empty();
  260.     }
  261. #endif
  262.     return theError;
  263. }
  264. const char* 
  265. DLLAccessPath::GetLibTypeName(UINT16 nLibType)
  266. {
  267.     if(nLibType >= DLLTYPE_NUMBER)
  268. return NULL;
  269.     return zm_pszDllTypeNames[nLibType];
  270. }