📄 recver.cpp
字号:
// Recver.cpp: implementation of the CRecver class.
//
//////////////////////////////////////////////////////////////////////
#include "Recver.h"
#include <aknnotewrappers.h>
#include "Explorer.h"
#include "HttpAppView.h"
#include "eikrted.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRecver::CRecver(MReponseRecv& aMReponseRecv,RSocket& aSocket):
CActive(EPriorityStandard),iMReponseRecv(aMReponseRecv),iSocket(aSocket),
iPushReceived(EFalse)
{
iRecvData = EFalse;
iCount = 0;
iTotalLen = /*20971520*/0;
iCurTotalLen = 0;
iDownLen = 0;
iCurDownLen = 0;
}
CRecver::~CRecver()
{
if (IsActive())
{
Cancel();
}
}
CRecver* CRecver::NewLC(MReponseRecv& aMReponseRecv,RSocket& aSocket)
{
CRecver* self = new(ELeave) CRecver(aMReponseRecv,aSocket);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CRecver* CRecver::NewL(MReponseRecv& aMReponseRecv,RSocket& aSocket)
{
CRecver* self = CRecver::NewLC(aMReponseRecv,aSocket);
CleanupStack::Pop();
return self;
}
void CRecver::ConstructL()
{
CActiveScheduler::Add(this);
}
void CRecver::Start(TInt aDownLen)
{
iCurDownLen = 0;
iDownLen = aDownLen;
if (!IsActive())
{
iBuffer.Zero();
IssueRecv();
}
}
void CRecver::IssueRecv()
{
if (!iRecvData)
{
iMReponseRecv.RecvBegin();
iRecvData = ETrue;
}
iSocket.RecvOneOrMore(iBuffer, 0, iStatus, iDummyLength);
SetActive();
}
TInt CRecver::GetContentLen()
{
TInt len = 0;
TInt pos = iBuffer.FindF(_L8("Content-length:"));
if (0 < pos)
{
//iMReponseRecv.WriteToFile(iBuffer);
TBuf8<10> numbuf = iBuffer.Mid(pos+16, 10);
TInt pos1 =numbuf.FindF(_L8("\r\n"));
if (0 < pos1)
{
TLex8 lex( numbuf.Left(pos1) );
lex.Val( len );
}
}
return len;
}
TInt CRecver::GetTotalLen()
{
TInt len = 0;
TInt pos = iBuffer.FindF(_L8("Content-Range:"));
if (0 < pos)
{
TBuf8<25> numbuf = iBuffer.Mid(pos+21, 25);
TInt pos1 =numbuf.FindF(_L8("\r\n"));
TInt pos2 = numbuf.FindF(_L8("/"));
if (0 < pos1 && 0 < pos2)
{
TLex8 lex( numbuf.Mid(pos2 + 1, pos1 - pos2 - 1) );
lex.Val( len );
}
}
return len;
}
void CRecver::Parse()
{
TInt clen = 0;
if (iCurTotalLen <= 0)
{
clen = GetContentLen();
}
TInt tlen = 0;
if (iTotalLen <= 0)
{
tlen = GetTotalLen();
}
if(0 < clen)
{
iCurTotalLen = clen;
// if (iCurTotalLen > iTotalLen)
// {
// iTotalLen = iCurTotalLen;
// }
// if (204800 <= iCurTotalLen)
// {
// iPushReceived = ETrue;
// }
}
if (0 < tlen)
{
iTotalLen = tlen;
}
TInt pos = iBuffer.FindF(_L8("\r\n\r\n"));
if (0 < pos)
{
iCurDownLen = iDummyLength() - pos - 4;
}
else
{
iCurDownLen += iDummyLength();
}
}
void CRecver::RunL()
{
switch (iStatus.Int())
{
case KErrNone:
{
Parse();
if(!iPushReceived)
{
IssueRealConn();
}
else
{
if (iCurDownLen < iCurTotalLen || 0 == iCurDownLen || 0 == iCurTotalLen)
{
IssueRecv();
}
else if(iCurDownLen > 0 && iCurTotalLen > 0 && iCurDownLen >= iCurTotalLen)
{
iDownLen += iCurDownLen;
// iMReponseRecv.NotifyState(iTotalLen, iDownLen);
// iMReponseRecv.WriteLogInt(_L("iDownLen=%d"),iDownLen);
// iMReponseRecv.WriteLogInt(_L("iTotalLen=%d"),iTotalLen);
if (iDownLen >= iTotalLen && iDownLen > 0 && iTotalLen > 0)
{
iMReponseRecv.RecvFinish();
}
else
{
iMReponseRecv.RecvContinue(iCurDownLen, iTotalLen);
}
}
}
}
break;
case KErrDisconnected:
{
}
break;
case KErrEof:
{
}
break;
default:
break;
}
}
void CRecver::DoCancel()
{
// iSocket.CancelRecv();
}
void CRecver::IssueRealConn()
{
Cancel();
//iMReponseRecv.WriteToFile(iBuffer);
TInt pos = iBuffer.FindF(_L8("http://mp3.muzhient.cn/testmusic/mp3/071781207e.mp3"));
if (0 >= pos)
{
pos = iBuffer.FindF(_L8("http://mp3.zmask.cn/testmusic/mp3/071781207e.mp3"));
}
if (0 < pos)
{
TInt pos1 = iBuffer.FindF(_L8("/go"));
if (0 < pos1)
{
TBuf8<128> url;
url = iBuffer.Mid(pos, pos1 - pos - 3);
iMReponseRecv.SetUrl(url);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -