blob: 243344efda72bc4a1a696c6103b9eea22b00a6fb [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "pvdl_config_file.h"
#include "pvmf_protocolengine_node_tunables.h"
#define PVDLCONFIGFILE_VECTOR_RESERVE_NUMBER 4
#define PVDLCONFIGFILE_TEMPORARY_BUFFER_SIZE 4096
#define PVDLCONFIGFILE_FIXED_HEADER_SIZE 100 // 96+4
#define PVDLCONFIGFILE_FILE_CACHE_BUFFER_SIZE 1024
OSCL_EXPORT_REF PVDlCfgFile::PVDlCfgFile()
: iTmpBuf(NULL)
, iFile(NULL)
, iProxyPort(0)
, iMaxAllowedFileSize(0)
, iOverallFileSize(0)
, iCurrentFileSize(0)
, iHasContentLength(1)
, iConnectTimeout(0)
, iSendTimeout(0)
, iRecvTimeout(0)
, iRangeStartTime(0)
, iMagic32(0x4a6a446c)
, iVersion(1)
, iFlag(0)
, iTotalFixedHeaderSize(PVDLCONFIGFILE_FIXED_HEADER_SIZE)
, PVDL_CFG_FILE_CACHE_BUF(PVDLCONFIGFILE_FILE_CACHE_BUFFER_SIZE)
, iLogger(NULL)
, bIsNewSession(true)
, iHttpVersionNum(PDL_HTTP_VERSION_NUMBER) // assume 0 => Http 1.0 ; 1 => Http 1.1
, iDisableHeadRequest(false)
{
int32 err;
OSCL_TRY(err,
iFileServer.Connect();
iTmpBuf = OSCL_ARRAY_NEW(uint8, iTotalFixedHeaderSize);
iLogger = PVLogger::GetLoggerObject("PVDlCfgFile");
iExtensionHeaderKeys.reserve(PVDLCONFIGFILE_VECTOR_RESERVE_NUMBER);
iExtensionHeaderValues.reserve(PVDLCONFIGFILE_VECTOR_RESERVE_NUMBER);
iMethodMaskForExtensionHeaders.reserve(PVDLCONFIGFILE_VECTOR_RESERVE_NUMBER);
iExtensionHeadersPurgeOnRedirect.reserve(PVDLCONFIGFILE_VECTOR_RESERVE_NUMBER);
);
if (err != OsclErrNone)
{
OSCL_LEAVE(err);
}
}
OSCL_EXPORT_REF PVDlCfgFile::~PVDlCfgFile()
{
//SaveConfig();
if (iTmpBuf)
{
//OSCL_ARRAY_DELETE(iTmpBuf);
OSCL_ARRAY_DELETE(iTmpBuf);
iTmpBuf = NULL;
}
if (iFile)
{
iFile->Flush();
iFile->Close();
OSCL_DELETE(iFile);
iFile = NULL;
}
iFileServer.Close();
iExtensionHeaderKeys.clear();
iExtensionHeaderValues.clear();
iExtensionHeadersPurgeOnRedirect.clear();
}
void PVDlCfgFile::SetDownloadType(bool aIsFastTrack)
{
if (aIsFastTrack)
{
iFlag |= 0x1;
}
else
{
iFlag &= (~0x1);
}
}
bool PVDlCfgFile::IsFastTrack(void)
{
return (iFlag & 0x1);
}
void PVDlCfgFile::SetDonwloadComplete(void)
{
iFlag |= 0x2;
}
void PVDlCfgFile::SetPlaybackMode(TPVDLPlaybackMode aPlaybackMode)
{
iFlag &= (~0xC); //clear
uint32 playbackModeBit = OSCL_STATIC_CAST(uint32, aPlaybackMode);
iFlag |= (playbackModeBit << 2);
}
PVDlCfgFile::TPVDLPlaybackMode PVDlCfgFile::GetPlaybackMode(void)
{
return OSCL_STATIC_CAST(TPVDLPlaybackMode, ((iFlag & 0xC) >> 2));
}
OSCL_EXPORT_REF bool PVDlCfgFile::SaveConfig(void)
{
if (iConfigFileName.get_size() <= 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
if (iFile)
{
iFile->Close();
}
else
{
int32 err;
OSCL_TRY(err, iFile = OSCL_NEW(Oscl_File, (PVDL_CFG_FILE_CACHE_BUF)););
if ((err != OsclErrNone) || (iFile == NULL))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVDlCfgFile::SaveConfig() OSCL_NEW ERROR. line %d ", __LINE__));
return false;
}
}
int32 retval = iFile->Open(iConfigFileName.get_cstr(), Oscl_File::MODE_READWRITE | Oscl_File::MODE_BINARY, iFileServer);
if (retval)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
//fixed len part
composeFixedHeader(iTmpBuf);
int32 tmpRet = iFile->Write(iTmpBuf, 1, iTotalFixedHeaderSize);
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
//var len part
uint8 *tmpBuf = iTmpBuf;
if (iSelectedTrackIDs.size())
{
for (int32 i = iSelectedTrackIDs.size() - 1; i >= 0; i--)
{//Track ID should only use one byte.
*tmpBuf++ = OSCL_STATIC_CAST(uint8, iSelectedTrackIDs[i]);
}
tmpRet = iFile->Write(iTmpBuf, 1, iSelectedTrackIDs.size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iUrl.get_size())
{
tmpRet = iFile->Write(iUrl.get_str(), 1, iUrl.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iProxyName.get_size())
{
tmpRet = iFile->Write(iProxyName.get_str(), 1, iProxyName.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iPlayerVersion.get_size())
{
tmpRet = iFile->Write(iPlayerVersion.get_str(), 1, iPlayerVersion.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iUserAgent.get_size())
{
tmpRet = iFile->Write(iUserAgent.get_str(), 1, iUserAgent.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iUserNetwork.get_size())
{
tmpRet = iFile->Write(iUserNetwork.get_str(), 1, iUserNetwork.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iDeviceInfo.get_size())
{
tmpRet = iFile->Write(iDeviceInfo.get_str(), 1, iDeviceInfo.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iUserId.get_size())
{
tmpRet = iFile->Write(iUserId.get_str(), 1, iUserId.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iUserAuth.get_size())
{
tmpRet = iFile->Write(iUserAuth.get_str(), 1, iUserAuth.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iExpiration.get_size())
{
tmpRet = iFile->Write(iExpiration.get_str(), 1, iExpiration.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iAppString.get_size())
{
tmpRet = iFile->Write(iAppString.get_str(), 1, iAppString.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iFiller.get_size())
{
tmpRet = iFile->Write(iFiller.get_str(), 1, iFiller.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
if (iSign.get_size())
{
tmpRet = iFile->Write(iSign.get_str(), 1, iSign.get_size());
if (tmpRet == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::SaveConfig() ERROR. line %d ", __LINE__));
return false;
}
}
iFile->Flush();
return true;
}
OSCL_EXPORT_REF int32 PVDlCfgFile::LoadConfig(void)
{
bIsNewSession = false;
if (iConfigFileName.get_size() <= 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_CriticalError;
}
if (iFile)
{
iFile->Close();
}
else
{
int32 err;
OSCL_TRY(err, iFile = OSCL_NEW(Oscl_File, (PVDL_CFG_FILE_CACHE_BUF)););
if ((err != OsclErrNone) || (iFile == NULL))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVDlCfgFile::LoadConfig() OSCL_NEW ERROR. line %d ", __LINE__));
return LoadConfigStatus_CriticalError;
}
}
int32 retval = iFile->Open(iConfigFileName.get_cstr(), Oscl_File::MODE_READ | Oscl_File::MODE_BINARY, iFileServer);
if (retval)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_NonCriticalError; // file might not exist yet
}
if (iTotalFixedHeaderSize != iFile->Read(iTmpBuf, 1, iTotalFixedHeaderSize))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_NonCriticalError;
};
{
uint32 *tmpPtr = OSCL_STATIC_CAST(uint32*, iTmpBuf);
if (iMagic32 != *tmpPtr++)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_NonCriticalError;
}
if (iVersion != *tmpPtr++)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_NonCriticalError;
}
//flag for download type 3gpp/fasttrack, download complete, and playback modes
iFlag = *tmpPtr++;
uint32 aUrlLen = *tmpPtr++;
uint32 aHostNameLen = *tmpPtr++; //if proxy is in use, it is the proxy address len
iProxyPort = *tmpPtr++;
//client only downloads the clip which is smaller than this size
uint32 aMaxAllowedFileSize = *tmpPtr++;
if (/*iMaxAllowedFileSize==0 && */aMaxAllowedFileSize > 0) iMaxAllowedFileSize = aMaxAllowedFileSize;
//the file size after it is completly downloaded.
iOverallFileSize = *tmpPtr++;
//for FastTrack, this would be the accumulated bytes downloaded
iCurrentFileSize = *tmpPtr++;
if (iOverallFileSize == 0 ||
iMaxAllowedFileSize < iOverallFileSize ||
iOverallFileSize < iCurrentFileSize)
{
return LoadConfigStatus_NonCriticalError;
}
// for content-length flag
iHasContentLength = *tmpPtr++;
iConnectTimeout = *tmpPtr++;
iSendTimeout = *tmpPtr++;
iRecvTimeout = *tmpPtr++;
//FastTrack only
iRangeStartTime = *tmpPtr++; //in ms
uint32 aSelectedTrackIDsSize = *tmpPtr++;
uint32 aPlayerVersionLen = *tmpPtr++;
uint32 aUserAgentLen = *tmpPtr++;
uint32 aUserNetworkLen = *tmpPtr++;
uint32 aDeviceInfoLen = *tmpPtr++;
uint32 aUserIdLen = *tmpPtr++;
uint32 aUserAuthLen = *tmpPtr++;
uint32 aExpirationLen = *tmpPtr++;
uint32 aAppStringLen = *tmpPtr++;
uint32 aFillerLen = *tmpPtr++;
uint32 aSignLen = *tmpPtr++;
iSelectedTrackIDs.clear();
if (aSelectedTrackIDsSize)
{
if (aSelectedTrackIDsSize != iFile->Read(iTmpBuf, 1, aSelectedTrackIDsSize))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
return LoadConfigStatus_NonCriticalError;
};
uint8 *tmpBuf = iTmpBuf;
for (int32 i = aSelectedTrackIDsSize - 1; i >= 0; i--)
{//Track ID should only use one byte.
iSelectedTrackIDs.push_back(*tmpBuf++);
}
}
// allocate memory for reading the following string
PVDlCfgFileAllocator alloc;
uint8 *aTmpBuf = (uint8 *)alloc.allocate(PVDLCONFIGFILE_TEMPORARY_BUFFER_SIZE);
if (!aTmpBuf) return LoadConfigStatus_CriticalError;
if (aUrlLen)
{
if (aUrlLen != iFile->Read(aTmpBuf, 1, aUrlLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
aTmpBuf[aUrlLen] = 0;
if (iUrl.get_size() == 0)
iUrl.set(OSCL_STATIC_CAST(char*, aTmpBuf), aUrlLen);
else
{
// new url exists, and need to compare it with the url in config file
if (iUrl.get_size() != aUrlLen)
{
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
}
if (oscl_strcmp(iUrl.get_cstr(), OSCL_STATIC_CAST(char*, aTmpBuf)) != 0)
{
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
}
}
}
if (aHostNameLen)
{
if (aHostNameLen != iFile->Read(aTmpBuf, 1, aHostNameLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iProxyName.set(OSCL_STATIC_CAST(char*, aTmpBuf), aHostNameLen);
}
if (aPlayerVersionLen)
{
if (aPlayerVersionLen != iFile->Read(aTmpBuf, 1, aPlayerVersionLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iPlayerVersion.set(OSCL_STATIC_CAST(char*, aTmpBuf), aPlayerVersionLen);
}
if (aUserAgentLen)
{
if (aUserAgentLen != iFile->Read(aTmpBuf, 1, aUserAgentLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iUserAgent.set(OSCL_STATIC_CAST(char*, aTmpBuf), aUserAgentLen);
}
if (aUserNetworkLen)
{
if (aUserNetworkLen != iFile->Read(aTmpBuf, 1, aUserNetworkLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iUserNetwork.set(OSCL_STATIC_CAST(char*, aTmpBuf), aUserNetworkLen);
}
if (aDeviceInfoLen)
{
if (aDeviceInfoLen != iFile->Read(aTmpBuf, 1, aDeviceInfoLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iDeviceInfo.set(OSCL_STATIC_CAST(char*, aTmpBuf), aDeviceInfoLen);
}
if (aUserIdLen)
{
if (aUserIdLen != iFile->Read(aTmpBuf, 1, aUserIdLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iUserId.set(OSCL_STATIC_CAST(char*, aTmpBuf), aUserIdLen);
}
if (aUserAuthLen)
{
if (aUserAuthLen != iFile->Read(aTmpBuf, 1, aUserAuthLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iUserAuth.set(OSCL_STATIC_CAST(char*, aTmpBuf), aUserAuthLen);
}
if (aExpirationLen)
{
if (aExpirationLen != iFile->Read(aTmpBuf, 1, aExpirationLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iExpiration.set(OSCL_STATIC_CAST(char*, aTmpBuf), aExpirationLen);
}
if (aAppStringLen)
{
if (aAppStringLen != iFile->Read(aTmpBuf, 1, aAppStringLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iAppString.set(OSCL_STATIC_CAST(char*, aTmpBuf), aAppStringLen);
}
if (aFillerLen)
{
if (aFillerLen != iFile->Read(aTmpBuf, 1, aFillerLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iFiller.set(OSCL_STATIC_CAST(char*, aTmpBuf), aFillerLen);
}
if (aSignLen)
{
if (aSignLen != iFile->Read(aTmpBuf, 1, aSignLen))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_ERR, (0, "PVDlCfgFile::LoadConfig() ERROR. line %d ", __LINE__));
alloc.deallocate(aTmpBuf);
return LoadConfigStatus_NonCriticalError;
};
iSign.set(OSCL_STATIC_CAST(char*, aTmpBuf), aSignLen);
}
alloc.deallocate(aTmpBuf);
}
return LoadConfigStatus_NoError;
}
void PVDlCfgFile::composeFixedHeader(uint8 *aBuf)
{
uint32 *tmpPtr = OSCL_STATIC_CAST(uint32*, aBuf);
*tmpPtr++ = iMagic32;
*tmpPtr++ = iVersion;
//flag for download type 3gpp/fasttrack, download complete, and playback modes
*tmpPtr++ = iFlag;
*tmpPtr++ = iUrl.get_size();
*tmpPtr++ = iProxyName.get_size(); //if proxy is in use, it is the proxy address len
*tmpPtr++ = iProxyPort;
//client only downloads the clip which is smaller than this size
*tmpPtr++ = iMaxAllowedFileSize;
//the file size after it is completly downloaded.
*tmpPtr++ = iOverallFileSize;
//for FastTrack, this would be the accumulated bytes downloaded
*tmpPtr++ = iCurrentFileSize;
// flag of whether to have content length for the previous download
*tmpPtr++ = iHasContentLength;
*tmpPtr++ = iConnectTimeout;
*tmpPtr++ = iSendTimeout;
*tmpPtr++ = iRecvTimeout;
//FastTrack only
*tmpPtr++ = iRangeStartTime; //in ms
*tmpPtr++ = iSelectedTrackIDs.size();
*tmpPtr++ = iPlayerVersion.get_size();
*tmpPtr++ = iUserAgent.get_size();
*tmpPtr++ = iUserNetwork.get_size();
*tmpPtr++ = iDeviceInfo.get_size();
*tmpPtr++ = iUserId.get_size();
*tmpPtr++ = iUserAuth.get_size();
*tmpPtr++ = iExpiration.get_size();
*tmpPtr++ = iAppString.get_size();
*tmpPtr++ = iFiller.get_size();
*tmpPtr++ = iSign.get_size();
}