⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recver.cpp

📁 简单的socket请求
💻 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 + -