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

📄 m5httpdown.cpp

📁 Symbian第二版断点续传代码,可以节省用户下载流量
💻 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 + -