📄 filetransfer.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 + -