HttpISAPIManager.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:4k
源码类别:

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : HttpISAPIManager.cpp
  3. Purpose: Implementation for the Mime Manager classes
  4. Created: PJN / 23-02-2003
  5. History: None                    
  6. Copyright (c) 2003 - 2005 by PJ Naughter.  
  7. All rights reserved.
  8. Copyright / Usage Details:
  9. You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
  10. when your product is released in binary form. You are allowed to modify the source code in any way you want 
  11. except you cannot modify the copyright details at the top of each module. If you want to distribute source 
  12. code with your application, then you are only allowed to distribute versions released by the author. This is 
  13. to maintain a single distribution point for the source code. 
  14. */
  15. //////////////// Includes ////////////////////////////////////////////
  16. #include "stdafx.h"
  17. #include "HttpISAPIManager.h"
  18. //////////////// Macros //////////////////////////////////////////////
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. //////////////// Implementation //////////////////////////////////////
  25. CIniHttpISAPIManager::CIniHttpISAPIManager()
  26. {
  27. }
  28. CIniHttpISAPIManager::~CIniHttpISAPIManager()
  29. {
  30. }
  31. void CIniHttpISAPIManager::FullArraysFromMultiSZString(LPTSTR pszString)
  32. {
  33.   //First work out how many strings there are in the multi sz string
  34.   int nStrings = 0;
  35.   LPTSTR pszCurrentString = pszString;
  36.   while (pszCurrentString[0] != _T(''))
  37.   {
  38.     ++nStrings;
  39.     pszCurrentString += (_tcslen(pszCurrentString) + 1);
  40.   }
  41.   //Initialize the hash table
  42.   m_sExtensionMap.InitHashTable(7929); //7929 is prime
  43.   //Set each array element's value
  44.   pszCurrentString = pszString;
  45.   for (long i=1; i<=nStrings; i++)
  46.   {
  47.     CString sCurrentString(pszCurrentString);
  48.     int nEquals = sCurrentString.Find(_T('='));
  49.     if (nEquals != -1)
  50.     {
  51.       //Form the key and value to add to the hash table
  52.       CString sKey = sCurrentString.Left(nEquals);
  53.       sKey.MakeUpper();
  54.       CString sValue = sCurrentString.Right(sCurrentString.GetLength() - nEquals - 1);
  55.       //Add to the hash table
  56.       m_sExtensionMap.SetAt(sKey, sValue);
  57.     }
  58.     //Move on to the next string
  59.     pszCurrentString += (_tcslen(pszCurrentString) + 1);
  60.   }
  61. }
  62. int CIniHttpISAPIManager::Initialize(const CString& sIniPath, const CString& sSection)
  63. {
  64.   DWORD dwSize = 1024;
  65.   BOOL bSuccess = FALSE;
  66.   while (!bSuccess)
  67.   {
  68.     //Allocate some heap memory for the SDK call
  69.     LPTSTR pszKeyValues = new TCHAR[dwSize];
  70.     //Call the SDK function
  71.     DWORD dwRetreived = GetPrivateProfileSection(sSection, pszKeyValues, dwSize, sIniPath);
  72.     if (dwRetreived == (dwSize - 2))
  73.     {
  74.       //Realloc the array by doubling its size ready for the next loop around
  75.       delete [] pszKeyValues;
  76.       dwSize *= 2;
  77.     }
  78.     else if (dwRetreived == 0)
  79.     {
  80.       //Tidy up the heap memory we have used
  81.       delete [] pszKeyValues;
  82.       bSuccess = TRUE;
  83.     }
  84.     else
  85.     {
  86.       //Flesh out our internal arrays from the multi sz string
  87.       FullArraysFromMultiSZString(pszKeyValues);
  88.       //Tidy up the heap memory we have used
  89.       delete [] pszKeyValues;
  90.       bSuccess = TRUE;
  91.     }
  92.   }
  93.   return m_sExtensionMap.GetCount();
  94. }
  95. CString CIniHttpISAPIManager::GetISAPIExtension(const CHttpRequest& request)
  96. {
  97.   //What will be the return value
  98.   CString sFile;
  99.   //Get the extension of the URL of the request
  100.   TCHAR pszExt[_MAX_EXT];
  101.   _tsplitpath(request.m_sLocalFile, NULL, NULL, NULL, pszExt);
  102.   if (_tcslen(pszExt))
  103.   {
  104.     //Validate our parameters
  105.     CString sExtension(pszExt);
  106.     ASSERT(sExtension.GetLength());
  107.     ASSERT(sExtension.GetAt(0) == _T('.'));
  108.     //Prevent the string arrays from being manipulated
  109.     //by multiple threads at the one time
  110.     CSingleLock sl(&m_CS, TRUE);
  111.     //Make a local copy because we may be modifying it
  112.     CString sTemp(sExtension);
  113.     //Remove the leading "." if any
  114.     if (sTemp.Find(_T('.')) == 0)
  115.       sTemp = sTemp.Right(sTemp.GetLength() - 1);
  116.     //Make it upper case
  117.     sTemp.MakeUpper();
  118.     //Lookup in the hash table
  119.     if (!m_sExtensionMap.Lookup(sTemp, sFile))
  120.     {
  121.       //if we could not find it in the map then
  122.       //return the local file itself (if its
  123.       //extension is a DLL)
  124.       if (sExtension.CompareNoCase(_T(".DLL")) == 0)
  125.         sFile = request.m_sLocalFile;
  126.     }
  127.   }
  128.   return sFile;
  129. }