wirefmgr.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,873 行 · 第 1/5 页
CPP
1,873 行
ulTimeStamp, // time stamp
0, // stream 0
HX_ASM_SWITCH_ON, // ASM flag
0); // ASM rule 0
if (SUCCEEDED(retVal))
{
// Assign the out parameters
HX_RELEASE(rpPacket);
rpPacket = pPacket;
rpPacket->AddRef();
}
}
HX_RELEASE(pPacket);
}
}
HX_RELEASE(pBuffer);
}
}
else
{
retVal = HXR_FAIL;
}
return retVal;
}
HX_RESULT PXWireFormatManager::GetNumCookies(IHXPacket* pPacket, REF(UINT32) rulNumCookies)
{
HX_RESULT retVal = HXR_FAIL;
if (pPacket)
{
IHXBuffer* pBuffer = pPacket->GetBuffer();
if (pBuffer)
{
BYTE* pBuf = pBuffer->GetBuffer();
UINT32 ulPacketType = 0;
UINT32 ulNumCookies = 0;
UnPack32(pBuf, ulPacketType);
UnPack32(pBuf, ulNumCookies);
if (ulPacketType == kPacketTypeCookie)
{
retVal = HXR_OK;
rulNumCookies = ulNumCookies;
}
}
HX_RELEASE(pBuffer);
}
return retVal;
}
HX_RESULT PXWireFormatManager::GetCookie(IHXPacket* pPacket, UINT32 ulIndex,
REF(IHXBuffer*) rpURL, REF(IHXBuffer*) rpBuffer)
{
HX_RESULT retVal = HXR_FAIL;
if (pPacket)
{
IHXBuffer* pBuffer = pPacket->GetBuffer();
if (pBuffer)
{
BYTE* pBuf = pBuffer->GetBuffer();
UINT32 ulPacketType = 0;
UINT32 ulNumCookies = 0;
UnPack32(pBuf, ulPacketType);
UnPack32(pBuf, ulNumCookies);
if (ulPacketType == kPacketTypeCookie &&
ulIndex < ulNumCookies)
{
// Advance up to the proper cookie
UINT32 ulURLSize = 0;
UINT32 ulCookieSize = 0;
for (UINT32 i = 0; i < ulIndex; i++)
{
UnPack32(pBuf, ulURLSize);
pBuf += ulURLSize;
UnPack32(pBuf, ulCookieSize);
pBuf += ulCookieSize;
}
// Get the size of the URL
UnPack32(pBuf, ulURLSize);
// Get the offset of the URL
UINT32 ulURLOffset = pBuf - pBuffer->GetBuffer();
// Advance to the cookie
pBuf += ulURLSize;
// Create a nested buffer class
CHXNestedBuffer *pNestedURLBuffer = NULL;
retVal = CHXNestedBuffer::CreateObject(&pNestedURLBuffer);
if (SUCCEEDED(retVal))
{
// Addref the object
pNestedURLBuffer->AddRef();
// Init the object
retVal = pNestedURLBuffer->Init(pBuffer, ulURLOffset, ulURLSize);
if (SUCCEEDED(retVal))
{
// Get the size of the cookie
UnPack32(pBuf, ulCookieSize);
// Get the offset of this cookie
UINT32 ulCookieOffset = pBuf - pBuffer->GetBuffer();
// Create a nested buffer class
CHXNestedBuffer *pNestedCookieBuffer = NULL;
retVal = CHXNestedBuffer::CreateObject(&pNestedCookieBuffer);
if (SUCCEEDED(retVal))
{
// Addref the object
pNestedCookieBuffer->AddRef();
// Init the object
retVal = pNestedCookieBuffer->Init(pBuffer, ulCookieOffset, ulCookieSize);
if (SUCCEEDED(retVal))
{
// Assign the nested buffer to the out parameter
HX_RELEASE(rpURL);
retVal = pNestedURLBuffer->QueryInterface(IID_IHXBuffer, (void**) &rpURL);
if (SUCCEEDED(retVal))
{
HX_RELEASE(rpBuffer);
retVal = pNestedCookieBuffer->QueryInterface(IID_IHXBuffer, (void**) &rpBuffer);
}
}
}
HX_RELEASE(pNestedCookieBuffer);
}
}
HX_RELEASE(pNestedURLBuffer);
}
}
HX_RELEASE(pBuffer);
}
return retVal;
}
HX_RESULT PXWireFormatManager::SetNoOpInfo(UINT32 ulSize, UINT32 ulTimeStamp, REF(IHXPacket*) rpPacket)
{
HX_RESULT retVal = HXR_FAIL;
if (ulSize >= 4)
{
IHXBuffer* pBuffer = NULL;
retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void**) &pBuffer);
if (SUCCEEDED(retVal))
{
retVal = pBuffer->SetSize(ulSize);
if (SUCCEEDED(retVal))
{
BYTE* pBuf = pBuffer->GetBuffer();
Pack32(pBuf, 0xFFFFFFFF);
IHXPacket* pPacket = NULL;
retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXPacket, (void**) &pPacket);
if (SUCCEEDED(retVal))
{
// Set the packet parameters
retVal = pPacket->Set(pBuffer, // opaque data
ulTimeStamp, // time stamp
0, // stream 0
HX_ASM_SWITCH_ON, // ASM flag
0); // ASM rule 0
if (SUCCEEDED(retVal))
{
// Assign the out parameters
HX_RELEASE(rpPacket);
rpPacket = pPacket;
rpPacket->AddRef();
}
}
HX_RELEASE(pPacket);
}
}
HX_RELEASE(pBuffer);
}
return retVal;
}
HX_RESULT PXWireFormatManager::GetBackChannelInfo(IHXPacket* pPacket, REF(UINT32) rulHandle,
REF(UINT32) rulTimeStopped)
{
HX_RESULT retVal = HXR_FAIL;
if (pPacket)
{
IHXBuffer* pBuffer = pPacket->GetBuffer();
if (pBuffer)
{
BYTE* pBuf = pBuffer->GetBuffer();
if (pBuf)
{
UINT32 ulOpCode = UnPackUINT32(pBuf);
if (ulOpCode == 0x34414453) // "4ADS"
{
rulHandle = UnPackUINT32(pBuf);
rulTimeStopped = UnPackUINT32(pBuf);
retVal = HXR_OK;
}
}
}
HX_RELEASE(pBuffer);
}
return retVal;
}
HX_RESULT PXWireFormatManager::SetBackChannelInfo(UINT32 ulHandle, UINT32 ulTimeStopped,
REF(IHXPacket*) rpPacket)
{
HX_RESULT retVal = HXR_OK;
if (ulHandle)
{
IHXBuffer* pBuffer = NULL;
retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,
(void**) &pBuffer);
if (SUCCEEDED(retVal))
{
retVal = pBuffer->SetSize(12);
if (SUCCEEDED(retVal))
{
// Pack the opaque buffer
BYTE* pBuf = pBuffer->GetBuffer();
PackUINT32(pBuf, 0x34414453);
PackUINT32(pBuf, ulHandle);
PackUINT32(pBuf, ulTimeStopped);
// Create the packet
IHXPacket* pPacket = NULL;
retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXPacket,
(void**) &pPacket);
if (SUCCEEDED(retVal))
{
// Set the packet parameters
retVal = pPacket->Set(pBuffer, // opaque data
0, // time stamp
0, // stream 0
HX_ASM_SWITCH_OFF, // ASM flag
0); //
if (SUCCEEDED(retVal))
{
// Pass the packet back
HX_RELEASE(rpPacket);
rpPacket = pPacket;
rpPacket->AddRef();
}
}
HX_RELEASE(pPacket);
}
}
HX_RELEASE(pBuffer);
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
UINT32 PXWireFormatManager::GetEffectWireSize(PXEffect* pEffect)
{
UINT32 ulRet = 0;
if (pEffect)
{
ulRet += pEffect->PackedSize(HX_GET_MAJOR_VERSION(m_ulStreamVersion),
HX_GET_MINOR_VERSION(m_ulStreamVersion));
ulRet += kIHXPacketOverhead;
}
return ulRet;
}
UINT32 PXWireFormatManager::GetImageWireSize(IHXBuffer* pStreamMimeStr, UINT32 ulImageFileSize)
{
UINT32 ulRet = 0;
if (pStreamMimeStr && ulImageFileSize)
{
// First we add the image header packet
//
// Add fixed size of image header packet
ulRet += 18;
// Add stream mime type string length of image header packet
UINT32 ulMimeLen = strlen((const char*) pStreamMimeStr->GetBuffer());
if (ulMimeLen)
{
ulRet += ulMimeLen + 1;
}
// Add the IHXPacket overhead of the image header packet
ulRet += kIHXPacketOverhead;
// Now we make a worst-case estimate of the number of packets
// for this image.
UINT32 ulWorstCaseNumPackets = (ulImageFileSize + kMinImageDataPacketSize - 1) / kMinImageDataPacketSize;
// Now, based on this estimated number of packets we can
// compute the overhead
UINT32 ulWorstCaseOverhead = (kIHXPacketOverhead + 8 + GetOpaqueSize((const char*) pStreamMimeStr->GetBuffer())) *
ulWorstCaseNumPackets;
// Now add the wire size for the image data packets - this
// is the file size plus the worst case overhead
ulRet += ulImageFileSize;
ulRet += ulWorstCaseOverhead;
}
return ulRet;
}
UINT32 PXWireFormatManager::GetPacketSize(IHXPacket* pPacket)
{
UINT32 ulSize = 0;
if (pPacket)
{
IHXBuffer* pBuffer = pPacket->GetBuffer();
if (pBuffer)
{
ulSize = pBuffer->GetSize();
}
HX_RELEASE(pBuffer);
}
return ulSize;
}
UINT32 PXWireFormatManager::GetOpaqueSize(const char* pszMimeType)
{
UINT32 ulRetVal = kDefaultOpaqueSize;
if (m_pMapMimeToOpaqueSize)
{
void *pVoid = NULL;
if (m_pMapMimeToOpaqueSize->Lookup(pszMimeType, pVoid))
{
ulRetVal = (UINT32) pVoid;
}
}
return ulRetVal;
}
void PXWireFormatManager::ReleaseAllCodecMimes()
{
if (m_pCodecMimeList)
{
LISTPOSITION pos = m_pCodecMimeList->GetHeadPosition();
while (pos)
{
IHXBuffer* pBuffer = (IHXBuffer*) m_pCodecMimeList->GetNext(pos);
HX_RELEASE(pBuffer);
}
m_pCodecMimeList->RemoveAll();
}
}
void PXWireFormatManager::ReleaseAllFXPackageMimes()
{
if (m_pFXPackageMimeList)
{
LISTPOSITION pos = m_pFXPackageMimeList->GetHeadPosition();
while (pos)
{
IHXBuffer* pBuffer = (IHXBuffer*) m_pFXPackageMimeList->GetNext(pos);
HX_RELEASE(pBuffer);
}
m_pFXPackageMimeList->RemoveAll();
}
}
void PXWireFormatManager::Deallocate()
{
HX_RELEASE(m_pContext);
HX_RELEASE(m_pCommonClassFactory);
HX_RELEASE(m_pTitleStr);
HX_RELEASE(m_pAuthorStr);
HX_RELEASE(m_pCopyrightStr);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?