?? xmlparse.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 + -