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

📄 xmlparse.cpp

📁 symbian系统上的记事本程序
💻 CPP
字号:
#include "XMLparse.h"
#include <aknnotewrappers.h>
#include <utf.h> 
#include "Common.h"
/***********************************************************************/

_LIT(REGORLOGBASICURL, "http://www.ldci.mobi/snsProject/@STATESIGN@?mobile=@PHONESIGN@&pass=@PASSWDSIGN@");
_LIT(STATESIGN, "@STATESIGN@");
_LIT(PHONESIGN, "@PHONESIGN@");
_LIT(PASSWDSIGN, "@PASSWDSIGN@");
_LIT(REGSTATE, "register");
_LIT(LOGSTATE, "login");
_LIT(UPDATESTATE, "update");
_LIT(DOWNLOADSTATE, "download");

_LIT(UPDATEURL, "http://www.ldci.mobi/snsProject/update");

_LIT(TYPESTART, "<type>");
_LIT(TYPEEND, "</type>");
_LIT(RESSTART, "<result>");
_LIT(RESEND, "</result>");

_LIT(KStatusFormat, "%d: %S");
const TInt KStatusCodeLength = 10;

_LIT(RSSSTART, "<rss>");
_LIT(RSSEND, "</rss>");
_LIT(MOBILESTART, "<mobile>");
_LIT(MOBILEEND, "</mobile>");
_LIT(RECORDSTART, "<record>");
_LIT(RECORDEND, "</record>");
_LIT(LNAMESTART, "<lname>");
_LIT(LNAMEEND, "</lname>");
_LIT(FNAMESTART, "<fname>");
_LIT(FNAMEEND, "</fname>");
_LIT(MOBSTART, "<mob>");
_LIT(MOBEND, "</mob>");
_LIT(MAILSTART, "<mail>");
_LIT(MAILEND, "</mail>");
_LIT(ADDRSTART, "<addr>");
_LIT(ADDREND, "</addr>");
_LIT(COMPANYSTART, "<company>");
_LIT(COMPANYEND, "</company>");

/***********************************************************************/


CXMLparse* CXMLparse::NewL()
{
	CXMLparse* self = NewLC();
    CleanupStack::Pop(self);
    return self;
}

CXMLparse* CXMLparse::NewLC()
{
	CXMLparse* self = new (ELeave) CXMLparse();
	CleanupStack::PushL(self);
    self->ConstructL();
    return self;
}

CXMLparse::CXMLparse()
{
	ResetResult();
	ResetServerState();
}

CXMLparse::~CXMLparse()
{
	MEM_FREE(iEngine);
	MEM_FREE(iBody);
	MEM_FREE(iCard);
	MEM_FREE(iCardArray);
}

void CXMLparse::ConstructL()
{
	iEngine = CHTTPExampleEngine::NewL(*this);
}

void CXMLparse::Reg(const TDesC& aPhoneNum, const TDesC& aPassWord)
{
	// 生成URL
	CreateURL(0, aPhoneNum, aPassWord);
	// 发送GET请求
	iEngine->GetRequestL(URLBasic);
}

void CXMLparse::Login(const TDesC& aPhoneNum, const TDesC& aPassWord)
{
	// 生成URL
	CreateURL(1, aPhoneNum, aPassWord);
	// 发送GET请求
	iEngine->GetRequestL(URLBasic);
}

void CXMLparse::UpLoad(const TDesC& aPhoneNum, CArrayPtrSeg<CBookInfo>* aCardArray)
{
	if(aCardArray==NULL)
	{
		return;
	}
	// 生成Body
	CreateBody(aPhoneNum, aCardArray);
	// POST
	iEngine->PostRequestL(iBody->Des());
}

void CXMLparse::DownLoad(const TDesC& aPhoneNum, const TDesC& aPassWord)
{
	// 生成URL
	CreateURL(2, aPhoneNum, aPassWord);
	// 发送GET请求
	iEngine->GetRequestL(URLBasic);
}

void CXMLparse::Cancal()
{
	iEngine->Cancel();
	iServerState = -1;
	iResult = -1;
}

void CXMLparse::CreateURL(TInt aState, const TDesC& aPhoneNum, const TDesC& aPassWord)
{
	URLBasic.Copy(REGORLOGBASICURL);
	
	iPhoneNumPos = URLBasic.Find(PHONESIGN);
	iPhoneNumLength = PHONESIGN.iTypeLength;
	URLBasic.Replace(iPhoneNumPos, iPhoneNumLength, aPhoneNum);
	
	iPassWDPos = URLBasic.Find(PASSWDSIGN);
	iPassWDLength = PASSWDSIGN.iTypeLength;
	URLBasic.Replace(iPassWDPos, iPassWDLength, aPassWord);

	if(aState==0)
	{
		iStactPos = URLBasic.Find(STATESIGN);
		iStactLength = STATESIGN.iTypeLength;
		URLBasic.Replace(iStactPos, iStactLength, REGSTATE);
	}
	else if(aState==1)
	{
		iStactPos = URLBasic.Find(STATESIGN);
		iStactLength = STATESIGN.iTypeLength;
		URLBasic.Replace(iStactPos, iStactLength, LOGSTATE);
	}
	else if(aState==2)
	{
		iStactPos = URLBasic.Find(STATESIGN);
		iStactLength = STATESIGN.iTypeLength;
		URLBasic.Replace(iStactPos, iStactLength, DOWNLOADSTATE);
	}
}

void CXMLparse::TestFun()
{
	CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
	informationNote->ExecuteLD(iBody->Des());
}

void CXMLparse::ResponseStatusL(TInt aStatusCode, const TDesC& aStatusText)
{
	
}

void CXMLparse::ResponseReceivedL(const TDesC& aResponse)	
{
	TInt aStartPosTmp;
	TInt aEndPosTmp;
	TBuf<16> aStateTmp;
	TBuf<16> aTmp;
	iResult = -1;

	aStartPosTmp = aResponse.Find(TYPESTART) + TYPESTART.iTypeLength;
	aEndPosTmp = aResponse.Find(TYPEEND);
	aStateTmp.Copy(aResponse.Mid(aStartPosTmp, aEndPosTmp-aStartPosTmp));	// 得到返回操作状态
	
	if((aStateTmp.Compare(_L("regi"))==0)||(aStateTmp.Compare(_L("login"))==0))	// 如果返回是注册或者登录的响应
	{
		aStartPosTmp = aResponse.Find(RESSTART) + RESSTART.iTypeLength;
		aEndPosTmp = aResponse.Find(RESEND);
		aTmp.Copy(aResponse.Mid(aStartPosTmp, aEndPosTmp-aStartPosTmp));

		TLex iLex(aTmp);
		iLex.Val(iResult);	// 得到状态值
	}
	else if(aStateTmp.Compare(_L("update"))==0)
	{
		aStartPosTmp = aResponse.Find(RESSTART) + RESSTART.iTypeLength;
		aEndPosTmp = aResponse.Find(RESEND);
		aTmp.Copy(aResponse.Mid(aStartPosTmp, aEndPosTmp-aStartPosTmp));
		
		TLex iLex(aTmp);
		iLex.Val(iResult);	// 得到状态值
	}
	else if(aStateTmp.Compare(_L("down"))==0)
	{
		// 解析函数
		XML(aResponse);
		iResult = 0;
	}
}

void CXMLparse::AddaCard(CBookInfo* aCard)
{
	if(aCard==NULL)
	{
		return;
	}

	TBuf8<256> aCardTmp;
	TBuf8<32> aTemp;
	TBuf<32> aOld;

	aCardTmp.Append(RECORDSTART);	
	aCardTmp.Append(LNAMESTART);
	aOld.Copy(aCard->GetLastName()->Des());
	CnvUtfConverter::ConvertFromUnicodeToUtf8( aTemp, aOld );	
	aCardTmp.Append(aTemp);
	aCardTmp.Append(LNAMEEND);
	
	aCardTmp.Append(FNAMESTART);	
	aOld.Copy(aCard->GetFirstName()->Des());
	CnvUtfConverter::ConvertFromUnicodeToUtf8( aTemp, aOld );
	aCardTmp.Append(aTemp);
	aCardTmp.Append(FNAMEEND);

	aCardTmp.Append(MOBSTART);
	aCardTmp.Append(aCard->GetHomeTelephone()->Des());
	aCardTmp.Append(MOBEND);

	aCardTmp.Append(MAILSTART);
	aCardTmp.Append(MAILEND);

	aCardTmp.Append(ADDRSTART);
	aCardTmp.Append(ADDREND);

	aCardTmp.Append(COMPANYSTART);
	aCardTmp.Append(COMPANYEND);

	aCardTmp.Append(RECORDEND);

	MEM_FREE(iCard);

	iCard = HBufC::NewL(aCardTmp.Length());
	iCard->Des().Copy(aCardTmp);
}


void CXMLparse::CreateBody(const TDesC& aPhoneNum, CArrayPtrSeg<CBookInfo>* aCardArray)
{
	if(iBody!=NULL)
	{
		delete iBody;
		iBody = NULL;
	}

	if(aCardArray==NULL)
	{
		return;
	}

	iBody = HBufC::NewL(aCardArray->Count()*256);

	iBody->Des().Append(RSSSTART);
	iBody->Des().Append(TYPESTART);
	iBody->Des().Append(UPDATESTATE);
	iBody->Des().Append(TYPEEND);

	iBody->Des().Append(MOBILESTART);
	iBody->Des().Append(aPhoneNum);
	iBody->Des().Append(MOBILEEND);

	for(TInt i=0; i<aCardArray->Count(); i++)
	{
		AddaCard(aCardArray->At(i));
		iBody->Des().Append(iCard->Des());	
	}

	iBody->Des().Append(RSSEND);
}


void CXMLparse::XML(const TDesC& aResponse)
{
	iCardArray = NULL;

	HBufC* aRes;
	aRes = HBufC::NewL(aResponse.Length());
	aRes->Des().Copy(aResponse);

	if(aRes->Find(RECORDSTART)==KErrNotFound)
	{
		return;
	}
	
	iCardArray = new(ELeave) CArrayPtrSeg<CBookInfo>(1);
	TInt aStartPosTemp;
	TInt aEndPosTemp;
	CBookInfo* aCardTemp;
	TBuf8<32> aOld;
	TBuf16<32> aNew;
	
	// 添加循环
	while(aRes->Find(RECORDSTART)!=KErrNotFound)	// 如果能找到RECORD
	{
		aCardTemp = CBookInfo::NewL();

		aStartPosTemp = aRes->Find(LNAMESTART)+LNAMESTART.iTypeLength;
		aEndPosTemp = aRes->Find(LNAMEEND);
		aOld.Copy(aRes->Mid(aStartPosTemp, aEndPosTemp-aStartPosTemp));
		CnvUtfConverter::ConvertToUnicodeFromUtf8( aNew, aOld );
		aCardTemp->SetLastName(aNew);

		aStartPosTemp = aRes->Find(FNAMESTART)+FNAMESTART.iTypeLength;
		aEndPosTemp = aRes->Find(FNAMEEND);
		aOld.Copy(aRes->Mid(aStartPosTemp, aEndPosTemp-aStartPosTemp));
		CnvUtfConverter::ConvertToUnicodeFromUtf8( aNew, aOld );
		aCardTemp->SetFirstName(aNew);

		aStartPosTemp = aRes->Find(MOBSTART)+MOBSTART.iTypeLength;
		aEndPosTemp = aRes->Find(MOBEND);
		aCardTemp->SetHomeMobileNumber(aRes->Mid(aStartPosTemp, aEndPosTemp-aStartPosTemp));	

		iCardArray->AppendL(aCardTemp);
		
		aStartPosTemp = aRes->Find(RECORDSTART);
		aEndPosTemp = aRes->Find(RECORDEND)+RECORDEND.iTypeLength;
		aRes->Des().Delete(aStartPosTemp, aEndPosTemp-aStartPosTemp);
	}

	MEM_FREE(aRes);
}


CArrayPtrSeg<CBookInfo>* CXMLparse::GetArray()
{
	return iCardArray;
}

const TInt CXMLparse::GetResult()
{
	return iResult;
}

const TInt CXMLparse::GetServerState()
{
	return iServerState;
}

void CXMLparse::ResetResult()
{
	iResult = -1;
}

void CXMLparse::ResetServerState()
{
	iServerState = -1;
}

⌨️ 快捷键说明

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