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

📄 filetransfer.cpp

📁 一个Symbian平台上的serverclient模型的简单示例
💻 CPP
字号:
// FileTransfer.cpp
//

#include "FileTransfer.h"
#include "httputils.h"

_LIT8(KHeadContentLength, "Content-Length");
_LIT8(KHeadContentType, "Content-Type");
_LIT8(KCRLF, "\r\n");


CFileTransfer* CFileTransfer::NewL(RSocket& aSocket, const TDesC& aFile)
	{
	CFileTransfer* object = new (ELeave) CFileTransfer(aSocket);
	CleanupStack::PushL(object);
	object->ConstructL(aFile);
	CleanupStack::Pop();
	return object;
	}


CFileTransfer::CFileTransfer(RSocket& aSocket)
: CActive(CActive::EPriorityStandard)
, iSocket(aSocket)
, iBufferCursor(0, 1000)
	{
    CActiveScheduler::Add(this); 
	}


void CFileTransfer::ConstructL(const TDesC& aFile)
	{
	iBuffer = HBufC8::NewL(1000);
	
	User::LeaveIfError(iFs.Connect());
	
	User::LeaveIfError(iFile.Open(iFs, aFile, EFileShareReadersOnly | EFileRead));

	iMimeType = HTTP::SystemMimeTypeL(aFile, iFs);

	}


CFileTransfer::~CFileTransfer()
	{
	iFile.Close();
	iFs.Close();

	delete iMimeType;
	delete iBuffer;
	}


void CFileTransfer::RunL()
	{
	switch (iState)
		{
		case ESocketWrite:
			if (iStatus.Int() == KErrNone)
				{
				ReadABlock();
				}
			break;
		case EFileRead:
			if (iBuffer->Length() < 1000)
				{
				iBufferCursor.Append(KCRLF);
				iState = EDone;
				}

			if (   iStatus.Int() == KErrNone
				&& iBuffer->Length() > 0)
				{
				iSocket.Write(*iBuffer, iStatus);
				if (iState != EDone)
					{
					iState = ESocketWrite;
					}
				SetActive();
				}
			break;
		case EDone:
			break;
		}

	}

void CFileTransfer::DoCancel()
	{
	if (iState == ESocketWrite)
		{
		iSocket.CancelWrite();
		}
	// else, no cancel available...
	}


void CFileTransfer::WriteHeaders()
	{
	TPtr8 buffer(iBuffer->Des());
	iBufferCursor.Set(buffer);
	iBufferCursor.SetLength(0);

	TInt s;
	iFile.Size(s);

	TVersion request_version(1, 1, 0);
	HTTP::WriteStatusLine(iBufferCursor, request_version, 200);
	HTTP::AppendField(iBufferCursor, KHeadContentLength, s);


	HTTP::AppendField(iBufferCursor, KHeadContentType, *iMimeType);
	iBufferCursor.Append(KCRLF);

	}

void CFileTransfer::ReadABlock()
	{
	TPtr8 buffer(iBuffer->Des());
	iBufferCursor.Set(buffer);
	iBufferCursor.SetLength(0);
	iFile.Read(iBufferCursor, iStatus);
	iState = EFileRead;
	SetActive();
	}


void CFileTransfer::StartTransfer()
	{
	WriteHeaders();
	iSocket.Write(*iBuffer, iStatus);
	iState = ESocketWrite;
	SetActive();
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -