📄 m5httpdown.cpp
字号:
#include "m5httpdown.h"
#include <e32std.h>
#include <f32file.h>
_LIT(KCMCCWapProxy, "10.0.0.172") ;
CM5HttpDown::CM5HttpDown(M5HttpDownNotifier & m5_notifier):m_m5_notifier(m5_notifier)
{
m_sock_eng = NULL ;
}
CM5HttpDown::~CM5HttpDown()
{
if(m_sock_eng->IsActive()) {
m_sock_eng->Disconnect() ;
}
delete m_sock_eng ;
}
void CM5HttpDown::ConstructL()
{
m_running = EFalse ;
m_down_type = HTTP_DOWN_CMWAP ;
m_is_first_resp = ETrue ;
m_total_bytes = 0 ;
m_recv_bytes = 0 ;
m_web_port = HTTP_WEB_PORT ;
m_web_addr.SetLength(0) ;
m_web_fname.SetLength(0) ;
m_sock_eng = CSocketsEngine::NewL(*this) ;
}
CM5HttpDown * CM5HttpDown::NewL(M5HttpDownNotifier& m5_notifier)
{
CM5HttpDown * self = CM5HttpDown::NewLC(m5_notifier);
CleanupStack::Pop(self);
return self;
}
CM5HttpDown * CM5HttpDown::NewLC(M5HttpDownNotifier& m5_notifier)
{
CM5HttpDown * self = new (ELeave) CM5HttpDown(m5_notifier);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
void CM5HttpDown::PrintNotify(const TDesC& aMessage, TUint aAttributes)
{
m_m5_notifier.M5PrintNotify(aMessage) ;
}
TBool CM5HttpDown::CheckRecv(const TDesC8& recv_buf)
{
TInt find_pos ;
find_pos = recv_buf.Find(m_web_addr) ;
if(find_pos != KErrNotFound) return EFalse ;
return ETrue ;
}
void CM5HttpDown::RecvNotify(const TDesC8& aMessage)
{
TInt recv_bytes = aMessage.Length() ;
TInt jump_length = 0 ;
if(recv_bytes > 0) {
if(m_is_first_resp) {
if(CheckRecv(aMessage)) {
if(ParseWebFileInfo(aMessage, m_total_bytes, jump_length)) {
if(m_recv_bytes > 0)
m_total_bytes += m_recv_bytes ;
m_recv_bytes += (recv_bytes - jump_length) ;
m_m5_notifier.M5RecvNotify(aMessage.Mid(jump_length)) ;
}
m_is_first_resp = false ;
} else {
TBuf<20> s ;
s.Format(_L("check failed !")) ;
PrintNotify(s) ;
}
} else {
// common receive procdure
if((m_recv_bytes + recv_bytes) > m_total_bytes) {
recv_bytes = m_total_bytes - m_recv_bytes ;
m_recv_bytes = m_total_bytes ;
} else {
m_recv_bytes += recv_bytes ;
}
m_m5_notifier.M5RecvNotify(aMessage) ;
}
}
}
void CM5HttpDown::ErrorNotify(const TDesC& aErrMessage, TInt aErrCode)
{
m_m5_notifier.M5PrintNotify(aErrMessage) ;
}
void CM5HttpDown::SetStatus(const TDesC& aStatus)
{
m_m5_notifier.M5PrintNotify(aStatus) ;
}
TBool CM5HttpDown::SendReq(TDesC8& req_str)
{
if(m_sock_eng->Connected()) {
m_sock_eng->WriteL(req_str) ;
return ETrue ;
}
return EFalse ;
}
TBool CM5HttpDown::ParseUri(TDesC8& uri, TDes8& web_addr, TDes8& web_fname, TInt& web_port)
{
TPtrC8 uri_ptr ;
TBuf8<30> tmp_buf ;
TInt find_pos = 0 ;
web_port = HTTP_WEB_PORT ;
if(uri.Length() <= 0) return false ;
// search and jump over the http or https prefix
uri_ptr.Set(uri.Ptr(), uri.Length()) ;
find_pos = uri.Find(KHttpPrefix) ;
if(find_pos != KErrNotFound) {
tmp_buf.Copy(KHttpPrefix) ;
uri_ptr.Set(uri.Ptr()+tmp_buf.Length(), uri.Length() - tmp_buf.Length()) ;
} else {
find_pos = uri.Find(KHttpsPrefix) ;
if(find_pos != KErrNotFound) {
tmp_buf.Copy(KHttpsPrefix) ;
uri_ptr.Set(uri.Ptr()+tmp_buf.Length(), uri.Length() - tmp_buf.Length()) ;
}
}
// get web address
find_pos = uri_ptr.Find(KHttpClip) ;
if(find_pos != KErrNotFound) {
web_addr.Copy(uri_ptr.Mid(0, find_pos)) ;
}
// get web file name
m_web_fname.Copy(uri_ptr.Ptr() + find_pos, uri_ptr.Length() - find_pos) ;
return ETrue ;
}
TBool CM5HttpDown::GetRespField(const TDesC8& recv_buf, TDesC8& field_name, TDesC8& end_flag, TDes8& res)
{
TPtrC8 ptr_hdr ;
TInt find_pos ;
if(recv_buf.Length() <= 0) return EFalse ;
find_pos = recv_buf.Find(field_name) ;
if(find_pos != KErrNotFound) {
ptr_hdr.Set(recv_buf.Ptr() + find_pos + field_name.Length(),
recv_buf.Length() - find_pos - field_name.Length()) ;
find_pos = ptr_hdr.Find(end_flag) ;
if(find_pos != KErrNotFound) {
res.Copy(ptr_hdr.Ptr(), find_pos) ;
}
return ETrue ;
}
return EFalse ;
}
TBool CM5HttpDown::ParseWebFileInfo(const TDesC8& recv_buf, TInt& file_length, TInt& jump_len)
{
TBuf8<30> tmp_field ;
TBuf8<30> tmp_end ;
TBuf8<30> tmp_str ;
int find_pos ;
file_length = 0 ;
jump_len = 0 ;
// get web file length
if(m_down_type == HTTP_DOWN_CMWAP) {
tmp_field.Append(KHttpCMWapHdrFileLen) ;
} else {
tmp_field.Append(KHttpCMNetHdrFileLen) ;
}
tmp_end.Append(KHttpHdrDiv) ;
if(!GetRespField(recv_buf, tmp_field, tmp_end, tmp_str))
return EFalse ;
file_length = Str2Int(tmp_str) ;
// set the jump length
find_pos = recv_buf.Find(KHttpHdrEnd) ;
if(find_pos != KErrNotFound) {
tmp_str.Copy(KHttpHdrEnd) ;
jump_len = find_pos + tmp_str.Length() ;
}
return ETrue ;
}
TBool CM5HttpDown::InitSock(TDesC8& server_name, TInt server_port)
{
TBuf<50> svr_name ;
svr_name.Copy(server_name) ;
m_sock_eng->SetServerName(svr_name) ;
m_sock_eng->SetPort(server_port) ;
m_sock_eng->ConnectL() ;
return ETrue ;
}
TBool CM5HttpDown::CloseSock()
{
if(m_running && m_sock_eng->IsActive()) {
m_sock_eng->Disconnect() ;
}
return true ;
}
TInt CM5HttpDown::Str2Int(const TDesC8 & s)
{
TInt value = 0 ;
TLex8 lex(s) ;
lex.Val(value) ;
return value ;
}
TBool CM5HttpDown::HttpConnPorxy(TDesC8& uri, TInt down_type)
{
m_running = true ;
m_down_type = down_type ;
ParseUri(uri, m_web_addr, m_web_fname, m_web_port) ;
if(m_down_type == HTTP_DOWN_CMWAP) {
TBuf8<20> proxy_svr ;
proxy_svr.Copy(KCMCCWapProxy) ;
if(!InitSock(proxy_svr, 80)) return EFalse ;
} else {
if(!InitSock(m_web_addr, m_web_port)) return EFalse ;
}
return ETrue ;
}
TBool CM5HttpDown::HttpDown(TDesC8& uri, TInt recv_bytes)
{
TBuf8<20> tmp_str ;
m_recv_bytes = recv_bytes ;
m_send_buf.SetLength(0) ;
if(m_recv_bytes == 0) {
m_send_buf.Append(KHttpCommonGet1) ;
if(m_down_type == HTTP_DOWN_CMWAP)
m_send_buf.Append(uri) ;
else
m_send_buf.Append(m_web_fname) ;
m_send_buf.Append(KHttpCommonGet2) ;
m_send_buf.Append(m_web_addr) ;
m_send_buf.Append(KHttpCommonGet3) ;
tmp_str.Format(_L8("%d"), m_web_port) ;
m_send_buf.Append(tmp_str) ;
m_send_buf.Append(KHttpCommonGet4) ;
} else {
m_send_buf.Append(KHttpResumeGet1) ;
if(m_down_type == HTTP_DOWN_CMWAP)
m_send_buf.Append(uri) ;
else
m_send_buf.Append(m_web_fname) ;
m_send_buf.Append(KHttpResumeGet2) ;
m_send_buf.Append(m_web_addr) ;
m_send_buf.Append(KHttpResumeGet3) ;
tmp_str.Format(_L8("%d"), m_web_port) ;
m_send_buf.Append(tmp_str) ;
m_send_buf.Append(KHttpResumeGet4) ;
tmp_str.Format(_L8("%d"), m_recv_bytes) ;
m_send_buf.Append(tmp_str) ;
m_send_buf.Append(KHttpResumeGet5) ;
}
// send the request
return SendReq(m_send_buf) ;
}
TBool CM5HttpDown::HttpStopDown()
{
return CloseSock() ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -