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

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : HttpMimeManager.cpp
  3. Purpose: Implementation for the Mime Manager classes
  4. Created: PJN / 22-04-1999
  5. History: None
  6. Copyright (c) 1999 - 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 "HttpMimeManager.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. CRegistryHttpMimeManager::CRegistryHttpMimeManager()
  26. {
  27. }
  28. CRegistryHttpMimeManager::~CRegistryHttpMimeManager()
  29. {
  30. }
  31. CString CRegistryHttpMimeManager::GetMimeType(const CHttpRequest& request)
  32. {
  33.   //Get the extension of the local file the request maps to
  34.   TCHAR pszExt[_MAX_EXT];
  35.   _tsplitpath(request.m_sLocalFile, NULL, NULL, NULL, pszExt);
  36.   //Validate our parameters
  37.   CString sExtension(pszExt);
  38.   ASSERT(sExtension.GetLength());
  39.   ASSERT(sExtension.GetAt(0) == _T('.'));
  40.   //Prevent the string arrays from being manipulated
  41.   //by multiple threads at the one time
  42.   CSingleLock sl(&m_CS, TRUE);
  43.   //Make a local copy because we may be modifying it
  44.   CString sTemp(sExtension);
  45.   //Remove the leading "." if any
  46.   if (sTemp.Find(_T('.')) == 0)
  47.     sTemp = sTemp.Right(sTemp.GetLength() - 1);
  48.   //Make it upper case
  49.   sTemp.MakeUpper();
  50.   //Lookup in the hash table first
  51.   CString sMimeType;
  52.   if (!m_sMimeMap.Lookup(sTemp, sMimeType))
  53.   {
  54.     //Open the specified key
  55.     HKEY hItem;
  56.     if (RegOpenKeyEx(HKEY_CLASSES_ROOT, sExtension, 0, KEY_READ, &hItem) == ERROR_SUCCESS)
  57.     { 
  58.       //Query the key for the content type
  59.       TCHAR sPath[_MAX_PATH];
  60.       DWORD dwSize = _MAX_PATH;
  61.       DWORD dwType = REG_SZ;
  62.       if (RegQueryValueEx(hItem, _T("Content Type"), NULL, &dwType, (LPBYTE) sPath, &dwSize) == ERROR_SUCCESS)
  63.       {
  64.         sMimeType = sPath;
  65.         //Add to the cache so that we do not have to do the registry lookup again
  66.         m_sMimeMap.SetAt(sTemp, sMimeType);
  67.       }
  68.       else
  69.         sMimeType = _T("application/octet-stream");
  70.       //Don't forget to close our key
  71.       RegCloseKey(hItem);
  72.     }
  73.   }
  74.   return sMimeType;
  75. }
  76. CIniHttpMimeManager::CIniHttpMimeManager()
  77. {
  78. }
  79. CIniHttpMimeManager::~CIniHttpMimeManager()
  80. {
  81. }
  82. void CIniHttpMimeManager::FullArraysFromMultiSZString(LPTSTR pszString)
  83. {
  84.   //First work out how many strings there are in the multi sz string
  85.   int nStrings = 0;
  86.   LPTSTR pszCurrentString = pszString;
  87.   while (pszCurrentString[0] != _T(''))
  88.   {
  89.     ++nStrings;
  90.     pszCurrentString += (_tcslen(pszCurrentString) + 1);
  91.   }
  92.   //Initialize the hash table
  93.   m_sMimeMap.InitHashTable(7929); //7929 is prime
  94.   //Set each array element's value
  95.   pszCurrentString = pszString;
  96.   for (long i=1; i<=nStrings; i++)
  97.   {
  98.     CString sCurrentString(pszCurrentString);
  99.     int nEquals = sCurrentString.Find(_T('='));
  100.     if (nEquals != -1)
  101.     {
  102.       //Form the key and value to add to the hash table
  103.       CString sKey = sCurrentString.Left(nEquals);
  104.       sKey.MakeUpper();
  105.       CString sValue = sCurrentString.Right(sCurrentString.GetLength() - nEquals - 1);
  106.       //Add to the hash table
  107.       m_sMimeMap.SetAt(sKey, sValue);
  108.     }
  109.     //Move on to the next string
  110.     pszCurrentString += (_tcslen(pszCurrentString) + 1);
  111.   }
  112. }
  113. int CIniHttpMimeManager::Initialize(const CString& sIniPath, const CString& sSection)
  114. {
  115.   DWORD dwSize = 1024;
  116.   BOOL bSuccess = FALSE;
  117.   while (!bSuccess)
  118.   {
  119.     //Allocate some heap memory for the SDK call
  120.     LPTSTR pszKeyValues = new TCHAR[dwSize];
  121.     //Call the SDK function
  122.     DWORD dwRetreived = GetPrivateProfileSection(sSection, pszKeyValues, dwSize, sIniPath);
  123.     if (dwRetreived == (dwSize - 2))
  124.     {
  125.       //Realloc the array by doubling its size ready for the next loop around
  126.       delete [] pszKeyValues;
  127.       dwSize *= 2;
  128.     }
  129.     else if (dwRetreived == 0)
  130.     {
  131.       //Tidy up the heap memory we have used
  132.       delete [] pszKeyValues;
  133.       bSuccess = TRUE;
  134.     }
  135.     else
  136.     {
  137.       //Flesh out our internal arrays from the multi sz string
  138.       FullArraysFromMultiSZString(pszKeyValues);
  139.       //Tidy up the heap memory we have used
  140.       delete [] pszKeyValues;
  141.       bSuccess = TRUE;
  142.     }
  143.   }
  144.   return m_sMimeMap.GetCount();
  145. }
  146. CString CIniHttpMimeManager::GetMimeType(const CHttpRequest& request)
  147. {
  148.   //what will be the return value
  149.   CString sMimeType(_T("application/octet-stream"));
  150.   //Get the extension of the local file the request maps to
  151.   TCHAR pszExt[_MAX_EXT];
  152.   _tsplitpath(request.m_sLocalFile, NULL, NULL, NULL, pszExt);
  153.   if (_tcslen(pszExt))
  154.   {
  155.     //Validate our parameters
  156.     CString sExtension(pszExt);
  157.     ASSERT(sExtension.GetLength());
  158.     ASSERT(sExtension.GetAt(0) == _T('.'));
  159.     //Prevent the string arrays from being manipulated
  160.     //by multiple threads at the one time
  161.     CSingleLock sl(&m_CS, TRUE);
  162.     //Make a local copy because we may be modifying it
  163.     CString sTemp(sExtension);
  164.     //Remove the leading "." if any
  165.     if (sTemp.Find(_T('.')) == 0)
  166.       sTemp = sTemp.Right(sTemp.GetLength() - 1);
  167.     //Make it upper case
  168.     sTemp.MakeUpper();
  169.     //Lookup in the hash table
  170.     m_sMimeMap.Lookup(sTemp, sMimeType);
  171.   }
  172.   return sMimeType;
  173. }