📄 gifvsrc.cpp
字号:
return HXR_UNEXPECTED; } HX_RESULT ret = HXR_OK; if ( SUCCEEDED(status) ) { HX_ASSERT(m_pViewSourceResponse != NULL); HX_ASSERT(m_pFileObject != NULL); m_ulFileSize = ulSize; m_ulModTime = ulModificationTime; // Now we read we only need the first 13 bytes - m_state = kStateReadPending; ret = m_pFileObject->Read(13); } else { m_state = kStateReady; ret = m_pViewSourceResponse->SourceReady(status, NULL); } return ret;}/************************************************************************ * Method: * IHXFileResponse::InitDone * Purpose: * Notification interface provided by users of the IHXFileObject * interface. This method is called by the IHXFileObject when the * initialization of the file is complete. */STDMETHODIMPCGIFViewSource::InitDone( HX_RESULT status ){ if ( m_state != kStateInitFilePending ) { return HXR_UNEXPECTED; } HX_ASSERT(m_pViewSourceResponse != NULL); m_state = kStateReady; return m_pViewSourceResponse->InitDone(status);}/************************************************************************ * Method: * IHXFileResponse::ReadDone * Purpose: * Notification interface provided by users of the IHXFileObject * interface. This method is called by the IHXFileObject when the * last read from the file is complete and a buffer is available. */STDMETHODIMPCGIFViewSource::ReadDone(HX_RESULT status, IHXBuffer* pBuffer){ if ( m_state != kStateReadPending ) { return HXR_UNEXPECTED; } HX_RESULT result = HXR_OK; HX_ASSERT(m_pViewSourceResponse != NULL); m_state = kStateReady; if ( SUCCEEDED(status) ) { // Have we read all we were supposed to? if (pBuffer->GetSize() == 13) { HX_RELEASE(m_pFileBuffer); m_pFileBuffer = pBuffer; m_pFileBuffer->AddRef(); IHXBuffer* pReturnBuffer = NULL; result = CreateInfoBuffer(pReturnBuffer); if ( SUCCEEDED(result) ) { result = m_pViewSourceResponse->SourceReady(HXR_OK, pReturnBuffer); } else { // don't like the File format result = m_pViewSourceResponse->SourceReady(result, NULL); } HX_RELEASE(pReturnBuffer); } else { result = m_pViewSourceResponse->SourceReady(HXR_FAIL, NULL); } } else { result = m_pViewSourceResponse->SourceReady(status, NULL); } return result;}/************************************************************************ * Method: * IHXFileResponse::WriteDone * Purpose: * Notification interface provided by users of the IHXFileObject * interface. This method is called by the IHXFileObject when the * last write to the file is complete. */STDMETHODIMPCGIFViewSource::WriteDone(HX_RESULT status){ // We don't ever write, so we don't expect to get this... return HXR_UNEXPECTED;}/************************************************************************ * Method: * IHXFileResponse::SeekDone * Purpose: * Notification interface provided by users of the IHXFileObject * interface. This method is called by the IHXFileObject when the * last seek in the file is complete. */STDMETHODIMPCGIFViewSource::SeekDone(HX_RESULT status){ return HXR_UNEXPECTED;}/************************************************************************ * Method: * IHXFileResponse::CloseDone * Purpose: * Notification interface provided by users of the IHXFileObject * interface. This method is called by the IHXFileObject when the * close of the file is complete. */STDMETHODIMPCGIFViewSource::CloseDone(HX_RESULT status){ return HXR_OK;}/************************************************************************ * Method: * CGIFViewSource::CreateInfoBuffer */STDMETHODIMP CGIFViewSource::CreateInfoBuffer(REF(IHXBuffer*) pBuffer){ char buf[128]; /* Flawfinder: ignore */ CGIFCodec::LogicalScreenDescriptor lsd; HX_RESULT ret = ParseGif(lsd); if ( FAILED(ret) ) { return ret; } CBigByteGrowingQueue queue(INITIAL_QUEUESIZE); queue.EnQueue(z_pOpen); sprintf(buf, z_pImage_ss, z_pGIFGif, z_pGIFGif); /* Flawfinder: ignore */ queue.EnQueue(buf); queue.EnQueue(z_pImageType); if ( m_bIsGIF89a ) { queue.EnQueue("GIF 89a Image"); } else { queue.EnQueue("GIF 87a Image"); } queue.EnQueue(z_pEndLine); queue.EnQueue(z_pFileName); const char* pFileName; m_pFileObject->GetFilename(pFileName); queue.EnQueue(pFileName); queue.EnQueue(z_pEndLine); QueueModificationTime(&queue, m_ulModTime); QueueFileSize(&queue, m_ulFileSize); sprintf(buf, z_pImageDimen_ii, lsd.m_ulLogicalScreenWidth, /* Flawfinder: ignore */ lsd.m_ulLogicalScreenHeight); queue.EnQueue(buf); queue.EnQueue(z_pEndLine); sprintf(buf, z_pColorTableBits_i, lsd.m_ulColorTableBits); /* Flawfinder: ignore */ queue.EnQueue(buf); queue.EnQueue(z_pEndLine); IHXBuffer* pRam = NULL; IHXBuffer* pCD = NULL; if (m_pViewSourceOptions && SUCCEEDED(m_pViewSourceOptions->GetPropertyCString("RamGenURL", pRam)) && SUCCEEDED(m_pViewSourceOptions->GetPropertyCString("CurrentPath", pCD)) ) { queue.EnQueue(z_pRamLink); queue.EnQueue("<a href =\""); queue.EnQueue((const char*)pRam->GetBuffer()); const char* p = (const char*)pCD->GetBuffer(); if ( *p == '/' ) { p++; } queue.EnQueue(p); queue.EnQueue("/"); const char* pFileName; m_pFileObject->GetFilename(pFileName); queue.EnQueue(pFileName); queue.EnQueue("\">"); queue.EnQueue((const char*)pRam->GetBuffer()); queue.EnQueue(p); queue.EnQueue("/"); queue.EnQueue(pFileName); queue.EnQueue("</a>"); queue.EnQueue(z_pEndLine); } HX_RELEASE(pRam); HX_RELEASE(pCD); queue.EnQueue((void*)z_pClose, strlen(z_pClose)); HX_RELEASE(pBuffer); m_pCommonClassFactory->CreateInstance(IID_IHXBuffer, (void**)&pBuffer); if ( !pBuffer ) { return HXR_OUTOFMEMORY; } if ( FAILED(pBuffer->SetSize(queue.GetQueuedItemCount())) ) { HX_RELEASE(pBuffer); return HXR_OUTOFMEMORY; } unsigned char* chr = pBuffer->GetBuffer(); queue.DeQueue(chr, queue.GetQueuedItemCount()); return HXR_OK;}/************************************************************************ * Method: * CGIFViewSource::ParseGif */STDMETHODIMPCGIFViewSource::ParseGif(REF(CGIFCodec::LogicalScreenDescriptor) lsd){ HX_RESULT retVal = HXR_OK; if ( m_pFileBuffer ) { // Get the buffer (this causes the initial gather) BYTE* pBuf = m_pFileBuffer->GetBuffer(); if (pBuf) { UINT32 ulBufSize = m_pFileBuffer->GetSize(); if ( ulBufSize < 13 ) { return HXR_FAIL; } BYTE *pBufLimit = pBuf + ulBufSize; /* Check the signature */ if (pBuf[0] != 'G' || pBuf[1] != 'I' || pBuf[2] != 'F') { return HXR_FAIL; } pBuf += 3; /* Check the version */ if (pBuf[0] == '8' && pBuf[1] == '9' && pBuf[2] == 'a') { m_bIsGIF89a = TRUE; } else if (pBuf[0] == '8' && pBuf[1] == '7' && pBuf[2] == 'a') { m_bIsGIF89a = FALSE; } else { return HXR_FAIL; } pBuf += 3; /* Get the logical screen descriptor */ CGIFCodec::ParseLogicalScreenDescriptor(pBuf, lsd); } else { retVal = HXR_FAIL; } } else { retVal = HXR_UNEXPECTED; } return retVal;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -