diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/xml/src/syncml/XMLSyncMLGenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/xml/src/syncml/XMLSyncMLGenerator.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,1090 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: XML syncml DTD generator +* +*/ + + +// ------------------------------------------------------------------------------------------------ +// Include +// ------------------------------------------------------------------------------------------------ +#include "XMLSyncMLGenerator.h" +#include "WBXMLGeneratorError.h" +#include "XMLWorkspace.h" +#include "XMLDevInfGenerator.h" +#include "WBXMLDevInfParser.h" +#include "WBXMLParser.h" + +#include "smlsyncmltags.h" +#include "smlmetinftags.h" + +#include + +// FOTA : Correlator added after 'Move' +_LIT8( KSyncMLElements, + "<0>|<1>|<2>|<3>|<4>|Add|Alert|Archive|Atomic|Chal|Cmd|CmdID|CmdRef|Copy|Cred|Data|Delete|" + "Exec|Final|Get|Item|Lang|LocName|LocURI|Map|MapItem|Meta|MsgID|MsgRef|" + "NoResp|NoResults|Put|Replace|RespURI|Results|Search|Sequence|SessionID|" + "SftDel|Source|SourceRef|Status|Sync|SyncBody|SyncHdr|SyncML|Target|" + "TargetRef||VerDTD|VerProto|NumberOfChanges|MoreData|Field|Filter|Record|FilterType|" + "SourceParent|TargetParent|Move|Correlator|Data" ); + +_LIT8( KSyncMLNamespace, "SYNCML:SYNCML"); + + +_LIT8( KMetInfElements, + "<0>|<1>|<2>|<3>|<4>|Anchor|EMI|Format|FreeID|FreeMem|Last|Mark|MaxMsgSize|Mem|MetInf|Next|" + "NextNonce|SharedMem|Size|Type|Version|MaxObjSize|FieldLevel" ); + +_LIT8( KMetInfNamespace, "syncml:metinf"); + +// HYBRID 1.2 CHANGE +_LIT8( KDevInfGen, "./devinf" ); +// Changes end + +_LIT8( KDevInfElements, + "<0>|<1>|<2>|<3>|<4>|CTCap|CTType|DataStore|DataType|DevID|DevInf|DevTyp|DisplayName|DSMem|Ext|" + "FwV|HwV|Man|MaxGUIDSize|MaxID|MaxMem|Mod|OEM|ParamName|PropName|Rx|Rx-Pref|" + "SharedMem|MaxSize|SourceRef|SwV|SyncCap|SyncType|Tx|Tx-Pref|ValEnum|VerCT|" + "VerDTD|Xnam|Xval|UTC|SupportNumberOfChanges|SupportLargeObjs|" +// 1.2 CHANGES: new elements + "Property|PropParam|MaxOccur|NoTruncate|Empty|Filter-Rx|FilterCap|FilterKeyword|FieldLevel|SupportHierarchicalSync" ); +// changes end + +// ------------------------------------------------------------------------------------------------ +// CXMLSyncMLGenerator +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CXMLSyncMLGenerator::CreateWorkspaceL() + { + CXMLGenerator::CreateDynamicWorkspaceL(); + // HYBRID 1.2 CHANGE + CXMLGenerator::SetTranslateTableL(KSyncMLElements()); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CXMLSyncMLGenerator::InitializeL() + { + // HYBRID 1.2 CHANGE + CXMLGenerator::SetTranslateTableL(KSyncMLElements()); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlStartMessage( SmlSyncHdrPtr_t aContent ) + { + // HYBRID 1.2 CHANGE + HBufC8* version=NULL; + TRAPD(result, version = HBufC8::NewL( KSyncMLNamespace().Length() + aContent->version->Data().Length())); + if(version) + { + TPtr8 versionPtr = version->Des(); + versionPtr = KSyncMLNamespace(); + versionPtr.Append ( aContent->version->Data() ); + TRAP(result,CXMLGenerator::SetNamespaceNameL( versionPtr )); + delete version; + } + + Reset(); + Workspace()->BeginTransaction(); + TRAP(result, doSmlStartMessageL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlEndMessage( Boolean_t aFinal ) + { + Workspace()->BeginTransaction(); + TRAPD(result, doSmlEndMessageL(aFinal)); + return HandleResult(result); // No safe treshold as this is end of packet! + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlStartSync( SmlSyncPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendSyncL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlEndSync() + { + Workspace()->BeginTransaction(); + TRAPD(result, EndElementL()); + return HandleResult(result); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlAddCmd( SmlAddPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendAddCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlReplaceCmd( SmlReplacePtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendReplaceCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlCopyCmd( SmlCopyPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendCopyCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// FOTA +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlExecCmd( SmlExecPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendExecCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } +// FOTA end +//1.2 CHANGES: Move command +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlMoveCmd( SmlMovePtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendMoveCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlDeleteCmd( SmlDeletePtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendDeleteCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlAlertCmd( SmlAlertPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendAlertCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlGetCmd( SmlPutPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendGetCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlPutCmd( SmlPutPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendPutCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlMapCmd( SmlMapPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendMapCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlResultsCmd( SmlResultsPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendResultsCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlStatusCmd( SmlStatusPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendStatusCmdL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlStartAtomic( SmlAtomicPtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendStartAtomicL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlEndAtomic() + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendEndAtomicL()); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlStartSequence( SmlSequencePtr_t aContent ) + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendStartSequenceL(aContent)); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlEndSequence() + { + Workspace()->BeginTransaction(); + TRAPD(result, AppendEndSequenceL()); + return HandleResult(result, KNSmlXmlBufferSafeTreshold); + } + +// Data chunk functionality + +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CXMLSyncMLGenerator::SetTruncate( TBool aEnabled ) + { + iUseTruncation = aEnabled; + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C TInt CXMLSyncMLGenerator::ItemIndex() const + { + return iItemIndex; + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C TInt CXMLSyncMLGenerator::DataConsumed() const + { + return iDataConsumed; + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C TBool CXMLSyncMLGenerator::WasTruncated() + { + TBool was(iItemWasTruncated); + iItemWasTruncated = EFalse; + return was; + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::doSmlStartMessageL( SmlSyncHdrPtr_t aContent ) + { + BeginDocumentL(KNSmlSyncMLVersion, KNSmlSyncMLPublicId, KNSmlSyncMLUTF8); + BeginElementL(ESyncML, ETrue); + AppendSyncHrdL(aContent); + BeginElementL(ESyncBody, ETrue); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::doSmlEndMessageL( Boolean_t aFinal ) + { + if( aFinal ) + { + BeginElementL(EFinal); + } + EndElementL(); // SyncBody + EndElementL(); // SyncML + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendSyncHrdL( SmlSyncHdrPtr_t aContent ) + { + BeginElementL(ESyncHdr, ETrue); + AppendPCDataL(EVerDTD, aContent->version); + AppendPCDataL(EVerProto, aContent->proto); + AppendPCDataL(ESessionID, aContent->sessionID); + AppendPCDataL(EMsgID, aContent->msgID); + AppendTargetL(aContent->target); + AppendSourceL(aContent->source); + AppendPCDataL(ERespURI, aContent->respURI); + if( aContent->flags & SmlNoResp_f ) + { + BeginElementL(ENoResp); + } + AppendCredL(aContent->cred); + AppendMetaL(aContent->meta); + EndElementL(); // ESyncHdr + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendTargetL( SmlTargetPtr_t aContent ) + { + AppendPCDataL(ELocURI, aContent->locURI); + AppendPCDataL(ELocName, aContent->locName); + AppendFilterL(aContent->filter); //1.2 CHANGES: Filter support + } + +//1.2 CHANGES: source & Target separated +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendSourceL( SmlSourcePtr_t aContent ) + { + AppendPCDataL(ELocURI, aContent->locURI); + AppendPCDataL(ELocName, aContent->locName); + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendTargetL( SmlTargetPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(ETarget, ETrue); + DoAppendTargetL(aContent); + EndElementL(); // ETarget + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendSourceL( SmlSourcePtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(ESource, ETrue); + DoAppendSourceL(aContent); //1.2 CHANGES: Source & Target separated + EndElementL(); // ETarget + } + +//1.2 CHANGES: Source & Target parent +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendSourceOrTargetParentL( SmlSourceOrTargetParentPtr_t aContent ) + { + AppendPCDataL(ELocURI, aContent->locURI); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendSourceParentL( SmlSourceParentPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(ESourceParent, ETrue); + DoAppendSourceOrTargetParentL(aContent); + EndElementL(); // ESourceParent + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendTargetParentL( SmlTargetParentPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(ETargetParent, ETrue); + DoAppendSourceOrTargetParentL(aContent); + EndElementL(); // ETargetParent + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendCredL( SmlCredPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(ECred, ETrue); + AppendMetaL(aContent->meta); + AppendPCDataL(EData, aContent->data); + EndElementL(); // ECred + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendSyncL( SmlSyncPtr_t aContent ) + { + BeginElementL(ESync, ETrue); + AppendPCDataL(ECmdID, aContent->cmdID); + if( aContent->flags & SmlNoResp_f ) + { + BeginElementL(ENoResp); + } + AppendCredL(aContent->cred); + AppendTargetL(aContent->target); + AppendSourceL(aContent->source); + AppendMetaL(aContent->meta); + AppendPCDataL(ENumberOfChanges, aContent->noc); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendGenericCmdL( SmlGenericCmdPtr_t aContent, Flag_t aMask ) + { + AppendPCDataL(ECmdID, aContent->cmdID); + if( (aContent->flags & SmlNoResp_f) & aMask ) + { + BeginElementL(ENoResp); + } + if( (aContent->flags & SmlArchive_f) & aMask ) + { + BeginElementL(EArchive); + } + if( (aContent->flags & SmlSftDel_f) & aMask ) + { + BeginElementL(ESftDel); + } + AppendCredL(aContent->cred); + AppendMetaL(aContent->meta); + AppendItemListL(aContent->itemList); + } +// FOTA +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendExecCmdL( SmlExecPtr_t aContent, Flag_t aMask ) + { + AppendPCDataL(ECmdID, aContent->cmdID); + if( (aContent->flags & SmlNoResp_f) & aMask ) + { + BeginElementL(ENoResp); + } + if( (aContent->flags & SmlArchive_f) & aMask ) + { + BeginElementL(EArchive); + } + if( (aContent->flags & SmlSftDel_f) & aMask ) + { + BeginElementL(ESftDel); + } + AppendCredL(aContent->cred); + AppendMetaL(aContent->meta); + AppendPCDataL(ECorrelator, aContent->correlator); + AppendItemL(aContent->item); + } +// FOTA end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendAddCmdL( SmlAddPtr_t aContent ) + { + BeginElementL(EAdd, ETrue); + DoAppendGenericCmdL(aContent, SmlNoResp_f); + EndElementL(); // EAdd + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendReplaceCmdL( SmlReplacePtr_t aContent ) + { + BeginElementL(EReplace, ETrue); + DoAppendGenericCmdL(aContent, SmlNoResp_f); + EndElementL(); // EReplace + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendCopyCmdL( SmlCopyPtr_t aContent ) + { + BeginElementL(ECopy, ETrue); + DoAppendGenericCmdL(aContent, SmlNoResp_f); + EndElementL(); // ECopy + } +// FOTA +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendExecCmdL( SmlExecPtr_t aContent ) + { + BeginElementL(EExec, ETrue); + DoAppendExecCmdL(aContent, SmlNoResp_f); + EndElementL(); // EExec + } +// FOTA end + +//1.2 CHANGES: Move command +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMoveCmdL( SmlMovePtr_t aContent ) + { + BeginElementL(EMove, ETrue); + DoAppendGenericCmdL(aContent, SmlNoResp_f); + EndElementL(); // EMove + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendDeleteCmdL( SmlDeletePtr_t aContent ) + { + BeginElementL(EDelete, ETrue); + DoAppendGenericCmdL(aContent, SmlNoResp_f|SmlArchive_f|SmlSftDel_f); + EndElementL(); // EDelete + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendAlertCmdL( SmlAlertPtr_t aContent ) + { + BeginElementL(EAlert, ETrue); + AppendPCDataL(ECmdID, aContent->cmdID); + if( aContent->flags & SmlNoResp_f ) + { + BeginElementL(ENoResp); + } + AppendCredL(aContent->cred); + AppendPCDataL(EData, aContent->data); +// FOTA + AppendPCDataL(ECorrelator, aContent->correlator); +// FOTA end + AppendItemListL(aContent->itemList); + EndElementL(); // EAlert + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendGetCmdL( SmlGetPtr_t aContent ) + { + BeginElementL(EGet, ETrue); + DoAppendPutGetL(aContent); + EndElementL(); // EPut + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendPutCmdL( SmlPutPtr_t aContent ) + { + BeginElementL(EPut, ETrue); + DoAppendPutGetL(aContent); + EndElementL(); // EPut + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendPutGetL( SmlPutPtr_t aContent ) + { + AppendPCDataL(ECmdID, aContent->cmdID); + if( aContent->flags & SmlNoResp_f ) + { + BeginElementL(ENoResp); + } + AppendPCDataL(ELang, aContent->lang); + AppendCredL(aContent->cred); + AppendMetaL(aContent->meta); + AppendItemListL(aContent->itemList); + } + +// ------------------------------------------------------------------------------------------------ +EXPORT_C Ret_t CXMLSyncMLGenerator::smlDeviceInfoL( SmlDevInfDevInfPtr_t aContent ) + { + BeginElementL(EData, ETrue); + CXMLDevInfGenerator* devgen = new (ELeave) CXMLDevInfGenerator(); + CleanupStack::PushL(devgen); + devgen->InitializeL(); + devgen->CreateWorkspaceL(); + devgen->SetIndentLevel(IndentLevel()); + devgen->smlDeviceInfo(aContent); + Workspace()->WriteL(devgen->Document()); + CleanupStack::PopAndDestroy(); // devgen + EndElementL(); // EPut + return KErrNone; + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMapCmdL( SmlMapPtr_t aContent ) + { + BeginElementL(EMap, ETrue); + AppendPCDataL(ECmdID, aContent->cmdID); + AppendTargetL(aContent->target); + AppendSourceL(aContent->source); + AppendCredL(aContent->cred); + AppendMetaL(aContent->meta); + AppendMapItemListL(aContent->mapItemList); + EndElementL(); // EMap + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendResultsCmdL( SmlResultsPtr_t aContent ) + { + BeginElementL(EResults, ETrue); + AppendPCDataL(ECmdID, aContent->cmdID); + AppendPCDataL(EMsgRef, aContent->msgRef); + AppendPCDataL(ECmdRef, aContent->cmdRef); + AppendMetaL(aContent->meta); + AppendPCDataL(ETargetRef, aContent->targetRef); + AppendPCDataL(ETargetRef, aContent->sourceRef); + AppendItemListL(aContent->itemList); + EndElementL(); // EResults + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendStatusCmdL( SmlStatusPtr_t aContent ) + { + BeginElementL(EStatus, ETrue); + AppendPCDataL(ECmdID, aContent->cmdID); + AppendPCDataL(EMsgRef, aContent->msgRef); + AppendPCDataL(ECmdRef, aContent->cmdRef); + AppendPCDataL(ECmd, aContent->cmd); + if( aContent->targetRefList ) + { + AppendTargetRefListL(aContent->targetRefList); + } + if( aContent->sourceRefList ) + { + AppendSourceRefListL(aContent->sourceRefList); + } + AppendCredL(aContent->cred); + AppendChalL(aContent->chal); + AppendPCDataL(EData, aContent->data); + if( aContent->itemList ) + { + AppendItemListL(aContent->itemList); + } + EndElementL(); // EStatus + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendStartAtomicOrSequenceL( SmlAtomicPtr_t aContent ) + { + AppendPCDataL(ECmdID, aContent->cmdID); + if( aContent->flags & SmlNoResp_f ) + { + BeginElementL(ENoResp); + } + AppendMetaL(aContent->meta); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendStartAtomicL( SmlAtomicPtr_t aContent ) + { + BeginElementL(EAtomic, ETrue); + AppendStartAtomicOrSequenceL(aContent); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendEndAtomicL() + { + EndElementL(); // EAtomic + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendStartSequenceL( SmlSequencePtr_t aContent ) + { + BeginElementL(ESequence, ETrue); + AppendStartAtomicOrSequenceL(aContent); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendEndSequenceL() + { + EndElementL(); // ESequence + } + +//1.2 CHANGES: Filter support +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendFilterL( SmlFilterPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(EFilter, ETrue); + AppendMetaL( aContent->meta ); + if( aContent->field ) + { + BeginElementL(EField, ETrue); + AppendItemL( aContent->field->item ); + EndElementL(); + } + if( aContent->record ) + { + BeginElementL(ERecord, ETrue); + AppendItemL( aContent->record->item ); + EndElementL(); + } + AppendPCDataL( EFilterType, aContent->filterType ); + EndElementL(); + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendPCDataL( TUint8 aElement, SmlPcdataPtr_t aContent, TInt aAmount ) + { + if( !aContent ) + { + return; + } + + TInt contentLength(aAmount == -1 ? aContent->length : aAmount); + + if( aContent->extension == SML_EXT_METINF ) + { + BeginElementL(aElement, ETrue); + DoAppendMetaL(SmlMetInfMetInfPtr_t(aContent->content)); + EndElementL(); + } +//1.2 CHANGES: Properties + else if( aContent->extension == SML_EXT_DEVINFPROP ) + { + BeginElementL(aElement, ETrue); + SmlDevInfCtCapPtr_t ct = (SmlDevInfCtCapPtr_t) aContent->content; + AppendPropertyListL( ct->property ); + EndElementL(); + } +// Changes end + else if( aContent->contentType == SML_PCDATA_OPAQUE ) + { + AddElementL(aElement, TPtrC8((TUint8*)aContent->content, contentLength)); + } + else + { + AddElementL(aElement, TPtrC8((TUint8*)aContent->content, contentLength), EXMLContentFormatInlineString); + } + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendPCDataListL( TUint8 aElement, SmlPcdataListPtr_t aList ) + { + for( SmlPcdataListPtr_t p = aList; p && p->data; p = p->next ) + { + AppendPCDataL(aElement, p->data); + } + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::FreeItemSizeAndMetaIfNeeded( SmlItemPtr_t aItem ) + { + if( aItem->meta ) + { + // if size element was created by generator -> delete it + if( aItem->generatorFlags & SML_PE_SIZE_CREATED_BY_GENERATOR ) + { + aItem->generatorFlags &= ~SML_PE_SIZE_CREATED_BY_GENERATOR; + delete SmlMetInfMetInfPtr_t(aItem->meta->content)->size; + SmlMetInfMetInfPtr_t(aItem->meta->content)->size = 0; + } + + // if meta element was created by generator -> delete it + if( aItem->generatorFlags & SML_PE_META_CREATED_BY_GENERATOR ) + { + aItem->generatorFlags &= ~SML_PE_META_CREATED_BY_GENERATOR; + delete aItem->meta; + aItem->meta = 0; + } + } + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemListL( SmlItemListPtr_t aList ) + { + iItemWasTruncated = EFalse; + + for( SmlItemListPtr_t p = aList, iItemIndex = 0; p && p->item; p = p->next, iItemIndex++ ) + { + Workspace()->BeginTransaction(); + + TRAPD(err, AppendItemL(p->item)); + + if( ((Workspace()->FreeSize() < KNSmlXmlBufferSafeTreshold) || (err == KErrTooBig)) && iUseTruncation ) + { + // Rollback everything that was written into buffer + Workspace()->Rollback(); + + SmlItemPtr_t item(p->item); + + // if this item does not have MoreData flag on --> put it on and add size to meta + if( !(item->generatorFlags & SML_PE_SIZE_SENT) ) + { + if( !item->meta ) + { + item->generatorFlags |= SML_PE_META_CREATED_BY_GENERATOR; + item->meta = new (ELeave) SmlPcdata_t(/*SML_PCDATA_EXTENSION, SML_EXT_METINF*/); + item->meta->contentType = SML_PCDATA_EXTENSION; + item->meta->extension = SML_EXT_METINF; + item->meta->content = new (ELeave) SmlMetInfMetInf_t(); + } + + if( !SmlMetInfMetInfPtr_t(item->meta->content)->size ) + { + item->generatorFlags |= SML_PE_SIZE_CREATED_BY_GENERATOR; + SmlMetInfMetInfPtr_t(item->meta->content)->size = new (ELeave) SmlPcdata_t(); + iBuffer.Num(TInt(item->data->length)); + SmlMetInfMetInfPtr_t(item->meta->content)->size->SetDataL(iBuffer); + } + } + + Workspace()->BeginTransaction(); + TRAPD(err, AppendItemBeginL(item)); + FreeItemSizeAndMetaIfNeeded(item); + if( (err != KErrNone) || (Workspace()->FreeSize() < 3*KNSmlXmlBufferSafeTreshold) ) + { + Workspace()->Rollback(); + User::Leave(KErrTooBig); + } + Workspace()->Commit(); + + item->generatorFlags |= SML_PE_SIZE_SENT; + + // Set dataconsume length + iDataConsumed = Workspace()->FreeSize() - 2*KNSmlXmlBufferSafeTreshold; + + // Now we most of item data in buffer + AppendItemDataL(item, iDataConsumed); + + // Now we most of item data in buffer + AppendItemEndL(ETrue); + + iItemWasTruncated = ETrue; + break; + } + else if( err != KErrNone ) + { + // Other error --> remove changes + Workspace()->Rollback(); + User::Leave(err); + } + + // Item added ok -> commit this item + Workspace()->Commit(); + } + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemBeginL( SmlItemPtr_t aContent ) + { + BeginElementL(EItem, ETrue); + AppendTargetL(aContent->target); + AppendSourceL(aContent->source); +//1.2 Changes: SourceTarget & sourceParent + AppendSourceParentL(aContent->sourceParent); + AppendTargetParentL(aContent->targetParent); +//Changes end + AppendMetaL(aContent->meta); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemEndL( TBool aMoreData ) + { + //if( aContent->flags & SmlMoreData_f ) + if( aMoreData ) + { + BeginElementL(EMoreData); + } + EndElementL(); // EItem + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemDataL( SmlItemPtr_t aContent, TInt aAmount ) + { + if( aContent->data && aContent->source && aContent->source->locURI ) + { + TPtrC8 locURI((TUint8*)aContent->source->locURI->content, aContent->source->locURI->length); + // HYBRID 1.2 CHANGE + if( locURI.Find(KDevInfGen()) != KErrNotFound ) + { + CWBXMLParser* parser = CWBXMLParser::NewL(); + CleanupStack::PushL(parser); + CWBXMLDevInfDocHandler* dh = CWBXMLDevInfDocHandler::NewL(this); + CleanupStack::PushL(dh); + parser->SetDocumentHandler(dh); + parser->SetExtensionHandler(dh); + RMemReadStream mrs(aContent->data->content, aContent->data->length); + parser->SetDocumentL(mrs); + + while( parser->ParseL() == KWBXMLParserErrorOk ) + ; + CleanupStack::PopAndDestroy(2); + return; + } + } + AppendPCDataL(EData, aContent->data, aAmount); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemL( SmlItemPtr_t aContent ) + { + AppendItemBeginL(aContent); + AppendItemDataL(aContent); + AppendItemEndL((aContent->flags & SmlMoreData_f) == SmlMoreData_f); + } + +//1.2 CHANGES: Filter support +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendItemL( SmlPcdataPtr_t aContent ) + { + if( !aContent ) + { + return; + } + SmlItemPtr_t item = (SmlItemPtr_t)aContent->content; + AppendItemL(item); + } +//Changes end + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendTargetRefListL( SmlTargetRefListPtr_t aList ) + { + AppendPCDataListL(ETargetRef, (SmlPcdataListPtr_t)aList); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendSourceRefListL( SmlSourceRefListPtr_t aList ) + { + AppendPCDataListL(ESourceRef, (SmlPcdataListPtr_t)aList); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendChalL( SmlChalPtr_t aContent ) + { + if( !aContent ) + { + return; + } + BeginElementL(EChal, ETrue); + AppendMetaL(aContent->meta); + EndElementL(); // EChal + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMapItemListL( SmlMapItemListPtr_t aList ) + { + for( SmlMapItemListPtr_t p = aList; p && p->mapItem; p = p->next ) + { + AppendMapItemL(p->mapItem); + } + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMapItemL( SmlMapItemPtr_t aContent ) + { + BeginElementL(EMapItem, ETrue); + AppendTargetL(aContent->target); + AppendSourceL(aContent->source); + EndElementL(); // EMapItem + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMetaL( SmlPcdataPtr_t aContent ) + { + if( !aContent ) + { + return; + } + SmlMetInfMetInfPtr_t meta = (SmlMetInfMetInfPtr_t)aContent->content; + AppendMetaL(meta); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMetaL( SmlMetInfMetInfPtr_t aMeta ) + { + BeginElementL(EMeta, ETrue); + DoAppendMetaL(aMeta); + EndElementL(); // EMeta + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::DoAppendMetaL( SmlMetInfMetInfPtr_t aMeta ) + { + SwitchCodePageL(ECodePageMetInf); + CXMLGenerator::SetNamespaceNameL(KMetInfNamespace(), CXMLGenerator::EAppendToEveryElement); + CXMLGenerator::SetTranslateTableL(KMetInfElements()); + + // FOTA + if ( aMeta ) + // FOTA end + { + AppendPCDataL(EFieldLevel, aMeta->fieldLevel); // 1.2 CHANGES: FieldLevel + AppendPCDataL(EMetFormat, aMeta->format); + AppendPCDataL(EMetType, aMeta->type); + AppendPCDataL(EMetMark, aMeta->mark); + AppendPCDataL(EMetSize, aMeta->size); + + if( aMeta->anchor ) + { + AppendMetAnchorL(aMeta->anchor); + } + + AppendPCDataL(EMetVersion, aMeta->version); + AppendPCDataL(EMetNextNonce, aMeta->nextnonce); + AppendPCDataL(EMetMaxMsgSize, aMeta->maxmsgsize); + AppendPCDataL(EMetMaxObjSize, aMeta->maxobjsize); + + if( aMeta->emi ) + { + AppendPCDataListL(EMetEMI, aMeta->emi); + } + if( aMeta->mem ) + { + AppendMetMemL(aMeta->mem); + } + } + + SwitchCodePageL(ECodePageSyncML); + CXMLGenerator::SetNamespaceNameL(KSyncMLNamespace()); + CXMLGenerator::SetTranslateTableL(KSyncMLElements()); + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMetMemL( SmlMetInfMemPtr_t aContent ) + { + BeginElementL(EMetMem, ETrue); + AppendPCDataL(EMetSharedMem, aContent->shared); + AppendPCDataL(EMetFreeMem, aContent->free); + AppendPCDataL(EMetFreeID, aContent->freeid); + EndElementL(); // EMetMem + } + +// ------------------------------------------------------------------------------------------------ +void CXMLSyncMLGenerator::AppendMetAnchorL( SmlMetInfAnchorPtr_t aContent ) + { + BeginElementL(EMetAnchor, ETrue); + AppendPCDataL(EMetLast, aContent->last); + AppendPCDataL(EMetNext, aContent->next); + EndElementL(); // EMetAnchor + } + +// 1.2 CHANGES: Properties and params for filter. +void CXMLSyncMLGenerator::AppendPropParamL( SmlDevInfPropParamPtr_t aContent) + { + BeginElementL(EDevPropParam, ETrue); + AppendPCDataL(EDevParamName, aContent->paramname); + AppendPCDataL(EDevDataType, aContent->datatype); + AppendPCDataListL(EDevValEnum, aContent->valenum); + AppendPCDataL(EDevDisplayName, aContent->displayname); + EndElementL(); // EDevPropParam + } +void CXMLSyncMLGenerator::AppendPropParamListL( SmlDevInfPropParamListPtr_t aContent) + { + if (aContent && aContent->data) + { + for( SmlDevInfPropParamListPtr_t p = aContent; p && p->data; p = p->next ) + { + AppendPropParamL(p->data); + } + } + } +void CXMLSyncMLGenerator::AppendPropertyL( SmlDevInfPropertyPtr_t aContent ) + { + BeginElementL(EDevProperty, ETrue); + AppendPCDataL(EDevPropName, aContent->propname); + AppendPCDataL(EDevDataType, aContent->datatype); + AppendPCDataL(EDevMaxOccur, aContent->maxoccur); + AppendPCDataL(EDevMaxSize, aContent->maxsize); + if (aContent->notruncate) + { + BeginElementL(EDevNoTruncate); + } + AppendPCDataListL(EDevValEnum, aContent->valenum); + AppendPCDataL(EDevDisplayName, aContent->displayname); + AppendPropParamListL(aContent->propparam); + EndElementL(); // EDevProperty + } +void CXMLSyncMLGenerator::AppendPropertyListL( SmlDevInfPropertyListPtr_t aContent ) + { + SwitchCodePageL(ECodePageDevInf); + CXMLGenerator::SetTranslateTableL(KDevInfElements()); + for( SmlDevInfPropertyListPtr_t p = aContent; p && p->data; p = p->next ) + { + AppendPropertyL(p->data); + } + SwitchCodePageL(ECodePageSyncML); + CXMLGenerator::SetNamespaceNameL(KSyncMLNamespace()); + CXMLGenerator::SetTranslateTableL(KSyncMLElements()); + } +// Changes end + +//End of File