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

Symbian

开发平台:

C/C++

  1. #include "ihxpckts.h"
  2. #include "hxbuffer.h"
  3. #include "recognizer.h"
  4. #if !defined (_SYMBIAN)
  5. HX_RESULT CHXFileRecognizer::GetMimeType(const char* pFileName, IHXBuffer* pBuffer, REF(IHXBuffer*) pMimeType)
  6. {
  7.     if (IsSDPFile(pBuffer))
  8.     {
  9.         // convert descriptor MIME type to IHXBuffer
  10.         pMimeType = new CHXBuffer;
  11.         if (pMimeType)
  12.         {
  13.             pMimeType->AddRef();
  14.             int len = strlen("application/sdp");
  15.     pMimeType->Set((const UCHAR*)"application/sdp", len + 1);
  16.     ((char*)pMimeType->GetBuffer())[len] = '';
  17.     return HXR_OK;
  18.         }
  19.     }
  20.     return HXR_FAILED;
  21. }
  22. #endif
  23. BOOL
  24. CHXFileRecognizer::IsSDPFile(IHXBuffer* pBuffer)
  25. {
  26.     BOOL bResult = FALSE;
  27.     if (pBuffer && pBuffer->GetSize())
  28.     {
  29.         if (0 == strncmp((const char*)pBuffer->GetBuffer(), "v=", 2))
  30.         {
  31.             bResult = TRUE;
  32.         }
  33.     }
  34.     return bResult;
  35. }
  36. // length of buffer read from file and passed to recognizer
  37. static const int KRecogLength = 512;
  38. CHXFileRecognizer::CHXFileRecognizer()
  39.     : m_lRefCount(0),
  40.       m_pFile(NULL),
  41.       m_pResponse(NULL),
  42.       m_pBuffer(NULL),
  43.       m_bGetMimeTypeDone(FALSE)
  44. {
  45. }
  46. CHXFileRecognizer::~CHXFileRecognizer()
  47. {
  48.     HX_RELEASE(m_pBuffer);
  49.     HX_RELEASE(m_pResponse);
  50.     HX_RELEASE(m_pFile);
  51. }
  52. STDMETHODIMP CHXFileRecognizer::QueryInterface(REFIID riid, void** ppvObj)
  53. {
  54.     HX_RESULT ret = HXR_OK;
  55.     if (IsEqualIID(riid, IID_IHXFileRecognizer))
  56.     {
  57. AddRef();
  58. *ppvObj = (IHXFileRecognizer*)this;
  59.     }
  60.     else if (IsEqualIID(riid, IID_IHXFileResponse))
  61.     {
  62. AddRef();
  63. *ppvObj = (IHXFileResponse*)this;
  64.     }
  65.     else if (IsEqualIID(riid, IID_IUnknown))
  66.     {
  67. AddRef();
  68. *ppvObj = this;
  69.     }
  70.     else
  71.     {
  72. *ppvObj = NULL;
  73. ret = HXR_NOINTERFACE;
  74.     }
  75.     return ret;
  76. }
  77. STDMETHODIMP_(ULONG32) CHXFileRecognizer::AddRef()
  78. {
  79.     return InterlockedIncrement(&m_lRefCount);
  80. }
  81. STDMETHODIMP_(ULONG32) CHXFileRecognizer::Release()
  82. {
  83.     if (InterlockedDecrement(&m_lRefCount) > 0)
  84.     {
  85.         return m_lRefCount;
  86.     }
  87.     delete this;
  88.     return 0;
  89. }
  90. STDMETHODIMP CHXFileRecognizer::GetMimeType(IHXFileObject* /*IN*/ pFile, 
  91.     IHXFileRecognizerResponse* /*IN*/ pRecognizerResponse)
  92. {
  93.     HX_RESULT ret = HXR_FAIL;
  94.     if (pRecognizerResponse)
  95.     {
  96. m_pResponse = pRecognizerResponse;
  97. m_pResponse->AddRef();
  98.     }
  99.     
  100.     // get our own IHXFileResponse interface
  101.     IHXFileResponse* pFileResponse = NULL;
  102.     ret = QueryInterface(IID_IHXFileResponse, (void**) &pFileResponse);
  103.     if (SUCCEEDED(ret) && pFileResponse && pFile != NULL)
  104.     {
  105. m_pFile = pFile;
  106. m_pFile->AddRef();
  107.     
  108.         m_pFile->Init(HX_FILE_READ | HX_FILE_BINARY, pFileResponse);
  109.     }
  110.     if (FAILED(ret) && m_pResponse)
  111.     {
  112. m_pResponse->GetMimeTypeDone(HXR_FAIL, NULL);
  113.     }
  114.     
  115.     HX_RELEASE(pFileResponse);
  116.     return ret;
  117. }
  118. STDMETHODIMP CHXFileRecognizer::InitDone(HX_RESULT status)
  119. {
  120.     if (SUCCEEDED(status))
  121.     {
  122. status = m_pFile->Read(KRecogLength);
  123.     }
  124.     if (FAILED(status) && m_pResponse)
  125.     {
  126. m_pResponse->GetMimeTypeDone(status, NULL);
  127.     }
  128.     return HXR_OK;
  129. }
  130. STDMETHODIMP CHXFileRecognizer::SeekDone(HX_RESULT /* status */)
  131. {
  132.     if (!m_bGetMimeTypeDone)
  133.     {
  134.         DoFileRecognize();
  135.         HX_RELEASE(m_pBuffer);
  136.     }
  137.     return HXR_OK;
  138. }
  139. STDMETHODIMP CHXFileRecognizer::ReadDone(HX_RESULT status,
  140.  IHXBuffer* pBuffer)
  141. {
  142.     if (FAILED(status) && m_pResponse)
  143.     {
  144. m_pResponse->GetMimeTypeDone(HXR_FAIL, NULL);
  145.     }
  146.     else
  147.     {
  148.         HX_ASSERT(!m_pBuffer);
  149.         m_pBuffer = pBuffer;
  150.         HX_ADDREF(m_pBuffer);
  151.  
  152.          // seek back to the beginning of the file
  153.          // since the same file object will be passed to the file format
  154.         if (HXR_OK != m_pFile->Seek(0, FALSE) &&
  155.             !m_bGetMimeTypeDone)
  156.         {
  157.             DoFileRecognize();
  158.             HX_RELEASE(m_pBuffer);
  159.         }
  160.     }
  161.     return HXR_OK;
  162. }
  163. STDMETHODIMP CHXFileRecognizer::WriteDone(HX_RESULT /* status */)
  164. {
  165.     return HXR_OK;
  166. }
  167. STDMETHODIMP CHXFileRecognizer::CloseDone(HX_RESULT /* status */)
  168. {
  169.     return HXR_OK;
  170. }
  171. void
  172. CHXFileRecognizer::DoFileRecognize(void)
  173. {
  174.     HX_RESULT   ret = HXR_OK;
  175.     IHXBuffer*  pMimeType = NULL;
  176.     const char* pFileName = NULL;
  177.     m_bGetMimeTypeDone = TRUE;
  178.     if (m_pFile)
  179. m_pFile->GetFilename(pFileName);
  180.     ret = GetMimeType(pFileName, m_pBuffer, pMimeType);
  181.     if (SUCCEEDED(ret) && 
  182. pMimeType && 
  183. pMimeType->GetSize() > 0 && 
  184. m_pResponse)
  185.     {
  186. m_pResponse->GetMimeTypeDone(HXR_OK, pMimeType);
  187.     }
  188.     else
  189.     {
  190. m_pResponse->GetMimeTypeDone(HXR_FAIL, NULL);
  191.     }
  192.     HX_RELEASE(pMimeType);
  193. }