# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1261031979 -7200 # Node ID 95fdac6ccb5c1b99b47dca603679c890171f4a13 # Parent dab8a81a92de5ce1471b2f669fe487f7b27a26ff Revision: 200949 Kit: 200951 diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_agenda_handler_plugin_api/ds_agenda_handler_plugin_api.metaxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_agenda_handler_plugin_api/ds_agenda_handler_plugin_api.metaxml Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,13 @@ + + +ds_agenda_handler_plugin_api +This api is used for creating new implementation to support multiple calendar feature for Agenda Adapter +c++ +Agenda Adapter + + + +no +no + + diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_agenda_handler_plugin_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_agenda_handler_plugin_api/group/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009 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: +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/nsmlagendaadapterhandler.h APP_LAYER_PLATFORM_EXPORT_PATH(nsmlagendaadapterhandler.h) +../inc/nsmlagendaadapterhandler.inl APP_LAYER_PLATFORM_EXPORT_PATH(nsmlagendaadapterhandler.inl) \ No newline at end of file diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_agenda_handler_plugin_api/inc/nsmlagendaadapterhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_agenda_handler_plugin_api/inc/nsmlagendaadapterhandler.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,168 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#ifndef C_NSMLAGENDA_ADAPTERHANDLERPLUGIN_H +#define C_NSMLAGENDA_ADAPTERHANDLERPLUGIN_H + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include + +// Constants +const TUid KAgendaAdapterHandlerInterfaceUid = { 0x20029F14 }; + +/** +* Interface definition for ECoM plug-in adapters +*/ +class CNSmlAgendaAdapterHandler: public CBase + { + public: + /** + * Ecom interface static factory method implementation. + * @param aImpUid Ecom's implementation uid + * @return A pointer to the created instance of CNSmlAgendaAdapterHandler + */ + static inline CNSmlAgendaAdapterHandler* NewL(TUid aImpUid); + + /** + * Destructor + */ + virtual ~CNSmlAgendaAdapterHandler(); + + public: + /** + * Determines the Server supported folder properties + * + * @param aServerDataStoreFormat Class structure of server device information + * + */ + virtual void CheckServerSupportForFolder( const CSmlDataStoreFormat& aServerDataStoreFormat ) = 0; + + /** + * Retrieve the folder from the Organizer db + * + * @param aUid variable specifing which Folder to be fetched + * @param aStream on return will have the Folder details + * + */ + virtual void FetchFolderL( const TSmlDbItemUid aUid, RBufWriteStream& aStream ) = 0; + + /** + * Determine the list of folders in the Organizer db owned by the calling application + * + * @param aFolderUidArray array on return will have UID's of owned folders + * + */ + virtual void SynchronizableCalendarIdsL( CArrayFixFlat* aFolderUidArray ) = 0; + + /** + * Create a folder on to Organizer db + * + * @param aStream containing the folder details to be created with + * @return TCalLocalUid of the newly created folder + * + */ + virtual TCalLocalUid CreateFolderL( RBufReadStream& aStream ) = 0; + + /** + * Replace the existing folder with updated info + * + * @param aUid determines folder to act upon + * @param aStream containing the folder information to be updated + * @param aSyncStatus updated folders current syncstatus + * + */ + virtual void ReplaceFolderL( const TCalLocalUid& aUid, RBufReadStream& aStream, TBool& aSyncStatus ) = 0; + + /** + * Retrieves the foldername + * + * @param aUid of the folder whose name to be determined + * @return HBufC* name of the folder + * + */ + virtual HBufC* FolderNameL( TSmlDbItemUid aUid ) = 0; + + /** + * Retrieve the calendar sync capability supported by the device + * + * @param aStringPool + * @return CSmlDataStoreFormat* Class structure of supported capabilities + * + */ + virtual CSmlDataStoreFormat* StoreFormatL( RStringPool& aStringPool ) = 0; + + /** + * Create a snap shot item + * + * @param aUid of folder whose snapshot to be created + * @retrun TNSmlSnapshotItem class + * + */ + virtual TNSmlSnapshotItem CreateFolderSnapShotItemL( const TCalLocalUid& aUid ) = 0; + + /** + * Determine the folder owner + * + * @return TInt uid of the owner application + * + */ + virtual TInt DeviceSyncOwner() = 0; + + /** + * Determines the sync status of the folder + * + * @param aUid determine the folder whose sync status to be retrieved + * @return TBool sync status + * + */ + virtual TBool FolderSyncStatusL( TSmlDbItemUid aUid ) = 0; + + /** + * Determines the sync status of the folder + * + * @param aFolderName determine the folder whose sync status to be retrieved + * @return TBool sync status + * + */ + virtual TBool FolderSyncStatusL( HBufC* aFolderName ) = 0; + + public: + /** + * Variable to hold the Plugin's Opaque Data + */ + HBufC8* iOpaqueData; + + private: + /** + * Used internally to create ECOM implementation + */ + TUid iDtor_ID_Key; + + }; + +#include "nsmlagendaadapterhandler.inl" + +#endif // C_NSMLAGENDA_ADAPTERHANDLERPLUGIN_H + +// End of File + diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_agenda_handler_plugin_api/inc/nsmlagendaadapterhandler.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_agenda_handler_plugin_api/inc/nsmlagendaadapterhandler.inl Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +// INCLUDE FILES +#include +#include "nsmlagendaadapterhandler.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CNSmlAgendaAdapterHandler::NewL +// Two phase construction +// ---------------------------------------------------------------------------- +inline CNSmlAgendaAdapterHandler* CNSmlAgendaAdapterHandler::NewL( TUid aImpUid) + { + TAny* implementation = REComSession::CreateImplementationL ( aImpUid, + _FOFF ( CNSmlAgendaAdapterHandler, iDtor_ID_Key )); + CNSmlAgendaAdapterHandler* self = REINTERPRET_CAST( CNSmlAgendaAdapterHandler*, implementation ); + return self; + } + +// ---------------------------------------------------------------------------- +// CNSmlAgendaAdapterHandler::~CNSmlAgendaAdapterHandler +// Destructor +// ---------------------------------------------------------------------------- +inline CNSmlAgendaAdapterHandler::~CNSmlAgendaAdapterHandler() + { + REComSession::DestroyedImplementation( iDtor_ID_Key ); + delete iOpaqueData; + } diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_folder_util_api/ds_folder_util_api.metaxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_folder_util_api/ds_folder_util_api.metaxml Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,13 @@ + + +ds_folder_util_api +Support for folderparsing API +c++ +DSUtils + + + +no +no + + diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_folder_util_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_folder_util_api/group/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2009 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: +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/nsmlfolderparser.h APP_LAYER_PLATFORM_EXPORT_PATH(nsmlfolderparser.h) \ No newline at end of file diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/ds_folder_util_api/inc/nsmlfolderparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentctrl_plat/ds_folder_util_api/inc/nsmlfolderparser.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,310 @@ +/* +* Copyright (c) 2004 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: Folder XML parser +* +*/ + + +// 1.2 Changes: nsmlxmlparser module added + + +#ifndef __NSMLFOLDERPARSER_H__ +#define __NSMLFOLDERPARSER_H__ + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include + +// ------------------------------------------------------------------------------------------------ +// Class forward declarations +// ------------------------------------------------------------------------------------------------ +class CNSmlXmlParser; +class CNSmlExtData; + + +//Constants + +// the maximum length of an integer in characters +const TInt KIntegerMaxLength = 12; + +// the length of a datetime in characters +const TInt KDateTimeLength = 16; + +// ------------------------------------------------------------------------------------------------ +// Typedefs +// ------------------------------------------------------------------------------------------------ +// the array used for xval-values +typedef CArrayPtrFlat CNSmlXValArray; +// the array used for extension data +typedef CArrayPtrFlat CNSmlExtDataArray; + +// enumeration for boolean values +enum TNSmlBoolean + { + EBooleanMissing = 0, // not included in the xml + EBooleanTrue, + EBooleanFalse + }; + +// The error values returned from parser and generator functions +enum TNSmlParserGeneratorError + { + EErrorNone, // no error + EOutOfMemory, // out of memory + EMandatoryFieldNotFound,// XNam inside Ext missing + EInvalidBooleanValue, // Invalid value inside boolean elements + EInvalidIntegerValue, // Invalid value inside integer elements + EInvalidDatetimeValue, // Invalid value inside datetime elements + EInvalidCDataStructure, // CDATA error + EInvalidXmlError, // Xml includes invalid data, i.e. xml generally against dtd + EInvalidFilename, // file was not found or the filename was otherwise erroneous + EUnknownError // Unknown error + }; + +// extension data (found in and folder) +class CNSmlExtData : public CBase + { +public: + IMPORT_C static CNSmlExtData* NewL(); + IMPORT_C static CNSmlExtData* NewLC(); + IMPORT_C virtual ~CNSmlExtData(); + + IMPORT_C void AddXValL( HBufC8* aXVal ); + + IMPORT_C void GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; + IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; + IMPORT_C void ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ); + +private: + CNSmlExtData(); + void ConstructL(); + +public: + HBufC8* iXNam; + CNSmlXValArray* iXVals; + }; + + +// folder attributes +struct TNSmlFolderAttributeData + { + IMPORT_C TNSmlFolderAttributeData(); + + /* + * Returns the count of attributes that are not EBooleanMissing. + */ + IMPORT_C TInt AttributeCount() const; + + IMPORT_C void GenerateXml( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; + IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; + + TNSmlBoolean iHidden; + TNSmlBoolean iSystem; + TNSmlBoolean iArchived; + TNSmlBoolean iDelete; + TNSmlBoolean iWritable; + TNSmlBoolean iReadable; + TNSmlBoolean iExecutable; + }; + +// Base class for actual parsergenerators. +// Implements basic utilities for parsing and generating the xml. +class CNSmlXmlParser : public CBase + { +public: + /* + * The constructor. + */ + IMPORT_C CNSmlXmlParser(); + + /* + * The destructor. + */ + IMPORT_C virtual ~CNSmlXmlParser(); + + /* + * Parses through the given xml and places the data it contains to + * member variables. Removes all the comments from the original string. + * @param aXml The xml to be parsed. + * @return + */ + virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ) =0; + + /* + * Generates xml using the data in member variables of the child class. + * aXml contains the generated xml when method returns successfully. + * Caller should not instantiate + * the buffer, since this method counts the size of the xml and + * instantiates the buffer using the size as its maximum size. + * Caller gets the control of the buffer when method returns. + * @param aXml A pointer to a buffer, which is instantiated in this + * method and contains the xml when method returns succesfully. + * @return + */ + virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ) =0; + + /* + * Counts the size of the generated xml, when the xml would be generated + * using the data in child class' member variables. + */ + virtual TInt CountXmlSizeL() =0; + + /* utility functions */ + + void PreProcessL( HBufC8* aXml ) const; + + TPtrC8 BooleanToString( const TNSmlBoolean aValue ) const; + TBuf8 DateTimeToStringL( const TTime& aValue ) const; + TBuf8 IntegerToString( const TInt aValue ) const; + + TNSmlBoolean StringToBooleanL( const TPtrC8& aValue ) const; + TInt StringToIntegerL( const TPtrC8& aValue ) const; + // Note: Ignores UTC-times (Z-ending) and treats them as local time! + TTime StringToTTimeL( TPtrC8& aValue ) const; + + void AppendElement( TPtr8& aPtr, const TDesC8& aElementName, const TDesC8& aValue ) const; + void AppendElement( TPtr8& aPtr, const TDesC8& aElementName ) const; + void AppendEndElement( TPtr8& aPtr, const TDesC8& aElementName ) const; + + TInt SizeOfElements( const TDesC8& aElementName ) const; + TInt SizeOfBoolean( const TNSmlBoolean aValue, const TDesC8& aElementName ) const; + TInt SizeOfDatetime( const TDesC8& aElementName ) const; + TInt SizeOfInteger( const TDesC8& aElementName ) const; + TInt SizeOfString( const HBufC8* aValue, const TDesC8& aElementName ) const; + + TInt EntitiesToCharactersL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; + TInt CharactersToEntitiesL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; + + TBool IsWhitespace( const TDesC8& aText ) const; + void LeaveIfNotWhiteSpaceL( const TDesC8& aText ) const; + + TNSmlParserGeneratorError CheckError( const TInt error ) const; + +protected: + // parsing methods + void ParseL( TPtrC8& aXml ); + void AddToCompleteL( const TPtrC8 aStr ); + void ResetBufferL( HBufC8*& aBuf ) const; + void AddToBufferL( const TText c, HBufC8*& aBuf ) const; + + virtual void NextElementL( TPtrC8 aElement ) =0; + virtual void NextDataL( TPtrC8 aData ) =0; + +private: + TInt ReplaceL( HBufC8*& aText, const TDesC8& aTarget, const TDesC8& aItem, TInt aStartPos, TInt aEndPos ) const; + void CheckDatetimeErrorL( const TInt error ) const; + +protected: + HBufC8* iBuffer; + HBufC8* iCompleteBuffer; + }; + +// Folder parser. Implements parsing and generating of Folder xml. +class CNSmlFolderParser : public CNSmlXmlParser + { +public: + IMPORT_C static CNSmlFolderParser* NewL(); + IMPORT_C static CNSmlFolderParser* NewLC(); + IMPORT_C virtual ~CNSmlFolderParser(); + + IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ); + IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ); + IMPORT_C virtual TInt CountXmlSizeL() ; + + IMPORT_C void AddExtL( CNSmlExtData* aExt ); + +protected: + virtual void NextElementL( TPtrC8 aElement ); + virtual void NextDataL( TPtrC8 aData ); + +protected: + + // the folder elements (states) in the order they appear in DTD + enum TNSmlCurrentFolderElement + { + EFolderNone = 0, + EFolder, + EFolderName, + EFolderCreated, + EFolderModified, + EFolderAccessed, + EAttributes, + EAttributesH, + EAttributesS, + EAttributesA, + EAttributesD, + EAttributesW, + EAttributesR, + EAttributesX, + EFolderRole, + EFolderExt, + EFolderExtXNam, + EFolderExtXVal + }; + + // struct used in folder parsing (which members are already set) + struct TNSmlSetFolderValues + { + TNSmlSetFolderValues(); + void Reset(); + + TBool iFolder; + TBool iName; + TBool iCreated; + TBool iModified; + TBool iAccessed; + TBool iAttributes; + TBool iAttributesH; + TBool iAttributesS; + TBool iAttributesA; + TBool iAttributesD; + TBool iAttributesW; + TBool iAttributesR; + TBool iAttributesX; + TBool iRole; + TBool iXNam; + }; + +private: + void StartElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState, TBool aIsSet = EFalse ); + void EndElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState ); + + void GenerateFolderXmlL( HBufC8*& aXml ); + void ConvertIntoEntitiesL(); + + CNSmlFolderParser(); + void ConstructL(); + +public: + HBufC8* iName; + TTime iCreated; + TTime iModified; + TTime iAccessed; + TNSmlFolderAttributeData iAttributes; + HBufC8* iRole; + CNSmlExtDataArray* iExt; + +private: + TNSmlCurrentFolderElement iCurrentState; + TNSmlCurrentFolderElement iLastState; + TNSmlSetFolderValues iSetValues; + + CNSmlExtData* iExtData; + }; + + + +#endif // __NSMLFOLDERPARSER_H__ diff -r dab8a81a92de -r 95fdac6ccb5c contentctrl_plat/group/bld.inf --- a/contentctrl_plat/group/bld.inf Mon Nov 23 14:46:41 2009 +0200 +++ b/contentctrl_plat/group/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -17,7 +17,6 @@ */ - -//#include "../syncml_notifier_roaming_api/group/bld.inf" -//#include "../sync_service_api/group/bld.inf" #include "../oma_ds_presync_plugin_api/group/bld.inf" +#include "../ds_agenda_handler_plugin_api/group/bld.inf" +#include "../ds_folder_util_api/group/bld.inf" diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AiwSyncProvider/src/AiwSyncProvider.rss --- a/omads/omadsappui/AiwSyncProvider/src/AiwSyncProvider.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AiwSyncProvider/src/AiwSyncProvider.rss Thu Dec 17 08:39:39 2009 +0200 @@ -19,7 +19,7 @@ #include #include "registryinfov2.rh" #include "AiwSyncProvider.rh" -#include +#include #include "AiwCommon.hrh" #include diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/group/AspSyncUtil.mmp --- a/omads/omadsappui/AspSyncUtil/group/AspSyncUtil.mmp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/group/AspSyncUtil.mmp Thu Dec 17 08:39:39 2009 +0200 @@ -117,12 +117,11 @@ //LIBRARY syncmldatafilter.lib LIBRARY nsmltransporthandler.lib -LIBRARY centralrepository.lib - //#ifdef __SAP_POLICY_MANAGEMENT -LIBRARY policyengine.lib +LIBRARY policyengine.lib calinterimapi.lib //#endif - +LIBRARY calencommonutils.lib +LIBRARY CalenInterimUtils2.lib //LIBRARY nsmlxml.lib //LIBRARY nsmlwbxml.lib diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/inc/AspProfile.h --- a/omads/omadsappui/AspSyncUtil/inc/AspProfile.h Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/inc/AspProfile.h Thu Dec 17 08:39:39 2009 +0200 @@ -22,6 +22,7 @@ // INCLUDES #include #include +#include #include // for RSyncMLSession #include // for RSyncMLDataSyncProfile @@ -469,7 +470,9 @@ void ReadDataProviderItemL(RSyncMLDataProvider& aProvider, TAspProviderItem& aItem); - + void CreateCalLocalDatabaseL(TDes& aCalName); + void RetrieveCalLocalDatabaseL(TDes& aCalName); + TBool IsCalNameAvailableL(CCalSession& aSession ,TDes& aCalName); private: diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspAdvanceSettingsDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspAdvanceSettingsDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspAdvanceSettingsDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -176,11 +176,11 @@ { switch ( aEventType ) { - case EEventItemDoubleClicked: + case EEventItemSingleClicked: HandleOKL(); break; case EEventEnterKeyPressed : - case EEventItemClicked : + case EEventItemDraggingActioned : case EEventPenDownOnItem : if(iEditMode != EDialogModeSettingEnforcement) diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspContentDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspContentDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspContentDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -546,7 +546,7 @@ { switch ( aEventType ) { - case EEventItemDoubleClicked: + case EEventItemSingleClicked: HandleOKL(); break; default: diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspFilterDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspFilterDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspFilterDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -326,7 +326,7 @@ // void CAspFilterDialog::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType) { - if (aEventType == EEventEnterKeyPressed || aEventType == EEventItemDoubleClicked) + if (aEventType == EEventEnterKeyPressed || aEventType == EEventItemSingleClicked) { HandleOKL(); } diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspProfile.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspProfile.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspProfile.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -21,6 +21,10 @@ #include #include // FeatureManager +#include +#include +#include +#include #include "AspProfile.h" #include "AspResHandler.h" @@ -28,8 +32,12 @@ #include "AspDebug.h" #include "AspSchedule.h" #include //CRepository - - +#include // Calendar File Meta Data Properties +#include +#include + +_LIT(KDrive ,"C:"); +_LIT(KCharUnderscore, "_"); /******************************************************************************* * class TAspProviderItem @@ -833,6 +841,33 @@ aContentCount = goodContentCount; return EMandatoryNoRemoteDatabase; } + + if (task.iDataProviderId == KUidNSmlAdapterCalendar.iUid) + { + CCalSession* session = CCalSession::NewL(); + CleanupStack::PushL(session); + TRAPD (err, session->OpenL(task.iClientDataSource)); + if (err == KErrNotFound) + { + TInt index = FindProviderIndex(task.iDataProviderId); + TAspProviderItem& provider = ProviderItem(index); + + TBuf localDatabase; + TBuf remoteDatabase; + TInt syncDirection; + TBool taskEnabled; + ReadTaskL(provider.iDataProviderId, localDatabase, remoteDatabase, + taskEnabled, syncDirection); + + //Creating new task creates new calendar local database + CreateTaskL(provider.iDataProviderId, localDatabase, remoteDatabase, + taskEnabled, syncDirection); + + InitAllTasksL(); + InitDataProvidersL(); + } + CleanupStack::PopAndDestroy(session); + } goodContentCount++; } @@ -1150,9 +1185,18 @@ RSyncMLTask task; CleanupClosePushL(task); - task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, + if (aDataProvider.iDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + CreateCalLocalDatabaseL(calLocalDb); + task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, + KNullDesC, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, KNullDesC, aDataProvider.iDefaultDataStore); - + } task.SetEnabledL(aDataProvider.iIsIncludedInSync); task.SetDefaultSyncTypeL(SmlSyncDirection()); @@ -1212,14 +1256,39 @@ } else { - task.CreateL(iProfile->Profile(), aDataProviderId, + if (aDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + CreateCalLocalDatabaseL(calLocalDb); + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProviderId, aRemoteDatabase, item.iDefaultDataStore); + } } } else { - task.CreateL(iProfile->Profile(), aDataProviderId, - aRemoteDatabase, aLocalDatabase); + if (aDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + TRAPD(err ,RetrieveCalLocalDatabaseL(calLocalDb)); + if (err != KErrNone) + { + CreateCalLocalDatabaseL(calLocalDb); + } + + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, aLocalDatabase); + } } task.SetEnabledL(aEnabled); @@ -1255,6 +1324,213 @@ FLOG( _L("CAspContentList::CreateTask END") ); } +// ----------------------------------------------------------------------------- +// CAspContentList::CreateTask +// +// ----------------------------------------------------------------------------- +// +void CAspContentList::CreateCalLocalDatabaseL(TDes& aCalName) + { + + aCalName.Copy(KDrive); + + TBuf<128> buffer; + iProfile->GetName(buffer); + + CCalSession* calSession = CCalSession::NewL(); + CleanupStack::PushL(calSession); + + + TInt suffix = 0; + TInt suffixLen = 0; + TInt delPos = buffer.Length(); + + while (!IsCalNameAvailableL(*calSession ,buffer)) + { + //A db with profile name already exists , try profile_1 ,profile_2 etc.. + if (!suffix) + { + buffer.Append(KCharUnderscore); + ++delPos; + } + else + { + while (suffix/10) + { + ++suffixLen; + } + + buffer.Delete(delPos ,++suffixLen); + suffixLen = 0; + } + buffer.AppendNum(++suffix); + } + + TBuf8<128> keyBuff; + TUint calValue = 0; + CCalCalendarInfo* calinfo = CCalCalendarInfo::NewL(); + CleanupStack::PushL(calinfo); + //Visibility + calinfo->SetEnabled(ETrue); + + calinfo->SetNameL(buffer); + calinfo->SetColor(Math::Random()); + + // Set Meta Data Properties + // LUID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + calValue = CCalenMultiCalUtil::GetNextAvailableOffsetL(); + FLOG(_L("CNSmlOviAgendaAdapterPlugin::CreateFolderItemL: nextoffset: '%d'"), calValue); + TPckgC pckgUidValue( calValue ); + calinfo->SetPropertyL( keyBuff, pckgUidValue ); + + // Create & Modified Time Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( ECreationTime ); + TTime time; + time.HomeTime(); + TPckgC pckgCreateTimeValue( time ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + + // Sync Status + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( ETrue ); + TPckgC pckgSyncStatusValue( syncstatus ); + calinfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Global UID MetaDataProperty + keyBuff.Zero(); + keyBuff.AppendNum( EGlobalUUID ); + CCalenInterimUtils2* interimUtils = CCalenInterimUtils2::NewL(); + CleanupStack::PushL( interimUtils ); + HBufC8* guuid = interimUtils->CalFileGlobalUidL(); + TPtr8 guuidPtr = guuid->Des(); + CleanupStack::PushL( guuid ); + calinfo->SetPropertyL( keyBuff, guuidPtr ); + CleanupStack::PopAndDestroy( guuid ); + CleanupStack::PopAndDestroy( interimUtils ); + + // Owner Name + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncServiceOwner ); + TPckgC pckgAppUIDValue( KCRUidNSmlDSApp.iUid ); + calinfo->SetPropertyL( keyBuff, pckgAppUIDValue ); + + + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC pckgProfileIdValue( iProfile->ProfileId() ); + calinfo->SetPropertyL( keyBuff, pckgProfileIdValue ); + + + // Create the CalFile + HBufC* calfilename = CCalenMultiCalUtil::GetNextAvailableCalFileL(); + calSession->CreateCalFileL( calfilename->Des(), *calinfo ); + + aCalName.Copy( calfilename->Des() ); + + delete calfilename; + + CleanupStack::PopAndDestroy(calinfo); + CleanupStack::PopAndDestroy(calSession); + } + +// ----------------------------------------------------------------------------- +// CAspContentList::IsCalNameAvailableL +// +// ----------------------------------------------------------------------------- +// +TBool CAspContentList::IsCalNameAvailableL(CCalSession& aSession ,TDes& aCalName) + { + CCalSession* vCalSubSession = NULL; + CDesCArray* calfilearr = aSession.ListCalFilesL(); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(aSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + + if (aCalName == caleninfo->NameL()) + { + delete caleninfo; + delete calfilearr; + CleanupStack::PopAndDestroy(vCalSubSession); + return EFalse; + } + + delete caleninfo; + CleanupStack::PopAndDestroy(vCalSubSession); + } + delete calfilearr; + return ETrue; + + } +// ----------------------------------------------------------------------------- +// CAspContentList::RetrieveCalLocalDatabaseL +// +// ----------------------------------------------------------------------------- +// +void CAspContentList::RetrieveCalLocalDatabaseL(TDes& aCalName) + { + + FLOG(_L("CAspContentList::RetrieveCalLocalDatabaseL: BEGIN")); + + TBuf8<128> keyBuff; + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + + TBool dbFound = EFalse; + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(*vCalSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + TInt profileId; + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC intBuf(profileId); + TRAP_IGNORE(intBuf.Set(caleninfo->PropertyValueL(keyBuff))); + + profileId = intBuf(); + + if ( profileId == iProfile->ProfileId()) + { + aCalName.Append(caleninfo->FileNameL()); + dbFound = ETrue; + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + break; + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + + if( dbFound == EFalse ) + { + delete calfilearr; + User::Leave( KErrNotFound ); + } + + delete calfilearr; + CleanupStack::PopAndDestroy(vCalSession); + } // ----------------------------------------------------------------------------- // CAspContentList::ReadTaskL diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspProfileDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspProfileDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspProfileDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -190,11 +190,11 @@ { switch ( aEventType ) { - case EEventItemDoubleClicked: + case EEventItemSingleClicked: HandleOKL(); break; case EEventEnterKeyPressed : - case EEventItemClicked : + case EEventItemDraggingActioned : case EEventPenDownOnItem : if(iEditMode != EDialogModeSettingEnforcement) diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspProfileWizardDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspProfileWizardDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspProfileWizardDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -260,7 +260,7 @@ { switch(aEventType) { - case EEventItemClicked: + case EEventItemSingleClicked: this->ProcessCommandL(EAknSoftkeySelect); break; default: @@ -531,7 +531,7 @@ switch(aEventType) { - case EEventItemClicked: + case EEventItemSingleClicked: index=aListBox->CurrentItemIndex(); selectableItem = (*iSelectionItemList)[index]; if(selectableItem->SelectionStatus()) diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspScheduleDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspScheduleDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspScheduleDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -204,11 +204,10 @@ { switch ( aEventType ) { - case EEventItemDoubleClicked: + case EEventItemSingleClicked: HandleOKL(); break; case EEventEnterKeyPressed : - case EEventItemClicked : case EEventItemDraggingActioned : case EEventPenDownOnItem : break; @@ -2785,7 +2784,7 @@ switch(aEventType) { - case EEventItemClicked: + case EEventItemSingleClicked: index=aListBox->CurrentItemIndex(); selectableItem = (*iSelectionItemList)[index]; if(selectableItem->SelectionStatus()) diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspSettingDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspSettingDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspSettingDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -1614,16 +1614,17 @@ TAspParam param(iApplicationId, iSyncSession); CAspProfile* profile = CAspProfile::NewLC(param); - profile->OpenL(iCurrentProfileId, CAspProfile::EOpenRead, + profile->OpenL(iCurrentProfileId, CAspProfile::EOpenReadWrite, CAspProfile::EAllProperties); TInt mandatoryConnectionData = CAspProfile::CheckMandatoryConnData(profile); - CleanupStack::PopAndDestroy(profile); - + iContentList->SetProfile(profile); TInt contentCount = 0; TInt mandatoryContentData = iContentList->CheckMandatoryDataL(contentCount); - + iContentList->SetProfile(NULL); + CleanupStack::PopAndDestroy(profile); + if (mandatoryConnectionData != EMandatoryOk) { return mandatoryConnectionData; @@ -2406,7 +2407,7 @@ { switch(aEventType) { - case EEventItemClicked : + case EEventItemSingleClicked : HandleOKL(); break; default: diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -181,7 +181,7 @@ switch ( aEventType ) { case EEventEnterKeyPressed: - case EEventItemDoubleClicked: + case EEventItemSingleClicked: HandleOKL(); break; default: diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspSyncUtil.rss --- a/omads/omadsappui/AspSyncUtil/src/AspSyncUtil.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspSyncUtil.rss Thu Dec 17 08:39:39 2009 +0200 @@ -25,10 +25,10 @@ #include "AspSyncUtil.rh" // aspsyncutil uses sync app .loc file -#include +#include // For profiles sync application brings -#include +#include // common avkon strings #include @@ -1457,7 +1457,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; }, + MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; flags = EEikMenuItemAction;}, #ifdef __SERIES60_HELP MENU_ITEM { command=EAknCmdHelp; txt=qtn_options_help; }, @@ -1524,7 +1524,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; }, + MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; flags = EEikMenuItemAction;}, #ifdef __SERIES60_HELP MENU_ITEM { command=EAknCmdHelp; txt=qtn_options_help; }, @@ -1538,7 +1538,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; }, + MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; flags = EEikMenuItemAction; }, #ifdef __SERIES60_HELP MENU_ITEM { command=EAspMenuCmdHelp; txt=qtn_options_help; }, @@ -1626,7 +1626,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; }, + MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; flags = EEikMenuItemAction; }, #ifdef __SERIES60_HELP MENU_ITEM { command=EAknCmdHelp; txt=qtn_options_help; }, @@ -1678,7 +1678,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdSelect; txt=qtn_sml_cmd_select; }, + MENU_ITEM { command=EAspMenuCmdSelect; txt=qtn_sml_cmd_select; flags = EEikMenuItemAction;}, MENU_ITEM { command=EAspMenuCmdView; txt=qtn_sml_cmd_view_contents; }, #ifdef __SERIES60_HELP @@ -1735,7 +1735,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change; }, + MENU_ITEM { command=EAspMenuCmdChange; txt=qtn_options_change;flags = EEikMenuItemAction; }, #ifdef __SERIES60_HELP MENU_ITEM { command=EAknCmdHelp; txt=qtn_options_help; }, @@ -1789,7 +1789,7 @@ { items= { - MENU_ITEM { command=EAspMenuCmdOpen; txt=qtn_options_open; }, + MENU_ITEM { command=EAspMenuCmdOpen; txt=qtn_options_open; flags = EEikMenuItemAction; }, #ifdef __SERIES60_HELP MENU_ITEM { command=EAknCmdHelp; txt=qtn_options_help; }, @@ -1920,8 +1920,8 @@ { items = { - MENU_ITEM { command=EAspMenuCmdMark; txt=qtn_sml_cmd_mark; }, - MENU_ITEM { command=EAspMenuCmdUnmark; txt=qtn_sml_cmd_unmark; }, + MENU_ITEM { command=EAspMenuCmdMark; txt=qtn_sml_cmd_mark; flags = EEikMenuItemAction; }, + MENU_ITEM { command=EAspMenuCmdUnmark; txt=qtn_sml_cmd_unmark; flags = EEikMenuItemAction; }, MENU_ITEM { command=EAspMenuCmdSync; txt=qtn_sml_cmd_sync; }, MENU_ITEM { command=EAspMenuCmdNewSet; txt=qtn_sml_cmd_create_new; }, MENU_ITEM { command=EAspMenuCmdEdit; txt=qtn_sml_cmd_edit; }, diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/OmaDsAppUiPlugin/data/NsmlDSGSPluginResource.rss --- a/omads/omadsappui/OmaDsAppUiPlugin/data/NsmlDSGSPluginResource.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/OmaDsAppUiPlugin/data/NsmlDSGSPluginResource.rss Thu Dec 17 08:39:39 2009 +0200 @@ -25,7 +25,7 @@ #include #include -#include +#include RESOURCE RSS_SIGNATURE { } diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/help/data/xhtml.zip Binary file omads/omadsappui/help/data/xhtml.zip has changed diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/help/inc/ds.hlp.hrh --- a/omads/omadsappui/help/inc/ds.hlp.hrh Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/help/inc/ds.hlp.hrh Thu Dec 17 08:39:39 2009 +0200 @@ -1,10 +1,23 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + // -// ds.hlp.hrh -// - -// -// File generated by CSXHelp Utilities on 2009-05-26 -// +// ds.hlp.hrh generated by CSXHelp Utilities. +// #ifndef __DS_HLP_HRH__ #define __DS_HLP_HRH__ @@ -15,6 +28,7 @@ _LIT(KDS_HLP_SETTINGS_CNT, "DS_HLP_SETTINGS_CNT"); // _LIT(KDS_HLP_SETTINGS_NOTES, "DS_HLP_SETTINGS_NOTES"); // _LIT(KDS_HLP_SETTINGS_SMS, "DS_HLP_SETTINGS_SMS"); // +_LIT(KDS_HLP_SETTINGS_SYNCML, "DS_HLP_SETTINGS_SYNCML"); // _LIT(KDS_HLP_SETTINGS_BOOKMARKS, "DS_HLP_SETTINGS_BOOKMARKS"); // _LIT(KDS_HLP_AUTO_SYNC_SETTINGS, "DS_HLP_AUTO_SYNC_SETTINGS"); // _LIT(KDS_HLP_SETTINGS_MMS, "DS_HLP_SETTINGS_MMS"); // diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/ui/src/NSmlDSSync.rss --- a/omads/omadsappui/ui/src/NSmlDSSync.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/ui/src/NSmlDSSync.rss Thu Dec 17 08:39:39 2009 +0200 @@ -24,7 +24,7 @@ // INCLUDES #include "NSmlDSSync.hrh" -#include +#include #include #include diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/ui/src/NSmlDSSyncAppUi.cpp --- a/omads/omadsappui/ui/src/NSmlDSSyncAppUi.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/ui/src/NSmlDSSyncAppUi.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -45,7 +45,7 @@ const TInt KBufSize128 = 128; const TInt KModeDialogNoWait = 4; - BaseConstructL(EAknEnableSkin | EAknDisableHighlightAnimation | EAknEnableMSK); + BaseConstructL(EAknEnableSkin | EAknDisableHighlightAnimation | EAknEnableMSK | EAknSingleClickCompatible); TBool flag = CEikonEnv::Static()->StartedAsServerApp() ; if (flag) diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/bld/nsmlagendadataprovider.mmp --- a/omads/omadsextensions/adapters/agenda/bld/nsmlagendadataprovider.mmp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/bld/nsmlagendadataprovider.mmp Thu Dec 17 08:39:39 2009 +0200 @@ -57,14 +57,14 @@ LANGUAGE_IDS END -START RESOURCE NSmlAgendaDataStore_1_2.rss -HEADER -TARGETPATH RESOURCE_FILES_DIR -LANGUAGE_IDS -END - +//RD_MULTICAL +LIBRARY gdi.lib +//RD_MULTICAL LIBRARY ECom.lib euser.lib efsrv.lib estor.lib smlstoreformat.lib LIBRARY nsmldebug.lib smldataprovider.lib nsmldatamod.lib LIBRARY nsmlchangefinder.lib wbxmllib.lib bafl.lib sysutil.lib -LIBRARY CalInterimAPI.lib msgs.lib CalenImp.lib CalenInterimUtils2.lib +LIBRARY CalInterimAPI.lib msgs.lib CalenImp.lib CalenInterimUtils2.lib calencommonutils.lib LIBRARY versit.lib +LIBRARY charconv.lib +LIBRARY flogger.lib +LIBRARY centralrepository.lib diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/inc/nsmlagendadataprovider.h --- a/omads/omadsextensions/adapters/agenda/inc/nsmlagendadataprovider.h Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/inc/nsmlagendadataprovider.h Thu Dec 17 08:39:39 2009 +0200 @@ -20,8 +20,8 @@ #define __NSMLAGENDADATAPROVIDER_H__ // INCLUDES +#include #include "nsmlagendadatastore.h" -#include // CONSTANTS _LIT( KNSmlDSAgendaDataStoreRsc_1_1_2,"z:NSMLAGENDADATASTORE_1_1_2.RSC" ); @@ -133,21 +133,12 @@ * By default Symbian 2nd phase constructor is private. */ void ConstructL(); - - /** - * Returns data providers own supported features in a store format class. - */ - CSmlDataStoreFormat* DoOwnStoreFormatL(); private: // Agenda data store CNSmlAgendaDataStore* iAgnDataStore; - // String ool - RStringPool iStringPool; // Data store format CSmlDataStoreFormat* iDSFormat; - // A handle to a file server session - RFs iSession; // Filter array RPointerArray iFilterArray; }; diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/inc/nsmlagendadatastore.h --- a/omads/omadsextensions/adapters/agenda/inc/nsmlagendadatastore.h Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/inc/nsmlagendadatastore.h Thu Dec 17 08:39:39 2009 +0200 @@ -21,10 +21,6 @@ // INCLUDES -#include "nsmlconstants.h" -#include "nsmlchangefinder.h" -#include "NSmlDataModBase.h" -#include "nsmlagendadefines.hrh" #include #include #include @@ -38,6 +34,11 @@ #include #include #include +#include +#include "nsmlconstants.h" +#include "nsmlchangefinder.h" +#include "NSmlDataModBase.h" +#include "nsmlagendadefines.hrh" // CONSTANTS const TInt KNSmlAgendaCompressLimit = 20; @@ -48,15 +49,33 @@ const TInt KNSmlCompactAfterChanges = 30; const TInt KNSmlDefaultStoreNameMaxSize = 256; const TInt KNSmlItemDataExpandSize = 1024; +const TUint KNSmlAgendaAdapterUid = 0x101F6DDD; +const TUint KNSmlAgendaAdapterStreamUid = 0x101F6DDD+0x10009d8d; _LIT( KNSmlDriveC, "C" ); _LIT( KNSmlAgendaStoreNameForDefaultDB, "Calendar" ); -_LIT8( KNSmlMRUtilitiesEComPlugInUID, "AgnEntryUi" ); +_LIT( KNSmlAgendaFileNameForDefaultDB, "c:calendar" ); _LIT8( KNSmlVersitTokenRecurrenceID, "RECURRENCE-ID"); _LIT8( KNSmlVersitTokenXRecurrenceID, "X-RECURRENCE-ID"); _LIT8(KNSmlVersitTokenGeoID,"GEO"); +//RD_MULTICAL +// MIME content type for folder item +_LIT8( KNSmlContentTypeFolder, "application/vnd.omads-folder+xml" ); +// Email folder item type version +_LIT8( KNSmlContentTypeFolderVersion, "1.2" ); +_LIT8( KNSmlDefaultOpaqueData, "Default" ); + +const TInt KArrayGranularity = 30; +const TInt KBuffLength = 128; // DATA TYPES +enum TNSmlDataMimeType + { + ENSmlNone = 0, + ENSmlCalendar, + ENSmlFolder + }; +//RD_MULTICAL enum TNSmlDataStoreStatus { ENSmlClosed = 0, @@ -72,6 +91,8 @@ ENSmlICal, ENSmlNotSet }; +// FORWARD CLASS DECLARATIONS +class CNSmlAgendaAdapterLog; // CLASS DECLARATIONS // ---------------------------------------------------------------------------- @@ -174,6 +195,20 @@ */ const TDesC& DoGetDefaultFileNameL() const; + /** + * Providing DataStore access to CNSmlDataProvider Class + */ + CSmlDataStoreFormat* StoreFormatL(); + + /** + * Check existance of CalFile with the given ProfileID associativity + */ + TBool IsCalFileAvailableL( TInt aProfileId, CDesCArray* aCalFileArr ); + + /** + * Create CalFile with the attributes provided + */ + HBufC* CreateCalFileL( HBufC* aProfileName, TInt aProfileId ); private: /** @@ -473,12 +508,21 @@ /** * Completes an item operation started in DoCreateItemL(). */ - void DoCommitCreateItemL(); + void DoCommitCreateCalItemL(); /** * Completes an item operation started in DoReplaceItemL(). */ - void DoCommitReplaceItemL(); + void DoCommitReplaceCalItemL(); + /** + * Completes an Folder item operation started in DoCreateItemL(). + */ + void DoCommitCreateFolderItemL(); + + /** + * Completes an Folder item operation started in DoReplaceItemL(). + */ + void DoCommitReplaceFolderItemL(); /** * Gets property from old item. @@ -498,7 +542,51 @@ */ void SetPropertiesToDataL( HBufC8*& aValue, const TDesC8& aProperty ); + + /** + * Method to determine the MIME type, provided the UID + */ + void DataMimeType( TSmlDbItemUid aUid ); + + /** + * Get All the AdapterHandler instance + */ + void ListAllAgendaPluginAdaptersL(); + + /** + * Get the AdapterHandler instance + */ + void AgendaAdapterHandlerL(); + + /** + * Retrieve the CalendarFile and associated entries ID + */ + void SynchronizableCalEntryIdsL( RArray& aUidArray ); + + /** + * Method to retrieve the Id of the Calendar Entry + */ + void GetCalendarEntryIdL( TCalLocalUid& aParentId, TCalLocalUid& aCalId ) const; + /** + * Open the Store if present else create one to work upon + */ + void OpenStoreL(); + + /** + * Filters out the non-active items from the given array + */ + CNSmlDataItemUidSet* ActiveItemsL( CNSmlDataItemUidSet& aUids ) const; + + /** + * Populate iCommittedUidArr from the Stream + */ + void ExternalizeCommittedUidL() const; + + /** + * Write the contents of iCommittedUidArr to the Stream + */ + void InternalizeCommittedUidL() const; private: // Data // Key @@ -533,8 +621,10 @@ TInt iServerMaxObjectSize; // Name of the opened database HBufC* iOpenedStoreName; + // Name of the received storename + HBufC* iReceivedStoreName; // Default name of the database - HBufC* iDefaultStoreName; + HBufC* iDefaultStoreFileName; // Opened database ID TInt64 iOpenedStoreId; // Item's ID that is to be added @@ -555,23 +645,111 @@ CNSmlDataItemUidSet* iReplacedUids; // Uids of moved items CNSmlDataItemUidSet* iMovedUids; - // Session to calendar server + /*// Session to calendar server CCalSession* iVCalSession; // Internal progress notifier - CNSmlAgendaProgressview* iAgendaProgressview; + CNSmlAgendaProgressview* iAgendaProgressview;*/ // Interim Utility CCalenInterimUtils2* iInterimUtils; - // Importer + /*// Importer CCalenImporter* iImporter; // Exporter CCalenExporter* iExporter; // Entry view CCalEntryView* iEntryView; - CVersitTlsData *iVersitTlsData; // for better performance + CVersitTlsData *iVersitTlsData; // for better performance*/ + // Flag is Hierarchical Sync is supported + TBool iIsHierarchicalSyncSupported; + // Mime Type of Calendar Item + TNSmlDataMimeType iDataMimeType; + // Parent Id of the Calendar Item + TInt iParentItemId; + // Offset value + TUint iCalOffsetVal; + // Offset memory values of the Calendar DB + CArrayFixFlat* iCalOffsetArr; + // List of committed UIDs + CNSmlDataItemUidSet* iCommittedUidArr; + // Agenda Adapter Handler Instance + RPointerArray iAgendaPluginAdapters; + // Agenda Adapter Handler Instance + CNSmlAgendaAdapterHandler* iAgendaAdapterHandler; + // SyncRelationship instance + CNSmlAgendaAdapterLog* iAgendaAdapterLog; }; +// ---------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil provides services to cope with maintaining calendar +// API's used for database access +// @lib nsmlagendadataprovider.dll +// ---------------------------------------------------------------------------- +NONSHARABLE_CLASS(CNSmlAgendaDataStoreUtil) : public CBase + { + public: + /** + * Two-phased constructor. + */ + static CNSmlAgendaDataStoreUtil* NewL(); + + /** + * Destructor. + */ + virtual ~CNSmlAgendaDataStoreUtil(); + + private: + /** + * C++ default constructor. + */ + CNSmlAgendaDataStoreUtil(); + + public: // New Functions + /** + * Initialize Calendar APIs for database access using the provided name and id + */ + void InitializeCalAPIsL( HBufC* aFileName, TSmlDbItemUid aUid = NULL ); + + + public: // Data + CCalSession* iCalSession; + CCalenExporter* iExporter; + CCalenImporter* iImporter; + CNSmlAgendaProgressview* iProgressView; + CCalEntryView* iEntryView; + CCalEntry* iEntry; + HBufC8* iFileName; + TSmlDbItemUid iUid; + }; + +// ---------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog provides services know active Sync +// API's used for database access +// @lib nsmlagendadataprovider.dll +// ---------------------------------------------------------------------------- +NONSHARABLE_CLASS(CNSmlAgendaAdapterLog) : public CBase + { + public: + /** + * Two-phased constructor. + */ + static CNSmlAgendaAdapterLog* NewL( MSmlSyncRelationship& aSyncRelationship ); + + /** + * Destructor. + */ + virtual ~CNSmlAgendaAdapterLog(); + + private: + /** + * C++ default constructor. + */ + CNSmlAgendaAdapterLog( MSmlSyncRelationship& aSyncRelationship ); + + public: // Data + MSmlSyncRelationship& iSyncRelationship; + + }; #endif // __NSMLAGENDADATASTORE_H__ // End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/inc/nsmlagendadebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/agenda/inc/nsmlagendadebug.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2005 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: Debug macros definition and constant declaration +* +*/ + + + +#ifndef NSMLDSAGENDASYNC__DEBUG_H +#define NSMLDSAGENDASYNC__DEBUG_H + +#include +#include +#include +#include + +_LIT(KLogFile,"Agenda.txt"); +_LIT(KLogDirFullName,"c:\\logs\\"); +_LIT(KLogDir,"MultiCalDB"); + +// Declare the FPrint function +inline void FPrint(const TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + } + +// =========================================================================== +#ifdef __WINS__ // File logging for WINS +// =========================================================================== +#define FLOG(arg...) { FPrint(arg); } +//#define FLOG(a) { RDebug::Print(a); } +#define FTRACE(a) { a; } +// =========================================================================== +#else // RDebug logging for target HW +// =========================================================================== +//#define FLOG(arg...) { RDebug::Print(arg); } +#define FLOG(arg...) { FPrint(arg); } +#define FTRACE(a) { a; } +#endif //__WINS__ + +// =========================================================================== +#else // // No loggings --> Reduced binary size +// =========================================================================== +#define FLOG(arg...) +#define FTRACE(a) + +#endif // NSMLDSSYNC__DEBUG_H + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/src/101F6DD7.rss --- a/omads/omadsextensions/adapters/agenda/src/101F6DD7.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/src/101F6DD7.rss Thu Dec 17 08:39:39 2009 +0200 @@ -16,7 +16,7 @@ */ -#include<101F6DD7.loc> +#include<101f6dd7.loc> #include #include diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/src/NSmlAgendaDataStore_1_2.rss --- a/omads/omadsextensions/adapters/agenda/src/NSmlAgendaDataStore_1_2.rss Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,866 +0,0 @@ -CHARACTER_SET UTF8/* -* Copyright (c) 2005 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: Resource data for DS agenda adapter -* -*/ - - -#include -#include "SmlDataFormat.rh" -#include "SmlDataFormat.hrh" -#include "nsmlagendadefines.hrh" - -RESOURCE SML_DATA_STORE_FORMAT nsml_agenda_data_store - { - version=1; - display_name="Calendar"; - sync_types=KSmlSyncType_TwoWay+KSmlSyncType_OneWayFromSvr+ - KSmlSyncType_OneWayFromClnt+KSmlSyncType_SlowSync+ - KSmlSyncType_RefreshFromSvr+KSmlSyncType_RefreshFromClnt; - mime_format= - { - SML_MIME_FORMAT - { - version=1; - mime_type="text/x-vcalendar"; - mime_ver="1.0"; - properties= - { - SML_DATA_PROPERTY - { - version=1; - display_name="Begin"; - name="BEGIN"; - data_type=""; - enum_values={"VCALENDAR","VEVENT","VTODO"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="End"; - name="END"; - data_type=""; - enum_values={"VCALENDAR","VEVENT","VTODO"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Version"; - name="VERSION"; - data_type=""; - enum_values={"1.0"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Uid"; - name="UID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Summary"; - name="SUMMARY"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Description"; - name="DESCRIPTION"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Dstart"; - name="DTSTART"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Dtend"; - name="DTEND"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Aalarm"; - name="AALARM"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params= { - SML_DATA_PROPERTY_PARAM - { - version=1; - display_name="Alarm type"; - name="TYPE"; - data_type=""; - enum_values={}; - } - }; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Class"; - name="CLASS"; - data_type=""; - enum_values={"PUBLIC","PRIVATE","CONFIDENTIAL"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Location"; - name="LOCATION"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Last Modified"; - name="LAST-MODIFIED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Priority"; - name="PRIORITY"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Status"; - name="STATUS"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Rrule"; - name="RRULE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Completed"; - name="COMPLETED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Dcreated"; - name="DCREATED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Due"; - name="DUE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="ExDate"; - name="EXDATE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Categories"; - name="CATEGORIES"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Sequence"; - name="SEQUENCE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="TZ"; - name="TZ"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Daylight"; - name="DAYLIGHT"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="RDate"; - name="RDATE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Attendee"; - name="ATTENDEE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params= { - SML_DATA_PROPERTY_PARAM - { - version=1; - display_name="Type"; - name="TYPE"; - data_type=""; - enum_values={"ROLE", "STATUS", "X-CN", "X-ROLE", "X-SENTBY", "X-STATUS"}; - } - }; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Recurrence"; - name="X-RECURRENCE-ID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Method"; - name="X-METHOD"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Local UID"; - name="X-SYMBIAN-LUID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Time stamp"; - name="X-SYMBIAN-DTSTAMP"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="X-Epoc Agenda Entry Type"; - name="X-EPOCAGENDAENTRYTYPE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="GEO Address"; - name="GEO"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - } - }; - field_level=0; - } -#ifdef __NSML_USE_ICAL_FEATURE - , - SML_MIME_FORMAT - { - version=1; - mime_type="text/calendar"; - mime_ver="2.0"; - properties= - { - SML_DATA_PROPERTY - { - version=1; - display_name="Begin"; - name="BEGIN"; - data_type=""; - enum_values={"VCALENDAR","VEVENT","VTODO","STANDARD","DAYLIGHT","VTIMEZONE","VALARM"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="End"; - name="END"; - data_type=""; - enum_values={"VCALENDAR","VEVENT","VTODO","STANDARD","DAYLIGHT","VTIMEZONE","VALARM"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Version"; - name="VERSION"; - data_type=""; - enum_values={"2.0"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Uid"; - name="UID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Summary"; - name="SUMMARY"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Description"; - name="DESCRIPTION"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Dstart"; - name="DTSTART"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Dtend"; - name="DTEND"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Aalarm"; - name="AALARM"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params= { - SML_DATA_PROPERTY_PARAM - { - version=1; - display_name="Alarm type"; - name="TYPE"; - data_type=""; - enum_values={}; - } - }; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Class"; - name="CLASS"; - data_type=""; - enum_values={"PUBLIC","PRIVATE","CONFIDENTIAL"}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Location"; - name="LOCATION"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Last Modified"; - name="LAST-MODIFIED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Priority"; - name="PRIORITY"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Status"; - name="STATUS"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Recurrence-Id"; - name="RECURRENCE-ID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Rrule"; - name="RRULE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Sequence"; - name="SEQUENCE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Method"; - name="METHOD"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="ATTENDEE"; - name="ATTENDEE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Categories"; - name="CATEGORIES"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Organizer"; - name="ORGANIZER"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Time stamp"; - name="DTSTAMP"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Completed"; - name="COMPLETED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Created"; - name="CREATED"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="ExDate"; - name="EXDATE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="RDate"; - name="RDATE"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Product ID"; - name="PRODID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Timezone ID"; - name="TZID"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Timezone OFFSET from"; - name="TZOFFSETFROM"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Timezone OFFSET to"; - name="TZOFFSETTO"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Alarm action"; - name="ACTION"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="Alarm trigger"; - name="TRIGGER"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - }, - SML_DATA_PROPERTY - { - version=1; - display_name="GEO Address"; - name="GEO"; - data_type=""; - enum_values={}; - flags=0; - max_size=256; - max_occur=0; - params={}; - } - }; - field_level=0; - } -#endif // __NSML_USE_ICAL_FEATURE - }; -#ifdef __NSML_USE_ICAL_FEATURE - mime_format_tx_pref=1; // Preferred index for tx - mime_format_rx_pref=1; // Preferred index for rx -#else // __NSML_USE_ICAL_FEATURE - mime_format_tx_pref=0; // Preferred index for tx - mime_format_rx_pref=0; // Preferred index for rx -#endif // __NSML_USE_ICAL_FEATURE - folder_properties={}; - filter_capabilities={}; - max_size=0; // no limit - max_items=0; // no limit - flags=0; - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/src/nsmlagendadataprovider.cpp --- a/omads/omadsextensions/adapters/agenda/src/nsmlagendadataprovider.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/src/nsmlagendadataprovider.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -17,21 +17,21 @@ // INCLUDE FILES -#include "nsmlagendadataprovider.h" -#include "nsmlagendadatastore.h" -#include "nsmldebug.h" -#include "nsmldsimpluids.h" #include #include #include #include -#include -#include +#include #include #include #include #include #include +#include +#include "nsmlagendadataprovider.h" +#include "nsmlagendadatastore.h" +#include "nsmlagendadebug.h" +#include "nsmldsimpluids.h" // ====================================== MEMBER FUNCTIONS ======================================== @@ -43,8 +43,8 @@ // CNSmlAgendaDataProvider::CNSmlAgendaDataProvider() { - _DBG_FILE("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): END"); + FLOG(_L("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): END")); } // ------------------------------------------------------------------------------------------------ @@ -54,11 +54,9 @@ // void CNSmlAgendaDataProvider::ConstructL( ) { - _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::NewL: BEGIN")); iAgnDataStore = CNSmlAgendaDataStore::NewL(); - iStringPool.OpenL(); - User::LeaveIfError( iSession.Connect() ); - _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::NewL: END")); } // ------------------------------------------------------------------------------------------------ @@ -68,12 +66,12 @@ // CNSmlAgendaDataProvider* CNSmlAgendaDataProvider::NewL() { - _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::NewL: BEGIN")); CNSmlAgendaDataProvider* self = new ( ELeave ) CNSmlAgendaDataProvider(); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); - _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::NewL: END")); return self; } @@ -84,14 +82,12 @@ // CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider() { - _DBG_FILE("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): BEGIN")); + delete iDSFormat; delete iAgnDataStore; - iSession.Close(); - delete iDSFormat; - iStringPool.Close(); iFilterArray.ResetAndDestroy(); iFilterArray.Close(); - _DBG_FILE("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): END"); + FLOG(_L("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): END")); } // ------------------------------------------------------------------------------------------------ @@ -101,8 +97,8 @@ // void CNSmlAgendaDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent /*aEvent*/, TInt /*aParam1*/, TInt /*aParam2*/ ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoOnFrameworkEvent: BEGIN"); - _DBG_FILE("CNSmlAgendaDataProvider::DoOnFrameworkEvent: END"); + FLOG(_L("CNSmlAgendaDataProvider::DoOnFrameworkEvent: BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoOnFrameworkEvent: END")); } // ------------------------------------------------------------------------------------------------ @@ -112,13 +108,13 @@ // TBool CNSmlAgendaDataProvider::DoSupportsOperation( TUid aOpId ) const { - _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: BEGIN")); if ( aOpId == KUidSmlSupportMultipleStores ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: END"); + FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: END")); return ETrue; } - _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: END"); + FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: END")); return EFalse; } @@ -129,16 +125,17 @@ // const CSmlDataStoreFormat& CNSmlAgendaDataProvider::DoStoreFormatL() { - _DBG_FILE("CNSmlAgendaDataProvider::DoStoreFormatL(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoStoreFormatL(): BEGIN")); if ( iDSFormat ) { delete iDSFormat; iDSFormat = NULL; } - iDSFormat = DoOwnStoreFormatL(); - - return *iDSFormat; + // RD_MULTICAL + iDSFormat = iAgnDataStore->StoreFormatL(); + // RD_MULTICAL + return *iDSFormat; } // ------------------------------------------------------------------------------------------------ @@ -148,8 +145,8 @@ // CDesCArray* CNSmlAgendaDataProvider::DoListStoresLC() { - _DBG_FILE("CNSmlAgendaDataProvider::DoListStoresLC(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataProvider::DoListStoresLC(): END"); + FLOG(_L("CNSmlAgendaDataProvider::DoListStoresLC(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoListStoresLC(): END")); return iAgnDataStore->DoListAgendaFilesLC(); } @@ -160,8 +157,8 @@ // const TDesC& CNSmlAgendaDataProvider::DoDefaultStoreL() { - _DBG_FILE("CNSmlAgendaDataProvider::DoDefaultStoreL(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataProvider::DoDefaultStoreL(): END"); + FLOG(_L("CNSmlAgendaDataProvider::DoDefaultStoreL(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoDefaultStoreL(): END")); return iAgnDataStore->DoGetDefaultFileNameL(); } @@ -172,10 +169,10 @@ // CSmlDataStore* CNSmlAgendaDataProvider::DoNewStoreInstanceLC() { - _DBG_FILE("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): BEGIN")); CNSmlAgendaDataStore* newStore = CNSmlAgendaDataStore::NewL(); CleanupStack::PushL( newStore ); - _DBG_FILE("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): END"); + FLOG(_L("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): END")); return newStore; } @@ -186,8 +183,8 @@ const RPointerArray& CNSmlAgendaDataProvider::DoSupportedServerFiltersL() { // This method returns empty array. It means that this Data Provider does not support filtering - _DBG_FILE("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): END"); + FLOG(_L("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): END")); return iFilterArray; } @@ -197,9 +194,9 @@ // ------------------------------------------------------------------------------------------------ void CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, RPointerArray& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): END")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): END"); } // ------------------------------------------------------------------------------------------------ @@ -208,9 +205,9 @@ // ------------------------------------------------------------------------------------------------ void CNSmlAgendaDataProvider::DoCheckServerFiltersL( RPointerArray& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): END")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): END"); } // ------------------------------------------------------------------------------------------------ @@ -219,9 +216,9 @@ // ------------------------------------------------------------------------------------------------ HBufC* CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC( const RPointerArray& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): END")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): END"); return NULL; } @@ -231,53 +228,9 @@ // ------------------------------------------------------------------------------------------------ void CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL( const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/ ) { - _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): BEGIN"); + FLOG(_L("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): BEGIN")); + FLOG(_L("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): END")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): END"); - } - -// ------------------------------------------------------------------------------------------------ -// CNSmlAgendaDataProvider::DoOwnStoreFormatL -// Read own store format from own resource file. -// ------------------------------------------------------------------------------------------------ -// -CSmlDataStoreFormat* CNSmlAgendaDataProvider::DoOwnStoreFormatL() - { - _DBG_FILE("CNSmlAgendaDataProvider::DoOwnStoreFormatL(): BEGIN"); - TFileName fileName; - TParse parse; - - // Check correct Data Sync protocol - TInt value( EDataSyncNotRunning ); - TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, - KDataSyncStatus, - value ); - if ( error == KErrNone && - value == EDataSyncRunning ) - { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_1_2, &KDC_RESOURCE_FILES_DIR, NULL ); - } - else // error or protocol version 1.2 - { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_2, &KDC_RESOURCE_FILES_DIR, NULL ); - } - - fileName = parse.FullName(); - RResourceFile resourceFile; - BaflUtils::NearestLanguageFile( iSession, fileName ); - - resourceFile.OpenL( iSession, fileName ); - CleanupClosePushL( resourceFile ); - - HBufC8* profileRes = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); - TResourceReader reader; - reader.SetBuffer( profileRes ); - - CSmlDataStoreFormat* dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); - CleanupStack::Pop(); // dsFormat - CleanupStack::PopAndDestroy( 2 ); // profileRes, resourceFile - _DBG_FILE("CNSmlAgendaDataProvider::DoOwnStoreFormatL(): END"); - return dsFormat; } // =================================== OTHER EXPORTED FUNCTIONS =================================== @@ -297,9 +250,9 @@ // EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) { - _DBG_FILE("ImplementationGroupProxy() for CNSmlAgendaDataProvider: begin"); + FLOG(_L("ImplementationGroupProxy() for CNSmlAgendaDataProvider: begin")); aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); - _DBG_FILE("ImplementationGroupProxy() for CNSmlAgendaDataProvider: end"); + FLOG(_L("ImplementationGroupProxy() for CNSmlAgendaDataProvider: end")); return ImplementationTable; } diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp --- a/omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -18,12 +18,6 @@ // INCLUDES -#include "nsmldebug.h" -#include "nsmlagendadatastore.h" -#include "nsmlagendadataprovider.h" -#include "nsmlchangefinder.h" -#include "NSmlDataModBase.h" -#include "nsmlagendadefines.hrh" #include #include #include @@ -40,12 +34,24 @@ #include #include #include -#include -#include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include "nsmlagendadebug.h" +#include "nsmlagendadatastore.h" +#include "nsmlagendadataprovider.h" +#include "nsmlchangefinder.h" +#include "NSmlDataModBase.h" +#include "nsmlagendadefines.hrh" #ifndef __WINS__ // This lowers the unnecessary compiler warning (armv5) to remark. @@ -70,10 +76,16 @@ iDrive( -1 ), iReplaceItemId( -1 ), iRXEntryType( ENSmlNotSet ), - iTXEntryType( ENSmlNotSet ) + iTXEntryType( ENSmlNotSet ), + iIsHierarchicalSyncSupported( EFalse ), + iParentItemId( 0 ) { - _DBG_FILE("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): END"); + FLOG(_L("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): BEGIN")); + // RD_MULTICAL + iDataMimeType = ENSmlNone; + iAgendaAdapterHandler = NULL; + // RD_MULTICAL + FLOG(_L("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): END")); } // ----------------------------------------------------------------------------- @@ -83,7 +95,7 @@ // void CNSmlAgendaDataStore::ConstructL() { - _DBG_FILE("CNSmlAgendaDataStore::ConstructL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::ConstructL: BEGIN")); iStringPool.OpenL(); User::LeaveIfError( iRfs.Connect() ); @@ -96,21 +108,32 @@ iMovedUids = new ( ELeave ) CNSmlDataItemUidSet(); iReplacedUids = new ( ELeave ) CNSmlDataItemUidSet(); - iDefaultStoreName = HBufC::NewL( KNSmlDefaultStoreNameMaxSize ); + iDefaultStoreFileName = HBufC::NewL( KNSmlDefaultStoreNameMaxSize ); + *iDefaultStoreFileName = KNSmlAgendaFileNameForDefaultDB; - iVersitTlsData = &CVersitTlsData::VersitTlsDataL(); - // Create CalSession and CalEntryView instances - iVCalSession = CCalSession::NewL(); - TPtr obptr = iDefaultStoreName->Des(); - obptr = iVCalSession->DefaultFileNameL(); - + // RD_MULTICAL + iAgendaAdapterLog = NULL; + iCalOffsetArr = new (ELeave) CArrayFixFlat( KArrayGranularity ); + iCommittedUidArr = new ( ELeave ) CNSmlDataItemUidSet(); + //iCalOffsetVal = CCalenMultiCalUtil::GetOffsetL(); + // TODO: Tweak code: BEGIN + iCalOffsetVal = 100000; + ListAllAgendaPluginAdaptersL(); + // END + iOwnFormat = DoOwnStoreFormatL(); - iDataMod->SetOwnStoreFormat( *iOwnFormat ); - + // RD_MULTICAL + iDataMod->SetOwnStoreFormat( *iOwnFormat ); iInterimUtils = CCalenInterimUtils2::NewL(); - - _DBG_FILE("CNSmlAgendaDataStore::ConstructL: END"); + + // Initialize the FieldId to a default value [UID3 of the application] + // This value will be rewritten once the exact single CalendarDB is determined + // In case of HF synchronization involving multiple CalendarDB's the below value + // will be retained. + iOpenedStoreId = KNSmlAgendaAdapterUid; + + FLOG(_L("CNSmlAgendaDataStore::ConstructL: END")); } // ----------------------------------------------------------------------------- @@ -120,7 +143,7 @@ // CNSmlAgendaDataStore* CNSmlAgendaDataStore::NewL() { - _DBG_FILE("CNSmlAgendaDataStore::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::NewL: BEGIN")); CNSmlAgendaDataStore* self = new ( ELeave ) CNSmlAgendaDataStore(); CleanupStack::PushL( self ); @@ -128,7 +151,7 @@ self->ConstructL(); CleanupStack::Pop(); // self - _DBG_FILE("CNSmlAgendaDataStore::NewL: END"); + FLOG(_L("CNSmlAgendaDataStore::NewL: END")); return self; } @@ -139,53 +162,61 @@ // CNSmlAgendaDataStore::~CNSmlAgendaDataStore() { - _DBG_FILE("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): BEGIN")); // Enable notifications TInt error( KErrNone ); - if ( iVCalSession ) + + // TODO: + /*if ( iVCalSession ) { TRAP_IGNORE( iVCalSession->EnablePubSubNotificationsL() ); TRAP_IGNORE( iVCalSession->EnableChangeBroadcast() ); - } - - delete iOwnFormat; - iRfs.Close(); - iStringPool.Close(); + }*/ if ( iChangeFinder ) { TRAP( error, iChangeFinder->CloseL() ); } - if (iVersitTlsData) - { - iVersitTlsData->VersitTlsDataClose(); - } - delete iChangeFinder; + + delete iChangeFinder; delete iNewUids; delete iDeletedUids; delete iSoftDeletedUids; delete iMovedUids; delete iReplacedUids; - delete iDefaultStoreName; + delete iDefaultStoreFileName; delete iOpenedStoreName; + delete iReceivedStoreName; delete iDataMod; delete iItemData; - - delete iAgendaProgressview; - - delete iImporter; - delete iExporter; - - delete iEntryView; - delete iVCalSession; + delete iInterimUtils; + iAgendaPluginAdapters.ResetAndDestroy(); - // REComSession::FinalClose(); - - _DBG_FILE("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): END"); + if( iOwnFormat ) + { + delete iOwnFormat; + iOwnFormat = NULL; + } + + iRfs.Close(); + iStringPool.Close(); + + if ( iCalOffsetArr ) + { + iCalOffsetArr->Reset(); + delete iCalOffsetArr; + } + + if ( iCommittedUidArr ) + { + iCommittedUidArr->Reset(); + delete iCommittedUidArr; + } + FLOG(_L("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): END")); } // ----------------------------------------------------------------------------- @@ -196,7 +227,8 @@ void CNSmlAgendaDataStore::DoOpenL( const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: BEGIN")); + iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlClosed ) @@ -209,72 +241,72 @@ { RFs::CharToDrive( KNSmlDriveC()[0], iDrive ); } - + + if ( iReceivedStoreName ) + { + delete iReceivedStoreName; + iReceivedStoreName = NULL; + } + iReceivedStoreName = aStoreName.AllocL(); // Open database TInt err( KErrNone ); - if ( aStoreName == KNSmlAgendaStoreNameForDefaultDB ) + if ( aStoreName == KNSmlAgendaFileNameForDefaultDB ) { - TRAP( err, iVCalSession->OpenL( *iDefaultStoreName ) ); + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: Calling the OpenStoreL: '%S'"), &aStoreName); + TRAP( err, OpenStoreL() ); } else { - TRAP( err, iVCalSession->OpenL( aStoreName ) ); + // Provided profile is created from the DS Application + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: storename: '%S'"), &aStoreName); + if ( iOpenedStoreName ) + { + delete iOpenedStoreName; + iOpenedStoreName = NULL; + } + iOpenedStoreName = aStoreName.AllocL(); + + CCalSession* calsession = CCalSession::NewL(); + CleanupStack::PushL(calsession); + TRAP( err, calsession->OpenL( aStoreName ) ); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: Cannot open the session: '%d'"), err); + CleanupStack::PopAndDestroy( calsession ); + User::RequestComplete( iCallerStatus, err ); + return; + } + + // Disable notifications + TRAP_IGNORE( calsession->DisablePubSubNotificationsL() ); + TRAP_IGNORE( calsession->DisableChangeBroadcast() ); + // Get ID of database + calsession->FileIdL( iOpenedStoreId ); + + // Close the session + CleanupStack::PopAndDestroy( calsession ); } + if ( err ) { User::RequestComplete( iCallerStatus, err ); return; } - // Disable notifications - TRAP_IGNORE( iVCalSession->DisablePubSubNotificationsL() ); - TRAP_IGNORE( iVCalSession->DisableChangeBroadcast() ); - - if ( iOpenedStoreName ) - { - delete iOpenedStoreName; - iOpenedStoreName = NULL; - } - iOpenedStoreName = aStoreName.AllocL(); - - // Initialize some member variables - // Create importer and exporter - iImporter = CCalenImporter::NewL( *iVCalSession ); - iExporter = CCalenExporter::NewL( *iVCalSession ); - - // Progress view - iAgendaProgressview = CNSmlAgendaProgressview::NewL(); - - iEntryView = CCalEntryView::NewL( *iVCalSession, *iAgendaProgressview ); - CActiveScheduler::Start(); - TInt completedStatus = iAgendaProgressview->GetCompletedStatus(); - if ( completedStatus != KErrNone ) - { - User::RequestComplete( iCallerStatus, completedStatus ); - return; - } - if ( iChangeFinder ) { iChangeFinder->CloseL(); delete iChangeFinder; iChangeFinder = NULL; } + iChangeFinder = CNSmlChangeFinder::NewL( aContext, iKey, iHasHistory, KNSmlAgendaAdapterImplUid ); - - // Get ID of database - iVCalSession->FileIdL( iOpenedStoreId ); - - if( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - + iAgendaAdapterLog = CNSmlAgendaAdapterLog::NewL( aContext ); iState = ENSmlOpenAndWaiting; User::RequestComplete( iCallerStatus, err ); - _DBG_FILE("CNSmlAgendaDataStore::DoOpenL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: END")); } // ----------------------------------------------------------------------------- @@ -284,7 +316,7 @@ // void CNSmlAgendaDataStore::DoCancelRequest() { - _DBG_FILE("CNSmlAgendaDataStore::DoCancelRequest: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelRequest: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iState = ENSmlClosed; @@ -293,7 +325,7 @@ { iState = ENSmlOpenAndWaiting; } - _DBG_FILE("CNSmlAgendaDataStore::DoCancelRequest: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelRequest: END")); } // ----------------------------------------------------------------------------- @@ -303,9 +335,9 @@ // const TDesC& CNSmlAgendaDataStore::DoStoreName() const { - _DBG_FILE("CNSmlAgendaDataStore::DoStoreName: BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::DoStoreName: END"); - return *iOpenedStoreName; + FLOG(_L("CNSmlAgendaDataStore::DoStoreName: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoStoreName: END")); + return *iReceivedStoreName; } // ----------------------------------------------------------------------------- @@ -315,9 +347,9 @@ // void CNSmlAgendaDataStore::DoBeginTransactionL() { - _DBG_FILE("CNSmlAgendaDataStore::DoBeginTransactionL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginTransactionL: BEGIN")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoBeginTransactionL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginTransactionL: END")); } // ----------------------------------------------------------------------------- @@ -327,11 +359,11 @@ // void CNSmlAgendaDataStore::DoCommitTransactionL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitTransactionL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitTransactionL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitTransactionL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitTransactionL: END")); } // ----------------------------------------------------------------------------- @@ -341,11 +373,11 @@ // void CNSmlAgendaDataStore::DoRevertTransaction( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoRevertTransaction: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoRevertTransaction: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoRevertTransaction: END"); + FLOG(_L("CNSmlAgendaDataStore::DoRevertTransaction: END")); } // ----------------------------------------------------------------------------- @@ -355,9 +387,9 @@ // void CNSmlAgendaDataStore::DoBeginBatchL() { - _DBG_FILE("CNSmlAgendaDataStore::DoBeginBatchL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginBatchL: BEGIN")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoBeginBatchL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginBatchL: END")); } // ----------------------------------------------------------------------------- @@ -368,11 +400,11 @@ void CNSmlAgendaDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitBatchL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitBatchL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitBatchL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitBatchL: END")); } // ----------------------------------------------------------------------------- @@ -382,9 +414,9 @@ // void CNSmlAgendaDataStore::DoCancelBatch() { - _DBG_FILE("CNSmlAgendaDataStore::DoCancelBatch: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelBatch: BEGIN")); // Nothing to do - _DBG_FILE("CNSmlAgendaDataStore::DoCancelBatch: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelBatch: END")); } // ----------------------------------------------------------------------------- @@ -395,7 +427,7 @@ void CNSmlAgendaDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: BEGIN")); if ( iOwnFormat ) { @@ -404,6 +436,24 @@ } iOwnFormat = DoOwnStoreFormatL(); + // RD_MULTICAL + if ( aServerDataStoreFormat.IsSupported( + CSmlDataStoreFormat::EOptionHierarchial ) ) + { + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Supports HIERARCHIAL")); + + + iIsHierarchicalSyncSupported = ETrue; + + // Check what properties are supported for folders + iAgendaAdapterHandler->CheckServerSupportForFolder( aServerDataStoreFormat ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Do not support HIERARCHIAL")); + iIsHierarchicalSyncSupported = EFalse; + } + // RD_MULTICAL iDataMod->SetOwnStoreFormat( *iOwnFormat ); iDataMod->SetPartnerStoreFormat( ( CSmlDataStoreFormat& ) @@ -416,7 +466,7 @@ #ifdef __NSML_USE_ICAL_FEATURE - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support iCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support iCal")); returnValue = iDataMod->SetUsedMimeType( iOwnFormat->MimeFormat( 1 ).MimeType(), iOwnFormat->MimeFormat( 1 ).MimeVersion() ); @@ -425,19 +475,19 @@ if ( returnValue == KErrNone ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets iCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets iCal")); iRXEntryType = ENSmlICal; iTXEntryType = ENSmlICal; } else { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support vCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support vCal")); returnValue = iDataMod->SetUsedMimeType( iOwnFormat->MimeFormat( 0 ).MimeType(), iOwnFormat->MimeFormat( 0 ).MimeVersion() ); if ( returnValue == KErrNone ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets vCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets vCal")); iRXEntryType = ENSmlVCal; iTXEntryType = ENSmlVCal; } @@ -445,11 +495,18 @@ if ( iRXEntryType == ENSmlNotSet || iTXEntryType == ENSmlNotSet ) { // Leave if server does not support either vCal or iCal - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: MimeType Not supported"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: MimeType Not supported")); User::Leave( KErrNotFound ); } - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: END"); + // RD_MULTICAL + if( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + // RD_MULTICAL + + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: END")); } // ----------------------------------------------------------------------------- @@ -459,9 +516,9 @@ // void CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize( TInt aServerMaxObjectSize ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: BEGIN")); iServerMaxObjectSize = aServerMaxObjectSize; - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: END")); } // ----------------------------------------------------------------------------- @@ -471,8 +528,8 @@ // TInt CNSmlAgendaDataStore::DoMaxObjectSize() const { - _DBG_FILE("CNSmlAgendaDataStore::DoMaxObjectSize: BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::DoMaxObjectSize - Default: END"); + FLOG(_L("CNSmlAgendaDataStore::DoMaxObjectSize: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoMaxObjectSize - Default: END")); return KNSmlAgendaOwnMaxObjectSize; } @@ -481,104 +538,187 @@ // Open calendar item for reading. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoOpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, - TInt& aSize, TSmlDbItemUid& /*aParent*/, TDes8& aMimeType, - TDes8& aMimeVer, TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoOpenItemL( TSmlDbItemUid aUid, + TBool& aFieldChange, + TInt& aSize, + TSmlDbItemUid& aParent, + TDes8& aMimeType, + TDes8& aMimeVer, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; + // Leave if Data Store is in wrong state if ( iState != ENSmlOpenAndWaiting ) { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Returing due to invalid state")); User::RequestComplete( iCallerStatus, KErrNotReady ); return; } - iReplaceItemId = aUid; - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); + // Add field change info + aFieldChange = EFalse; - if ( err || !entry ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - return; - } - + // Update the SnapShots if ( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + { + RegisterSnapshotL(); + } + + // Initialize the Buffer + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - RBufWriteStream writeStream( *iItemData ); - writeStream.PushL(); - - // Export item from database - if ( iTXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - iCal DB"); - iExporter->ExportICalL( *entry, writeStream ); - aMimeType = iOwnFormat->MimeFormat( 1 ).MimeType().DesC(); - aMimeVer = iOwnFormat->MimeFormat( 1 ).MimeVersion().DesC(); - } - else if ( iTXEntryType == ENSmlVCal ) + RBufWriteStream writeStream( *iItemData ); + writeStream.PushL(); + + // RD_MULTICAL + //Determine the Mime Type + DataMimeType( aUid ); + TInt fetchError( KErrNone ); + switch( iDataMimeType ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - vCal DB"); - iExporter->ExportVCalL( *entry, writeStream ); - aMimeType = iOwnFormat->MimeFormat( 0 ).MimeType().DesC(); - aMimeVer = iOwnFormat->MimeFormat( 0 ).MimeVersion().DesC(); + case ENSmlFolder: + { + //Set the Parent UID + aParent = KDbItemUidRoot; // parent is root + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: calling fetch")); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:writestream before size: '%d'"), writeStream.Sink()->SizeL()); + TRAP( fetchError, iAgendaAdapterHandler->FetchFolderL( aUid, writeStream ) ); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:writestream size: '%d'"), writeStream.Sink()->SizeL()); + + if(fetchError != KErrNone) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: fetch error: '%d'"), fetchError); + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, fetchError ); + return; + } + + aMimeType.Append( KNSmlContentTypeFolder ); + aMimeVer.Append( KNSmlContentTypeFolderVersion ); + + writeStream.CommitL(); + iItemData->Compress(); + iPos = 0; + } + break; + case ENSmlCalendar: + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: calendar item")); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Parent Id is not Valid one")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + aParent = parentid; + //Get the Folder Name + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL( parentid )); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + iReplaceItemId = entryid; + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: entry is not valid")); + delete agendautil; + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + // Export item from database + if ( iTXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - iCal DB")); + agendautil->iExporter->ExportICalL( *agendautil->iEntry, writeStream ); + aMimeType = iOwnFormat->MimeFormat( 1 ).MimeType().DesC(); + aMimeVer = iOwnFormat->MimeFormat( 1 ).MimeVersion().DesC(); + } + else if ( iTXEntryType == ENSmlVCal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - vCal DB")); + agendautil->iExporter->ExportVCalL( *agendautil->iEntry, writeStream ); + aMimeType = iOwnFormat->MimeFormat( 0 ).MimeType().DesC(); + aMimeVer = iOwnFormat->MimeFormat( 0 ).MimeVersion().DesC(); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - DB Not Supported")); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( &writeStream ); + User::RequestComplete( iCallerStatus, KErrNotSupported ); + return; + } + writeStream.CommitL(); + iItemData->Compress(); + iPos = 0; + + iDataMod->StripTxL( *iItemData ); + delete agendautil; + delete calfilename; + } + break; + default: + { + iDataMimeType = ENSmlNone; + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } } - else - { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - DB Not Supported"); - CleanupStack::PopAndDestroy( 2 ); // writeStream, entry - User::RequestComplete( iCallerStatus, KErrNotSupported ); - return; - } - - writeStream.CommitL(); - iItemData->Compress(); - iPos = 0; + + CleanupStack::PopAndDestroy( ); // writeStream -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "Item from database:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: destroying the stream")); - iDataMod->StripTxL( *iItemData ); - CleanupStack::PopAndDestroy( 2 ); // writeStream, entry - -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "Item from database after strip:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - - aFieldChange = EFalse; + // Set the Size aSize = iItemData->Size(); iState = ENSmlItemOpen; + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: user complete")); + if ( iServerMaxObjectSize == 0 || aSize <= iServerMaxObjectSize ) { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: error none")); User::RequestComplete( iCallerStatus, KErrNone ); } else { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: error too big")); User::RequestComplete( iCallerStatus, KErrTooBig ); } - - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: END")); } // ----------------------------------------------------------------------------- @@ -587,87 +727,157 @@ // buffered. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, - TSmlDbItemUid /*aParent*/, const TDesC8& aMimeType, - const TDesC8& /*aMimeVer*/, TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoCreateItemL( TSmlDbItemUid& aUid, + TInt aSize, + TSmlDbItemUid aParent, + const TDesC8& aMimeType, + const TDesC8& /*aMimeVer*/, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: Parent id: '%d'"), aParent); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: UID: '%d'"), aUid); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; iAddItemId = &aUid; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrNotReady: END"); - return; - } - - if ( KNSmlAgendaOwnMaxObjectSize < aSize ) - { - User::RequestComplete( iCallerStatus, KErrTooBig ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrTooBig: END"); - return; - } - - if( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) - { - User::RequestComplete( iCallerStatus, KErrDiskFull ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrDiskFull: END"); - return; - } - - // Check if MIME type of new item is supported - TBool mimeFound( EFalse ); - // vCal - if ( iOwnFormat->MimeFormat( 0 ).MimeType().DesC().Compare( aMimeType ) - == 0 ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: received vCal"); - mimeFound = ETrue; - iRXEntryType = ENSmlVCal; - } - -#ifdef __NSML_USE_ICAL_FEATURE - - // iCal - else if ( iOwnFormat->MimeFormat( 1 ).MimeType().DesC().Compare( aMimeType ) - == 0 ) + //Leave if Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: received iCal"); - mimeFound = ETrue; - iRXEntryType = ENSmlICal; + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrNotReady: END")); + return; } + // Leave if item is larger than we support + if ( KNSmlAgendaOwnMaxObjectSize < aSize ) + { + User::RequestComplete( iCallerStatus, KErrTooBig ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrTooBig: END")); + return; + } + + // Check the drive free space + if( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrDiskFull: END")); + return; + } + + // Check the MIME type + if ( 0 == iOwnFormat->MimeFormat( 0 ).MimeType().DesC().Compare( aMimeType ) ) + { + // vcal + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: received vCal")); + iRXEntryType = ENSmlVCal; + iDataMimeType = ENSmlCalendar; + + TInt err( KErrNone ); + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + if( !iAgendaAdapterHandler->FolderSyncStatusL( aParent ) ) + { + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + } +#ifdef __NSML_USE_ICAL_FEATURE + else if ( 0 == iOwnFormat->MimeFormat( 1 ).MimeType().DesC().Compare( aMimeType ) ) + { + //ical + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: received iCal")); + iRXEntryType = ENSmlICal; + iDataMimeType = ENSmlCalendar; + } #endif // __NSML_USE_ICAL_FEATURE - - // Else use original iRXEntryType + // RD_MULTICAL + else if( aMimeType == KNSmlContentTypeFolder() && iIsHierarchicalSyncSupported ) + { + // Check the validity + /*if ( aUid <= 0 || aParent <= 0 ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: Corrupt ids")); + User::RequestComplete( iCallerStatus, KErrCorrupt ); + return; + }*/ + iDataMimeType = ENSmlFolder; + } + // RD_MULTICAL else { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: \ - mime type not received"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: \ + mime type not received")); iRXEntryType = iTXEntryType; + iDataMimeType = ENSmlNone; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: end with leave")); + return; } - - if ( !mimeFound ) - { - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL -KErrNotSupported: END"); - return; + + if( iIsHierarchicalSyncSupported ) + { + // Check that parent exists + iParentItemId = aParent; + if ( iParentItemId == KDbItemUidRoot + && iDataMimeType == ENSmlCalendar ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: ParentId is NULL")); + iParentItemId = NULL; + User::RequestComplete( iCallerStatus, KErrGeneral ); + return; + } + + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( iParentItemId, key, index ); + + if( err != KErrNone && iDataMimeType == ENSmlCalendar ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: ParentId is NotFound")); + iParentItemId = NULL; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } } + + // TODO: Any other validation is required ? + + // Register snapshots if needed + if( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + + // Buffer is reinitialized + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + iPos = 0; + + iState = ENSmlItemCreating; + User::RequestComplete( iCallerStatus, KErrNone ); - if( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - iPos = 0; - - iState = ENSmlItemCreating; - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: END")); } // ----------------------------------------------------------------------------- @@ -676,80 +886,170 @@ // writes item's data as buffered. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, - TSmlDbItemUid /*aParent*/, TBool aFieldChange, - TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoReplaceItemL( TSmlDbItemUid aUid, + TInt aSize, + TSmlDbItemUid aParent, + TBool aFieldChange, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: Parent id: '%d'"), aParent); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: UID: '%d'"), aUid); + iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; + TInt err( KErrNone ); - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotReady: END"); - return; - } - - if ( KNSmlAgendaOwnMaxObjectSize < aSize ) - { - User::RequestComplete( iCallerStatus, KErrTooBig ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrTooBig: END"); - return; - } + // Leave if Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotReady: END")); + return; + } - if ( aFieldChange ) - { - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL \ - - KErrNotSupported: END"); - return; - } - if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) - { - User::RequestComplete( iCallerStatus, KErrDiskFull ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrDiskFull: END"); - return; - } - - iReplaceItemId = aUid; - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); - - if ( !entry || err == KErrNotFound ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotFound: END"); - return; - } - else if ( err ) + // Leave if item is larger than we support + if ( KNSmlAgendaOwnMaxObjectSize < aSize ) { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, err ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - Error: END"); - return; + User::RequestComplete( iCallerStatus, KErrTooBig ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrTooBig: END")); + return; } - CleanupStack::PopAndDestroy( entry ); // entry - - if ( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - iPos = 0; - iReplaceItemId = aUid; + // This adapter does not support Field Level sync + if ( aFieldChange ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL \ + - KErrNotSupported: END")); + return; + } + + // Check the drive free space + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrDiskFull: END")); + return; + } + + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + TCalLocalUid parentid( aParent ); + TCalLocalUid entryid( aUid ); + + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: Invalid UID")); + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + + if( !iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ) + { + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + + // Determine the Mime Type + DataMimeType( aUid ); + switch( iDataMimeType ) + { + case ENSmlFolder: + { + iReplaceItemId = aUid; + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + iParentItemId = aParent; + + if( iIsHierarchicalSyncSupported ) + { + iReplaceItemId = aUid - aParent; + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL( aParent )); + } + else + { + iReplaceItemId = aUid; + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: entry id to be fetched: '%d'"), iReplaceItemId); + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, iReplaceItemId )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: entry is not valid")); + delete agendautil; + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + delete agendautil; + delete calfilename; + } + break; + default: + { + iDataMimeType = ENSmlNone; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL \ + - KErrNotSupported: END")); + return; + } + } + + if ( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + + //Reinitialize the Buffer + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + iPos = 0; + + iState = ENSmlItemUpdating; + User::RequestComplete( iCallerStatus, KErrNone ); - iState = ENSmlItemUpdating; - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: END")); } // ----------------------------------------------------------------------------- @@ -759,7 +1059,7 @@ // void CNSmlAgendaDataStore::DoReadItemL( TDes8& aBuffer ) { - _DBG_FILE("CNSmlAgendaDataStore::DoReadItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoReadItemL: BEGIN")); if ( iState != ENSmlItemOpen || !iItemData ) { iPos = -1; @@ -781,7 +1081,7 @@ iItemData->Read( iPos, aBuffer, iItemData->Size() - iPos ); iPos = -1; } - _DBG_FILE("CNSmlAgendaDataStore::DoReadItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoReadItemL: END")); } // ----------------------------------------------------------------------------- @@ -791,7 +1091,7 @@ // void CNSmlAgendaDataStore::DoWriteItemL( const TDesC8& aData ) { - _DBG_FILE("CNSmlAgendaDataStore::DoWriteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoWriteItemL: BEGIN")); if ( iState == ENSmlItemCreating || iState == ENSmlItemUpdating ) { if ( iItemData ) @@ -806,7 +1106,7 @@ } } User::Leave( KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoWriteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoWriteItemL: END")); } // ----------------------------------------------------------------------------- @@ -816,34 +1116,63 @@ // void CNSmlAgendaDataStore::DoCommitItemL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - - if ( iState != ENSmlItemCreating && iState != ENSmlItemUpdating ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL - KErrNotReady: END"); - return; - } - - iItemData->Compress(); - TInt error( KErrNone ); - - if ( iState == ENSmlItemCreating ) - { - TRAP( error, DoCommitCreateItemL() ); - } - else // ENSmlItemUpdating - { - TRAP( error, DoCommitReplaceItemL() ); - } - iReplaceItemId = -1; - iPos = -1; - iState = ENSmlOpenAndWaiting; - iRXEntryType = iTXEntryType; + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL: BEGIN")); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Leave if Data Store is in wrong state + if ( iState != ENSmlItemCreating && iState != ENSmlItemUpdating ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL - KErrNotReady: END")); + return; + } + + iItemData->Compress(); + TInt error( KErrNone ); + + // RD_MULTICAL + switch(iDataMimeType) + { + case ENSmlCalendar: + { + if( iState == ENSmlItemCreating ) + { + TRAP( error, DoCommitCreateCalItemL() ); + } + else + { + TRAP( error, DoCommitReplaceCalItemL() ); + } + } + break; + case ENSmlFolder: + { + if( iState == ENSmlItemCreating ) + { + TRAP( error, DoCommitCreateFolderItemL() ); + } + else + { + TRAP( error, DoCommitReplaceFolderItemL() ); + } + } + break; + default: + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateItemL - \ + KErrNotSupported: END")); + User::Leave( KErrNotSupported ); + } + } + // RD_MULTICAL + + iReplaceItemId = -1; + iPos = -1; + iState = ENSmlOpenAndWaiting; + iRXEntryType = iTXEntryType; User::RequestComplete( iCallerStatus, error ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL: END")); } // ----------------------------------------------------------------------------- @@ -853,13 +1182,13 @@ // void CNSmlAgendaDataStore::DoCloseItem() { - _DBG_FILE("CNSmlAgendaDataStore::DoCloseItem: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCloseItem: BEGIN")); if ( iState == ENSmlItemOpen ) { iPos = -1; iState = ENSmlOpenAndWaiting; } - _DBG_FILE("CNSmlAgendaDataStore::DoCloseItem: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCloseItem: END")); } // ----------------------------------------------------------------------------- @@ -868,18 +1197,16 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoMoveItemL( TSmlDbItemUid /*aUid*/, - TSmlDbItemUid /*aNewParent*/, TRequestStatus& aStatus ) + TSmlDbItemUid /*aNewParent*/, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoMoveItemL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoMoveItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoMoveItemL: BEGIN")); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + FLOG(_L("CNSmlAgendaDataStore::DoMoveItemL: END")); } // ----------------------------------------------------------------------------- @@ -888,46 +1215,233 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoDeleteItemL( TSmlDbItemUid aUid, - TRequestStatus& aStatus ) + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: aUid: '%d'"), aUid); + + TInt err(KErrNone); iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); + *iCallerStatus = KRequestPending; + + // Leave is Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + //Check validity of UID + if ( aUid <= 0 ) + { + User::RequestComplete( iCallerStatus, KErrCorrupt ); + return; + } - if ( !entry || err == KErrNotFound ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - return; - } - else if ( err ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, err ); - return; - } + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + TCalLocalUid parentid( NULL ); + TCalLocalUid entryid( aUid ); + + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: Invalid UID")); + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL - Sync Disabled: END")); + return; + } + + if( !iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ) + { + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + + //Determine the Mime Type + DataMimeType( aUid ); + switch( iDataMimeType ) + { + case ENSmlFolder: + { + HBufC* calfilename = NULL; + //Get the Calendar information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(aUid) ); + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: name exists")); + CCalSession* vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + vCalSession->OpenL(calfilename->Des()); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: before deleting")); + TRAP(err, vCalSession->DeleteCalFileL(calfilename->Des())); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: after deleting err: '%d'"), err); + if( err == KErrInUse ) + { + // Delete all the entries associated with this CalFile + CNSmlAgendaDataStoreUtil* agendautil = NULL; + TBuf8 keyBuff; + TInt aNumSuccessfulDeleted( 0 ); + RArray uidArray; + CleanupClosePushL( uidArray ); + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + // ... and then delete them + agendautil->iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); + CleanupStack::PopAndDestroy( &uidArray ); // uidArray + delete agendautil; + + // Get the CalFile + CCalCalendarInfo* caleninfo = vCalSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + // Mark the CalFile as Hidden + caleninfo->SetEnabled( EFalse ); + + // Set the SyncStatus to False + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( EFalse ); + TPckgC pckgSyncStatusValue( syncstatus ); + caleninfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Mark the meta property as SoftDeleted + keyBuff.Zero(); + keyBuff.AppendNum(EMarkAsDelete); + TPckgC pkgSoftDelete( ETrue ); + caleninfo->SetPropertyL(keyBuff, pkgSoftDelete); + + vCalSession->SetCalendarInfoL( *caleninfo ); + CleanupStack::PopAndDestroy(caleninfo); + } + else if( err != KErrNone ) + { + CleanupStack::PopAndDestroy(vCalSession); + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + return; + } + CleanupStack::PopAndDestroy(vCalSession); + delete calfilename; + + //Update the array + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aUid, key, index ); + + if( err == KErrNone ) + { + iCalOffsetArr->Delete(index); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: updated the array")); + } + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Parent Id is not Valid one")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(parentid) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: entry is not valid")); + delete agendautil; + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + agendautil->iEntryView->DeleteL( *agendautil->iEntry ); + delete agendautil; + delete calfilename; + } + break; + default: + break; + } + + //Update the Snapshots + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( aUid ); + iChangeFinder->ItemDeleted( item ); + } + + User::RequestComplete( iCallerStatus, KErrNone ); - iEntryView->DeleteL( *entry ); - CleanupStack::PopAndDestroy( entry ); // entry - - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( aUid ); - iChangeFinder->ItemDeleted( item ); - } - - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: END")); } // ----------------------------------------------------------------------------- @@ -936,13 +1450,13 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, - TRequestStatus& aStatus ) + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeleteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeleteItemL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeleteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeleteItemL: END")); } // ----------------------------------------------------------------------------- @@ -952,40 +1466,62 @@ // void CNSmlAgendaDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteAllItemsL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - - // Delete all items - // First searh every UIDs ... - TInt aNumSuccessfulDeleted( 0 ); - RArray uidArray; - CleanupClosePushL( uidArray ); - TCalTime zeroTime; - zeroTime.SetTimeUtcL( Time::NullTTime() ); - iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); - - - // ... and then delete them - iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); - CleanupStack::PopAndDestroy( &uidArray ); // uidArray - + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: BEGIN")); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + if( iIsHierarchicalSyncSupported ) + { + // TODO: Have to enable once the delete issue is fixed by Organizer + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: Temporarily doesnot support")); + User::RequestComplete( iCallerStatus, KErrNotSupported ); + return; + } + else + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + calfilename = iOpenedStoreName->AllocL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + agendautil->InitializeCalAPIsL( calfilename ); + CleanupStack::Pop(agendautil); + // Delete all items + // First searh every UIDs ... + TInt aNumSuccessfulDeleted( 0 ); + RArray uidArray; + CleanupClosePushL( uidArray ); + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + + // ... and then delete them + agendautil->iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); + CleanupStack::PopAndDestroy( &uidArray ); // uidArray + } + delete agendautil; + delete calfilename; + } + // Update changefinder - if ( iChangeFinder ) - { - iChangeFinder->ResetL(); - } - iSnapshotRegistered = EFalse; - RegisterSnapshotL(); - - User::RequestComplete( iCallerStatus, KErrNone ); - - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteAllItemsL: END"); + if ( iChangeFinder ) + { + iChangeFinder->ResetL(); + } + iSnapshotRegistered = EFalse; + RegisterSnapshotL(); + + User::RequestComplete( iCallerStatus, KErrNone ); + + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: END")); } // ----------------------------------------------------------------------------- @@ -995,7 +1531,7 @@ // TBool CNSmlAgendaDataStore::DoHasSyncHistory() const { - _DBG_FILE("CNSmlAgendaDataStore::DoHasSyncHistory: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoHasSyncHistory: BEGIN")); TBool ret = EFalse; if ( iHasHistory ) { @@ -1012,7 +1548,7 @@ { iChangeFinder->SetDataStoreUid( iOpenedStoreId ); } - _DBG_FILE("CNSmlAgendaDataStore::DoHasSyncHistory: END"); + FLOG(_L("CNSmlAgendaDataStore::DoHasSyncHistory: END")); return ret; } @@ -1023,13 +1559,40 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoAddedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoAddedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iNewUids->Reset(); TRAP_IGNORE( iChangeFinder->FindNewItemsL( *iNewUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE(inactiveuids = ActiveItemsL( *iNewUids )); + delete inactiveuids; + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename = iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iNewUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoAddedItems: END"); + + for( TInt count = 0; count < iNewUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: list '%d'"), iNewUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: END")); return *iNewUids; } @@ -1040,13 +1603,93 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoDeletedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoDeletedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iDeletedUids->Reset(); - TRAP_IGNORE( iChangeFinder->FindDeletedItemsL( *iDeletedUids ) ); + TRAP_IGNORE( iChangeFinder->FindDeletedItemsL( *iDeletedUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CArrayFixFlat* folderuidarr; + CNSmlDataItemUidSet* tempdeleteuids; + TSmlDbItemUid uid(0); + + folderuidarr = new CArrayFixFlat( KArrayGranularity ); + tempdeleteuids= new CNSmlDataItemUidSet(); + + // Get the list of Folder ids + for( TInt count =0; count < iDeletedUids->ItemCount(); count++ ) + { + uid = iDeletedUids->ItemAt(count); + + if( 0 == (uid % iCalOffsetVal) ) + { + TRAP_IGNORE( folderuidarr->AppendL(uid) ); + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: Folderuid: '%d'"), uid); + } + } + + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iDeletedUids ) ); + delete inactiveuids; + + if( folderuidarr->Count() > 0 ) + { + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + // Fill the temp uid array + for (TInt folderidcount = 0; folderidcount< folderuidarr->Count(); folderidcount++) + { + tempdeleteuids->AddItem(folderuidarr->At(folderidcount)); + } + + // Filter out ID's of entries for Folder deletion + for( TInt count =0; count < iDeletedUids->ItemCount(); count++ ) + { + uid = iDeletedUids->ItemAt(count); + uid = (uid/iCalOffsetVal)*iCalOffsetVal; + err = folderuidarr->Find( uid, key, index ); + if (err == KErrNone) + { + break; + } + tempdeleteuids->AddItem(uid); + } + // Store the proper UID values + iDeletedUids->Reset(); + for( TInt count =0; count < tempdeleteuids->ItemCount(); count++ ) + { + iDeletedUids->AddItem(tempdeleteuids->ItemAt(count)); + } + } + delete tempdeleteuids; + delete folderuidarr; + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename = iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iDeletedUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoDeletedItems: END"); + + for( TInt count = 0; count < iDeletedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: list '%d'"), iDeletedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: END")); return *iDeletedUids; } @@ -1057,14 +1700,14 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoSoftDeletedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeletedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeletedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iSoftDeletedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindSoftDeletedItemsL( *iSoftDeletedUids ) ); } - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeletedItems: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeletedItems: END")); return *iSoftDeletedUids; } @@ -1075,13 +1718,58 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoModifiedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoModifiedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iReplacedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindChangedItemsL( *iReplacedUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iReplacedUids ) ); + + if( inactiveuids ) + { + TRAP_IGNORE( InternalizeCommittedUidL() ); + for( TInt count = 0; count < inactiveuids->ItemCount(); count++ ) + { + TSmlDbItemUid inactiveuid = inactiveuids->ItemAt(count); + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: inactive '%d'"), inactiveuid ); + for( TInt uidcount = 0; uidcount < iCommittedUidArr->ItemCount(); uidcount++ ) + { + if( inactiveuid == iCommittedUidArr->ItemAt( uidcount ) ) + { + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: '%d'"), inactiveuid ); + iReplacedUids->AddItem( inactiveuid ); + } + } + } + delete inactiveuids; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename= iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iReplacedUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoModifiedItems: END"); + + for( TInt count = 0; count < iReplacedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: list '%d'"), iReplacedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: END")); return *iReplacedUids; } @@ -1092,13 +1780,19 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoMovedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoMovedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iMovedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindMovedItemsL( *iMovedUids ) ); } - _DBG_FILE("CNSmlAgendaDataStore::DoMovedItems: END"); + + for( TInt count = 0; count < iMovedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: list '%d'"), iMovedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: END")); return *iMovedUids; } @@ -1109,7 +1803,7 @@ // void CNSmlAgendaDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoResetChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoResetChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1124,7 +1818,7 @@ RegisterSnapshotL(); } User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoResetChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoResetChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1135,7 +1829,7 @@ void CNSmlAgendaDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1144,8 +1838,28 @@ return; } iChangeFinder->CommitChangesL( aItems ); + + // Save the UIDs to the list + iCommittedUidArr->Reset(); + for ( TInt count = 0; count < aItems.ItemCount(); count++ ) + { + iCommittedUidArr->AddItem( aItems.ItemAt( count ) ); + } + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iCommittedUidArr ) ); + delete inactiveuids; + + // Print the iCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::DoCommitChangeInfoL(): CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::iCommittedUidArr: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + + // Store the array in the stream + ExternalizeCommittedUidL(); User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1155,7 +1869,7 @@ // void CNSmlAgendaDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1164,8 +1878,17 @@ return; } iChangeFinder->CommitChangesL(); + // Print the iInterCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::DoCommitChangeInfoL() Without Param: CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::iCommittedUidArr: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + + // Store the array in the stream + ExternalizeCommittedUidL(); User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1175,18 +1898,40 @@ // void CNSmlAgendaDataStore::RegisterSnapshotL() { - _DBG_FILE("CNSmlAgendaAdapter::RegisterSnapshotL(): begin"); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): begin")); CArrayFixSeg* snapshot = new ( ELeave ) CArrayFixSeg( 64 ); CleanupStack::PushL( snapshot ); - - // First find all entries ... RArray uidArray; CleanupClosePushL( uidArray ); - TCalTime zeroTime; - zeroTime.SetTimeUtcL( Time::NullTTime() ); - iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + // First find all entries ... + iAgendaAdapterHandler->SynchronizableCalendarIdsL( iCalOffsetArr ); + // Populate the Entry ID's associated with the CalFile + SynchronizableCalEntryIdsL( uidArray ); + } + else + { + HBufC* calfilename = iOpenedStoreName->AllocL(); + CNSmlAgendaDataStoreUtil* agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + agendautil->InitializeCalAPIsL( calfilename ); + CleanupStack::Pop(agendautil); + } + // First find all entries ... + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + delete agendautil; + delete calfilename; + } + // RD_MULTICAL + // ... and then create snapshot items for ( TInt i = 0; i < uidArray.Count(); i++ ) { @@ -1197,15 +1942,38 @@ } } - CleanupStack::PopAndDestroy( &uidArray ); + CleanupStack::PopAndDestroy( &uidArray ); + + for ( TInt i = 0; i < snapshot->Count(); i++ ) + { + TNSmlSnapshotItem item = snapshot->At(i); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): id: '%d'"), item.ItemId()); + } iChangeFinder->SetNewSnapshot( snapshot ); + // Save the UIDs to the list + iCommittedUidArr->Reset(); + for ( TInt count = 0; count < snapshot->Count(); count++ ) + { + iCommittedUidArr->AddItem( snapshot->At( count ).ItemId() ); + } + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iCommittedUidArr ) ); + delete inactiveuids; + // Print the iCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::RegisterSnapshotL: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + // iChangeFinder takes ownership of items CleanupStack::Pop( snapshot ); + iSnapshotRegistered = ETrue; - _DBG_FILE("CNSmlAgendaAdapter::RegisterSnapshotL(): end"); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): end")); } // ----------------------------------------------------------------------------- @@ -1215,25 +1983,85 @@ TNSmlSnapshotItem CNSmlAgendaDataStore::CreateSnapshotItemL( const TCalLocalUid& aUid ) { + FLOG(_L("CNSmlAgendaAdapter::CreateSnapshotItemL(): Begin")); + TNSmlSnapshotItem item( 0 ); - CCalEntry* entry = iEntryView->FetchL( aUid ); - CleanupStack::PushL( entry ); - - if( entry ) - { - CCalEntry::TReplicationStatus replicationStatus = - entry->ReplicationStatusL(); - if ( CanBeSynchronized( replicationStatus ) ) - { - TUint intUid = entry->LocalUidL(); - item.SetItemId( intUid ); - item.SetLastChangedDate( - entry->LastModifiedDateL().TimeUtcL() ); - item.SetSoftDelete( EFalse ); - } - } - - CleanupStack::PopAndDestroy( entry ); // entry + DataMimeType( aUid ); + + switch( iDataMimeType ) + { + case ENSmlFolder: + { + item = iAgendaAdapterHandler->CreateFolderSnapShotItemL( aUid ); + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Parent Id is not Valid one")); + return item; + } + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(parentid) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Invalid CalendarInfo")); + return item; + } + + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Parent Id: '%d'"), parentid); + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Entry Id: '%d'"), entryid); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL: entry is not valid")); + delete agendautil; + delete calfilename; + return item; + } + + CCalEntry::TReplicationStatus replicationStatus = + agendautil->iEntry->ReplicationStatusL(); + if ( CanBeSynchronized( replicationStatus ) ) + { + TUint intUid = agendautil->iEntry->LocalUidL() + parentid; + item.SetItemId( intUid ); + item.SetLastChangedDate( + agendautil->iEntry->LastModifiedDateL().TimeUtcL() ); + item.SetSoftDelete( EFalse ); + } + delete agendautil; + delete calfilename; + } + break; + default: + break; + } + FLOG(_L("CNSmlAgendaAdapter::CreateSnapshotItemL(): end")); + return item; } @@ -1244,9 +2072,10 @@ // CDesCArray* CNSmlAgendaDataStore::DoListAgendaFilesLC() const { - CDesCArray* array = iVCalSession->ListCalFilesL(); - CleanupStack::PushL( array ); - return array; + CDesCArray* array = new (ELeave) CDesCArrayFlat(1); + array->AppendL(*iDefaultStoreFileName); + CleanupStack::PushL( array ); + return array; } // ----------------------------------------------------------------------------- @@ -1256,11 +2085,11 @@ // const TDesC& CNSmlAgendaDataStore::DoGetDefaultFileNameL() const { - if ( !iDefaultStoreName ) + if ( !iDefaultStoreFileName ) { User::Leave( KErrGeneral ); } - return *iDefaultStoreName; + return *iDefaultStoreFileName; } // ----------------------------------------------------------------------------- @@ -1283,337 +2112,538 @@ // CSmlDataStoreFormat* CNSmlAgendaDataStore::DoOwnStoreFormatL() { - _DBG_FILE("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): BEGIN"); - TFileName fileName; - TParse parse; + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): BEGIN")); + + AgendaAdapterHandlerL(); - // Check correct Data Sync protocol - TInt value( EDataSyncNotRunning ); - TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, - KDataSyncStatus, - value ); - if ( error == KErrNone && - value == EDataSyncRunning ) + if( NULL == iAgendaAdapterHandler ) { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_1_2, - &KDC_RESOURCE_FILES_DIR, NULL ); - } - else // error or protocol version 1.2 - { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_2, - &KDC_RESOURCE_FILES_DIR, NULL ); + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): Invalid AgendaAdapterHandler Error END")); + User::Leave( KErrGeneral ); } - fileName = parse.FullName(); - RResourceFile resourceFile; - BaflUtils::NearestLanguageFile( iRfs, fileName ); + TFileName fileName; + TParse* parse = NULL; + parse = new(ELeave) TParse(); + CleanupStack::PushL( parse ); + + // Check correct Data Sync protocol + TInt value( EDataSyncNotRunning ); + TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, + KDataSyncStatus, + value ); + + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): SyncStatus: '%d'"), KDataSyncStatus); + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): value: '%d'"), value); + + if ( error == KErrNone && + value == EDataSyncRunning ) + { + parse->Set( KNSmlDSAgendaDataStoreRsc_1_1_2, + &KDC_RESOURCE_FILES_DIR, NULL ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): Invoking AdapterHandler Implementation")); + CleanupStack::PopAndDestroy( parse ); + return iAgendaAdapterHandler->StoreFormatL( iStringPool ); + } + + fileName = parse->FullName(); + RResourceFile resourceFile; + BaflUtils::NearestLanguageFile( iRfs, fileName ); - TRAPD( leavecode, resourceFile.OpenL( iRfs,fileName ) ); - if ( leavecode != 0 ) - { - CleanupStack::PopAndDestroy(); // parse - _DBG_FILE("CNSmlAgendaDataProvider::DoStoreFormatL(): END"); - User::Leave( leavecode ); - } - CleanupClosePushL( resourceFile ); - HBufC8* profileRes = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); - TResourceReader reader; - reader.SetBuffer( profileRes ); + TRAPD( leavecode, resourceFile.OpenL( iRfs,fileName ) ); + if ( leavecode != 0 ) + { + CleanupStack::PopAndDestroy(); // parse + FLOG(_L("CNSmlAgendaDataStore:::StoreFormatL(): Error END")); + User::Leave( leavecode ); + } + + CleanupClosePushL( resourceFile ); + HBufC8* buffer = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); + TResourceReader reader; + reader.SetBuffer( buffer ); - CSmlDataStoreFormat* dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, - reader ); - CleanupStack::Pop(); - CleanupStack::PopAndDestroy( 2 ); // resourceFile, profileRes - _DBG_FILE("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): END"); - return dsFormat; + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + CleanupStack::Pop(); // dsFormat + CleanupStack::PopAndDestroy( 3 ); // buffer, resourceFile, parse + + FLOG(_L("CNSmlAgendaDataStore::DoOwnStoreFormatL: END")); + return dsFormat; } // ----------------------------------------------------------------------------- -// CNSmlAgendaDataStore::DoCommitCreateItemL -// Commit item data to database when adding item. +// CNSmlAgendaDataStore::DoCommitCreateCalItemL +// Commit Calendar item data to database when adding item. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCommitCreateItemL() +void CNSmlAgendaDataStore::DoCommitCreateCalItemL() { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: Parentid: '%d'"), iParentItemId); iState = ENSmlOpenAndWaiting; // iState set to closed to handle leave CCalEntry::TReplicationStatus replicationStatus; - + TInt err(KErrNone); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; RBufReadStream readStream; readStream.Open( *iItemData ); readStream.PushL(); RPointerArray rdArray; CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - if ( iRXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: ImportICalendarL"); - iImporter->ImportICalendarL( readStream, rdArray ); - } - else if ( iRXEntryType == ENSmlVCal ) + + if( iIsHierarchicalSyncSupported ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: ImportVCalendarL"); - iImporter->ImportVCalendarL( readStream, rdArray ); + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(iParentItemId) ); } else { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL:Invalid CalendarInfo")); CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - KErrNotSupported: END"); + User::Leave( KErrNotFound ); + } + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete calfilename; + User::Leave( KErrNotFound ); + } + + if ( iRXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: ImportICalendarL")); + agendautil->iImporter->ImportICalendarL( readStream, rdArray ); + } + else if ( iRXEntryType == ENSmlVCal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: ImportVCalendarL")); + agendautil->iImporter->ImportVCalendarL( readStream, rdArray ); + } + else + { + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + KErrNotSupported: END")); User::Leave( KErrNotSupported ); } // If rdArray is empty or there is multiple items then return error - // Multiple items are not supported - if ( rdArray.Count() != 1 ) - { - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - Multiple items are not supported: END"); + // Multiple items are not supported + if ( rdArray.Count() != 1 ) + { + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + Multiple items are not supported: END")); User::Leave( KErrNotSupported ); - } - - TInt err( KErrNone ); - - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: before StoreL"); - TRAP( err, iInterimUtils->StoreL( *iEntryView, *rdArray[0], ETrue ) ); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoCommitCreateItemL: after StoreL '%d'"), err ); + } + + err = KErrNone; + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: before StoreL")); + TRAP( err, iInterimUtils->StoreL( *agendautil->iEntryView, *rdArray[0], ETrue ) ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: after StoreL '%d'"), err ); if ( err ) { + delete agendautil; + delete calfilename; CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - Error at storing item to database: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + Error at storing item to database: END")); User::Leave( KErrGeneral ); } - *iAddItemId = rdArray[0]->LocalUidL(); + *iAddItemId = rdArray[0]->LocalUidL(); + CCalEntry* newEntry = agendautil->iEntryView->FetchL( *iAddItemId ); - CCalEntry* newEntry = iEntryView->FetchL( *iAddItemId ); + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + *iAddItemId = *iAddItemId + iParentItemId; + } + // RD_MULTICAL if( newEntry ) - { - CleanupStack::PushL( newEntry ); + { + CleanupStack::PushL( newEntry ); - replicationStatus = newEntry->ReplicationStatusL(); - - if ( CanBeSynchronized( replicationStatus ) ) - { - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( *iAddItemId ); - item.SetLastChangedDate( - newEntry->LastModifiedDateL().TimeUtcL() ); - item.SetSoftDelete( EFalse ); - TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); - if ( changeFinderError == KErrAlreadyExists ) - { - iChangeFinder->ItemUpdatedL( item ); - } - else - { - User::LeaveIfError( changeFinderError ); - } - } - } - CleanupStack::PopAndDestroy();// newEntry, - } + replicationStatus = newEntry->ReplicationStatusL(); + + if ( CanBeSynchronized( replicationStatus ) ) + { + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( *iAddItemId ); + item.SetLastChangedDate( + newEntry->LastModifiedDateL().TimeUtcL() ); + item.SetSoftDelete( EFalse ); + TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); + if ( changeFinderError == KErrAlreadyExists ) + { + iChangeFinder->ItemUpdatedL( item ); + } + else + { + User::LeaveIfError( changeFinderError ); + } + } + } + CleanupStack::PopAndDestroy();// newEntry, + } + delete agendautil; + delete calfilename; CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: END")); } // ----------------------------------------------------------------------------- -// CNSmlAgendaDataStore::DoCommitReplaceItemL -// Commit item data to database when replacing item. +// CNSmlAgendaDataStore::DoCommitReplaceCalItemL +// Commit Calendar item data to database when replacing item. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCommitReplaceItemL() +void CNSmlAgendaDataStore::DoCommitReplaceCalItemL() { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: BEGIN")); iState = ENSmlOpenAndWaiting; // iState set to closed to handle leave CBufFlat* oldItem = CBufFlat::NewL( KNSmlItemDataExpandSize ); CleanupStack::PushL( oldItem ); RBufWriteStream writeStream( *oldItem ); writeStream.PushL(); - - CCalEntry* entry = NULL; - TInt error( KErrNone ); - TRAP( error, entry = iEntryView->FetchL( iReplaceItemId ) ); - if ( error || !entry ) - { - CleanupStack::PopAndDestroy( 2 ); // writeStream, oldItem - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Error in fetching the item: END"); - User::Leave( KErrGeneral ); - } - CleanupStack::PushL( entry ); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TInt err( KErrNone ); - // Export item from database depending on transmitted item entry type - if ( iTXEntryType == ENSmlVCal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ExportVCalL"); - iExporter->ExportVCalL( *entry, writeStream ); - } + + if( iIsHierarchicalSyncSupported ) + { + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(iParentItemId) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + User::Leave( KErrNotFound ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: entry id: '%d'"), iReplaceItemId); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, iReplaceItemId )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: entry is not valid")); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + User::Leave( KErrGeneral ); + } + + // Export item from database depending on transmitted item entry type + if ( iTXEntryType == ENSmlVCal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ExportVCalL")); + agendautil->iExporter->ExportVCalL( *agendautil->iEntry, writeStream ); + } #ifdef __NSML_USE_ICAL_FEATURE - else if ( iTXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ExportICalL"); - iExporter->ExportICalL( *entry, writeStream ); - } + else if ( iTXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ExportICalL")); + agendautil->iExporter->ExportICalL( *agendautil->iEntry, writeStream ); + } #endif // __NSML_USE_ICAL_FEATURE - else + else { - CleanupStack::PopAndDestroy( 2 ); // entry, writeStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - KErrNotSupported: END"); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL - \ + KErrNotSupported: END")); User::Leave( KErrNotSupported ); } - writeStream.CommitL(); - oldItem->Compress(); - - CleanupStack::PopAndDestroy( 2 ); // entry, writeStream - - // Get original UID, geoId and Recurrence-ID properties - HBufC8* uid = NULL; - HBufC8* recurrenceId = NULL; - HBufC8* xRecurrenceId = NULL; - HBufC8* geoId = NULL; - GetPropertiesFromDataL( oldItem, uid, KVersitTokenUID() ); - GetPropertiesFromDataL( oldItem, recurrenceId, KNSmlVersitTokenRecurrenceID() ); - GetPropertiesFromDataL( oldItem, xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); - GetPropertiesFromDataL( oldItem, geoId, KNSmlVersitTokenGeoID() ); - CleanupStack::PushL( uid ); - CleanupStack::PushL( recurrenceId ); - CleanupStack::PushL( xRecurrenceId ); - CleanupStack::PushL( geoId ); + writeStream.CommitL(); + oldItem->Compress(); -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )oldItem->Ptr( 0 ).Ptr(), oldItem->Size(), - _S8( "Old item from database:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ + CleanupStack::PopAndDestroy( 1 ); + + // Get original UID, geoId and Recurrence-ID properties + HBufC8* uid = NULL; + HBufC8* recurrenceId = NULL; + HBufC8* xRecurrenceId = NULL; + HBufC8* geoId = NULL; + GetPropertiesFromDataL( oldItem, uid, KVersitTokenUID() ); + GetPropertiesFromDataL( oldItem, recurrenceId, KNSmlVersitTokenRecurrenceID() ); + GetPropertiesFromDataL( oldItem, xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); + GetPropertiesFromDataL( oldItem, geoId, KNSmlVersitTokenGeoID() ); + CleanupStack::PushL( uid ); + CleanupStack::PushL( recurrenceId ); + CleanupStack::PushL( xRecurrenceId ); + CleanupStack::PushL( geoId ); - if ( iDataMod->NeedsMerge() ) - { - // Merge data - iDataMod->MergeRxL( *iItemData, *oldItem ); - } - - // Add original UID and Recurrence-ID to merged data - // This first removes UID and Recurrence-ID from merged data - // and then adds original ones - if ( uid ) - { - SetPropertiesToDataL( uid, KVersitTokenUID() ); - } + if ( iDataMod->NeedsMerge() ) + { + // Merge data + iDataMod->MergeRxL( *iItemData, *oldItem ); + } + + // Add original UID and Recurrence-ID to merged data + // This first removes UID and Recurrence-ID from merged data + // and then adds original ones + if ( uid ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :uid")); + SetPropertiesToDataL( uid, KVersitTokenUID() ); + } else { + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, + // uid, oldItem, geoId User::Leave( KErrNotSupported ); } - if ( recurrenceId ) - { - SetPropertiesToDataL( recurrenceId, KNSmlVersitTokenRecurrenceID() ); - } - if ( xRecurrenceId ) - { - SetPropertiesToDataL( xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); - } - if ( geoId ) - { - SetPropertiesToDataL( geoId, KNSmlVersitTokenGeoID() ); - } - -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "New item to database:" ) ); + if ( recurrenceId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :recurrenceId")); + SetPropertiesToDataL( recurrenceId, KNSmlVersitTokenRecurrenceID() ); + } + if ( xRecurrenceId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :xRecurrenceId")); + SetPropertiesToDataL( xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); + } + if ( geoId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :geoId")); + SetPropertiesToDataL( geoId, KNSmlVersitTokenGeoID() ); + } + + CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, + // uid, oldItem, geoId + + // Replace item to database + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - - CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, - // uid, oldItem, geoId - - // Replace item to database - RBufReadStream readStream; - readStream.Open( *iItemData ); - readStream.PushL(); + RPointerArray rdArray; + CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - RPointerArray rdArray; - CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - - // Import item to database depending on received item entry type - if ( iRXEntryType == ENSmlVCal ) + // Import item to database depending on received item entry type + if ( iRXEntryType == ENSmlVCal ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ImportVCalendarL"); - iImporter->ImportVCalendarL( readStream, rdArray ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportVCalendarL")); + TRAP( err, agendautil->iImporter->ImportVCalendarL( readStream, rdArray )); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportVCalendarL error: '%d'"), err); + if( err != KErrNone) + { + User::Leave(err); + } } #ifdef __NSML_USE_ICAL_FEATURE - else if ( iRXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ImportICalendarL"); - iImporter->ImportICalendarL( readStream, rdArray ); - } + else if ( iRXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportICalendarL")); + agendautil->iImporter->ImportICalendarL( readStream, rdArray ); + } #endif // __NSML_USE_ICAL_FEATURE else { + delete agendautil; + delete calfilename; CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - KErrNotSupported: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ + KErrNotSupported: END")); User::Leave( KErrNotSupported ); } // If rdArray is empty or there is multiple items then return error - // Multiple items are not supported - if ( rdArray.Count() != 1 ) - { - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Multiple items are not supported: END"); + // Multiple items are not supported + if ( rdArray.Count() != 1 ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: Multiple items are not supported ")); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ + Multiple items are not supported: END")); User::Leave( KErrNotSupported ); - } - - TInt err( KErrNone ); + } + + err = KErrNone; - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: before StoreL"); - TRAP( err, iInterimUtils->StoreL( *iEntryView, *rdArray[0], ETrue ) ); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoCommitCreateItemL: after StoreL '%d'"), err ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: before StoreL")); + TRAP( err, iInterimUtils->StoreL( *agendautil->iEntryView, *rdArray[0], ETrue ) ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateItemL: after StoreL '%d'"), err ); if ( err ) { + delete agendautil; + delete calfilename; CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Error at storing item to database: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL - \ + Error at storing item to database: END")); User::Leave( KErrGeneral ); } - CCalEntry::TReplicationStatus replicationStatus; - - CCalEntry* replacedEntry = iEntryView->FetchL( iReplaceItemId ); - if( replacedEntry ) - { + CCalEntry::TReplicationStatus replicationStatus; + + CCalEntry* replacedEntry = agendautil->iEntryView->FetchL( iReplaceItemId ); + if( replacedEntry ) + { CleanupStack::PushL( replacedEntry ); - + replicationStatus = replacedEntry->ReplicationStatusL(); - - if ( CanBeSynchronized( replicationStatus ) ) - { - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( iReplaceItemId ); - item.SetLastChangedDate( - replacedEntry->LastModifiedDateL().TimeUtcL()); - item.SetSoftDelete( EFalse ); - iChangeFinder->ItemUpdatedL( item ); - } - } - CleanupStack::PopAndDestroy(); // replacedEntry - } - - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: END"); + + // RD_MULTICAL + if( !iIsHierarchicalSyncSupported ) + { + iParentItemId = 0; + } + // RD_MULTICAL + + if ( CanBeSynchronized( replicationStatus ) ) + { + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( iReplaceItemId + iParentItemId ); + item.SetLastChangedDate( + replacedEntry->LastModifiedDateL().TimeUtcL()); + item.SetSoftDelete( EFalse ); + iChangeFinder->ItemUpdatedL( item ); + } + } + CleanupStack::PopAndDestroy(); // replacedEntry } + delete agendautil; + delete calfilename; + + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DoCommitCreateFolderItemL +// Commit Folder item data to database when adding item. +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStore::DoCommitCreateFolderItemL() + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: BEGIN")); + + TInt err(KErrNone); + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); + + TRAP(err, *iAddItemId = iAgendaAdapterHandler->CreateFolderL( readStream )); + if( err != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: Error in Create Folder")); + CleanupStack::PopAndDestroy( &readStream ); + User::Leave( err ); + } + + // Add snapshotitem + if ( iChangeFinder ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: item id: '%d'"), *iAddItemId ); + TNSmlSnapshotItem item( *iAddItemId ); + TTime time; + time.HomeTime(); + item.SetLastChangedDate( time ); + item.SetSoftDelete( EFalse ); + TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); + if ( changeFinderError == KErrAlreadyExists ) + { + iChangeFinder->ItemUpdatedL( item ); + } + else + { + User::LeaveIfError( changeFinderError ); + } + + iCalOffsetArr->AppendL(*iAddItemId); + + } + + CleanupStack::PopAndDestroy( &readStream ); + + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: END")); + } + + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DoCommitReplaceFolderItemL +// Commit Folder item data to database when replacing item. +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStore::DoCommitReplaceFolderItemL() + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: BEGIN")); + + TBool syncstatus(ETrue); + TInt err(KErrNone); + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); + + TRAP(err, iAgendaAdapterHandler->ReplaceFolderL( iReplaceItemId, readStream, syncstatus )); + if(err != KErrNone) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: Error while replacing Folder")); + CleanupStack::PopAndDestroy( &readStream ); + User::Leave(err); + } + + // Update snapshotitem + if ( iChangeFinder && syncstatus ) + { + TNSmlSnapshotItem item( iReplaceItemId ); + TTime time; + time.HomeTime(); + item.SetLastChangedDate(time); + item.SetSoftDelete( EFalse ); + iChangeFinder->ItemUpdatedL( item ); + } + + CleanupStack::PopAndDestroy( &readStream ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: END")); + } // ----------------------------------------------------------------------------- // CNSmlAgendaDataStore::GetPropertiesFromDataL // Gets property from old item. @@ -1623,7 +2653,7 @@ HBufC8*& aValue, const TDesC8& aProperty ) { - _DBG_FILE("CNSmlAgendaDataStore::GetPropertiesFromDataL(): begin"); + FLOG(_L("CNSmlAgendaDataStore::GetPropertiesFromDataL(): begin")); // Gemerate property that is searched (Linebreak + property + tokencolon) HBufC8* startBuffer = HBufC8::NewLC( KVersitTokenCRLF().Size() + @@ -1669,7 +2699,7 @@ } CleanupStack::PopAndDestroy( startBuffer ); // startBuffer - _DBG_FILE("CNSmlAgendaDataStore::GetPropertiesFromDataL(): end"); + FLOG(_L("CNSmlAgendaDataStore::GetPropertiesFromDataL(): end")); } // ----------------------------------------------------------------------------- @@ -1680,7 +2710,7 @@ void CNSmlAgendaDataStore::SetPropertiesToDataL( HBufC8*& aValue, const TDesC8& aProperty ) { - _DBG_FILE("CNSmlAgendaDataStore::SetPropertiesToDataL(): begin"); + FLOG(_L("CNSmlAgendaDataStore::SetPropertiesToDataL(): begin")); // Gemerate property that is searched (Linebreak + property + tokencolon) HBufC8* startBuffer = HBufC8::NewLC( KVersitTokenCRLF().Size() + @@ -1764,7 +2794,719 @@ CleanupStack::PopAndDestroy( 3 ); // endVTodo, endVEvent, startBuffer - _DBG_FILE("CNSmlAgendaDataStore::SetPropertiesToDataL(): end"); + FLOG(_L("CNSmlAgendaDataStore::SetPropertiesToDataL(): end")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::GetCalendarEntryIdL +// Method to retrieve the Id of the Calendar Entry +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::GetCalendarEntryIdL( TCalLocalUid& aParentId, TCalLocalUid& aCalId ) const + { + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: BEGIN")); + + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: parentid: '%d'"), aParentId); + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: aCalId: '%d'"), aCalId); + + TInt uidcalentry = aCalId; + + if( uidcalentry < iCalOffsetVal ) + { + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: Invalid CalendarId: '%d'"), aCalId); + User::Leave( KErrGeneral ); + } + else if( uidcalentry == iCalOffsetVal || + 0 == (uidcalentry % iCalOffsetVal) ) + { + aParentId = uidcalentry; + } + else + { + while( uidcalentry > iCalOffsetVal ) + { + uidcalentry = uidcalentry - iCalOffsetVal; + } + aParentId = aCalId - uidcalentry; + aCalId = uidcalentry; + } + + TInt err(KErrNone); + TInt index = KErrNotFound; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aParentId, key, index ); + + if( err != KErrNone ) + { + User::Leave(err); + } + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DataMimeType +// Method to determine the MIME type, provided the UID +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::DataMimeType( TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: BEGIN")); + + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: LUID '%d'"), aUid ); + + if( iIsHierarchicalSyncSupported ) + { + // Find a match with the list of Offset values available + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aUid, key, index ); + + // Determine the Data Mime Type + if( err == KErrNone ) + { + iDataMimeType = ENSmlFolder; + } + else + { + iDataMimeType = ENSmlCalendar; + } + } + else + { + iDataMimeType = ENSmlCalendar; + } + + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: END, DataMimeType '%d' "), iDataMimeType); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL +// Get All the AdapterHandler instance +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL() + { + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL BEGIN")); + + RImplInfoPtrArray adapterInfoArray; + CNSmlAgendaAdapterHandler* adapterInstance(NULL); + + REComSession::ListImplementationsL( KAgendaAdapterHandlerInterfaceUid, adapterInfoArray ); + TInt adapterCount = adapterInfoArray.Count(); + FLOG(_L("adaptercount:'%d'"),adapterCount); + CImplementationInformation* adapterInfo = NULL; + + for (TInt adapterIndex = 0 ; adapterIndex < adapterCount; adapterIndex++) + { + adapterInfo = adapterInfoArray[ adapterIndex ]; + TUid adapterUid = { adapterInfo->ImplementationUid().iUid }; + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL before newl")); + adapterInstance = CNSmlAgendaAdapterHandler::NewL(adapterUid); + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL after newl")); + if( adapterInstance ) + { + adapterInstance->iOpaqueData = adapterInfo->OpaqueData().Alloc(); + iAgendaPluginAdapters.AppendL( adapterInstance ); + } + } + adapterInfoArray.ResetAndDestroy(); + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::AgendaAdapterHandlerL +// Get the AdapterHandler instance +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::AgendaAdapterHandlerL() + { + FLOG(_L("CNSmlAgendaDataStore::AgendaAdapterHandlerL BEGIN")); + + // Get the Opaque data / server id from the cenrep + TBuf serverid; + HBufC8* opaquedata; + CRepository* rep = CRepository::NewLC( KNsmlDsSessionInfoKey ); + TInt err = rep->Get(EDSSessionServerId, serverid ); + FLOG(_L("CNSmlAgendaDataStore:::AgendaAdapterHandlerL():serverid '%S'"), &serverid ); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(rep); + + if( 0 == serverid.Length() ) + { + FLOG(_L("CNSmlAgendaDataStore:::AgendaAdapterHandlerL():serverid length is zero")); + opaquedata = KNSmlDefaultOpaqueData().AllocL(); + } + else + { + opaquedata = HBufC8::NewL( serverid.Length() ); + TPtr8 name( opaquedata->Des() ); + CnvUtfConverter::ConvertFromUnicodeToUtf8(name , serverid ); + } + iAgendaAdapterHandler = NULL; + for( TInt adaptercount = 0; adaptercount < iAgendaPluginAdapters.Count(); adaptercount++ ) + { + if( 0 == opaquedata->Compare(iAgendaPluginAdapters[adaptercount]->iOpaqueData->Des()) ) + { + iAgendaAdapterHandler = iAgendaPluginAdapters[adaptercount]; + break; + } + } + + delete opaquedata; + + if( NULL == iAgendaAdapterHandler ) + { + opaquedata = KNSmlDefaultOpaqueData().AllocL(); + for( TInt adaptercount = 0; adaptercount < iAgendaPluginAdapters.Count(); adaptercount++ ) + { + if( 0 == opaquedata->Compare(iAgendaPluginAdapters[adaptercount]->iOpaqueData->Des()) ) + { + iAgendaAdapterHandler = iAgendaPluginAdapters[adaptercount]; + break; + } + } + delete opaquedata; + } + + FLOG(_L("CNSmlAgendaDataStore::AgendaAdapterHandlerL END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::SynchronizableCalEntryIdsL +// Retrieve the CalendarFile and associated entries ID +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::SynchronizableCalEntryIdsL( RArray& aUidArray ) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL BEGIN")); + + TInt err(KErrNone); + + for( TInt calfilecount = 0; calfilecount < iCalOffsetArr->Count(); calfilecount++ ) + { + TUint calfileid = iCalOffsetArr->At(calfilecount); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(calfileid) ); + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL calfilename: '%S'"), calfilename); + + if( err!= KErrNone || NULL == calfilename) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Invalid FileName")); + User::Leave(KErrGeneral); + } + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Initialize")); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Initialization failed")); + delete calfilename; + User::Leave(KErrGeneral); + } + + TCalTime zeroTime; + RArray entryarray; + CleanupClosePushL( entryarray ); + + aUidArray.AppendL(calfileid); + + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, entryarray ); + + for( TInt i=0; i profilename; + + // Get the ProfileId and ProfileName from the cenrep + CRepository* rep = CRepository::NewLC( KNsmlDsSessionInfoKey ); + TInt err = rep->Get( EDSSessionProfileId, profileid ); + err = rep->Get( EDSSessionProfileName, profilename ); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(rep); + + // Find the CalendarFile having the given ProfileID + CDesCArray* calfilearr = new (ELeave) CDesCArrayFlat(1); + CleanupStack::PushL(calfilearr); + if ( IsCalFileAvailableL( profileid, calfilearr ) ) + { + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL Found the assoicated calfile")); + + // TODO: Yet to get clarification for enable/disable the notification + + if ( iOpenedStoreName ) + { + delete iOpenedStoreName; + iOpenedStoreName = NULL; + } + iOpenedStoreName = calfilearr->MdcaPoint(0).AllocL(); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL CouldNot Find the Calfile")); + + // No association found thus creating a CalendarFile + HBufC* name = profilename.AllocL(); + HBufC* calfilename = CreateCalFileL( name, profileid ); + delete name; + + if ( iOpenedStoreName ) + { + delete iOpenedStoreName; + iOpenedStoreName = NULL; + } + iOpenedStoreName = calfilename; + } + + CCalSession* calsession = CCalSession::NewL(); + CleanupStack::PushL(calsession); + TRAP( err, calsession->OpenL( iOpenedStoreName->Des() ) ); + // Disable notifications + TRAP_IGNORE( calsession->DisablePubSubNotificationsL() ); + TRAP_IGNORE( calsession->DisableChangeBroadcast() ); + // Get ID of database + calsession->FileIdL( iOpenedStoreId ); + CleanupStack::PopAndDestroy( calsession ); + + CleanupStack::PopAndDestroy(calfilearr); + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL END")); } - + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::IsCalFileAvailableL +// Check existance of CalFile with the given ProfileID associativity +// ----------------------------------------------------------------------------- +TBool CNSmlAgendaDataStore::IsCalFileAvailableL( TInt aProfileId, CDesCArray* aCalFileArr ) + { + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: BEGIN")); + + TBool calfilestatus(EFalse); + TBuf8 keyBuff; + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + CleanupStack::PushL(calfilearr); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(*vCalSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + TInt ProfileId; + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC intBuf(ProfileId); + TRAPD(err,intBuf.Set(caleninfo->PropertyValueL(keyBuff))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: Error while retrieving CalFile Property")); + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + continue; + } + + ProfileId = intBuf(); + + if(aProfileId == ProfileId) + { + aCalFileArr->AppendL(calfilearr->MdcaPoint(i)); + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + + if( aCalFileArr->Count() > 0 ) + { + calfilestatus = ETrue; + } + else + { + calfilestatus = EFalse; + } + CleanupStack::PopAndDestroy(calfilearr); + CleanupStack::PopAndDestroy(vCalSession); + + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: END")); + return calfilestatus; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::OpenStoreL +// Create CalFile with the attributes provided +// ----------------------------------------------------------------------------- +HBufC* CNSmlAgendaDataStore::CreateCalFileL( HBufC* aProfileName, TInt aProfileId ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: BEGIN")); + + TBuf8 keyBuff; + TUint calValue = 0; + CCalSession* calSession = CCalSession::NewL(); + CleanupStack::PushL(calSession); + CCalCalendarInfo* calinfo = CCalCalendarInfo::NewL(); + CleanupStack::PushL(calinfo); + + //Visibility + calinfo->SetEnabled(ETrue); + calinfo->SetNameL(aProfileName->Des()); + // TODO + calinfo->SetColor(Math::Random()); + + // Set Meta Data Properties + // LUID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + calValue = CCalenMultiCalUtil::GetNextAvailableOffsetL(); + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: nextoffset: '%d'"), calValue); + TPckgC pckgUidValue( calValue ); + calinfo->SetPropertyL( keyBuff, pckgUidValue ); + + // Create & Modified Time Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( ECreationTime ); + TTime time; + time.HomeTime(); + TPckgC pckgCreateTimeValue( time ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + + // Sync Status + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( ETrue ); + TPckgC pckgSyncStatusValue( syncstatus ); + calinfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Global UID MetaDataProperty + keyBuff.Zero(); + keyBuff.AppendNum( EGlobalUUID ); + HBufC8* guuid = iInterimUtils->CalFileGlobalUidL(); + TPtr8 guuidPtr = guuid->Des(); + CleanupStack::PushL( guuid ); + calinfo->SetPropertyL( keyBuff, guuidPtr ); + CleanupStack::PopAndDestroy( guuid ); + + // Owner + keyBuff.Zero(); + TInt syncowner = iAgendaAdapterHandler->DeviceSyncOwner(); + keyBuff.AppendNum( EDeviceSyncServiceOwner ); + TPckgC pckgAppUIDValue( syncowner ); + calinfo->SetPropertyL( keyBuff, pckgAppUIDValue ); + + // Profile ID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC pckgProfileIdValue( aProfileId ); + calinfo->SetPropertyL( keyBuff, pckgProfileIdValue ); + + // Create the CalFile + HBufC* calfilename = CCalenMultiCalUtil::GetNextAvailableCalFileL(); + calSession->CreateCalFileL( calfilename->Des(), *calinfo ); + CleanupStack::PopAndDestroy(calinfo); + CleanupStack::PopAndDestroy(calSession); + + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: END")); + + return calfilename; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ActiveItemsL +// Filters out the non-active items from the given array +// ----------------------------------------------------------------------------- +CNSmlDataItemUidSet* CNSmlAgendaDataStore::ActiveItemsL( CNSmlDataItemUidSet& aUids ) const + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: BEGIN")); + + TInt err(KErrNone); + TCalLocalUid uid(0); + TCalLocalUid parentid(0); + CNSmlDataItemUidSet* tempuids = new ( ELeave ) CNSmlDataItemUidSet(); + CNSmlDataItemUidSet* inactiveuids = new ( ELeave ) CNSmlDataItemUidSet(); + for( TInt count =0; count < aUids.ItemCount(); count++ ) + { + parentid = 0; + uid = aUids.ItemAt(count); + TRAP( err, GetCalendarEntryIdL( parentid, uid )); + if ( err && iIsHierarchicalSyncSupported ) + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: Invalid UID")); + delete tempuids; + delete inactiveuids; + User::Leave( KErrGeneral ); + } + if( iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ) + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: ActiveItem: '%d'"), aUids.ItemAt(count)); + tempuids->AddItem( aUids.ItemAt(count) ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: InActiveItem: '%d'"), aUids.ItemAt(count)); + inactiveuids->AddItem( aUids.ItemAt(count) ); + } + } + if( inactiveuids->ItemCount() > 0 ) + { + aUids.Reset(); + for( TInt count =0; count < tempuids->ItemCount(); count++ ) + { + aUids.AddItem( tempuids->ItemAt(count) ); + } + delete tempuids; + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: END")); + return inactiveuids; + } + else + { + delete tempuids; + delete inactiveuids; + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: END")); + return NULL; + } + } + + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ExternalizeCommittedUidL +// Populate iCommittedUidArr from the Stream +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::ExternalizeCommittedUidL() const + { + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: BEGIN")); + + TUid uid = {KNSmlAgendaAdapterStreamUid}; + RWriteStream writeStream; + + // Open stream for writing + iAgendaAdapterLog->iSyncRelationship.OpenWriteStreamLC(writeStream, uid); + + // Write the snapshot to the stream + TInt itemCount = iCommittedUidArr->ItemCount(); + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: count '%d'"), itemCount); + writeStream.WriteInt32L(itemCount); + + if( itemCount > 0 ) + { + for (TInt i = 0; i < itemCount; ++i) + { + writeStream.WriteInt32L(iCommittedUidArr->ItemAt(i)); + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: item '%d'"), iCommittedUidArr->ItemAt(i)); + } + } + writeStream.CommitL(); + CleanupStack::PopAndDestroy(); // writeStream + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::InternalizeCommittedUidL +// Write the contents of iCommittedUidArr to the Stream +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::InternalizeCommittedUidL() const + { + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: BEGIN")); + + TUid uid = {KNSmlAgendaAdapterStreamUid}; + TBool hashistory = iAgendaAdapterLog->iSyncRelationship.IsStreamPresentL(uid); + + if (hashistory) + { + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: HasHistory")); + + // Open stream for reading + RReadStream readStream; + iAgendaAdapterLog->iSyncRelationship.OpenReadStreamLC(readStream, uid); + + // Read snapshot from the stream + TSmlDbItemUid item; + TInt itemCount(readStream.ReadInt32L()); + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: count '%d'"), itemCount); + iCommittedUidArr->Reset(); + for (TInt i = 0; i < itemCount; ++i) + { + item = readStream.ReadInt32L(); + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: item '%d'"), item); + iCommittedUidArr->AddItem(item); + } + CleanupStack::PopAndDestroy(); // readStream + } + + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil() : + iCalSession( NULL ), + iExporter( NULL ), + iImporter( NULL ), + iProgressView( NULL ), + iEntryView( NULL ), + iEntry( NULL ), + iFileName( NULL ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil(): BEGIN")); + + FLOG(_L("CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::InitializeCalAPIsL +// Initialize Calendar APIs for database access using the provided name and id +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStoreUtil::InitializeCalAPIsL( HBufC* aFileName, TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::InitializeCalAPIsL: BEGIN")); + + iCalSession = CCalSession::NewL(); + iCalSession->OpenL(aFileName->Des()); + iExporter = CCalenExporter::NewL( *iCalSession ); + iImporter = CCalenImporter::NewL( *iCalSession ); + iProgressView = CNSmlAgendaProgressview::NewL(); + iEntryView = CCalEntryView::NewL( *iCalSession, *iProgressView ); + CActiveScheduler::Start(); + TInt completedStatus = iProgressView->GetCompletedStatus(); + if ( completedStatus != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::ConstructL: ERROR in Progressview")); + } + if( aUid != NULL ) + { + iEntry = iEntryView->FetchL( aUid ); + if( NULL == iEntry ) + { + User::Leave( KErrNotFound ); + } + + } + FLOG(_L("CNSmlAgendaDataStoreUtil::InitializeCalAPIsL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil* CNSmlAgendaDataStoreUtil::NewL() + { + FLOG(_L("CNSmlAgendaDataStoreUtil::NewL: BEGIN")); + + CNSmlAgendaDataStoreUtil* self = new ( ELeave ) CNSmlAgendaDataStoreUtil(); + + FLOG(_L("CNSmlAgendaDataStoreUtil::NewL: END")); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil +// Destructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil() + { + FLOG(_L("CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil(): BEGIN")); + + delete iEntry; + delete iEntryView; + delete iExporter; + delete iImporter; + delete iCalSession; + delete iProgressView; + + FLOG(_L("CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog( MSmlSyncRelationship& aSyncRelationship ) : + iSyncRelationship( aSyncRelationship ) + { + FLOG(_L("CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog(): BEGIN")); + + FLOG(_L("CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog* CNSmlAgendaAdapterLog::NewL( MSmlSyncRelationship& aSyncRelationship ) + { + FLOG(_L("CNSmlAgendaAdapterLog::NewL: BEGIN")); + + CNSmlAgendaAdapterLog* self = new ( ELeave ) CNSmlAgendaAdapterLog(aSyncRelationship); + + FLOG(_L("CNSmlAgendaAdapterLog::NewL: END")); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog +// Destructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog() + { + FLOG(_L("CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog(): BEGIN")); + + FLOG(_L("CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog(): END")); + } + + // End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/agenda/src/nsmlagendaprogressview.cpp --- a/omads/omadsextensions/adapters/agenda/src/nsmlagendaprogressview.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/agenda/src/nsmlagendaprogressview.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -18,8 +18,9 @@ // INCLUDES -#include "nsmldebug.h" +#include "nsmlagendadebug.h" #include "nsmlagendadatastore.h" +#include // ===================================== MEMBER FUNCTIONS ====================== // ----------------------------------------------------------------------------- @@ -28,10 +29,10 @@ // ----------------------------------------------------------------------------- CNSmlAgendaProgressview* CNSmlAgendaProgressview::NewL() { - _DBG_FILE("CNSmlAgendaProgressview::NewL(): BEGIN"); + FLOG(_L("CNSmlAgendaProgressview::NewL(): BEGIN")); CNSmlAgendaProgressview* self = new (ELeave) CNSmlAgendaProgressview(); self->ConstructL(); - _DBG_FILE("CNSmlAgendaProgressview::NewL(): END"); + FLOG(_L("CNSmlAgendaProgressview::NewL(): END")); return self; } @@ -41,9 +42,9 @@ // ----------------------------------------------------------------------------- CNSmlAgendaProgressview::~CNSmlAgendaProgressview() { - _DBG_FILE("CNSmlAgendaProgressview::~CNSmlAgendaProgressview(): BEGIN"); + FLOG(_L("CNSmlAgendaProgressview::~CNSmlAgendaProgressview(): BEGIN")); // Nothing to do - _DBG_FILE("CNSmlAgendaProgressview::~CNSmlAgendaProgressview(): END"); + FLOG(_L("CNSmlAgendaProgressview::~CNSmlAgendaProgressview(): END")); } // ----------------------------------------------------------------------------- @@ -53,8 +54,8 @@ // ----------------------------------------------------------------------------- void CNSmlAgendaProgressview::Progress( TInt /*aPercentageCompleted*/ ) { - _DBG_FILE("CNSmlAgendaProgressview::Progress(): BEGIN"); - _DBG_FILE("CNSmlAgendaProgressview::Progress(): END"); + FLOG(_L("CNSmlAgendaProgressview::Progress(): BEGIN")); + FLOG(_L("CNSmlAgendaProgressview::Progress(): END")); } // ----------------------------------------------------------------------------- @@ -63,12 +64,12 @@ // ----------------------------------------------------------------------------- void CNSmlAgendaProgressview::Completed( TInt aError ) { - _DBG_FILE("CNSmlAgendaProgressview::Completed(): BEGIN"); + FLOG(_L("CNSmlAgendaProgressview::Completed(): BEGIN")); iCompletedStatus = aError; CActiveScheduler::Stop(); - _DBG_FILE("CNSmlAgendaProgressview::Completed(): END"); + FLOG(_L("CNSmlAgendaProgressview::Completed(): END")); } // ----------------------------------------------------------------------------- @@ -86,8 +87,8 @@ // ----------------------------------------------------------------------------- TBool CNSmlAgendaProgressview::NotifyProgress() { - _DBG_FILE("CNSmlAgendaProgressview::NotifyProgress(): BEGIN"); - _DBG_FILE("CNSmlAgendaProgressview::NotifyProgress(): END"); + FLOG(_L("CNSmlAgendaProgressview::NotifyProgress(): BEGIN")); + FLOG(_L("CNSmlAgendaProgressview::NotifyProgress(): END")); return EFalse; } @@ -98,9 +99,9 @@ CNSmlAgendaProgressview::CNSmlAgendaProgressview() : iCompletedStatus( KErrNotReady ) { - _DBG_FILE("CNSmlAgendaProgressview::CNSmlAgendaProgressview(): BEGIN"); + FLOG(_L("CNSmlAgendaProgressview::CNSmlAgendaProgressview(): BEGIN")); // Nothing to do - _DBG_FILE("CNSmlAgendaProgressview::CNSmlAgendaProgressview(): END"); + FLOG(_L("CNSmlAgendaProgressview::CNSmlAgendaProgressview(): END")); } // ----------------------------------------------------------------------------- @@ -109,9 +110,9 @@ // ----------------------------------------------------------------------------- void CNSmlAgendaProgressview::ConstructL() { - _DBG_FILE("CNSmlAgendaProgressview::ConstructL(): BEGIN"); + FLOG(_L("CNSmlAgendaProgressview::ConstructL(): BEGIN")); // Nothing to do - _DBG_FILE("CNSmlAgendaProgressview::ConstructL(): END"); + FLOG(_L("CNSmlAgendaProgressview::ConstructL(): END")); } // End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/contacts/src/101F6DD6.rss --- a/omads/omadsextensions/adapters/contacts/src/101F6DD6.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/contacts/src/101F6DD6.rss Thu Dec 17 08:39:39 2009 +0200 @@ -16,7 +16,7 @@ */ -#include<101F6DD6.loc> +#include<101f6dd6.loc> #include #include diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_1_2.rss --- a/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_1_2.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_1_2.rss Thu Dec 17 08:39:39 2009 +0200 @@ -562,6 +562,18 @@ SML_DATA_PROPERTY { version=1; + display_name="My Card"; + name="X-SELF"; + data_type=""; + enum_values={}; + flags= 0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; display_name="SIP protocol"; name="X-SIP"; data_type=""; diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_2.rss --- a/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_2.rss Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStoreFormat_1_2.rss Thu Dec 17 08:39:39 2009 +0200 @@ -419,7 +419,20 @@ max_occur=0; params={}; }, - SML_DATA_PROPERTY + + SML_DATA_PROPERTY + { + version=1; + display_name="My Card"; + name="X-SELF"; + data_type=""; + enum_values={}; + flags= 0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY { version=1; display_name="SIP protocol"; diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/bld/bld.inf --- a/omads/omadsextensions/dsutils/emailxmlutils/bld/bld.inf Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -/* -* Copyright (c) 2004 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: EMail XML Utils build file. -* -*/ - - -PRJ_MMPFILES -./nsmlxmlparser.mmp - - diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/bld/def/bwinscwxmlparseru.def --- a/omads/omadsextensions/dsutils/emailxmlutils/bld/def/bwinscwxmlparseru.def Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -EXPORTS - ??0CNSmlXmlParser@@QAE@XZ @ 1 NONAME ; CNSmlXmlParser::CNSmlXmlParser(void) - ??0TNSmlFolderAttributeData@@QAE@XZ @ 2 NONAME ; TNSmlFolderAttributeData::TNSmlFolderAttributeData(void) - ??1CNSmlEmailFileParser@@UAE@XZ @ 3 NONAME ; CNSmlEmailFileParser::~CNSmlEmailFileParser(void) - ??1CNSmlEmailParser@@UAE@XZ @ 4 NONAME ; CNSmlEmailParser::~CNSmlEmailParser(void) - ??1CNSmlExtData@@UAE@XZ @ 5 NONAME ; CNSmlExtData::~CNSmlExtData(void) - ??1CNSmlFolderParser@@UAE@XZ @ 6 NONAME ; CNSmlFolderParser::~CNSmlFolderParser(void) - ??1CNSmlTruncatedData@@UAE@XZ @ 7 NONAME ; CNSmlTruncatedData::~CNSmlTruncatedData(void) - ??1CNSmlXmlParser@@UAE@XZ @ 8 NONAME ; CNSmlXmlParser::~CNSmlXmlParser(void) - ?AddAttachmentL@CNSmlTruncatedData@@QAEXPAVHBufC8@@H0@Z @ 9 NONAME ; void CNSmlTruncatedData::AddAttachmentL(class HBufC8 *, int, class HBufC8 *) - ?AddBodyL@CNSmlTruncatedData@@QAEXHPAVHBufC8@@@Z @ 10 NONAME ; void CNSmlTruncatedData::AddBodyL(int, class HBufC8 *) - ?AddExtL@CNSmlEmailParser@@QAEXPAVCNSmlExtData@@@Z @ 11 NONAME ; void CNSmlEmailParser::AddExtL(class CNSmlExtData *) - ?AddExtL@CNSmlFolderParser@@QAEXPAVCNSmlExtData@@@Z @ 12 NONAME ; void CNSmlFolderParser::AddExtL(class CNSmlExtData *) - ?AddXValL@CNSmlExtData@@QAEXPAVHBufC8@@@Z @ 13 NONAME ; void CNSmlExtData::AddXValL(class HBufC8 *) - ?AttributeCount@TNSmlFolderAttributeData@@QBEHXZ @ 14 NONAME ; int TNSmlFolderAttributeData::AttributeCount(void) const - ?ConvertIntoEntitiesL@CNSmlExtData@@QAEXPBVCNSmlXmlParser@@@Z @ 15 NONAME ; void CNSmlExtData::ConvertIntoEntitiesL(class CNSmlXmlParser const *) - ?ConvertIntoEntitiesL@CNSmlTruncatedData@@QAEXPBVCNSmlXmlParser@@@Z @ 16 NONAME ; void CNSmlTruncatedData::ConvertIntoEntitiesL(class CNSmlXmlParser const *) - ?CountXmlSize@CNSmlExtData@@QBEHPBVCNSmlXmlParser@@@Z @ 17 NONAME ; int CNSmlExtData::CountXmlSize(class CNSmlXmlParser const *) const - ?CountXmlSize@TNSmlFolderAttributeData@@QBEHPBVCNSmlXmlParser@@@Z @ 18 NONAME ; int TNSmlFolderAttributeData::CountXmlSize(class CNSmlXmlParser const *) const - ?CountXmlSizeL@CNSmlEmailFileParser@@UAEHXZ @ 19 NONAME ; int CNSmlEmailFileParser::CountXmlSizeL(void) - ?CountXmlSizeL@CNSmlEmailParser@@UAEHXZ @ 20 NONAME ; int CNSmlEmailParser::CountXmlSizeL(void) - ?CountXmlSizeL@CNSmlFolderParser@@UAEHXZ @ 21 NONAME ; int CNSmlFolderParser::CountXmlSizeL(void) - ?CountXmlSizeL@CNSmlTruncatedData@@QBEHPBVCNSmlXmlParser@@@Z @ 22 NONAME ; int CNSmlTruncatedData::CountXmlSizeL(class CNSmlXmlParser const *) const - ?GenerateXml@CNSmlEmailFileParser@@UAE?AW4TNSmlParserGeneratorError@@AAPAVHBufC8@@@Z @ 23 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailFileParser::GenerateXml(class HBufC8 * &) - ?GenerateXml@CNSmlEmailFileParser@@UAE?AW4TNSmlParserGeneratorError@@AAVRWriteStream@@@Z @ 24 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailFileParser::GenerateXml(class RWriteStream &) - ?GenerateXml@CNSmlEmailParser@@UAE?AW4TNSmlParserGeneratorError@@AAPAVHBufC8@@@Z @ 25 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailParser::GenerateXml(class HBufC8 * &) - ?GenerateXml@CNSmlFolderParser@@UAE?AW4TNSmlParserGeneratorError@@AAPAVHBufC8@@@Z @ 26 NONAME ; enum TNSmlParserGeneratorError CNSmlFolderParser::GenerateXml(class HBufC8 * &) - ?GenerateXml@TNSmlFolderAttributeData@@QBEXAAVTPtr8@@PBVCNSmlXmlParser@@@Z @ 27 NONAME ; void TNSmlFolderAttributeData::GenerateXml(class TPtr8 &, class CNSmlXmlParser const *) const - ?GenerateXmlL@CNSmlExtData@@QBEXAAVTPtr8@@PBVCNSmlXmlParser@@@Z @ 28 NONAME ; void CNSmlExtData::GenerateXmlL(class TPtr8 &, class CNSmlXmlParser const *) const - ?GenerateXmlL@CNSmlTruncatedData@@QBEXAAVTPtr8@@PBVCNSmlXmlParser@@@Z @ 29 NONAME ; void CNSmlTruncatedData::GenerateXmlL(class TPtr8 &, class CNSmlXmlParser const *) const - ?NewL@CNSmlEmailFileParser@@SAPAV1@XZ @ 30 NONAME ; class CNSmlEmailFileParser * CNSmlEmailFileParser::NewL(void) - ?NewL@CNSmlEmailParser@@SAPAV1@XZ @ 31 NONAME ; class CNSmlEmailParser * CNSmlEmailParser::NewL(void) - ?NewL@CNSmlExtData@@SAPAV1@XZ @ 32 NONAME ; class CNSmlExtData * CNSmlExtData::NewL(void) - ?NewL@CNSmlFolderParser@@SAPAV1@XZ @ 33 NONAME ; class CNSmlFolderParser * CNSmlFolderParser::NewL(void) - ?NewL@CNSmlTruncatedData@@SAPAV1@XZ @ 34 NONAME ; class CNSmlTruncatedData * CNSmlTruncatedData::NewL(void) - ?NewLC@CNSmlEmailFileParser@@SAPAV1@XZ @ 35 NONAME ; class CNSmlEmailFileParser * CNSmlEmailFileParser::NewLC(void) - ?NewLC@CNSmlEmailParser@@SAPAV1@XZ @ 36 NONAME ; class CNSmlEmailParser * CNSmlEmailParser::NewLC(void) - ?NewLC@CNSmlExtData@@SAPAV1@XZ @ 37 NONAME ; class CNSmlExtData * CNSmlExtData::NewLC(void) - ?NewLC@CNSmlFolderParser@@SAPAV1@XZ @ 38 NONAME ; class CNSmlFolderParser * CNSmlFolderParser::NewLC(void) - ?NewLC@CNSmlTruncatedData@@SAPAV1@XZ @ 39 NONAME ; class CNSmlTruncatedData * CNSmlTruncatedData::NewLC(void) - ?ParseXml@CNSmlEmailFileParser@@UAE?AW4TNSmlParserGeneratorError@@AAVRReadStream@@@Z @ 40 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailFileParser::ParseXml(class RReadStream &) - ?ParseXml@CNSmlEmailFileParser@@UAE?AW4TNSmlParserGeneratorError@@PAVHBufC8@@@Z @ 41 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailFileParser::ParseXml(class HBufC8 *) - ?ParseXml@CNSmlEmailParser@@UAE?AW4TNSmlParserGeneratorError@@PAVHBufC8@@@Z @ 42 NONAME ; enum TNSmlParserGeneratorError CNSmlEmailParser::ParseXml(class HBufC8 *) - ?ParseXml@CNSmlFolderParser@@UAE?AW4TNSmlParserGeneratorError@@PAVHBufC8@@@Z @ 43 NONAME ; enum TNSmlParserGeneratorError CNSmlFolderParser::ParseXml(class HBufC8 *) - diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/bld/def/eabixmlparseru.def --- a/omads/omadsextensions/dsutils/emailxmlutils/bld/def/eabixmlparseru.def Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -EXPORTS - _ZN12CNSmlExtData20ConvertIntoEntitiesLEPK14CNSmlXmlParser @ 1 NONAME - _ZN12CNSmlExtData4NewLEv @ 2 NONAME - _ZN12CNSmlExtData5NewLCEv @ 3 NONAME - _ZN12CNSmlExtData8AddXValLEP6HBufC8 @ 4 NONAME - _ZN12CNSmlExtDataD0Ev @ 5 NONAME - _ZN12CNSmlExtDataD1Ev @ 6 NONAME - _ZN12CNSmlExtDataD2Ev @ 7 NONAME - _ZN14CNSmlXmlParserC2Ev @ 8 NONAME - _ZN14CNSmlXmlParserD0Ev @ 9 NONAME - _ZN14CNSmlXmlParserD1Ev @ 10 NONAME - _ZN14CNSmlXmlParserD2Ev @ 11 NONAME - _ZN16CNSmlEmailParser11GenerateXmlERP6HBufC8 @ 12 NONAME - _ZN16CNSmlEmailParser13CountXmlSizeLEv @ 13 NONAME - _ZN16CNSmlEmailParser4NewLEv @ 14 NONAME - _ZN16CNSmlEmailParser5NewLCEv @ 15 NONAME - _ZN16CNSmlEmailParser7AddExtLEP12CNSmlExtData @ 16 NONAME - _ZN16CNSmlEmailParser8ParseXmlEP6HBufC8 @ 17 NONAME - _ZN16CNSmlEmailParserD0Ev @ 18 NONAME - _ZN16CNSmlEmailParserD1Ev @ 19 NONAME - _ZN16CNSmlEmailParserD2Ev @ 20 NONAME - _ZN17CNSmlFolderParser11GenerateXmlERP6HBufC8 @ 21 NONAME - _ZN17CNSmlFolderParser13CountXmlSizeLEv @ 22 NONAME - _ZN17CNSmlFolderParser4NewLEv @ 23 NONAME - _ZN17CNSmlFolderParser5NewLCEv @ 24 NONAME - _ZN17CNSmlFolderParser7AddExtLEP12CNSmlExtData @ 25 NONAME - _ZN17CNSmlFolderParser8ParseXmlEP6HBufC8 @ 26 NONAME - _ZN17CNSmlFolderParserD0Ev @ 27 NONAME - _ZN17CNSmlFolderParserD1Ev @ 28 NONAME - _ZN17CNSmlFolderParserD2Ev @ 29 NONAME - _ZN18CNSmlTruncatedData14AddAttachmentLEP6HBufC8iS1_ @ 30 NONAME - _ZN18CNSmlTruncatedData20ConvertIntoEntitiesLEPK14CNSmlXmlParser @ 31 NONAME - _ZN18CNSmlTruncatedData4NewLEv @ 32 NONAME - _ZN18CNSmlTruncatedData5NewLCEv @ 33 NONAME - _ZN18CNSmlTruncatedData8AddBodyLEiP6HBufC8 @ 34 NONAME - _ZN18CNSmlTruncatedDataD0Ev @ 35 NONAME - _ZN18CNSmlTruncatedDataD1Ev @ 36 NONAME - _ZN18CNSmlTruncatedDataD2Ev @ 37 NONAME - _ZN20CNSmlEmailFileParser11GenerateXmlER12RWriteStream @ 38 NONAME - _ZN20CNSmlEmailFileParser11GenerateXmlERP6HBufC8 @ 39 NONAME - _ZN20CNSmlEmailFileParser13CountXmlSizeLEv @ 40 NONAME - _ZN20CNSmlEmailFileParser4NewLEv @ 41 NONAME - _ZN20CNSmlEmailFileParser5NewLCEv @ 42 NONAME - _ZN20CNSmlEmailFileParser8ParseXmlEP6HBufC8 @ 43 NONAME - _ZN20CNSmlEmailFileParser8ParseXmlER11RReadStream @ 44 NONAME - _ZN20CNSmlEmailFileParserD0Ev @ 45 NONAME - _ZN20CNSmlEmailFileParserD1Ev @ 46 NONAME - _ZN20CNSmlEmailFileParserD2Ev @ 47 NONAME - _ZN24TNSmlFolderAttributeDataC1Ev @ 48 NONAME - _ZN24TNSmlFolderAttributeDataC2Ev @ 49 NONAME - _ZNK12CNSmlExtData12CountXmlSizeEPK14CNSmlXmlParser @ 50 NONAME - _ZNK12CNSmlExtData12GenerateXmlLER5TPtr8PK14CNSmlXmlParser @ 51 NONAME - _ZNK18CNSmlTruncatedData12GenerateXmlLER5TPtr8PK14CNSmlXmlParser @ 52 NONAME - _ZNK18CNSmlTruncatedData13CountXmlSizeLEPK14CNSmlXmlParser @ 53 NONAME - _ZNK24TNSmlFolderAttributeData11GenerateXmlER5TPtr8PK14CNSmlXmlParser @ 54 NONAME - _ZNK24TNSmlFolderAttributeData12CountXmlSizeEPK14CNSmlXmlParser @ 55 NONAME - _ZNK24TNSmlFolderAttributeData14AttributeCountEv @ 56 NONAME - _ZTI12CNSmlExtData @ 57 NONAME ; ## - _ZTI14CNSmlXmlParser @ 58 NONAME ; ## - _ZTI16CNSmlEmailParser @ 59 NONAME ; ## - _ZTI17CNSmlFolderParser @ 60 NONAME ; ## - _ZTI18CNSmlTruncatedData @ 61 NONAME ; ## - _ZTI20CNSmlEmailFileParser @ 62 NONAME ; ## - _ZTV12CNSmlExtData @ 63 NONAME ; ## - _ZTV14CNSmlXmlParser @ 64 NONAME ; ## - _ZTV16CNSmlEmailParser @ 65 NONAME ; ## - _ZTV17CNSmlFolderParser @ 66 NONAME ; ## - _ZTV18CNSmlTruncatedData @ 67 NONAME ; ## - _ZTV20CNSmlEmailFileParser @ 68 NONAME ; ## - diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/bld/nsmlxmlparser.mmp --- a/omads/omadsextensions/dsutils/emailxmlutils/bld/nsmlxmlparser.mmp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* -* Copyright (c) 2004 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: EMail XML Parser mmp file -* -*/ - - -#include "defaultcaps.hrh" -#include - -CAPABILITY CAP_GENERAL_DLL -VENDORID VID_DEFAULT -TARGET nsmlxmlparser.dll -TARGETTYPE dll -UID 0x1000008d 0x101F6DE4 - -#if defined(ARMCC) -DEFFILE ./def/eabixmlparser -#elif defined(WINSCW) -DEFFILE ./def/bwinscwxmlparser -#elif defined(WINS) -DEFFILE ./def/bwinsxmlparser -#else -DEFFILE ./def/bmarmxmlparser -#endif - -APP_LAYER_SYSTEMINCLUDE -SYSTEMINCLUDE ../../../adapters/email/mtm/inc -USERINCLUDE ../inc - -SOURCEPATH ../src -SOURCE nsmlxmlparser.cpp -SOURCE NSmlExtData.cpp -SOURCE NSmlFolderAttributeData.cpp -SOURCE NSmlTruncatedData.cpp -SOURCE NSmlEmailParser.cpp -SOURCE NSmlEmailFileParser.cpp -SOURCE NSmlFolderParser.cpp - -LIBRARY euser.lib estor.lib efsrv.lib - diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/inc/nsmlxmlparser.h --- a/omads/omadsextensions/dsutils/emailxmlutils/inc/nsmlxmlparser.h Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,659 +0,0 @@ -/* -* Copyright (c) 2004 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: Email XML parser -* -*/ - - -// 1.2 Changes: nsmlxmlparser module added - - -#ifndef __NSMLXMLPARSER_H__ -#define __NSMLXMLPARSER_H__ - -// ------------------------------------------------------------------------------------------------ -// Includes -// ------------------------------------------------------------------------------------------------ -#include -#include -#include "nsmlEmailmtmdefs.h" - - -// ------------------------------------------------------------------------------------------------ -// Defines for binary size optimization -// ------------------------------------------------------------------------------------------------ -#define __NO_XML_COMMENTS_ -//#define __NO_EMPTY_ELEMENTS_ - - -// ------------------------------------------------------------------------------------------------ -// Class forward declarations -// ------------------------------------------------------------------------------------------------ -class CNSmlXmlParser; -class CNSmlExtData; - - -// ------------------------------------------------------------------------------------------------ -// Typedefs -// ------------------------------------------------------------------------------------------------ -// the array used for xval-values -typedef CArrayPtrFlat CNSmlXValArray; -// the array used for extension data -typedef CArrayPtrFlat CNSmlExtDataArray; -// the array used for truncate info attachments data -typedef RPointerArray RNSmlAttachArray; -// the array used for truncate info body data -typedef RPointerArray RNSmlBodyArray; - - -// ------------------------------------------------------------------------------------------------ -// constants -// ------------------------------------------------------------------------------------------------ - -// the maximum length of an integer in characters -const TInt KIntegerMaxLength = 12; - -// the length of a datetime in characters -const TInt KDateTimeLength = 16; - -// the length of element start (<) and end (>) -const TInt KElementStartEndWidth = 2; - -// constants used with files -const TInt KReadDataLength = 512; -const TUint KFileReadAccess = EFileRead|EFileShareAny; -const TUint KFileWriteAccess = EFileWrite|EFileShareExclusive; -const TInt KMaxEmailItemFileNameLength = 256; -_LIT(KEmailItemFile, "c:\\system\\temp\\emailitem.txt"); -_LIT(KEmailItemPath, "c:\\system\\temp\\"); - -const TInt KNSmlEmailItemDrive = EDriveC; - -// Whitespace characters -const TText KWhitespaceEmpty = ' '; -const TText KWhitespaceLineFeed = '\r'; -const TText KWhitespaceNewLine = '\n'; -const TText KWhitespaceTabular = '\t'; -const TText KWhitespaceLineFeedNewLine = '\r\n'; - -const TText KCharacterSlash = '/'; - -// CData -_LIT8(KCDataStart, ""); -_LIT8(KCDataInnerEnd, "]]]]>>"); -#endif - -const TText KElementStart = '<'; -const TText KElementEnd = '>'; - -// Xml entities -_LIT8(KEntityLT, "<"); -_LIT8(KEntityGT, ">"); -_LIT8(KEntityAMP, "&"); -_LIT8(KEntityAPOS, "'"); -_LIT8(KEntityQUOT, """); - -// special characters -_LIT8(KLessThan, "<"); -_LIT8(KGreaterThan, ">"); -_LIT8(KAmpersand, "&"); -_LIT8(KApostrophe, "\'"); -_LIT8(KQuotation, "\""); - -// boolean string representations -_LIT8(KStringTrue, "true"); -_LIT8(KStringFalse, "false"); - -// empty string -_LIT8(KStringEmpty, ""); - -// email spesific elements -_LIT8(KEmailElement, "Email"); -_LIT8(KEmailReadElement, "read"); -_LIT8(KEmailForwardedElement, "forwarded"); -_LIT8(KEmailRepliedElement, "replied"); -_LIT8(KEmailReceivedElement, "received"); -_LIT8(KEmailCreatedElement, "created"); -_LIT8(KEmailModifiedElement, "modified"); -_LIT8(KEmailDeletedElement, "deleted"); -_LIT8(KEmailFlaggedElement, "flagged"); -_LIT8(KEmailItemElement, "emailitem"); - -// truncated info spesific elements -_LIT8(KTruncatedElement, "truncated"); -_LIT8(KTruncatedBodyElement, "body"); -_LIT8(KTruncatedAttachElement, "attach"); -_LIT8(KTruncatedSizeElement, "size"); -_LIT8(KTruncatedTypeElement, "type"); -_LIT8(KTruncatedNameElement, "name"); - -// extension spesific elements -_LIT8(KExtElement, "Ext"); -_LIT8(KExtXNamElement, "XNam"); -_LIT8(KExtXValElement, "XVal"); - -// folder spesific elements -_LIT8(KFolderElement, "Folder"); -_LIT8(KFolderNameElement, "name"); -_LIT8(KFolderCreatedElement, "created"); -_LIT8(KFolderModifiedElement, "modified"); -_LIT8(KFolderAccessedElement, "accessed"); -_LIT8(KFolderAttributesElement, "attributes"); -_LIT8(KFolderRoleElement, "role"); - -// folder attributes -_LIT8(KAttributeHiddenElement, "h"); -_LIT8(KAttributeSystemElement, "s"); -_LIT8(KAttributeArchivedElement, "a"); -_LIT8(KAttributeDeleteElement, "d"); -_LIT8(KAttributeWritableElement, "w"); -_LIT8(KAttributeReadableElement, "r"); -_LIT8(KAttributeExecutableElement, "x"); - - -// The error values returned from parser and generator functions -enum TNSmlParserGeneratorError - { - EErrorNone, // no error - EOutOfMemory, // out of memory - EMandatoryFieldNotFound,// XNam inside Ext missing - EInvalidBooleanValue, // Invalid value inside boolean elements - EInvalidIntegerValue, // Invalid value inside integer elements - EInvalidDatetimeValue, // Invalid value inside datetime elements - EInvalidCDataStructure, // CDATA error - EInvalidXmlError, // Xml includes invalid data, i.e. xml generally against dtd - EInvalidFilename, // file was not found or the filename was otherwise erroneous - EUnknownError // Unknown error - }; - - -// enumeration for boolean values -enum TNSmlBoolean - { - EBooleanMissing = 0, // not included in the xml - EBooleanTrue, - EBooleanFalse - }; - - -// extension data (found in both email and folder) -class CNSmlExtData : public CBase - { -public: - IMPORT_C static CNSmlExtData* NewL(); - IMPORT_C static CNSmlExtData* NewLC(); - IMPORT_C virtual ~CNSmlExtData(); - - IMPORT_C void AddXValL( HBufC8* aXVal ); - - IMPORT_C void GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; - IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; - IMPORT_C void ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ); - -private: - CNSmlExtData(); - void ConstructL(); - -public: - HBufC8* iXNam; - CNSmlXValArray* iXVals; - }; - - -// folder attributes -struct TNSmlFolderAttributeData - { - IMPORT_C TNSmlFolderAttributeData(); - - /* - * Returns the count of attributes that are not EBooleanMissing. - */ - IMPORT_C TInt AttributeCount() const; - - IMPORT_C void GenerateXml( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; - IMPORT_C TInt CountXmlSize( const CNSmlXmlParser* aParser ) const; - - TNSmlBoolean iHidden; - TNSmlBoolean iSystem; - TNSmlBoolean iArchived; - TNSmlBoolean iDelete; - TNSmlBoolean iWritable; - TNSmlBoolean iReadable; - TNSmlBoolean iExecutable; - }; - - -// truncate info data -class CNSmlTruncatedData : public CBase - { -public: - IMPORT_C static CNSmlTruncatedData* NewL(); - IMPORT_C static CNSmlTruncatedData* NewLC(); - IMPORT_C virtual ~CNSmlTruncatedData(); - - IMPORT_C void AddAttachmentL(HBufC8* aName, TInt aSize, HBufC8* aType); - IMPORT_C void AddBodyL(TInt aSize, HBufC8* aType); - - IMPORT_C void GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const; - IMPORT_C TInt CountXmlSizeL( const CNSmlXmlParser* aParser ) const; - IMPORT_C void ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ); - -private: - CNSmlTruncatedData(); - void ConstructL(); - -public: - RNSmlBodyArray iBodys; - RNSmlAttachArray iAttachments; - }; - - -// Base class for actual parsergenerators. -// Implements basic utilities for parsing and generating the xml. -class CNSmlXmlParser : public CBase - { -public: - /* - * The constructor. - */ - IMPORT_C CNSmlXmlParser(); - - /* - * The destructor. - */ - IMPORT_C virtual ~CNSmlXmlParser(); - - /* - * Parses through the given xml and places the data it contains to - * member variables. Removes all the comments from the original string. - * @param aXml The xml to be parsed. - * @return - */ - virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ) =0; - - /* - * Generates xml using the data in member variables of the child class. - * aXml contains the generated xml when method returns successfully. - * Caller should not instantiate - * the buffer, since this method counts the size of the xml and - * instantiates the buffer using the size as its maximum size. - * Caller gets the control of the buffer when method returns. - * @param aXml A pointer to a buffer, which is instantiated in this - * method and contains the xml when method returns succesfully. - * @return - */ - virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ) =0; - - /* - * Counts the size of the generated xml, when the xml would be generated - * using the data in child class' member variables. - */ - virtual TInt CountXmlSizeL() =0; - - /* utility functions */ - - void PreProcessL( HBufC8* aXml ) const; - - TPtrC8 BooleanToString( const TNSmlBoolean aValue ) const; - TBuf8 DateTimeToStringL( const TTime& aValue ) const; - TBuf8 IntegerToString( const TInt aValue ) const; - - TNSmlBoolean StringToBooleanL( const TPtrC8& aValue ) const; - TInt StringToIntegerL( const TPtrC8& aValue ) const; - // Note: Ignores UTC-times (Z-ending) and treats them as local time! - TTime StringToTTimeL( TPtrC8& aValue ) const; - - void AppendElement( TPtr8& aPtr, const TDesC8& aElementName, const TDesC8& aValue ) const; - void AppendElement( TPtr8& aPtr, const TDesC8& aElementName ) const; - void AppendEndElement( TPtr8& aPtr, const TDesC8& aElementName ) const; - - TInt SizeOfElements( const TDesC8& aElementName ) const; - TInt SizeOfBoolean( const TNSmlBoolean aValue, const TDesC8& aElementName ) const; - TInt SizeOfDatetime( const TDesC8& aElementName ) const; - TInt SizeOfInteger( const TDesC8& aElementName ) const; - TInt SizeOfString( const HBufC8* aValue, const TDesC8& aElementName ) const; - - TInt EntitiesToCharactersL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; - TInt CharactersToEntitiesL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const; - - TBool IsWhitespace( const TDesC8& aText ) const; - void LeaveIfNotWhiteSpaceL( const TDesC8& aText ) const; - - TNSmlParserGeneratorError CheckError( const TInt error ) const; - -protected: - // parsing methods - void ParseL( TPtrC8& aXml ); - void AddToCompleteL( const TPtrC8 aStr ); - void ResetBufferL( HBufC8*& aBuf ) const; - void AddToBufferL( const TText c, HBufC8*& aBuf ) const; - - virtual void NextElementL( TPtrC8 aElement ) =0; - virtual void NextDataL( TPtrC8 aData ) =0; - -private: - TInt ReplaceL( HBufC8*& aText, const TDesC8& aTarget, const TDesC8& aItem, TInt aStartPos, TInt aEndPos ) const; - void CheckDatetimeErrorL( const TInt error ) const; - -protected: - HBufC8* iBuffer; - HBufC8* iCompleteBuffer; - }; - - - -// Email parser. Implements the parsing and generating of Email xml. -class CNSmlEmailParser : public CNSmlXmlParser - { -public: - IMPORT_C static CNSmlEmailParser* NewL(); - IMPORT_C static CNSmlEmailParser* NewLC(); - IMPORT_C virtual ~CNSmlEmailParser(); - - IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ); - IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ); - IMPORT_C virtual TInt CountXmlSizeL(); - - IMPORT_C void AddExtL( CNSmlExtData* aExt ); - -protected: - virtual void NextElementL( TPtrC8 aElement ); - virtual void NextDataL( TPtrC8 aData ); - - virtual void HandleNextEmailItemDataL( TPtrC8 aData ); - virtual void HandleNextEmailItemStartL() {}; // nothing to do - virtual void HandleNextEmailItemEndL() {}; // nothing to do - - void ConvertIntoEntitiesL(); - - CNSmlEmailParser(); - void ConstructL(); - -protected: - - // the email elements (states) in the order they appear in DTD - enum TNSmlCurrentEmailElement - { - ENone = 0, - EEmail, - ERead, - EForwarded, - EReplied, - EReceived, - ECreated, - EModified, - EDeleted, - EFlagged, - EEmailItem, - ETrunc, - ETruncBody, - ETruncBodySize, - ETruncBodyType, - ETruncAttach, - ETruncAttachName, - ETruncAttachSize, - ETruncAttachType, - EExt, - EExtXNam, - EExtXVal - }; - - // struct used in email parsing to know which members are already set - struct TNSmlSetEmailValues - { - TNSmlSetEmailValues(); - void Reset(); - - TBool iEmail; - TBool iRead; - TBool iForwarded; - TBool iReplied; - TBool iDeleted; - TBool iFlagged; - TBool iReceived; - TBool iCreated; - TBool iModified; - TBool iEmailItem; - TBool iTrunc; - TBool iTruncBodySize; - TBool iTruncBodyType; - TBool iTruncAttachSize; - TBool iTruncAttachType; - TBool iTruncAttachName; - TBool iXNam; - }; - -private: - void StartElementStateChangeL( TNSmlCurrentEmailElement aCurrentState, TNSmlCurrentEmailElement aNextState, TBool aIsSet = EFalse ); - void EndElementStateChangeL( TNSmlCurrentEmailElement aCurrentState, TNSmlCurrentEmailElement aNextState ); - - void GenerateEmailXmlL( HBufC8*& aXml ); - -public: - - /* - * The values of the data below is treated as follows: - * When constructing this data from an xml, boolean values - * are EBooleanTrue, when true, EBooleanFalse - * when false OR , and EBooleanMissing - * when the field is not present in the xml. Datetime values - * are equal to Time::NullTTime when the field is missing (they should - * never be empty). Text values (HBufC8*) are NULL when the field is - * missing, an empty string when OR and the - * actual value between elements if there is data between those - * elements. iExt is never NULL, but when iExt->Count() - * equals to zero, there are no extensions present in the xml. - * - * These same rules are used when generating xml from - * this data object. - */ - - TNSmlBoolean iRead; - TNSmlBoolean iForwarded; - TNSmlBoolean iReplied; - TTime iReceived; - TTime iCreated; - TTime iModified; - HBufC8* iEmailItem; - TNSmlBoolean iDeleted; - TNSmlBoolean iFlagged; - CNSmlTruncatedData* iTruncated; - CNSmlExtDataArray* iExt; - -protected: - TNSmlSetEmailValues iSetValues; - TNSmlCurrentEmailElement iCurrentState; - TNSmlCurrentEmailElement iLastState; - -private: - - TInt iTruncSize; - HBufC8* iTruncType; - HBufC8* iTruncName; - CNSmlExtData* iExtData; - }; - - - -// ------------------------------------------------------------------------------------------------ -// Parses and generates the xml using files/streams. If emailitem is present, it is -// stored in a file. -// ------------------------------------------------------------------------------------------------ -class CNSmlEmailFileParser : public CNSmlEmailParser - { -public: - IMPORT_C static CNSmlEmailFileParser* NewL(); - IMPORT_C static CNSmlEmailFileParser* NewLC(); - IMPORT_C virtual ~CNSmlEmailFileParser(); - - IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ); - IMPORT_C virtual TNSmlParserGeneratorError ParseXml( RReadStream& aRs ); - IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ); - IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( RWriteStream& aWs ); - IMPORT_C virtual TInt CountXmlSizeL(); - -protected: - virtual void HandleNextEmailItemDataL( TPtrC8 aData ); - virtual void HandleNextEmailItemStartL(); - virtual void HandleNextEmailItemEndL(); - -private: - void ParseFromStreamL( RReadStream& rs ); - void ParsePieceL( TPtrC8& aXml, TBool aLastPiece = EFalse ); - TUint RemoveIncompleteL( HBufC8* aPiece, RReadStream& aStream ); - TUint CheckPiece( const TPtrC8 aEnd ) const; - void PreProcessPieceL( HBufC8* aXml ); - - void GenerateEmailXmlL( RWriteStream& aWs ); - - void ResetParserL(); - void ResetPreProcessor(); - - HBufC* Buf8ToBuf16( const HBufC8* buf8 ) const; - - CNSmlEmailFileParser(); - void ConstructL(); - -public: - - TBool iUseEmailItem; // whether or not emailitem should be used in generation - -private: - - // xml parsing state - TBool iReadingElementName; - TBool iReadingCData; -#ifndef __NO_XML_COMMENTS_ - TBool iReadingComment; -#endif - TBool iReadingEmailItemData; - - // pre-processing state - TInt iCdataStartPos; - TInt iCdataEndPos; - - // file handling - RFs iRfs; - RFileWriteStream iWriteStream; - - HBufC* iEmailItemFile; - TBool iFirstPiece; - TBool iCdataFoundFromFirstPiece; - }; - - - - -// Folder parser. Implements parsing and generating of Folder xml. -class CNSmlFolderParser : public CNSmlXmlParser - { -public: - IMPORT_C static CNSmlFolderParser* NewL(); - IMPORT_C static CNSmlFolderParser* NewLC(); - IMPORT_C virtual ~CNSmlFolderParser(); - - IMPORT_C virtual TNSmlParserGeneratorError ParseXml( HBufC8* aXml ); - IMPORT_C virtual TNSmlParserGeneratorError GenerateXml( HBufC8*& aXml ); - IMPORT_C virtual TInt CountXmlSizeL() ; - - IMPORT_C void AddExtL( CNSmlExtData* aExt ); - -protected: - virtual void NextElementL( TPtrC8 aElement ); - virtual void NextDataL( TPtrC8 aData ); - -protected: - - // the folder elements (states) in the order they appear in DTD - enum TNSmlCurrentFolderElement - { - EFolderNone = 0, - EFolder, - EFolderName, - EFolderCreated, - EFolderModified, - EFolderAccessed, - EAttributes, - EAttributesH, - EAttributesS, - EAttributesA, - EAttributesD, - EAttributesW, - EAttributesR, - EAttributesX, - EFolderRole, - EFolderExt, - EFolderExtXNam, - EFolderExtXVal - }; - - // struct used in folder parsing (which members are already set) - struct TNSmlSetFolderValues - { - TNSmlSetFolderValues(); - void Reset(); - - TBool iFolder; - TBool iName; - TBool iCreated; - TBool iModified; - TBool iAccessed; - TBool iAttributes; - TBool iAttributesH; - TBool iAttributesS; - TBool iAttributesA; - TBool iAttributesD; - TBool iAttributesW; - TBool iAttributesR; - TBool iAttributesX; - TBool iRole; - TBool iXNam; - }; - -private: - void StartElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState, TBool aIsSet = EFalse ); - void EndElementStateChangeL( TNSmlCurrentFolderElement aCurrentState, TNSmlCurrentFolderElement aNextState ); - - void GenerateFolderXmlL( HBufC8*& aXml ); - void ConvertIntoEntitiesL(); - - CNSmlFolderParser(); - void ConstructL(); - -public: - HBufC8* iName; - TTime iCreated; - TTime iModified; - TTime iAccessed; - TNSmlFolderAttributeData iAttributes; - HBufC8* iRole; - CNSmlExtDataArray* iExt; - -private: - TNSmlCurrentFolderElement iCurrentState; - TNSmlCurrentFolderElement iLastState; - TNSmlSetFolderValues iSetValues; - - CNSmlExtData* iExtData; - }; - - - -#endif // __NSMLXMLPARSER_H__ diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlEmailFileParser.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlEmailFileParser.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,814 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailFileParser* CNSmlEmailFileParser::NewL() - { - CNSmlEmailFileParser* self = CNSmlEmailFileParser::NewLC(); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailFileParser* CNSmlEmailFileParser::NewLC() - { - CNSmlEmailFileParser* self = new (ELeave) CNSmlEmailFileParser(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::~CNSmlEmailFileParser -// Destructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailFileParser::~CNSmlEmailFileParser() - { - // close rfs and open streams - if ( iWriteStream.Sink() ) - iWriteStream.Close(); - - iRfs.Close(); - delete iEmailItemFile; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ParseXml -// Parses the email xml, that is located in the file whose name is given -// as aXml (path and filename) -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailFileParser::ParseXml( HBufC8* aXml ) - { - if ( !aXml ) - return EInvalidFilename; - - HBufC* filename = Buf8ToBuf16( aXml ); - if ( !filename ) - { - return EOutOfMemory; - } - - // open the stream and parse - TNSmlParserGeneratorError err = EErrorNone; - RFileReadStream rs; - if ( rs.Open(iRfs, *filename, KFileReadAccess) != KErrNone ) - { - err = EInvalidFilename; - } - else - { - err = ParseXml( rs ); - rs.Close(); - } - - delete filename; - - return err; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ParseXml -// Parses the xml from the given stream, and writes the emailitem - if present - to a temp file -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailFileParser::ParseXml( RReadStream& aRs ) - { - iSetValues.Reset(); - iCurrentState = ENone; - iLastState = ENone; - - TRAPD(err, ParseFromStreamL( aRs )); - - if( err == EErrorNone && iCurrentState != ENone ) - return EInvalidXmlError; - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::GenerateXml -// Generates the xml and writes it to the file whose name is given in aXml (path -// and filename). -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailFileParser::GenerateXml( HBufC8*& aXml ) - { - if ( !aXml ) - return EInvalidFilename; - - HBufC* filename = Buf8ToBuf16( aXml ); - if ( !filename ) - { - return EOutOfMemory; - } - - // open the stream and generate - iWriteStream.Replace(iRfs, *filename, KFileWriteAccess); - TNSmlParserGeneratorError err = GenerateXml( iWriteStream ); - iWriteStream.Close(); - - delete filename; - - return err; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::GenerateXml -// Generates the xml and writes it to the given stream. -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailFileParser::GenerateXml( RWriteStream& aWs ) - { - TRAPD( err, GenerateEmailXmlL( aWs ) ); - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::GenerateEmailXmlL -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::GenerateEmailXmlL( RWriteStream& aWs ) - { - ConvertIntoEntitiesL(); - - // count the size of the xml (does not include emailitem, since it is - if present - in a file) - TInt size = CNSmlEmailParser::CountXmlSizeL(); - if ( iUseEmailItem ) size += 20; // extra for emailitem tags - - // create a buffer for using the size - HBufC8* xml = HBufC8::NewLC(size); - TPtr8 ptr = xml->Des(); - - // append data to buffer - AppendElement(ptr, KEmailElement()); - - if ( iRead ) - { - AppendElement(ptr, KEmailReadElement(), BooleanToString( iRead )); - } - - if ( iForwarded ) - { - AppendElement(ptr, KEmailForwardedElement(), BooleanToString( iForwarded )); - } - - if ( iReplied ) - { - AppendElement(ptr, KEmailRepliedElement(), BooleanToString( iReplied )); - } - - if (iReceived != Time::NullTTime()) - { - AppendElement(ptr, KEmailReceivedElement(), DateTimeToStringL(iReceived)); - } - - if (iCreated != Time::NullTTime()) - { - AppendElement(ptr, KEmailCreatedElement(), DateTimeToStringL(iCreated)); - } - - if (iModified != Time::NullTTime()) - { - AppendElement(ptr, KEmailModifiedElement(), DateTimeToStringL(iModified)); - } - - if ( iDeleted ) - { - AppendElement(ptr, KEmailDeletedElement(), BooleanToString( iDeleted )); - } - - if ( iFlagged ) - { - AppendElement(ptr, KEmailFlaggedElement(), BooleanToString( iFlagged )); - } - - // if emailitem should be used in generation, write it to the stream - if ( iUseEmailItem ) - { - // append start tag and cdata start - AppendElement(ptr, KEmailItemElement()); - ptr.Append(KCDataStart); - - // open a stream to emailitem - RFileReadStream rs; - TInt err = rs.Open( iRfs, *iEmailItemFile, KFileReadAccess ); - if ( err != KErrNone ) - User::Leave( EInvalidFilename ); - - CleanupClosePushL(rs); - - // write the buffer to the stream - aWs.WriteL(ptr); - - // write emailitem from stream - aWs.WriteL(rs); - - // close the opened read stream - CleanupStack::Pop(); // rs - - // empty the buffer (i.e. set the length to zero) - ptr.SetLength(0); - - // append emailitem end tag and cdata inner end - ptr.Append(KCDataEnd); - AppendEndElement(ptr, KEmailItemElement()); - } - - // append the rest of the data to the buffer - if ( iTruncated ) - { - iTruncated->GenerateXmlL(ptr, this); - } - - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - iExt->At(i)->GenerateXmlL(ptr, this); - } - - } - - AppendEndElement(ptr, KEmailElement()); - - // write the buffer to the stream and commit - aWs.WriteL(ptr); - aWs.CommitL(); - - CleanupStack::PopAndDestroy(); // xml - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::CountXmlSizeL -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CNSmlEmailFileParser::CountXmlSizeL() - { - // counting the size is not essential, since xml is written to a file - return KErrNotSupported; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::HandleNextEmailItemDataL -// Next emailitem data -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::HandleNextEmailItemDataL( TPtrC8 aData ) - { - // write the given piece of data into a file (stream) - iWriteStream.WriteL(aData); - } - - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::HandleNextEmailItemStartL -// Emailitem element starts -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::HandleNextEmailItemStartL() - { - // open the write stream - User::LeaveIfError( iWriteStream.Replace( iRfs, *iEmailItemFile, KFileWriteAccess ) ); - iReadingEmailItemData = ETrue; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::HandleNextEmailItemEndL -// Emailitem element ends -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::HandleNextEmailItemEndL() - { - // close the write stream - iWriteStream.Close(); - iReadingEmailItemData = EFalse; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ParseFromStreamL -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::ParseFromStreamL( RReadStream& aRs ) - { - - // reset preprocess variables and parser - ResetPreProcessor(); - ResetParserL(); - - // read and process the data piece by piece - HBufC8* piece = HBufC8::NewLC(KReadDataLength); - TPtr8 ptr = piece->Des(); - TInt dataSize = aRs.Source()->SizeL(); - - TInt pos = 0; - iFirstPiece = ETrue; - for( pos = KReadDataLength; pos <= dataSize ; pos += KReadDataLength ) - { - // read piece of data from the stream - aRs.ReadL(ptr, KReadDataLength); - - // check that there are no incomplete cdata/comment/entity at the end - dataSize += RemoveIncompleteL( piece, aRs ); - - // pre-process - PreProcessPieceL( piece ); - - // parsing - TPtrC8 temp( *piece ); - ParsePieceL( temp ); - - iFirstPiece = EFalse; - } - - TInt lastPartLength = dataSize - pos + KReadDataLength; - aRs.ReadL(ptr, lastPartLength); - - PreProcessPieceL( piece ); - - // parsing - TPtrC8 temp( *piece ); - ParsePieceL( temp, ETrue ); - - CleanupStack::PopAndDestroy(); // piece - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ParsePieceL -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::ParsePieceL( TPtrC8& aXml, TBool aLastPiece ) - { - - // check if last cdata has not ended yet - if ( iReadingCData ) - { - TInt endPos = aXml.Find(KCDataEnd); - TPtrC8 cdata = _L8(""); - - if ( endPos == KErrNotFound && aLastPiece ) - { - User::Leave(EInvalidCDataStructure); - } - else if ( endPos == KErrNotFound ) - { - // cdata end was not found, read the whole piece as cdata - NextDataL( aXml ); - return; - } - else - { - // add data until cdata end to buffer - cdata.Set( aXml.Left( endPos ) ); - aXml.Set( aXml.Right( aXml.Length() - endPos - KCDataEnd().Length() ) ); - iReadingCData = EFalse; - } - - AddToCompleteL(cdata); - NextDataL(*iCompleteBuffer); - ResetBufferL(iCompleteBuffer); - - } -#ifndef __NO_XML_COMMENTS_ - else if ( iReadingComment ) // check if last comment has not ended yet - { - TInt endPos = aXml.Find(KCommentEnd); - - if ( endPos == KErrNotFound && aLastPiece ) - { // this is the last piece of data and end of comment has not been found -> error - User::Leave(EInvalidXmlError); - } - else if ( endPos == KErrNotFound ) - { - // end of comment was not found, no need to parse this piece of data - return; - } - else - { - // end of cdata was found, jump to that position - aXml.Set( aXml.Right( aXml.Length() - endPos - KCommentEnd().Length() ) ); - iReadingComment = EFalse; - } - } -#endif - - // parse through the string - TText c; - - for( TInt i=0; i < aXml.Length(); ++i ) - { - c = aXml[i]; - switch(c) - { - case KElementStart: - // if currently reading element, error - if( iReadingElementName ) - { - User::Leave(EInvalidXmlError); - } - - if( aXml.Length()-i >= KCDataStart().Length() && - !aXml.Mid(i, KCDataStart().Length()).Compare(KCDataStart()) ) - { // cdata - aXml.Set( aXml.Right( aXml.Length() - i ) ); - TInt endPos = aXml.Find(KCDataEnd); - - TPtrC8 cdata = _L8(""); - if ( endPos == KErrNotFound && aLastPiece ) - { - User::Leave(EInvalidCDataStructure); - } - else if ( endPos == KErrNotFound ) - { - // cdata end was not found, read all the rest as cdata - cdata.Set( aXml.Right( aXml.Length() - KCDataStart().Length() ) ); - i = aXml.Length(); // move to the end - iReadingCData = ETrue; - } - else - { - cdata.Set( aXml.Mid( KCDataStart().Length(), endPos - KCDataStart().Length() ) ); - aXml.Set( aXml.Right( aXml.Length() - endPos - KCDataEnd().Length() ) ); - - i = -1; - } - - // add current buffer to complete buffer - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - ResetBufferL(iBuffer); - AddToCompleteL(cdata); - } -#ifndef __NO_XML_COMMENTS_ - else if( aXml.Length()-i >= KCommentStart().Length() && - !aXml.Mid(i, KCommentStart().Length()).Compare(KCommentStart()) ) - { // comment - aXml.Set( aXml.Right( aXml.Length() - i ) ); - TInt endPos = aXml.Find(KCommentEnd); - - if ( endPos == KErrNotFound && aLastPiece) - { - // this is the last piece of data, and end of comment was not found -> error - User::Leave(EInvalidXmlError); - } - else if ( endPos == KErrNotFound ) - { - // the end was not found, no need to parse the rest since it is comment - iReadingComment = ETrue; - return; - } - else - { - // the end of comment was found, move to the end of comment and start parsing - // from there on - aXml.Set( aXml.Right( aXml.Length() - endPos - KCommentEnd().Length() ) ); - } - - i = -1; - } -#endif - else - { - // send the buffer - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - NextDataL(*iCompleteBuffer); - ResetBufferL(iBuffer); - ResetBufferL(iCompleteBuffer); - iReadingElementName = ETrue; - } - - break; - case KElementEnd: - // stop reading element name - if( !iReadingElementName ) - { - User::Leave(EInvalidXmlError); - } - else - { - NextElementL(*iBuffer); - ResetBufferL(iBuffer); - iReadingElementName = EFalse; - } - break; - default: - // add char to buffer - AddToBufferL(c, iBuffer); - break; - } - } - - // send the data in the buffer - if ( ( iReadingEmailItemData || aLastPiece ) && !iReadingElementName ) - { - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - NextDataL(*iCompleteBuffer); - ResetBufferL(iBuffer); - ResetBufferL(iCompleteBuffer); - } - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::RemoveIncompleteL -// Checks if there is incomplete cdata/comment/entity at the end of the given -// piece. If one is found, it is removed from aPiece and the read mark of the -// stream is moved backwards the length of the removed item (i.e. the incomplete -// item will be read to the next piece as a whole). -// ----------------------------------------------------------------------------- -// -TUint CNSmlEmailFileParser::RemoveIncompleteL( HBufC8* aPiece, RReadStream& aStream ) - { - // we need to check only the last nine characters - TUint removeSize = CheckPiece( aPiece->Right( 9 ) ); - - if ( removeSize ) - { - // remove the incomplete item from aPiece - TPtr8 ptr = aPiece->Des(); - ptr.Delete( aPiece->Length() - removeSize, removeSize ); - - // move backwards in reading the stream - aStream.Source()->SeekL( MStreamBuf::ERead, aStream.Source()->TellL(MStreamBuf::ERead) - removeSize ); - } - - // no need to loop the rest of aPiece. If xml is not correctly formed, - // an error occures later in the parser - - return removeSize; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::CheckPiece -// ----------------------------------------------------------------------------- -// -TUint CNSmlEmailFileParser::CheckPiece( const TPtrC8 aEnd ) const - { - // check that there are no incomplete cdata/comment/entity at the end - // (cdata start, cdata end, cdata inner end, comment start, comment end, entities) - // ( , , &xxxx; , ]]]]>> , ]]]]>> ) - // do not change the order - - // possible inner cdata end - TInt pos = aEnd.Find( _L8("]]]") ); - if ( pos != KErrNotFound ) - { - return aEnd.Length() - pos; - } - - // beginning part of comment or cdata - pos = aEnd.Find( _L8("Des(); - - // the string used for searching and moving in the string - TPtrC8 searchString(*aXml); - - // the current position in the original string - TInt searchStartPos = 0; - - // if start has been found and end has not, try to find end first - if ( iCdataEndPos == KErrNotFound && iCdataStartPos != KErrNotFound && iCdataFoundFromFirstPiece ) - { - // we're looking for a cdata end - iCdataEndPos = searchString.Find(KCDataEnd); - - // if the end was found, remove it and start looking for a cdata start - if ( iCdataEndPos != KErrNotFound ) - { - // remove cdata end - xml.Delete(iCdataEndPos, KCDataEnd().Length()); - searchStartPos = iCdataEndPos; - searchString.Set( xml.Right(xml.Length() - searchStartPos) ); - } - else - { - // end was not found, return - return; - } - } - - iCdataStartPos = searchString.Find(KCDataStart); - - // If CDATA is not found from beginning then data is not inside CDATA and then - // preprocessing is not needed - if ( iCdataStartPos != 0 && iFirstPiece ) - { - return; - } - else if ( !iFirstPiece && !iCdataFoundFromFirstPiece ) - { - return; - } - else if ( iCdataStartPos == 0 && iFirstPiece ) - { - iCdataFoundFromFirstPiece = ETrue; - } - - - // while cdata is found - while ( iCdataStartPos != KErrNotFound ) - { - iCdataStartPos += searchStartPos; - - // find an end of cdata before entities are converted - iCdataEndPos = searchString.Find(KCDataEnd); - - // convert entities between search start and cdata start - TInt entityChange = EntitiesToCharactersL(aXml, searchStartPos, iCdataStartPos); - xml.Set(aXml->Des()); - iCdataStartPos += entityChange; - - if ( iCdataEndPos != KErrNotFound ) - { - iCdataEndPos += entityChange; - iCdataEndPos += searchStartPos; - - // if the end is before start -> error - if ( iCdataEndPos < iCdataStartPos ) - User::Leave( EInvalidCDataStructure ); - - // remove cdata end - xml.Delete(iCdataEndPos, KCDataEnd().Length()); - // remove cdata start - xml.Delete(iCdataStartPos, KCDataStart().Length()); - - searchStartPos = iCdataEndPos - KCDataStart().Length(); - searchString.Set( xml.Right(xml.Length() - searchStartPos) ); - } - else - { - // remove cdata start - xml.Delete(iCdataStartPos, KCDataStart().Length()); - - // since there was no end found, return - return; - } - - // find a new cdata start that is after the found end - iCdataStartPos = searchString.Find(KCDataStart); - - } - - if ( iCdataStartPos == KErrNotFound ) - { - EntitiesToCharactersL(aXml, searchStartPos, aXml->Length()); - } - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ResetParserL -// Resets the state of the parser, should be called before starting the parsing. -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::ResetParserL() - { - ResetBufferL(iBuffer); - ResetBufferL(iCompleteBuffer); - iReadingElementName = EFalse; - iReadingCData = EFalse; - iReadingEmailItemData = EFalse; - iFirstPiece = EFalse; - iCdataFoundFromFirstPiece = EFalse; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ResetPreProcessor -// Resets the variables used in preprocessor. -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::ResetPreProcessor() - { - iCdataStartPos = KErrNotFound; - iCdataEndPos = KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::Buf8ToBuf16 -// ----------------------------------------------------------------------------- -// -HBufC* CNSmlEmailFileParser::Buf8ToBuf16( const HBufC8* buf8 ) const - { - HBufC* buf16 = HBufC::New(buf8->Length()); - if ( buf16 ) - { - TPtr ptr = buf16->Des(); - ptr.Copy( *buf8 ); - } - - return buf16; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::CNSmlEmailFileParser -// Constructor. -// ----------------------------------------------------------------------------- -// -CNSmlEmailFileParser::CNSmlEmailFileParser() - : iUseEmailItem(ETrue) - { - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailFileParser::ConstructL -// Second phase construction. -// ----------------------------------------------------------------------------- -// -void CNSmlEmailFileParser::ConstructL() - { - CNSmlEmailParser::ConstructL(); - User::LeaveIfError( iRfs.Connect() ); - - // create path+filename for emailitem - iEmailItemFile = HBufC::NewL( KMaxEmailItemFileNameLength ); - TPtr file = iEmailItemFile->Des(); - - file.Append( KEmailItemFile ); - - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlEmailParser.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlEmailParser.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,793 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailParser* CNSmlEmailParser::NewL() - { - CNSmlEmailParser* self = CNSmlEmailParser::NewLC(); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailParser* CNSmlEmailParser::NewLC() - { - CNSmlEmailParser* self = new (ELeave) CNSmlEmailParser(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::~CNSmlEmailParser -// Destructor -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlEmailParser::~CNSmlEmailParser() - { - if( iTruncated ) - delete iTruncated; - - if( iExt ) - { - iExt->ResetAndDestroy(); - delete iExt; - } - - if( iEmailItem ) delete iEmailItem; - - if( iTruncType ) delete iTruncType; - if( iTruncName ) delete iTruncName; - if( iExtData ) delete iExtData; - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::ParseXml -// Parses through the given XML and puts the data it contains -// to member variables. -// Note: The string-values in CNSmlEmailParser are NOT copies, but -// references to aXml. The method does not check, if member variables -// already contain data, but just writes it (if some of them are already -// instantiated dynamically, they should be deleted before this method is called). -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailParser::ParseXml( HBufC8* aXml ) - { - - // pre-process the data (remove cdata over ) - TRAPD( cdataErr, PreProcessL(aXml)); - if (cdataErr != EErrorNone) - return (TNSmlParserGeneratorError)cdataErr; - - // reset state - iSetValues.Reset(); - iCurrentState = ENone; - iLastState = ENone; - TPtrC8 ptr(*aXml); - - // parse - TRAPD(err, ParseL( ptr )); - - // return error, if in wrong state - if( err == EErrorNone && iCurrentState != ENone ) - return EInvalidXmlError; - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::GenerateXml -// Generates Email-XML using the data in member variables. aXml contains the -// generated xml when the function returns successfully. Note: caller should not -// instantiate the HBufC8, since this method first counts the size of the xml to -// be generated and then instatiates the HBufC8 with a correct maximum size. If -// the given buffer is not NULL, it is destroyed and a new one is instantiated. -// However, the caller gets the control of the HBufC8 when the function returns. -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlEmailParser::GenerateXml( HBufC8*& aXml ) - { - - TRAPD( err, GenerateEmailXmlL( aXml ) ); - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::GenerateEmailXmlL -// Private method that does the actual email xml generation -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::GenerateEmailXmlL( HBufC8*& aXml ) - { - ConvertIntoEntitiesL(); - - // count the size of the xml - TInt size = CountXmlSizeL(); - - // create buffer for the xml - - if ( aXml ) - { - delete aXml; - aXml = NULL; - } - - aXml = HBufC8::NewLC(size); - TPtr8 ptr = aXml->Des(); - - // append data to buffer - AppendElement(ptr, KEmailElement()); - - if ( iRead ) - { - AppendElement(ptr, KEmailReadElement(), BooleanToString( iRead )); - } - - if ( iForwarded ) - { - AppendElement(ptr, KEmailForwardedElement(), BooleanToString( iForwarded )); - } - - if ( iReplied ) - { - AppendElement(ptr, KEmailRepliedElement(), BooleanToString( iReplied )); - } - - if (iReceived != Time::NullTTime()) - { - AppendElement(ptr, KEmailReceivedElement(), DateTimeToStringL(iReceived)); - } - - if (iCreated != Time::NullTTime()) - { - AppendElement(ptr, KEmailCreatedElement(), DateTimeToStringL(iCreated)); - } - - if (iModified != Time::NullTTime()) - { - AppendElement(ptr, KEmailModifiedElement(), DateTimeToStringL(iModified)); - } - - if ( iDeleted ) - { - AppendElement(ptr, KEmailDeletedElement(), BooleanToString( iDeleted )); - } - - if ( iFlagged ) - { - AppendElement(ptr, KEmailFlaggedElement(), BooleanToString( iFlagged )); - } - - if ( iEmailItem ) - { - AppendElement(ptr, KEmailItemElement()); - ptr.Append(KCDataStart); - ptr.Append( *iEmailItem ); - ptr.Append(KCDataEnd); - AppendEndElement(ptr, KEmailItemElement()); - } - - if ( iTruncated ) - { - iTruncated->GenerateXmlL(ptr, this); - } - - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - iExt->At(i)->GenerateXmlL(ptr, this); - } - - } - - - AppendEndElement(ptr, KEmailElement()); - - CleanupStack::Pop(); // aXml - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::CountXmlSizeL -// Counts how long the xml string will be if it was generated using -// the values currently in member variables. -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CNSmlEmailParser::CountXmlSizeL() - { - TInt size = 0; - - size += KCDataStart().Length() + KCDataEnd().Length(); - size += SizeOfElements( KEmailElement() ); - - if ( iRead ) - { - size += SizeOfBoolean( iRead, KEmailReadElement() ); - } - - if ( iForwarded ) - { - size += SizeOfBoolean( iForwarded, KEmailForwardedElement() ); - } - - if ( iReplied ) - { - size += SizeOfBoolean( iReplied, KEmailRepliedElement() ); - } - - if (iReceived != Time::NullTTime()) - { - size += SizeOfDatetime( KEmailReceivedElement() ); - } - - if (iCreated != Time::NullTTime()) - { - size += SizeOfDatetime( KEmailCreatedElement() ); - } - - if (iModified != Time::NullTTime()) - { - size += SizeOfDatetime( KEmailModifiedElement() ); - } - - if ( iDeleted ) - { - size += SizeOfBoolean( iDeleted, KEmailDeletedElement() ); - } - - if ( iFlagged ) - { - size += SizeOfBoolean( iFlagged, KEmailFlaggedElement() ); - } - - if ( iEmailItem ) - { - size += SizeOfString( iEmailItem, KEmailItemElement() ); - size += KCDataStart().Length() + KCDataInnerEnd().Length(); - } - - if ( iTruncated ) - { - size += iTruncated->CountXmlSizeL( this ); - } - - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - size += iExt->At(i)->CountXmlSize( this ); - } - } - - return size; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::AddExtL -// Adds the given extension to iExt -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlEmailParser::AddExtL( CNSmlExtData* aExt ) - { - iExt->AppendL(aExt); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::NextElementL -// Base class' ParseL method calls this method, when a new element is found. aElement -// is the name of that element (string inside '<' and '>' characters). -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::NextElementL( TPtrC8 aElement ) - { - if (aElement.Length() == 0) - User::Leave(EInvalidXmlError); - - TBool startElement = ETrue; - - if(aElement[0] == KCharacterSlash) - { - // take off the '/' character from the beginning - aElement.Set(aElement.Right(aElement.Length()-1)); - // end element - startElement = EFalse; - } -#ifndef __NO_EMPTY_ELEMENTS_ - else if (aElement[aElement.Length()-1] == KCharacterSlash) - { - // take off the '/' character from the end - aElement.Set(aElement.Left(aElement.Length()-1)); - - // empty element == start element, empty data, end element - NextElementL( aElement ); // simulates start element - NextDataL( _L8("") ); // simulates empty data - - // create the end element - HBufC8* end = HBufC8::NewLC(aElement.Length()+1); - TPtr8 ptr = end->Des(); - ptr.Append( _L8("/") ); - ptr.Append( aElement ); - - NextElementL( ptr ); // simulates end element - - CleanupStack::PopAndDestroy(); // end - - return; - } -#endif - - // variables used for state, init to and not set - TNSmlCurrentEmailElement inner = EEmail; - TNSmlCurrentEmailElement outer = EEmail; - TBool isSet = EFalse; - - // check which element we've got - if( aElement == KEmailElement ) - { - outer = ENone; - isSet = iSetValues.iEmail; - if ( startElement ) iSetValues.iEmail = ETrue; - } - else if( aElement == KEmailReadElement ) - { - inner = ERead; - isSet = iSetValues.iRead; - } - else if( aElement == KEmailForwardedElement ) - { - inner = EForwarded; - isSet = iSetValues.iForwarded; - } - else if( aElement == KEmailRepliedElement ) - { - inner = EReplied; - isSet = iSetValues.iReplied; - } - else if( aElement == KEmailReceivedElement ) - { - inner = EReceived; - isSet = iSetValues.iReceived; - } - else if( aElement == KEmailCreatedElement ) - { - inner = ECreated; - isSet = iSetValues.iCreated; - } - else if( aElement == KEmailModifiedElement ) - { - inner = EModified; - isSet = iSetValues.iModified; - } - else if( aElement == KEmailDeletedElement ) - { - inner = EDeleted; - isSet = iSetValues.iDeleted; - } - else if( aElement == KEmailFlaggedElement ) - { - inner = EFlagged; - isSet = iSetValues.iFlagged; - } - else if( aElement == KEmailItemElement ) - { - inner = EEmailItem; - isSet = iSetValues.iEmailItem; - if ( startElement ) - HandleNextEmailItemStartL(); - else - HandleNextEmailItemEndL(); - } - else if( aElement == KTruncatedElement ) - { - inner = ETrunc; - isSet = iSetValues.iTrunc; - - if ( startElement ) - { - if ( !iTruncated ) - iTruncated = CNSmlTruncatedData::NewL(); - iSetValues.iTrunc = ETrue; - } - } - else if( aElement == KTruncatedBodyElement ) - { - inner = ETruncBody; - outer = ETrunc; - if ( startElement ) - { - if( iTruncType ) - { - delete iTruncType; - iTruncType = NULL; - } - iTruncSize = KErrNotFound; - - iSetValues.iTruncBodySize = EFalse; - iSetValues.iTruncBodyType = EFalse; - } - else - { - iTruncated->AddBodyL(iTruncSize, iTruncType); - } - } - else if( aElement == KTruncatedAttachElement ) - { - inner = ETruncAttach; - outer = ETrunc; - if ( startElement ) - { - if( iTruncType ) - { - delete iTruncType; - iTruncType = NULL; - } - if( iTruncName ) - { - delete iTruncName; - iTruncName = NULL; - } - iTruncSize = KErrNotFound; - - iSetValues.iTruncAttachName = EFalse; - iSetValues.iTruncAttachType = EFalse; - iSetValues.iTruncAttachSize = EFalse; - } - else - { - iTruncated->AddAttachmentL(iTruncName, iTruncSize, iTruncType); - } - } - else if( aElement == KTruncatedSizeElement ) - { - if ( (startElement && iCurrentState == ETruncBody) - || (!startElement && iCurrentState == ETruncBodySize) ) - { - inner = ETruncBodySize; - outer = ETruncBody; - isSet = iSetValues.iTruncBodySize; - } - else if ( (startElement && iCurrentState == ETruncAttach) - || (!startElement && iCurrentState == ETruncAttachSize) ) - { - inner = ETruncAttachSize; - outer = ETruncAttach; - isSet = iSetValues.iTruncAttachSize; - } - else - { - User::Leave(EInvalidXmlError); // wrong state - } - } - else if( aElement == KTruncatedTypeElement ) - { - if ( (startElement && iCurrentState == ETruncBody) - || (!startElement && iCurrentState == ETruncBodyType) ) - { - inner = ETruncBodyType; - outer = ETruncBody; - isSet = iSetValues.iTruncBodyType; - } - else if ( (startElement && iCurrentState == ETruncAttach) - || (!startElement && iCurrentState == ETruncAttachType) ) - { - inner = ETruncAttachType; - outer = ETruncAttach; - isSet = iSetValues.iTruncAttachType; - } - else - { - User::Leave(EInvalidXmlError); // wrong state - } - } - else if( aElement == KTruncatedNameElement ) - { - inner = ETruncAttachName; - outer = ETruncAttach; - isSet = iSetValues.iTruncAttachName; - } - else if( aElement == KExtElement ) - { - inner = EExt; - if ( startElement ) - { - if( iExtData ) - { - delete iExtData; - iExtData = NULL; - } - iExtData = CNSmlExtData::NewL(); - iSetValues.iXNam = EFalse; - } - else - { - if( !iSetValues.iXNam ) User::Leave(EMandatoryFieldNotFound); // xnam not set - iExt->AppendL(iExtData); - iExtData = NULL; - } - } - else if( aElement == KExtXNamElement ) - { - inner = EExtXNam; - outer = EExt; - isSet = iSetValues.iXNam; - } - else if( aElement == KExtXValElement ) - { - inner = EExtXVal; - outer = EExt; - } - else - { // unknown element - User::Leave(EInvalidXmlError); - } - - - // finally, change state depending on was the element start or end element - if ( startElement ) - { - StartElementStateChangeL( outer, inner, isSet ); - } - else - { - EndElementStateChangeL( inner, outer ); - } - - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::NextDataL -// Base class' ParseL method calls this method, when a data is read from xml, but that -// data is not element name (data inside or between elements). -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::NextDataL( TPtrC8 aData ) - { - switch(iCurrentState) - { - case ENone: - case EEmail: - case ETrunc: - case ETruncBody: - case ETruncAttach: - case EExt: - LeaveIfNotWhiteSpaceL( aData ); - break; - case ERead: - iRead = StringToBooleanL(aData); - iSetValues.iRead = ETrue; - break; - case EForwarded: - iForwarded = StringToBooleanL(aData); - iSetValues.iForwarded = ETrue; - break; - case EReplied: - iReplied = StringToBooleanL(aData); - iSetValues.iReplied = ETrue; - break; - case EDeleted: - iDeleted = StringToBooleanL(aData); - iSetValues.iDeleted = ETrue; - break; - case EFlagged: - iFlagged = StringToBooleanL(aData); - iSetValues.iFlagged = ETrue; - break; - case EReceived: - iReceived = StringToTTimeL(aData); - iSetValues.iReceived = ETrue; - break; - case ECreated: - iCreated = StringToTTimeL(aData); - iSetValues.iCreated = ETrue; - break; - case EModified: - iModified = StringToTTimeL(aData); - iSetValues.iModified = ETrue; - break; - case EEmailItem: - HandleNextEmailItemDataL( aData ); // implementation dependent behavior - iSetValues.iEmailItem = ETrue; - break; - case ETruncBodySize: - iTruncSize = StringToIntegerL(aData); - iSetValues.iTruncBodySize = ETrue; - break; - case ETruncBodyType: - iTruncType = aData.AllocL(); - iSetValues.iTruncBodyType = ETrue; - break; - case ETruncAttachSize: - iTruncSize = StringToIntegerL(aData); - iSetValues.iTruncAttachSize = ETrue; - break; - case ETruncAttachName: - iTruncName = aData.AllocL(); - iSetValues.iTruncAttachName = ETrue; - break; - case ETruncAttachType: - iTruncType = aData.AllocL(); - iSetValues.iTruncAttachType = ETrue; - break; - case EExtXNam: - iExtData->iXNam = aData.AllocL(); - iSetValues.iXNam = ETrue; - break; - case EExtXVal: - iExtData->AddXValL(aData.AllocL()); - break; - default: - User::Leave(EUnknownError); // should never happen - break; - } - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::HandleNextEmailItemDataL -// Next emailitem data -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::HandleNextEmailItemDataL( TPtrC8 aData ) - { - iEmailItem = aData.AllocL(); - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::StartElementStateChangeL -// Checks that the state change (new start element) is legal (right order of -// elements and element not already set) and changes the state. -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::StartElementStateChangeL(TNSmlCurrentEmailElement aCurrentState, - TNSmlCurrentEmailElement aNextState, - TBool aIsSet) - { - if( aIsSet || iCurrentState != aCurrentState || aNextState < iLastState ) - { - User::Leave(EInvalidXmlError); - } - - iLastState = iCurrentState; - iCurrentState = aNextState; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::EndElementStateChangeL -// Checks that the state change (new end element) is legal (right order of -// elements and element not already set) and changes the state. -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::EndElementStateChangeL(TNSmlCurrentEmailElement aCurrentState, - TNSmlCurrentEmailElement aNextState ) - { - if( iCurrentState != aCurrentState ) - { - User::Leave(EInvalidXmlError); - } - - iLastState = iCurrentState; - iCurrentState = aNextState; - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::ConvertIntoEntitiesL -// Converts special characters of this email-dataobject to corresponding -// characters. Emailitem needs not to be changed, since it is always -// placed inside cdata (when generating xml). -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::ConvertIntoEntitiesL() - { - - // truncate info - if ( iTruncated ) - { - iTruncated->ConvertIntoEntitiesL(this); - } - - // extensions - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - iExt->At(i)->ConvertIntoEntitiesL(this); - } - } - - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::CNSmlEmailParser -// Private constructor -// ----------------------------------------------------------------------------- -// -CNSmlEmailParser::CNSmlEmailParser() - : iReceived(Time::NullTTime()), iCreated(Time::NullTTime()), iModified(Time::NullTTime()), - iTruncSize(KErrNotFound) - { - } - -// ----------------------------------------------------------------------------- -// CNSmlEmailParser::ConstructL -// Second phase construction -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::ConstructL() - { - iExt = new (ELeave) CNSmlExtDataArray(3); - } - -// ----------------------------------------------------------------------------- -// TNSmlSetEmailValues::TNSmlSetEmailValues -// ----------------------------------------------------------------------------- -// -CNSmlEmailParser::TNSmlSetEmailValues::TNSmlSetEmailValues() - { - Reset(); - } - - -// ----------------------------------------------------------------------------- -// TNSmlSetEmailValues::Reset -// ----------------------------------------------------------------------------- -// -void CNSmlEmailParser::TNSmlSetEmailValues::Reset() - { - iEmail = EFalse; - iRead = EFalse; - iForwarded = EFalse; - iReplied = EFalse; - iDeleted = EFalse; - iFlagged = EFalse; - iReceived = EFalse; - iCreated = EFalse; - iModified = EFalse; - iEmailItem = EFalse; - iTrunc = EFalse; - iTruncBodySize = EFalse; - iTruncBodyType = EFalse; - iXNam = EFalse; - iTruncAttachSize = EFalse; - iTruncAttachType = EFalse; - iTruncAttachName = EFalse; - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlExtData.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlExtData.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CNSmlExtData::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlExtData* CNSmlExtData::NewL() - { - CNSmlExtData* self = CNSmlExtData::NewLC(); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlExtData* CNSmlExtData::NewLC() - { - CNSmlExtData* self = new (ELeave) CNSmlExtData(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::~CNSmlExtData -// Destructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlExtData::~CNSmlExtData() - { - if (iXVals) - { - iXVals->ResetAndDestroy(); - delete iXVals; - } - - if (iXNam) delete iXNam; - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::AddXValL -// Adds given buffer to iXVals. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlExtData::AddXValL( HBufC8* aXVal ) - { - iXVals->AppendL(aXVal); - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::GenerateXmlL -// Generates ext data xml using aParser and appends the xml to aXml. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlExtData::GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser) const - { - if ( aParser == NULL ) - return; - - aParser->AppendElement(aXml, KExtElement()); - - if( iXNam ) - { - aParser->AppendElement(aXml, KExtXNamElement(), *iXNam); - } - else - User::Leave(EMandatoryFieldNotFound); - - if ( iXVals ) - { - for (TInt i=0; i < iXVals->Count(); ++i) - { - aParser->AppendElement(aXml, KExtXValElement(), *iXVals->At(i)); - } - } - - aParser->AppendEndElement(aXml, KExtElement()); - - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::CountXmlSize -// Counts the size of the ext data xml if it was generated with current -// values in member variables. -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CNSmlExtData::CountXmlSize( const CNSmlXmlParser* aParser ) const - { - TInt size = 0; - size += aParser->SizeOfElements( KExtElement() ); - - if( iXNam ) - { - size += aParser->SizeOfString( iXNam, KExtXNamElement() ); - } - - if ( iXVals ) - { - for (TInt i=0; i < iXVals->Count(); ++i) - { - size += aParser->SizeOfString( iXVals->At(i), KExtXValElement() ); - } - } - - return size; - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::ConvertIntoEntitiesL -// Converts special characters in member variables into entities. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlExtData::ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ) - { - if( iXNam ) - aParser->CharactersToEntitiesL(iXNam, 0, iXNam->Length()); - - if( iXVals ) - { - for (TInt i=0; i < iXVals->Count(); ++i) - { - aParser->CharactersToEntitiesL(iXVals->At(i), 0, iXVals->At(i)->Length()); - } - } - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::CNSmlExtData -// Constructor. -// ----------------------------------------------------------------------------- -// -CNSmlExtData::CNSmlExtData() - { - } - -// ----------------------------------------------------------------------------- -// CNSmlExtData::ConstructL -// Second phase construction. -// ----------------------------------------------------------------------------- -// -void CNSmlExtData::ConstructL() - { - iXVals = new (ELeave) CNSmlXValArray(3); - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlFolderAttributeData.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlFolderAttributeData.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// TNSmlFolderAttributeData::TNSmlFolderAttributeData -// Constructor -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlFolderAttributeData::TNSmlFolderAttributeData() -: iHidden(EBooleanMissing), iSystem(EBooleanMissing), -iArchived(EBooleanMissing), iDelete(EBooleanMissing), -iWritable(EBooleanMissing), iReadable(EBooleanMissing), -iExecutable(EBooleanMissing) - { - } - -// ----------------------------------------------------------------------------- -// TNSmlFolderAttributeData::AttributeCount -// Returns the amount of fields that are not EBooleanMissing -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt TNSmlFolderAttributeData::AttributeCount() const - { - TInt count = 0; - - if ( iHidden ) count++; - if ( iSystem ) count++; - if ( iArchived ) count++; - if ( iDelete ) count++; - if ( iWritable ) count++; - if ( iReadable ) count++; - if ( iExecutable ) count++; - - return count; - } - -// ----------------------------------------------------------------------------- -// TNSmlFolderAttributeData::GenerateXml -// Generates attribute xml -// ----------------------------------------------------------------------------- -// -EXPORT_C void TNSmlFolderAttributeData::GenerateXml( TPtr8& aXml, const CNSmlXmlParser* aParser ) const - { - aParser->AppendElement(aXml, KFolderAttributesElement()); - - if ( iHidden ) - { - aParser->AppendElement(aXml, KAttributeHiddenElement(), aParser->BooleanToString( iHidden )); - } - - if ( iSystem ) - { - aParser->AppendElement(aXml, KAttributeSystemElement(), aParser->BooleanToString( iSystem )); - } - - if ( iArchived ) - { - aParser->AppendElement(aXml, KAttributeArchivedElement(), aParser->BooleanToString( iArchived )); - } - - if ( iDelete ) - { - aParser->AppendElement(aXml, KAttributeDeleteElement(), aParser->BooleanToString( iDelete )); - } - - if ( iWritable ) - { - aParser->AppendElement(aXml, KAttributeWritableElement(), aParser->BooleanToString( iWritable )); - } - - if ( iReadable ) - { - aParser->AppendElement(aXml, KAttributeReadableElement(), aParser->BooleanToString( iReadable )); - } - - if ( iExecutable ) - { - aParser->AppendElement(aXml, KAttributeExecutableElement(), aParser->BooleanToString( iExecutable )); - } - - aParser->AppendEndElement(aXml, KFolderAttributesElement()); - } - -// ----------------------------------------------------------------------------- -// TNSmlFolderAttributeData::CountXmlSize -// Coounts the size of the xml if it was generated using the values currently in -// member variables -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt TNSmlFolderAttributeData::CountXmlSize( const CNSmlXmlParser* aParser ) const - { - TInt size = 0; - size += aParser->SizeOfElements( KFolderAttributesElement() ); - - if ( iHidden ) - { - size += aParser->SizeOfBoolean( iHidden, KAttributeHiddenElement() ); - } - - if ( iSystem ) - { - size += aParser->SizeOfBoolean( iSystem, KAttributeSystemElement() ); - } - - if ( iArchived ) - { - size += aParser->SizeOfBoolean( iArchived, KAttributeArchivedElement() ); - } - - if ( iDelete ) - { - size += aParser->SizeOfBoolean( iDelete, KAttributeDeleteElement() ); - } - - if ( iWritable ) - { - size += aParser->SizeOfBoolean( iWritable, KAttributeWritableElement() ); - } - - if ( iReadable ) - { - size += aParser->SizeOfBoolean( iReadable, KAttributeReadableElement() ); - } - - if ( iExecutable ) - { - size += aParser->SizeOfBoolean( iExecutable, KAttributeExecutableElement() ); - } - - return size; - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlFolderParser.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlFolderParser.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,631 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlFolderParser* CNSmlFolderParser::NewL() - { - CNSmlFolderParser* self = CNSmlFolderParser::NewLC(); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlFolderParser* CNSmlFolderParser::NewLC() - { - CNSmlFolderParser* self = new (ELeave) CNSmlFolderParser(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::~CNSmlFolderParser -// Destructor -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlFolderParser::~CNSmlFolderParser() - { - if(iExt) - { - iExt->ResetAndDestroy(); - delete iExt; - } - - if(iName) delete iName; - if(iRole) delete iRole; - - if( iExtData ) delete iExtData; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::ParseXml -// Parses through the given XML and places the data to member variables. -// Note: The string-values in CNSmlEmailParser are NOT copies, but -// references to aXml. The method does not check whether the member variables -// already contains data or not, but just writes it (if some of them are already -// instantiated dynamically, they should be deleted before this method is called). -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlFolderParser::ParseXml( HBufC8* aXml ) - { - - TRAPD(cdataErr, PreProcessL(aXml)); - if (cdataErr != EErrorNone) - return (TNSmlParserGeneratorError)cdataErr; - - iSetValues.Reset(); - iCurrentState = EFolderNone; - iLastState = EFolderNone; - TPtrC8 ptr(*aXml); - - TRAPD(err, ParseL( ptr )); - - if( err == EErrorNone && iCurrentState != EFolderNone ) - return EInvalidXmlError; - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::GenerateXml -// Generates Folder-XML using the values in member variables. aXml contains the -// generated xml when the function returns successfully. Note: caller should not -// instantiate the HBufC8, since this method first counts the size of the -// xml to be generated and then instatiates the HBufC8 with a correct maximum size. -// If the given buffer is not NULL, it is destroyed and a new one is instantiated. -// Caller gets the control of the HBufC8 when the function returns. -// ----------------------------------------------------------------------------- -// -EXPORT_C TNSmlParserGeneratorError CNSmlFolderParser::GenerateXml( HBufC8*& aXml ) - { - - TRAPD( err, ConvertIntoEntitiesL(); // convert special characters into entities - - GenerateFolderXmlL( aXml ) ); - - return CheckError(err); - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::GenerateFolderXmlL -// Private methods that does the actual folder xml generation -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::GenerateFolderXmlL( HBufC8*& aXml ) - { - // count the size of the xml - TInt size = CountXmlSizeL(); - - // create buffer for the xml - - if ( aXml ) - { - delete aXml; - aXml = NULL; - } - - aXml = HBufC8::NewLC(size); - TPtr8 ptr = aXml->Des(); - - AppendElement(ptr, KFolderElement()); - - if ( iName ) - { - AppendElement(ptr, KFolderNameElement(), *iName); - } - - if (iCreated != Time::NullTTime()) - { - AppendElement(ptr, KFolderCreatedElement(), DateTimeToStringL(iCreated)); - } - - if (iModified != Time::NullTTime()) - { - AppendElement(ptr, KFolderModifiedElement(), DateTimeToStringL(iModified)); - } - - if (iAccessed != Time::NullTTime()) - { - AppendElement(ptr, KFolderAccessedElement(), DateTimeToStringL(iAccessed)); - } - - if (iAttributes.AttributeCount() > 0) - { - iAttributes.GenerateXml(ptr, this); - } - - if ( iRole ) - { - AppendElement(ptr, KFolderRoleElement(), *iRole); - } - - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - iExt->At(i)->GenerateXmlL(ptr, this); - } - - } - - AppendEndElement(ptr, KFolderElement()); - - CleanupStack::Pop(); // aXml - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::CountXmlSizeL -// Counts how long the xml string will be if it was generated using -// the values currently in member variables. -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CNSmlFolderParser::CountXmlSizeL() - { - TInt size = 0; - - size += SizeOfElements( KFolderElement() ); - size += KCDataStart().Length() + KCDataEnd().Length(); - - if ( iName ) - { - size += SizeOfString( iName, KFolderNameElement() ); - } - - if (iCreated != Time::NullTTime()) - { - size += SizeOfDatetime( KFolderCreatedElement() ); - } - - if (iModified != Time::NullTTime()) - { - size += SizeOfDatetime( KFolderModifiedElement() ); - } - - if (iAccessed != Time::NullTTime()) - { - size += SizeOfDatetime( KFolderAccessedElement() ); - } - - // attributes, if any present - if (iAttributes.AttributeCount() > 0) - { - size += iAttributes.CountXmlSize( this ); - } - - if ( iRole ) - { - size += SizeOfString( iRole, KFolderRoleElement() ); - } - - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - size += iExt->At(i)->CountXmlSize( this ); - } - } - - return size; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::AddExtL -// Adds the given extension to iExt -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlFolderParser::AddExtL( CNSmlExtData* aExt ) - { - iExt->AppendL(aExt); - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::NextElementL -// Base class' ParseL method calls this method, when a new element is found. aElement -// is the name of that element (string inside '<' and '>' characters). -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::NextElementL( TPtrC8 aElement ) - { - if (aElement.Length() == 0) - User::Leave(EInvalidXmlError); - - TBool startElement = ETrue; - - if(aElement[0] == KCharacterSlash) - { - // end element - // remove the '/' character from the beginning - aElement.Set( aElement.Right( aElement.Length() - 1 ) ); - startElement = EFalse; - } -#ifndef __NO_EMPTY_ELEMENTS_ - else if (aElement[aElement.Length()-1] == KCharacterSlash) - { - // empty element - // remove the '/' character from the end - aElement.Set( aElement.Left( aElement.Length() - 1 ) ); - - // empty element == start element, empty data, end element - NextElementL( aElement ); // simulates start element - NextDataL( _L8("") ); // simulates the empty data - - HBufC8* end = HBufC8::NewLC(aElement.Length()+1); - TPtr8 ptr = end->Des(); - ptr.Append( _L8("/") ); - ptr.Append( aElement ); - - NextElementL( ptr ); // simulates end element - - CleanupStack::PopAndDestroy(); // end - - return; - } -#endif - - // variables used for state, init to and not set - TNSmlCurrentFolderElement inner = EFolder; - TNSmlCurrentFolderElement outer = EFolder; - TBool isSet = EFalse; - - if( aElement == KFolderElement ) - { - outer = EFolderNone; - isSet = iSetValues.iFolder; - if ( startElement ) iSetValues.iFolder = ETrue; - } - else if( aElement == KFolderNameElement ) - { - inner = EFolderName; - isSet = iSetValues.iName; - } - else if( aElement == KFolderCreatedElement ) - { - inner = EFolderCreated; - isSet = iSetValues.iCreated; - } - else if( aElement == KFolderModifiedElement ) - { - inner = EFolderModified; - isSet = iSetValues.iModified; - } - else if( aElement == KFolderAccessedElement ) - { - inner = EFolderAccessed; - isSet = iSetValues.iAccessed; - } - else if( aElement == KFolderAttributesElement ) - { - inner = EAttributes; - isSet = iSetValues.iAttributes; - if ( startElement) iSetValues.iAttributes = ETrue; - } - else if( aElement == KAttributeHiddenElement ) - { - inner = EAttributesH; - outer = EAttributes; - isSet = iSetValues.iAttributesH; - } - else if( aElement == KAttributeSystemElement ) - { - inner = EAttributesS; - outer = EAttributes; - isSet = iSetValues.iAttributesS; - } - else if( aElement == KAttributeArchivedElement ) - { - inner = EAttributesA; - outer = EAttributes; - isSet = iSetValues.iAttributesA; - } - else if( aElement == KAttributeDeleteElement ) - { - inner = EAttributesD; - outer = EAttributes; - isSet = iSetValues.iAttributesD; - } - else if( aElement == KAttributeWritableElement ) - { - inner = EAttributesW; - outer = EAttributes; - isSet = iSetValues.iAttributesW; - } - else if( aElement == KAttributeReadableElement ) - { - inner = EAttributesR; - outer = EAttributes; - isSet = iSetValues.iAttributesR; - } - else if( aElement == KAttributeExecutableElement ) - { - inner = EAttributesX; - outer = EAttributes; - isSet = iSetValues.iAttributesX; - } - else if( aElement == KFolderRoleElement ) - { - inner = EFolderRole; - isSet = iSetValues.iRole; - } - else if( aElement == KExtElement ) - { - inner = EFolderExt; - - if ( startElement ) - { - if( iExtData ) - { - delete iExtData; - iExtData = NULL; - } - iExtData = CNSmlExtData::NewL(); - iSetValues.iXNam = EFalse; - } - else - { - if( !iSetValues.iXNam ) User::Leave(EMandatoryFieldNotFound); // xnam not set - iExt->AppendL(iExtData); - iExtData = NULL; - } - } - else if( aElement == KExtXNamElement ) - { - inner = EFolderExtXNam; - outer = EFolderExt; - isSet = iSetValues.iXNam; - } - else if( aElement == KExtXValElement ) - { - inner = EFolderExtXVal; - outer = EFolderExt; - } - else - { - User::Leave(EInvalidXmlError); - } - - - // finally, change state depending on was the element start or end element - if ( startElement ) - { - StartElementStateChangeL( outer, inner, isSet ); - } - else - { - EndElementStateChangeL( inner, outer ); - } - - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::NextDataL -// Base class' ParseL method calls this method, when a data is read from xml, -// but that data is not element name (data inside or between elements). -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::NextDataL( TPtrC8 aData ) - { - switch(iCurrentState) - { - case EFolderNone: - case EFolder: - case EAttributes: - case EFolderExt: - LeaveIfNotWhiteSpaceL( aData ); - break; - case EFolderName: - iName = aData.AllocL(); - iSetValues.iName = ETrue; - break; - case EFolderCreated: - iCreated = StringToTTimeL(aData); - iSetValues.iCreated = ETrue; - break; - case EFolderModified: - iModified = StringToTTimeL(aData); - iSetValues.iModified = ETrue; - break; - case EFolderAccessed: - iAccessed = StringToTTimeL(aData); - iSetValues.iAccessed = ETrue; - break; - case EAttributesH: - iAttributes.iHidden = StringToBooleanL(aData); - iSetValues.iAttributesH = ETrue; - break; - case EAttributesS: - iAttributes.iSystem = StringToBooleanL(aData); - iSetValues.iAttributesS = ETrue; - break; - case EAttributesA: - iAttributes.iArchived = StringToBooleanL(aData); - iSetValues.iAttributesA = ETrue; - break; - case EAttributesD: - iAttributes.iDelete = StringToBooleanL(aData); - iSetValues.iAttributesD = ETrue; - break; - case EAttributesW: - iAttributes.iWritable = StringToBooleanL(aData); - iSetValues.iAttributesW = ETrue; - break; - case EAttributesR: - iAttributes.iReadable = StringToBooleanL(aData); - iSetValues.iAttributesR = ETrue; - break; - case EAttributesX: - iAttributes.iExecutable = StringToBooleanL(aData); - iSetValues.iAttributesX = ETrue; - break; - case EFolderRole: - iRole = aData.AllocL(); - iSetValues.iRole = ETrue; - break; - case EFolderExtXNam: - iExtData->iXNam = aData.AllocL(); - iSetValues.iXNam = ETrue; - break; - case EFolderExtXVal: - iExtData->AddXValL(aData.AllocL()); - break; - default: - User::Leave(EUnknownError); // should never happen - break; - } - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::StartElementStateChangeL -// Checks that the state change (new start element) is legal (right order of -// elements and element not already set) and changes the state. -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::StartElementStateChangeL(TNSmlCurrentFolderElement aCurrentState, - TNSmlCurrentFolderElement aNextState, - TBool aIsSet) - { - if( aIsSet || iCurrentState != aCurrentState || aNextState < iLastState ) - { - User::Leave(EInvalidXmlError); - } - - iLastState = iCurrentState; - iCurrentState = aNextState; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::EndElementStateChangeL -// Checks that the state change (new end element) is legal (right order of -// elements and element not already set) and changes the state. -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::EndElementStateChangeL(TNSmlCurrentFolderElement aCurrentState, - TNSmlCurrentFolderElement aNextState ) - { - if( iCurrentState != aCurrentState ) - { - User::Leave(EInvalidXmlError); - } - - iLastState = iCurrentState; - iCurrentState = aNextState; - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::ConvertIntoEntitiesL -// Converts special characters of this email-dataobject to corresponding -// characters. -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::ConvertIntoEntitiesL() - { - // name - if ( iName ) - { - CharactersToEntitiesL(iName, 0, iName->Length()); - } - - // role - if ( iRole ) - { - CharactersToEntitiesL(iRole, 0, iRole->Length()); - } - - // extensions - if ( iExt ) - { - for (TInt i=0; i < iExt->Count(); ++i) - { - iExt->At(i)->ConvertIntoEntitiesL(this); - } - } - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::CNSmlFolderParser -// Constructor -// ----------------------------------------------------------------------------- -// -CNSmlFolderParser::CNSmlFolderParser() - : iCreated(Time::NullTTime()), iModified(Time::NullTTime()), - iAccessed(Time::NullTTime()) - { - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::ConstructL -// Second phase construction -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::ConstructL() - { - iExt = new (ELeave) CNSmlExtDataArray(3); - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::TNSmlSetFolderValues::TNSmlSetFolderValues -// ----------------------------------------------------------------------------- -// -CNSmlFolderParser::TNSmlSetFolderValues::TNSmlSetFolderValues() - { - Reset(); - } - -// ----------------------------------------------------------------------------- -// CNSmlFolderParser::TNSmlSetFolderValues::Reset -// ----------------------------------------------------------------------------- -// -void CNSmlFolderParser::TNSmlSetFolderValues::Reset() - { - iFolder = EFalse; - iName = EFalse; - iCreated = EFalse; - iModified = EFalse; - iAccessed = EFalse; - iAttributes = EFalse; - iAttributesH = EFalse; - iAttributesS = EFalse; - iAttributesA = EFalse; - iAttributesD = EFalse; - iAttributesW = EFalse; - iAttributesR = EFalse; - iAttributesX = EFalse; - iXNam = EFalse; - iRole = EFalse; - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/NSmlTruncatedData.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/NSmlTruncatedData.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,305 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - - -// INCLUDE FILES -#include -#include - -#include "nsmlxmlparser.h" - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlTruncatedData* CNSmlTruncatedData::NewL() - { - CNSmlTruncatedData* self = CNSmlTruncatedData::NewLC(); - CleanupStack::Pop(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlTruncatedData* CNSmlTruncatedData::NewLC() - { - CNSmlTruncatedData* self = new (ELeave) CNSmlTruncatedData(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::~CNSmlTruncatedData -// Destructor -// ----------------------------------------------------------------------------- -// -EXPORT_C CNSmlTruncatedData::~CNSmlTruncatedData() - { - iAttachments.ResetAndDestroy(); - iAttachments.Close(); - - iBodys.ResetAndDestroy(); - iBodys.Close(); - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::AddAttachmentL -// Adds an attachment to iAttachments. Takes copies of buffers, caller must -// destroy the original buffers. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlTruncatedData::AddAttachmentL(HBufC8* aName, TInt aSize, HBufC8* aType) - { - CNSmlAttachmentTruncateInfo* attach = new (ELeave) CNSmlAttachmentTruncateInfo(); - CleanupStack::PushL(attach); - - attach->SetMembersL(aName, aType, aSize); - - iAttachments.Append(attach); - - CleanupStack::Pop(); // attach - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::AddBodyL -// Adds a body. Takes copies of buffers, caller must destroy the -// original buffers. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlTruncatedData::AddBodyL(TInt aSize, HBufC8* aType) - { - CNSmlBodyTruncateInfo* body = new (ELeave) CNSmlBodyTruncateInfo(); - CleanupStack::PushL(body); - - body->SetMembersL(aType, aSize); - - iBodys.Append(body); - - CleanupStack::Pop(); // body - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::GenerateXmlL -// Generates truncate data xml -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlTruncatedData::GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser ) const - { - aParser->AppendElement(aXml, KTruncatedElement()); - - TInt size = 0; - HBufC8* type = 0; - HBufC8* name = 0; - - for ( TInt j = 0; j < iBodys.Count(); ++j ) - { - iBodys[j]->GetMembersL(type, size); - - aParser->AppendElement(aXml, KTruncatedBodyElement()); - - if ( size != KErrNotFound ) - { - aParser->AppendElement(aXml, KTruncatedSizeElement(), aParser->IntegerToString(size)); - } - - if ( type ) - { - aParser->AppendElement(aXml, KTruncatedTypeElement(), *type); - delete type; type = NULL; - } - - aParser->AppendEndElement(aXml, KTruncatedBodyElement()); - } - - for ( TInt i = 0; i < iAttachments.Count(); ++i ) - { - size = 0; - type = NULL; - name = NULL; - - iAttachments[i]->GetMembersL(name, type, size); - - aParser->AppendElement(aXml, KTruncatedAttachElement()); - - if ( name ) - { - aParser->AppendElement(aXml, KTruncatedNameElement(), *name); - delete name; name = NULL; - } - - if ( size != KErrNotFound ) - { - aParser->AppendElement(aXml, KTruncatedSizeElement(), aParser->IntegerToString(size)); - } - - if ( type ) - { - aParser->AppendElement(aXml, KTruncatedTypeElement(), *type); - delete type; type = NULL; - } - - aParser->AppendEndElement(aXml, KTruncatedAttachElement()); - } - - aParser->AppendEndElement(aXml, KTruncatedElement()); - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::CountXmlSizeL -// Counts the size of truncate data xml if it was generated using current values -// in member variables. -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CNSmlTruncatedData::CountXmlSizeL( const CNSmlXmlParser* aParser ) const - { - TInt size = 0; - size += aParser->SizeOfElements( KTruncatedElement() ); - - for ( TInt j = 0; j < iBodys.Count(); ++j ) - { - TInt bodySize = 0; - HBufC8* bodyType = 0; - iBodys[j]->GetMembersL(bodyType, bodySize); - - size += aParser->SizeOfElements( KTruncatedBodyElement() ); - - if ( bodySize != KErrNotFound ) - { - size += aParser->SizeOfInteger( KTruncatedSizeElement() ); - } - - if ( bodyType ) - { - size += aParser->SizeOfString( bodyType, KTruncatedTypeElement() ); - delete bodyType; bodyType = NULL; - } - - } - - for ( TInt i = 0; i < iAttachments.Count(); ++i ) - { - TInt attachSize = 0; - HBufC8* attachType = 0; - HBufC8* attachName = 0; - iAttachments[i]->GetMembersL(attachName, attachType, attachSize); - - size += aParser->SizeOfElements( KTruncatedAttachElement() ); - - if ( attachName ) - { - size += aParser->SizeOfString( attachName, KTruncatedNameElement() ); - delete attachName; attachName = NULL; - } - - if ( attachSize != KErrNotFound ) - { - size += aParser->SizeOfInteger( KTruncatedSizeElement() ); - } - - if ( attachType ) - { - size += aParser->SizeOfString( attachType, KTruncatedTypeElement() ); - delete attachType; attachType = NULL; - } - - } - - return size; - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::ConvertIntoEntitiesL -// Converts special characters in strings into entities. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CNSmlTruncatedData::ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ) - { - TInt size = 0; - HBufC8* type = NULL; - HBufC8* name = NULL; - - for ( TInt j = 0; j < iBodys.Count(); ++j ) - { - iBodys[j]->GetMembersL(type, size); - CleanupStack::PushL(type); - - if( type ) - aParser->CharactersToEntitiesL(type, 0, type->Length()); - - iBodys[j]->SetMembersL(type, size); - CleanupStack::Pop(); // type - delete type; type = NULL; - } - - for ( TInt i = 0; i < iAttachments.Count(); ++i ) - { - iAttachments[i]->GetMembersL(name, type, size); - CleanupStack::PushL(type); - CleanupStack::PushL(name); - - if( name ) - { - aParser->CharactersToEntitiesL(name, 0, name->Length()); - } - if( type ) - { - aParser->CharactersToEntitiesL(type, 0, type->Length()); - } - - iAttachments[i]->SetMembersL(name, type, size); - CleanupStack::Pop(2); // name, type - - delete name; name = NULL; - delete type; type = NULL; - } - - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::CNSmlTruncatedData -// Private constructor -// ----------------------------------------------------------------------------- -// -CNSmlTruncatedData::CNSmlTruncatedData() - { - } - -// ----------------------------------------------------------------------------- -// CNSmlTruncatedData::ConstructL -// Second phase construction -// ----------------------------------------------------------------------------- -// -void CNSmlTruncatedData::ConstructL() - { - iAttachments.Reset(); - iBodys.Reset(); - } - -// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/emailxmlutils/src/nsmlxmlparser.cpp --- a/omads/omadsextensions/dsutils/emailxmlutils/src/nsmlxmlparser.cpp Mon Nov 23 14:46:41 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,797 +0,0 @@ -/* -* Copyright (c) 2004 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: Sources -* -*/ - - -// 1.2 Changes: nsmlxmlparser module added - -// ------------------------------------------------------------------------------------------------ -// Includes -// ------------------------------------------------------------------------------------------------ -#include -#include -#include "nsmlxmlparser.h" - - -// ------------------------------------------------------------------------------------------------ -// -// CNSmlXmlParser methods -// -// ------------------------------------------------------------------------------------------------ - -// ------------------------------------------------------------------------------------------------ -// Constructor -// ------------------------------------------------------------------------------------------------ -EXPORT_C CNSmlXmlParser::CNSmlXmlParser() - { - } - - -// ------------------------------------------------------------------------------------------------ -// Destructor. -// ------------------------------------------------------------------------------------------------ -EXPORT_C CNSmlXmlParser::~CNSmlXmlParser() - { - if( iBuffer ) delete iBuffer; - if ( iCompleteBuffer ) delete iCompleteBuffer; - } - - -// ------------------------------------------------------------------------------------------------ -// Parses the given string for cdata areas and entitys. If a cdata area is -// found, the data in it is skipped over. The entities outside cdata are converted -// into characters they represent (but only if cdata is found). -// Note: This method is intended for processing the CDATA used right after . -// I.e. this method removes the cdata-elements used for wrapping the whole xml data -// and processes the string so that the inner cdatas used in the xml become valid. -// THIS METHOD SHOULD BE CALLED RIGHT IN THE BEGINNING OF PARSING IF -BLOCK -// IS WRAPPED WITHIN CDATA. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::PreProcessL( HBufC8* aXml ) const - { - // take a modifiable pointer - TPtr8 xml = aXml->Des(); - - // the string used for searching and moving in the string - TPtrC8 searchString(*aXml); - - // the current position in the original string - TInt searchStartPos = 0; - - // find the first cdata start - TInt cdataStartPos = searchString.Find(KCDataStart); - - // If CDATA is not found from beginning then data is not inside CDATA and then - // preprocessing is not needed - if ( cdataStartPos != 0 ) - { - return; - } - - TInt cdataEndPos = KErrNotFound; - - // while cdata is found - while ( cdataStartPos != KErrNotFound ) - { - cdataStartPos += searchStartPos; - - // find an end of cdata before entities are converted - cdataEndPos = searchString.Find(KCDataEnd); - - // convert entities between search start and cdata start - TInt entityChange = EntitiesToCharactersL(aXml, searchStartPos, cdataStartPos); - xml.Set(aXml->Des()); - cdataStartPos += entityChange; - - if ( cdataEndPos != KErrNotFound ) - { - cdataEndPos += entityChange; - cdataEndPos += searchStartPos; - - // if the end is before start -> error - if (cdataEndPos < cdataStartPos) - User::Leave( EInvalidCDataStructure ); - - // remove cdata end - xml.Delete(cdataEndPos, KCDataEnd().Length()); - // remove cdata start - xml.Delete(cdataStartPos, KCDataStart().Length()); - - searchStartPos = cdataEndPos - KCDataStart().Length(); - searchString.Set( xml.Right(xml.Length() - searchStartPos) ); - } - else - { - // the end of cdata was not found or cdata end was before start -> error - User::Leave( EInvalidCDataStructure ); - } - - // find a new cdata start that is after the found end - cdataStartPos = searchString.Find(KCDataStart); - - } - - } - - -// ------------------------------------------------------------------------------------------------ -// Return the TNSmlBoolean-value's string-representation. -// ------------------------------------------------------------------------------------------------ -TPtrC8 CNSmlXmlParser::BooleanToString( const TNSmlBoolean aValue ) const - { - TPtrC8 str; - switch(aValue) - { - case EBooleanTrue: - { - str.Set(KStringTrue); - break; - } - case EBooleanFalse: - { - str.Set(KStringFalse); - break; - } - default: - { - str.Set(KStringEmpty); - } - } - - return str; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the TTime-value's string-representation. -// ------------------------------------------------------------------------------------------------ -TBuf8 CNSmlXmlParser::DateTimeToStringL( const TTime& aValue ) const - { - TBuf str; - - // aValue is not changed but Z character is added to the end of string. - // Messaging uses UTC times and that is reason why time is not changed. - aValue.FormatL( str, _L("%F%Y%M%DT%H%T%SZ") ); - - // from 16-bit to 8-bit - TBuf8 dt; - dt.Copy(str); - - return dt; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the integer value's string-representation. -// ------------------------------------------------------------------------------------------------ -TBuf8 CNSmlXmlParser::IntegerToString( const TInt aValue ) const - { - TBuf8 str; - str.AppendNum(aValue); - return str; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the boolean representation of the string or leaves if error (EInvalidBooleanValue). -// ------------------------------------------------------------------------------------------------ -TNSmlBoolean CNSmlXmlParser::StringToBooleanL( const TPtrC8& aValue ) const - { - if( aValue == KStringTrue ) - return EBooleanTrue; - else if( aValue == KStringFalse || aValue == KStringEmpty ) - return EBooleanFalse; - else - User::Leave(EInvalidBooleanValue); - - return EBooleanMissing; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the integer representation of the string or leaves if error (EInvalidIntegerValue). -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::StringToIntegerL( const TPtrC8& aValue ) const - { - if (aValue.Length() <= 0) - return 0; - - // convert the data to an integer - TLex8 lex(aValue); - TUint uValue = 0; - TBool isNegative = EFalse; - - TChar c = lex.Peek(); - - // check for a minus or plus sign - if ( c == '-' ) - { - isNegative = ETrue; - lex.Inc(); - } - else if ( c == '+' ) - { - lex.Inc(); - } - - TRadix radix = EDecimal; - c = lex.Peek(); - - if (c == '0') // octal or hex - { - lex.Get(); - c = lex.Get(); - if ( c == 'x' || c == 'X' ) - { - radix = EHex; - } - else - { - radix = EOctal; - lex.UnGet(); // back up - } - } - - TInt err = lex.Val(uValue, radix); - if ( err != KErrNone ) - User::Leave(EInvalidIntegerValue); - - TInt value = uValue; - - return isNegative ? value*(-1) : value; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the TTime representation of the string or leaves if error (EInvalidDatetimeValue). -// UTC times are not supported, i.e. datetimes that have Z-ending are treated as -// local times. -// ------------------------------------------------------------------------------------------------ -TTime CNSmlXmlParser::StringToTTimeL( TPtrC8& aValue ) const - { - // check that there is data - if (aValue.Length() <= 0) - User::Leave( EInvalidDatetimeValue ); - - // format the data into a TTime - - if (aValue[aValue.Length()-1] == 'Z') - { - // The datetime is in UTC, which is not supported - // no correction done, treat as local time - aValue.Set( aValue.Left( aValue.Length()-1 ) ); - } - - TDateTime datetime(0,(TMonth)0,0,0,0,0,0); - - // read datetime and check errors - - TInt error = KErrNone; - - // read year - TPtrC8 str = aValue.Left(4); - TLex8 lex(str); - TInt value; - error = lex.Val(value); - CheckDatetimeErrorL( error ); - error = datetime.SetYear(value); - CheckDatetimeErrorL( error ); - - // read month - str.Set(aValue.Mid(4, 2)); - lex.Assign(str); - error = lex.Val(value); - CheckDatetimeErrorL( error ); - --value; - error = datetime.SetMonth((TMonth)value); - CheckDatetimeErrorL( error ); - - // read day - str.Set(aValue.Mid(6, 2)); - lex.Assign(str); - error = lex.Val(value); - CheckDatetimeErrorL( error ); - --value; - error = datetime.SetDay(value); - CheckDatetimeErrorL( error ); - - // Skip character 'T' and read hour - str.Set(aValue.Mid(9, 2)); - lex.Assign(str); - error = lex.Val(value); - CheckDatetimeErrorL( error ); - error = datetime.SetHour(value); - CheckDatetimeErrorL( error ); - - // minutes - str.Set(aValue.Mid(11, 2)); - lex.Assign(str); - error = lex.Val(value); - CheckDatetimeErrorL( error ); - error = datetime.SetMinute(value); - CheckDatetimeErrorL( error ); - - // seconds - str.Set(aValue.Mid(13, 2)); - lex.Assign(str); - error = lex.Val(value); - CheckDatetimeErrorL( error ); - error = datetime.SetSecond(value); - CheckDatetimeErrorL( error ); - - return TTime(datetime); - } - - -// ------------------------------------------------------------------------------------------------ -// Adds start element, the value and end element to aPtr. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::AppendElement( TPtr8& aPtr, const TDesC8& aElementName, const TDesC8& aValue ) const - { - // start element - aPtr.Append(KElementStart); - aPtr.Append(aElementName); - aPtr.Append(KElementEnd); - - // value - aPtr.Append(aValue); - - // end element - aPtr.Append(KElementStart); - aPtr.Append(KCharacterSlash); - aPtr.Append(aElementName); - aPtr.Append(KElementEnd); - } - - -// ------------------------------------------------------------------------------------------------ -// Forms an element using the given element name and appends it to the given string. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::AppendElement( TPtr8& aPtr, const TDesC8& aElementName ) const - { - aPtr.Append(KElementStart); - aPtr.Append(aElementName); - aPtr.Append(KElementEnd); - } - - -// ------------------------------------------------------------------------------------------------ -// Forms an end element using the given element name and appends it to the given string. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::AppendEndElement( TPtr8& aPtr, const TDesC8& aElementName ) const - { - aPtr.Append(KElementStart); - aPtr.Append(KCharacterSlash); - aPtr.Append(aElementName); - aPtr.Append(KElementEnd); - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the total length of start and end tag. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::SizeOfElements( const TDesC8& aElementName ) const - { - TInt size = 0; - - // start element plus end element ( 1 = length of '/' char ) - size += 2*aElementName.Length() + 1; - size += 2*KElementStartEndWidth; // '<' and '>' - - return size; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the length of the given boolean element and it's data if it was a string. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::SizeOfBoolean( const TNSmlBoolean aValue, const TDesC8& aElementName ) const - { - TInt size = 0; - size += SizeOfElements( aElementName ); - switch ( aValue ) - { - case EBooleanTrue: - return size+4; // "true" - case EBooleanFalse: - return size+5; // "false" - default: - return 0; - } - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the length of the given datetime element and it's data if it was a string. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::SizeOfDatetime( const TDesC8& aElementName ) const - { - TInt size = SizeOfElements( aElementName ) + KDateTimeLength; - return size; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the maximum length of the given integer element and it's data if it was a string. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::SizeOfInteger( const TDesC8& aElementName ) const - { - TInt size = SizeOfElements( aElementName ) + KIntegerMaxLength; - return size; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns the length of the given string element and it's data if it was a string. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::SizeOfString( const HBufC8* aValue, const TDesC8& aElementName ) const - { - TInt size = SizeOfElements( aElementName ) + aValue->Length(); - return size; - } - - -// ------------------------------------------------------------------------------------------------ -// Finds entities and replaces them with the characters they represent. Returns -// an integer indicating the size change in aXml. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::EntitiesToCharactersL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const - { - TInt change = 0; - TInt changeSum = 0; - - change = ReplaceL(aXml, KEntityLT, KLessThan, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KEntityGT, KGreaterThan, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KEntityAMP, KAmpersand, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KEntityAPOS, KApostrophe, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KEntityQUOT, KQuotation, aStartPos, aEndPos); - changeSum += change; - - return changeSum; - } - - -// ------------------------------------------------------------------------------------------------ -// Finds special characters and replaces them with corresponding entities. Returns -// an integer indicating the size change in aXml. -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::CharactersToEntitiesL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const - { - TInt change = 0; - TInt changeSum = 0; - - // Note: this replace has to be the first one, since it changes - // &-characters to &s and all the other replaces generate - // &-characters as they are entities. - change = ReplaceL(aXml, KAmpersand, KEntityAMP, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KLessThan, KEntityLT, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KGreaterThan, KEntityGT, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KApostrophe, KEntityAPOS, aStartPos, aEndPos); - changeSum += change; - aEndPos += change; - - change = ReplaceL(aXml, KQuotation, KEntityQUOT, aStartPos, aEndPos); - changeSum += change; - - return changeSum; - } - - -// ------------------------------------------------------------------------------------------------ -// Returns ETrue if all the characters in the given text are whitespace -// characters, else EFalse. -// ------------------------------------------------------------------------------------------------ -TBool CNSmlXmlParser::IsWhitespace( const TDesC8& aText ) const - { - // loop the string character by character - TText c; - for ( TInt i=0; i < aText.Length(); ++i ) - { - c = aText[i]; - switch( c ) - { - case KWhitespaceEmpty: - break; - case KWhitespaceLineFeed: - break; - case KWhitespaceNewLine: - break; - case KWhitespaceTabular: - break; - case KWhitespaceLineFeedNewLine: - break; - default: - return EFalse; - } - } - - return ETrue; - } - - -// ------------------------------------------------------------------------------------------------ -// Leaves with EInvalidXmlError if the given string is not whitespace. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::LeaveIfNotWhiteSpaceL( const TDesC8& aText ) const - { - if ( !IsWhitespace( aText ) ) - { - User::Leave( EInvalidXmlError ); - } - } - - -// ------------------------------------------------------------------------------------------------ -// Maps the given value to TNSmlParserGeneratorError. -// ------------------------------------------------------------------------------------------------ -TNSmlParserGeneratorError CNSmlXmlParser::CheckError( const TInt error ) const - { - if ( error == KErrNoMemory ) - { - return EOutOfMemory; - } - else if ( error < KErrNone ) - { - // some system wide error, should not occur - return EUnknownError; - } - else if ( error != EErrorNone ) - { - return (TNSmlParserGeneratorError)error; - } - - return EErrorNone; - } - - -// ------------------------------------------------------------------------------------------------ -// Parses the given xml and calls NextDataL and NextElementL methods when finds -// data or element. -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::ParseL( TPtrC8& aXml ) - { - - ResetBufferL(iBuffer); - ResetBufferL(iCompleteBuffer); - - // boolean indicating if reading element name (true) or insides of - // an element (false) - TBool readingElementName = EFalse; - TText c; - - for( TInt i=0; i < aXml.Length(); ++i ) - { - c = aXml[i]; - switch(c) - { - case KElementStart: - // if currently reading element, error - if( readingElementName ) - { - User::Leave(EInvalidXmlError); - } - - if( aXml.Length()-i >= KCDataStart().Length() && - !aXml.Mid(i, KCDataStart().Length()).Compare(KCDataStart()) ) - { // cdata - aXml.Set( aXml.Right( aXml.Length() - i ) ); - TInt endPos = aXml.Find(KCDataEnd); - - TPtrC8 cdata = _L8(""); - if ( endPos == KErrNotFound ) - { - User::Leave(EInvalidCDataStructure); - } - - cdata.Set( aXml.Mid( KCDataStart().Length(), endPos - KCDataStart().Length() ) ); - aXml.Set( aXml.Right( aXml.Length() - endPos - KCDataEnd().Length() ) ); - - i = -1; - - // add current buffer to complete buffer - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - ResetBufferL(iBuffer); - AddToCompleteL(cdata); - } -#ifndef __NO_XML_COMMENTS_ - else if( aXml.Length()-i >= KCommentStart().Length() && - !aXml.Mid(i, KCommentStart().Length()).Compare(KCommentStart()) ) - { // comment - aXml.Set( aXml.Right( aXml.Length() - i ) ); - TInt endPos = aXml.Find(KCommentEnd); - - if ( endPos != KErrNotFound ) - { - aXml.Set( aXml.Right( aXml.Length() - endPos - KCommentEnd().Length() ) ); - } - else - { - User::Leave(EInvalidXmlError); - } - - i = -1; - } -#endif - else - { - // send the buffer - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - NextDataL(*iCompleteBuffer); - ResetBufferL(iBuffer); - ResetBufferL(iCompleteBuffer); - readingElementName = ETrue; - } - - break; - case KElementEnd: - // stop reading element name - if( !readingElementName ) - { - User::Leave(EInvalidXmlError); - } - else - { - NextElementL(*iBuffer); - ResetBufferL(iBuffer); - readingElementName = EFalse; - } - break; - default: - // add char to buffer - AddToBufferL(c, iBuffer); - break; - } - } - - EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); - AddToCompleteL(*iBuffer); - NextDataL(*iCompleteBuffer); - } - - -// ------------------------------------------------------------------------------------------------ -// Adds the given string to iCompleteBuffer -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::AddToCompleteL( const TPtrC8 aStr ) - { - if(!iCompleteBuffer) - { - iCompleteBuffer = HBufC8::NewL(aStr.Length()); - } - - TPtr8 ptr = iCompleteBuffer->Des(); - if( ptr.MaxLength() < iCompleteBuffer->Length()+aStr.Length() ) - { - iCompleteBuffer = iCompleteBuffer->ReAllocL(iCompleteBuffer->Length()+aStr.Length()); - ptr.Set(iCompleteBuffer->Des()); - } - - ptr.Append(aStr); - } - - -// ------------------------------------------------------------------------------------------------ -// Deletes the given buffer and initializes it again to length 10 -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::ResetBufferL( HBufC8*& aBuf ) const - { - if( aBuf ) - { - delete aBuf; - aBuf = NULL; - } - - aBuf = HBufC8::NewL(10); - } - - -// ------------------------------------------------------------------------------------------------ -// Adds the given char to given buffer -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::AddToBufferL( const TText c, HBufC8*& aBuf ) const - { - TPtr8 ptr = aBuf->Des(); - if( ptr.MaxLength() == aBuf->Length()+1 ) - { - aBuf = aBuf->ReAllocL(aBuf->Length()+10); - ptr.Set(aBuf->Des()); - } - - TChar str = c; - ptr.Append(str); - } - - - -// ------------------------------------------------------------------------------------------------ -// Replaces all occurances of aTarget in aText with aItem. Returns an integer indicating -// the size change in aText. aStartPos and aEndPos indicate the start and end positions -// of aText to be parsed (if whole string should be parsed, use 0 and aText.Length()). -// ------------------------------------------------------------------------------------------------ -TInt CNSmlXmlParser::ReplaceL( HBufC8*& aText, const TDesC8& aTarget, const TDesC8& aItem, TInt aStartPos, TInt aEndPos ) const - { - TInt change = 0; - TInt searchPos = aStartPos; - TPtrC8 text = aText->Mid(aStartPos, aEndPos-aStartPos); - TInt pos = text.Find(aTarget); - - while ( pos != KErrNotFound ) - { - pos += searchPos; - - TInt currentChange = aItem.Length() - aTarget.Length(); - change += currentChange; - aEndPos += currentChange; - searchPos = pos; - - if ( currentChange > 0 ) - { - searchPos += currentChange; - - // check that aText is large enough - if ( aText->Des().MaxLength() < aText->Length()+currentChange ) - { - aText = aText->ReAllocL(aText->Length()+currentChange); - } - } - - // the actual replace - aText->Des().Replace(pos, aTarget.Length(), aItem); - - text.Set( aText->Mid(searchPos, aEndPos-searchPos) ); - pos = text.Find(aTarget); - } - - return change; - } - - -// ------------------------------------------------------------------------------------------------ -// -// ------------------------------------------------------------------------------------------------ -void CNSmlXmlParser::CheckDatetimeErrorL( const TInt error ) const - { - if ( error != KErrNone ) - { - User::Leave( EInvalidDatetimeValue ); - } - } - -//End of File - diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,19 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +PRJ_MMPFILES +nsmldefaultagendahandler.mmp \ No newline at end of file diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/def/bwinscwnsmldefaultagendahandleru.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/def/bwinscwnsmldefaultagendahandleru.DEF Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,4 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ?NewL@CNSmlDefaultAgendaHandlerPlugin@@SAPAV1@XZ @ 2 NONAME ; class CNSmlDefaultAgendaHandlerPlugin * CNSmlDefaultAgendaHandlerPlugin::NewL(void) + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/def/eabinsmldefaultagendahandleru.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/def/eabinsmldefaultagendahandleru.DEF Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,8 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZN31CNSmlDefaultAgendaHandlerPlugin4NewLEv @ 2 NONAME + _ZTI29CNSmlDefaultAgendaHandlerUtil @ 3 NONAME + _ZTI31CNSmlDefaultAgendaHandlerPlugin @ 4 NONAME + _ZTV29CNSmlDefaultAgendaHandlerUtil @ 5 NONAME + _ZTV31CNSmlDefaultAgendaHandlerPlugin @ 6 NONAME + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/nsmldefaultagendahandler.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/bld/nsmldefaultagendahandler.mmp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2006-2007 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: +* +*/ + +#include +#include +#include + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +TARGET nsmldefaultagendahandler.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x20029F16 + +START RESOURCE ../data/nsmldefaultagendahandler.rss +TARGET nsmldefaultagendahandler.rsc +END + +START RESOURCE ../data/nsmldefaultagendahandler_1_2.rss +HEADER +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END + +SOURCEPATH ../src +SOURCE nsmldefaultagendahandlerutil.cpp +SOURCE nsmldefaultagendahandlerplugin.cpp + +USERINCLUDE ../inc +USERINCLUDE ../loc + +SYSTEMINCLUDE /epoc32/include/ecom + +APP_LAYER_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY eCom.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY flogger.lib +LIBRARY bafl.lib +LIBRARY charconv.lib +LIBRARY centralrepository.lib +LIBRARY eikcore.lib +LIBRARY cone.lib +LIBRARY CommonEngine.lib +LIBRARY calinterimapi.lib +LIBRARY calencommonutils.lib +LIBRARY nsmlfolderparser.lib +LIBRARY gdi.lib +LIBRARY smlstoreformat.lib +LIBRARY nsmlchangefinder.lib + +#if defined(ARMCC) +DEFFILE ./def/eabinsmldefaultagendahandler.DEF +#elif defined(WINSCW) +DEFFILE ./def/bwinscwnsmldefaultagendahandler.DEF +#endif \ No newline at end of file diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/data/nsmldefaultagendahandler.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/data/nsmldefaultagendahandler.rss Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2007 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: +* +*/ + +#include +#include "nsmldefaultagendahandler.loc" + +RESOURCE REGISTRY_INFO theInfo +{ + // UID for the DLL + dll_uid = 0x20029F16; + + // Declare array of interface info + interfaces = + { + INTERFACE_INFO + { + + // UID of interface that is implemented + interface_uid = 0x20029F14; + + implementations = + { + + // Info for all implementations + IMPLEMENTATION_INFO + { + implementation_uid = 0x20029F16; + version_no = 1; + display_name = ""; + default_data = ""; + opaque_data = qtn_nsml_default_agenda_handler_opaque_name; + } + + }; + } + }; +} + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/data/nsmldefaultagendahandler_1_2.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/data/nsmldefaultagendahandler_1_2.rss Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,902 @@ +CHARACTER_SET UTF8/* +* Copyright (c) 2005 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: Resource data for DS agenda adapter +* +*/ + + +#include +#include +#include + +RESOURCE SML_DATA_STORE_FORMAT nsml_default_agenda_handler + { + version=1; + display_name="Calendar"; + sync_types=KSmlSyncType_TwoWay+KSmlSyncType_OneWayFromSvr+ + KSmlSyncType_OneWayFromClnt+KSmlSyncType_SlowSync+ + KSmlSyncType_RefreshFromSvr+KSmlSyncType_RefreshFromClnt; + mime_format= + { + SML_MIME_FORMAT + { + version=1; + mime_type="text/x-vcalendar"; + mime_ver="1.0"; + properties= + { + SML_DATA_PROPERTY + { + version=1; + display_name="Begin"; + name="BEGIN"; + data_type=""; + enum_values={"VCALENDAR","VEVENT","VTODO"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="End"; + name="END"; + data_type=""; + enum_values={"VCALENDAR","VEVENT","VTODO"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Version"; + name="VERSION"; + data_type=""; + enum_values={"1.0"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Uid"; + name="UID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Summary"; + name="SUMMARY"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Description"; + name="DESCRIPTION"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Dstart"; + name="DTSTART"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Dtend"; + name="DTEND"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Aalarm"; + name="AALARM"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params= { + SML_DATA_PROPERTY_PARAM + { + version=1; + display_name="Alarm type"; + name="TYPE"; + data_type=""; + enum_values={}; + } + }; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Class"; + name="CLASS"; + data_type=""; + enum_values={"PUBLIC","PRIVATE","CONFIDENTIAL"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Location"; + name="LOCATION"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Last Modified"; + name="LAST-MODIFIED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Priority"; + name="PRIORITY"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Status"; + name="STATUS"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Rrule"; + name="RRULE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Completed"; + name="COMPLETED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Dcreated"; + name="DCREATED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Due"; + name="DUE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="ExDate"; + name="EXDATE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Categories"; + name="CATEGORIES"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Sequence"; + name="SEQUENCE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="TZ"; + name="TZ"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Daylight"; + name="DAYLIGHT"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="RDate"; + name="RDATE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Attendee"; + name="ATTENDEE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params= { + SML_DATA_PROPERTY_PARAM + { + version=1; + display_name="Type"; + name="TYPE"; + data_type=""; + enum_values={"ROLE", "STATUS", "X-CN", "X-ROLE", "X-SENTBY", "X-STATUS"}; + } + }; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Recurrence"; + name="X-RECURRENCE-ID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Method"; + name="X-METHOD"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Local UID"; + name="X-SYMBIAN-LUID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Time stamp"; + name="X-SYMBIAN-DTSTAMP"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="X-Epoc Agenda Entry Type"; + name="X-EPOCAGENDAENTRYTYPE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="GEO Address"; + name="GEO"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + } + }; + field_level=0; + } +#ifdef __NSML_USE_ICAL_FEATURE + , + SML_MIME_FORMAT + { + version=1; + mime_type="text/calendar"; + mime_ver="2.0"; + properties= + { + SML_DATA_PROPERTY + { + version=1; + display_name="Begin"; + name="BEGIN"; + data_type=""; + enum_values={"VCALENDAR","VEVENT","VTODO","STANDARD","DAYLIGHT","VTIMEZONE","VALARM"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="End"; + name="END"; + data_type=""; + enum_values={"VCALENDAR","VEVENT","VTODO","STANDARD","DAYLIGHT","VTIMEZONE","VALARM"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Version"; + name="VERSION"; + data_type=""; + enum_values={"2.0"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Uid"; + name="UID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Summary"; + name="SUMMARY"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Description"; + name="DESCRIPTION"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Dstart"; + name="DTSTART"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Dtend"; + name="DTEND"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Aalarm"; + name="AALARM"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params= { + SML_DATA_PROPERTY_PARAM + { + version=1; + display_name="Alarm type"; + name="TYPE"; + data_type=""; + enum_values={}; + } + }; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Class"; + name="CLASS"; + data_type=""; + enum_values={"PUBLIC","PRIVATE","CONFIDENTIAL"}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Location"; + name="LOCATION"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Last Modified"; + name="LAST-MODIFIED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Priority"; + name="PRIORITY"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Status"; + name="STATUS"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Recurrence-Id"; + name="RECURRENCE-ID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Rrule"; + name="RRULE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Sequence"; + name="SEQUENCE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Method"; + name="METHOD"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="ATTENDEE"; + name="ATTENDEE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Categories"; + name="CATEGORIES"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Organizer"; + name="ORGANIZER"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Time stamp"; + name="DTSTAMP"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Completed"; + name="COMPLETED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Created"; + name="CREATED"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="ExDate"; + name="EXDATE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="RDate"; + name="RDATE"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Product ID"; + name="PRODID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Timezone ID"; + name="TZID"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Timezone OFFSET from"; + name="TZOFFSETFROM"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Timezone OFFSET to"; + name="TZOFFSETTO"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Alarm action"; + name="ACTION"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="Alarm trigger"; + name="TRIGGER"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + }, + SML_DATA_PROPERTY + { + version=1; + display_name="GEO Address"; + name="GEO"; + data_type=""; + enum_values={}; + flags=0; + max_size=256; + max_occur=0; + params={}; + } + }; + field_level=0; + } +#endif // __NSML_USE_ICAL_FEATURE + }; +#ifdef __NSML_USE_ICAL_FEATURE + mime_format_tx_pref=1; // Preferred index for tx + mime_format_rx_pref=1; // Preferred index for rx +#else // __NSML_USE_ICAL_FEATURE + mime_format_tx_pref=0; // Preferred index for tx + mime_format_rx_pref=0; // Preferred index for rx +#endif // __NSML_USE_ICAL_FEATURE + folder_properties={ + SML_DATA_PROPERTY + { + version = 1; + display_name = "Name"; + name = "NAME"; + data_type = "text"; + enum_values = {}; + flags = 0; + max_size = 256; + max_occur = 1; + params = {}; + }, + SML_DATA_PROPERTY + { + version = 1; + display_name = "Created"; + name = "CREATED"; + data_type = "datetime"; + enum_values = {}; + flags = 0; + max_size = 256; + max_occur = 1; + params = {}; + }, + SML_DATA_PROPERTY + { + version = 1; + display_name = "Modified"; + name = "MODIFIED"; + data_type = "datetime"; + enum_values = {}; + flags = 0; + max_size = 256; + max_occur = 1; + params = {}; + } + }; + filter_capabilities={}; + max_size=0; // no limit + max_items=0; // no limit + flags = KSmlDataStore_Hierarchical; // Hierarchical + } + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerdebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerdebug.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2005 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: Debug macros definition and constant declaration +* +*/ + + + +#ifndef NSML_DEFAULTAGENDAHANDLER_DEBUG_H +#define NSML_DEFAULTAGENDAHANDLER_DEBUG_H + +#include +#include +#include +#include + +_LIT(KLogFile,"DefaultAgendaHandler.txt"); +_LIT(KLogDirFullName,"c:\\logs\\"); +_LIT(KLogDir,"MultiCalDB"); + +// Declare the FPrint function +inline void FPrint(const TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + } + +// =========================================================================== +#ifdef __WINS__ // File logging for WINS +// =========================================================================== +#define FLOG(arg...) { FPrint(arg); } +//#define FLOG(a) { RDebug::Print(a); } +#define FTRACE(a) { a; } +// =========================================================================== +#else // RDebug logging for target HW +// =========================================================================== +//#define FLOG(arg...) { RDebug::Print(arg); } +#define FLOG(arg...) { FPrint(arg); } +#define FTRACE(a) { a; } +#endif //__WINS__ + +// =========================================================================== +#else // // No loggings --> Reduced binary size +// =========================================================================== +#define FLOG(arg...) +#define FTRACE(a) + +#endif // NSML_DEFAULTAGENDAHANDLER_DEBUG_H + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerplugin.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,118 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#ifndef C_NSML_DEFAULTAGENDAHANDLER_PLUGIN_H +#define C_NSML_DEFAULTAGENDAHANDLER_PLUGIN_H + +#include +#include +#include +#include + +// CONSTANTS +_LIT( KNSmlDefaultAgendaHandlerRsc_1_2,"z:NSMLDEFAULTAGENDAHANDLER_1_2.RSC" ); +const TUid KCRUidNSmlDSApp = { 0x101F9A1D }; +const TInt KArrayGranularity = 30; + +_LIT8( KNSmlDataObjectCREATED, "CREATED" ); +_LIT8( KNSmlDataObjectNAME, "NAME" ); +_LIT8( KNSmlDataObjectMODIFIED, "MODIFIED" ); + +struct TNSmlServerSupportsForFolder + { + TBool iSSName; + TBool iSSCreated; + TBool iSSModified; + }; + +// FORWARD DECLARATIONS +class CNSmlDefaultAgendaHandlerUtil; +class CCalSession; + +/** + * This class represents the Adapter Object plugin + * It is used by ECoM client to initialize calendar notifier + * + * @lib nsmloviagendaadapter.lib + */ +class CNSmlDefaultAgendaHandlerPlugin: public CNSmlAgendaAdapterHandler + { +public: + /** + * Two phase construction + */ + IMPORT_C static CNSmlDefaultAgendaHandlerPlugin* NewL(); + + /** + * Destructor + */ + ~CNSmlDefaultAgendaHandlerPlugin(); + +private: + /** + * C++ constructor - not exported; + * implicitly called from NewLC() + */ + CNSmlDefaultAgendaHandlerPlugin::CNSmlDefaultAgendaHandlerPlugin(); + + void ConstructL(); + + /** + * Inherited from CAgendaAdapterHandler + * + * @param + */ + void CheckServerSupportForFolder( const CSmlDataStoreFormat& aServerDataStoreFormat ); + + void FetchFolderL( const TSmlDbItemUid aUid, RBufWriteStream& aStream ); + + void SynchronizableCalendarIdsL( CArrayFixFlat* aFolderUidArray ); + + TCalLocalUid CreateFolderL( RBufReadStream& aStream ); + + void ReplaceFolderL( const TCalLocalUid& aUid, RBufReadStream& aStream, TBool& aSyncStatus ); + + HBufC* FolderNameL( TSmlDbItemUid aUid ); + + CSmlDataStoreFormat* StoreFormatL( RStringPool& aStringPool ); + + TInt DeviceSyncOwner(); + + TBool FolderSyncStatusL( TSmlDbItemUid aUid ); + + TBool FolderSyncStatusL( HBufC* aFolderName ); + + TNSmlSnapshotItem CreateFolderSnapShotItemL( const TCalLocalUid& aUid ); + +public: + + void SynchronizableCalEntryIdsL( CCalSession* aCalSession, TCalLocalUid aUId, RArray& aUidArray ); + + + CNSmlDefaultAgendaHandlerUtil* CalendarInfoL( TSmlDbItemUid aUid ); + + CNSmlDefaultAgendaHandlerUtil* ParseFolderDataL( RBufReadStream& aStream ); + +public: + +private: + + TNSmlServerSupportsForFolder iServerSupportsForFolder; + + }; + +# endif // C_NSML_DEFAULTAGENDAHANDLER_PLUGIN_H diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerutil.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/inc/nsmldefaultagendahandlerutil.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#ifndef C_NSML_DEFAULTAGENDAHANDLER_UTIL_H +#define C_NSML_DEFAULTAGENDAHANDLER_UTIL_H + +#include +#include +#include + +/** + * + * + * + * @lib NSmlDefaultAgendaHandler.lib + */ +class CNSmlDefaultAgendaHandlerUtil : public CBase + { + public: + /** + * Two-phased constructor. + */ + static CNSmlDefaultAgendaHandlerUtil* NewL(); + + /** + * Destructor. + */ + virtual ~CNSmlDefaultAgendaHandlerUtil(); + + public: // New Functions + + private: + /** + * C++ default constructor. + */ + CNSmlDefaultAgendaHandlerUtil(); + + public: // Data + HBufC* iFileName; + HBufC* iName; + TBool iEnabled; + TBool iSyncStatus; + TTime iCreated; + TTime iModified; + }; + +#endif // C_NSML_DEFAULTAGENDAHANDLER_UTIL_H diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/loc/nsmldefaultagendahandler.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/loc/nsmldefaultagendahandler.loc Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,24 @@ +/* +* Copyright (c) 2005 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: loc file for DS agenda adapter +* +*/ + + +//d:Display name for registry info +//l:list_setting_pane_t1 +// +#define qtn_nsml_default_agenda_handler_opaque_name "Default" + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/src/nsmldefaultagendahandlerplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/src/nsmldefaultagendahandlerplugin.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,794 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsmldefaultagendahandlerplugin.h" +#include "nsmldefaultagendahandlerutil.h" +#include "nsmldefaultagendahandlerdebug.h" + + + +// CONSTANTS +const TInt KBuffLength = 128; + +// ---------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::NewL +// Two Phase Construction +// ---------------------------------------------------------------------------- +EXPORT_C CNSmlDefaultAgendaHandlerPlugin* CNSmlDefaultAgendaHandlerPlugin::NewL() + { + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::NewL, BEGIN")); + + CNSmlDefaultAgendaHandlerPlugin* self = new ( ELeave ) CNSmlDefaultAgendaHandlerPlugin(); + self->ConstructL(); + + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::NewL, END")); + return self; + } + +// ---------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::~CNSmlDefaultAgendaHandlerPlugin +// Destructor +// ---------------------------------------------------------------------------- +CNSmlDefaultAgendaHandlerPlugin::~CNSmlDefaultAgendaHandlerPlugin() + { + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::~CNSmlDefaultAgendaHandlerPlugin, BEGIN")); + + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::~CNSmlDefaultAgendaHandlerPlugin, END")); + } + +// ---------------------------------------------------------------------------- +// C++ constructor - not exported; +// implicitly called from NewL() +// ---------------------------------------------------------------------------- +CNSmlDefaultAgendaHandlerPlugin::CNSmlDefaultAgendaHandlerPlugin() + { + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::CNSmlDefaultAgendaHandlerPlugin, BEGIN")); + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::CNSmlDefaultAgendaHandlerPlugin, END")); + } + +// ---------------------------------------------------------------------------- +// 2nd phase constructor +// ---------------------------------------------------------------------------- +void CNSmlDefaultAgendaHandlerPlugin::ConstructL() + { + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::ConstructL, BEGIN")); + + // Initialize server supports for folder + iServerSupportsForFolder.iSSName = EFalse; + iServerSupportsForFolder.iSSCreated = EFalse; + iServerSupportsForFolder.iSSModified = EFalse; + + FLOG( _L("CNSmlDefaultAgendaHandlerPlugin::ConstructL, END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder +// Method to check if needed properties are supported by remote server. +// ----------------------------------------------------------------------------- +void CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder( const CSmlDataStoreFormat& aServerDataStoreFormat ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder: BEGIN")); + + iServerSupportsForFolder.iSSName = EFalse; + iServerSupportsForFolder.iSSCreated = EFalse; + iServerSupportsForFolder.iSSModified = EFalse; + + if ( aServerDataStoreFormat.FolderPropertyCount() == 0 ) + { + // Server has no restricition on folder property + iServerSupportsForFolder.iSSName = ETrue; + iServerSupportsForFolder.iSSCreated = ETrue; + iServerSupportsForFolder.iSSModified = ETrue; + return; + } + else + { + for ( TInt i = 0; + i < aServerDataStoreFormat.FolderPropertyCount(); + i++ ) + { + if ( aServerDataStoreFormat.FolderProperty( i ).Field().Name().DesC().Compare( KNSmlDataObjectNAME ) == 0 ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder: Supports NAME Property")); + iServerSupportsForFolder.iSSName = ETrue; + } + else if ( aServerDataStoreFormat.FolderProperty( i ).Field().Name().DesC().Compare( KNSmlDataObjectCREATED ) == 0 ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder: Supports CREATED Property")); + iServerSupportsForFolder.iSSCreated = ETrue; + } + else if ( aServerDataStoreFormat.FolderProperty( i ).Field().Name().DesC().Compare( KNSmlDataObjectMODIFIED ) == 0 ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder: Supports MODIFIED Property")); + iServerSupportsForFolder.iSSModified = ETrue; + } + } + } + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CheckServerSupportForFolder: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::FetchFolderL +// Method to read folder item from database. +// ----------------------------------------------------------------------------- +void CNSmlDefaultAgendaHandlerPlugin::FetchFolderL( const TSmlDbItemUid aUid, RBufWriteStream& aStream ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL: begin")); + + // Create parser and set properties + CNSmlFolderParser* parser = CNSmlFolderParser::NewLC(); + TNSmlParserGeneratorError parseError = EErrorNone; + HBufC8* generatedBuf = NULL; + HBufC8* nameBuf = NULL; + + //Get the Folder Information + CNSmlDefaultAgendaHandlerUtil* agendautil = CalendarInfoL(aUid); + if( NULL == agendautil ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( parser ); + User::Leave( KErrNotFound ); + } + + if ( iServerSupportsForFolder.iSSCreated ) + { + parser->iCreated = agendautil->iCreated; + } + else + { + parser->iCreated = Time::NullTTime(); + } + + if ( iServerSupportsForFolder.iSSName ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL: retrieving name")); + nameBuf = HBufC8::NewL( agendautil->iName->Length() ); + TPtr8 name( nameBuf->Des() ); + CnvUtfConverter::ConvertFromUnicodeToUtf8(name , agendautil->iName->Des()); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL: name converted")); + parser->iName = nameBuf; + } + + // Generate data and write it to buffer + generatedBuf = HBufC8::NewLC( 1 ); + generatedBuf->Des() = KNullDesC8; + CleanupStack::Pop(); // generatedBuf + parseError = parser->GenerateXml( generatedBuf ); + CleanupStack::PushL( generatedBuf ); + + aStream.WriteL( generatedBuf->Des() ); + + delete agendautil; + CleanupStack::PopAndDestroy( generatedBuf ); + CleanupStack::PopAndDestroy( parser ); + + if ( parseError != EErrorNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL(): end with leave")); + User::Leave( KErrGeneral ); + } + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FetchFolderL: end")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL +// Retrieve the CalendarFile ID +// ----------------------------------------------------------------------------- +void CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL( CArrayFixFlat* aFolderUidArray ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL BEGIN")); + + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + TBuf8 keyBuff; + + aFolderUidArray->Reset(); + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + CleanupStack::PushL(calfilearr); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + TInt err = KErrNone; + vCalSubSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + //Get UID value associated with the CalFile + keyBuff.Zero(); + TUint UidVal; + keyBuff.AppendNum( EFolderLUID ); + TPckgC pckUidValue(UidVal); + TRAP(err,pckUidValue.Set(caleninfo->PropertyValueL( keyBuff ))); + UidVal = pckUidValue(); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL: Error while retrieving CalFile Property: '%d'"), err); + } + + //Get OWNER value associated with the CalFile + keyBuff.Zero(); + TInt SyncServiceOwnerVal; + keyBuff.AppendNum( EDeviceSyncServiceOwner ); + TPckgC pckOwnerValue(SyncServiceOwnerVal); + TRAP(err,pckOwnerValue.Set(caleninfo->PropertyValueL( keyBuff ))); + SyncServiceOwnerVal = pckOwnerValue(); + + if( err == KErrNotFound ) + { + // Set DS Application as owner + SyncServiceOwnerVal = KCRUidNSmlDSApp.iUid; + TPckgC pckOwnerValue(SyncServiceOwnerVal); + caleninfo->SetPropertyL( keyBuff, pckOwnerValue ); + vCalSubSession->SetCalendarInfoL( *caleninfo ); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL: Empty Owner LUID '%d'"), UidVal ); + aFolderUidArray->AppendL(UidVal); + } + else if( err == KErrNone ) + { + if( KCRUidNSmlDSApp.iUid == SyncServiceOwnerVal ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL: DS Owner LUID '%d'"), UidVal ); + aFolderUidArray->AppendL(UidVal); + } + } + else + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL: Error while retrieving Owner Property: '%d'"), err); + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + CleanupStack::PopAndDestroy(calfilearr); + CleanupStack::PopAndDestroy(vCalSession); + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::SynchronizableCalendarIdsL END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::CreateFolderItemL +// Creates the Folder item with the stream provided +// ----------------------------------------------------------------------------- +TCalLocalUid CNSmlDefaultAgendaHandlerPlugin::CreateFolderL( RBufReadStream& aStream ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderItemL BEGIN")); + + TBuf8 keyBuff; + TUint calValue = 0; + CNSmlDefaultAgendaHandlerUtil* agendautil = NULL; + CCalCalendarInfo* calinfo = CCalCalendarInfo::NewL(); + CleanupStack::PushL(calinfo); + + // Parse the buffer for the folder data and construct the calendar info + agendautil = ParseFolderDataL( aStream ); + + if( agendautil ) + { + // Visibility + calinfo->SetEnabled( agendautil->iEnabled ); + + // LUID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + calValue = CCalenMultiCalUtil::GetNextAvailableOffsetL(); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderItemL: nextoffset: '%d'"), calValue); + TPckgC pckgUidValue( calValue ); + calinfo->SetPropertyL( keyBuff, pckgUidValue ); + + // Create & Modified Time Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( ECreationTime ); + TTime time; + time.HomeTime(); + TPckgC pckgCreateTimeValue( time ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + + // Sync Status Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( ETrue ); + TPckgC pckgSyncStatusValue( syncstatus ); + calinfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Add + CCalSession* calsession = CCalSession::NewL(); + TInt err(KErrNone); + if( agendautil->iName != NULL ) + { + calinfo->SetNameL( agendautil->iName->Des() ); + TRAP( err, calsession->CreateCalFileL( agendautil->iName->Des(), *calinfo ) ); + } + else + { + err = KErrNotFound; + } + + delete calsession; + delete agendautil; + CleanupStack::PopAndDestroy(calinfo); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderItemL: Error while Creating Calfile")); + User::Leave( KErrGeneral ); + } + } + else + { + CleanupStack::PopAndDestroy(calinfo); + User::Leave( KErrGeneral ); + } + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderItemL END")); + return calValue; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL +// Replaces the Folder item with the ID provided +// ----------------------------------------------------------------------------- +void CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderL( const TCalLocalUid& aUid, + RBufReadStream& aStream, TBool& aSyncStatus ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL: BEGIN")); + + TBuf8 keyBuff; + CNSmlDefaultAgendaHandlerUtil* agendautil = NULL; + + // Parse the buffer for the folder data and construct the calendar info + agendautil = ParseFolderDataL( aStream ); + + if( agendautil ) + { + //Get the associated Calendar File + CNSmlDefaultAgendaHandlerUtil* updateagendautil = CalendarInfoL( aUid ); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL: After CalendarInfoL '%d'"), updateagendautil); + + if( NULL == updateagendautil ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Invalid Updatable CalendarInfo")); + delete agendautil; + User::Leave( KErrNotFound ); + } + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:valid CalendarInfo")); + if( updateagendautil->iFileName != NULL ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:valid name '%S'"), updateagendautil->iFileName); + CCalSession* vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Open the session")); + vCalSession->OpenL(updateagendautil->iFileName->Des()); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Get the Calendar Info")); + CCalCalendarInfo* caleninfo = vCalSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Set the status")); + caleninfo->SetEnabled(agendautil->iEnabled); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Set the name")); + caleninfo->SetNameL(agendautil->iName->Des()); + + // Modified Time Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + TTime time; + time.HomeTime(); + TPckgC pckgCreateTimeValue( time ); + caleninfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + + aSyncStatus = updateagendautil->iSyncStatus; + + // Update + vCalSession->SetCalendarInfoL(*caleninfo); + + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy( vCalSession ); + } + else + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Invalid Updatable CalendarInfo Name")); + delete agendautil; + delete updateagendautil; + User::Leave( KErrNotFound ); + } + } + else + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL:Invalid Parsed CalendarInfo")); + User::Leave( KErrNotFound ); + } + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ReplaceFolderItemL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::FolderNameL +// Returns the FolderName for the given ID +// ----------------------------------------------------------------------------- +HBufC* CNSmlDefaultAgendaHandlerPlugin::FolderNameL( TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderNameL: BEGIN")); + + HBufC* calfilename = NULL; + CNSmlDefaultAgendaHandlerUtil* agendautil = CalendarInfoL( aUid ); + + if( agendautil != NULL ) + { + calfilename = agendautil->iFileName->Alloc(); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::foldername: '%S'"), calfilename); + } + delete agendautil; + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderNameL: END")); + + return calfilename; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::StoreFormatL +// Returns adapters supported store format which is read from Calendar Plug +// In Adapter own resource file. +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CNSmlDefaultAgendaHandlerPlugin::StoreFormatL( RStringPool& aStringPool ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::StoreFormatL: BEGIN")); + + TFileName fileName; + TParse* parse = new(ELeave) TParse(); + CleanupStack::PushL( parse ); + + parse->Set( KNSmlDefaultAgendaHandlerRsc_1_2, + &KDC_RESOURCE_FILES_DIR, NULL ); + + fileName = parse->FullName(); + RResourceFile resourceFile; + RFs rfs; + User::LeaveIfError(rfs.Connect()); + + BaflUtils::NearestLanguageFile( rfs, fileName ); + + TRAPD( leavecode, resourceFile.OpenL( rfs,fileName ) ); + if ( leavecode != 0 ) + { + CleanupStack::PopAndDestroy(); // parse + rfs.Close(); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin:::StoreFormatL(): Error END")); + User::Leave( leavecode ); + } + + CleanupClosePushL( resourceFile ); + HBufC8* buffer = resourceFile.AllocReadLC( NSML_DEFAULT_AGENDA_HANDLER ); + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( aStringPool, reader ); + CleanupStack::Pop(); // dsFormat + CleanupStack::PopAndDestroy( 3 ); // buffer, resourceFile, parse + rfs.Close(); + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::StoreFormatL: END")); + return dsFormat; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::DeviceSyncOwner +// Returns the DS Application UID +// ----------------------------------------------------------------------------- +TInt CNSmlDefaultAgendaHandlerPlugin::DeviceSyncOwner() + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::DeviceSyncOwner: BEGIN")); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::DeviceSyncOwner: '%d' END"), KCRUidNSmlDSApp.iUid ); + return KCRUidNSmlDSApp.iUid; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL +// Returns the Sync Status for the given UID +// ----------------------------------------------------------------------------- +TBool CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL( TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: BEGIN")); + + TBool syncstatus( EFalse ); + CNSmlDefaultAgendaHandlerUtil* agendautil = CalendarInfoL( aUid ); + if( agendautil != NULL ) + { + syncstatus = agendautil->iSyncStatus; + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::syncstatus: '%d'"), syncstatus ); + } + delete agendautil; + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: END")); + + return syncstatus; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL +// Returns the Sync Status for the given FolderName +// ----------------------------------------------------------------------------- +TBool CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL( HBufC* aFolderName ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: BEGIN")); + + TBool syncstatus( EFalse ); + TBuf8 keyBuff; + CCalSession *calsession = CCalSession::NewL(); + CleanupStack::PushL(calsession); + calsession->OpenL(aFolderName->Des()); + CCalCalendarInfo* caleninfo = calsession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + // Sync Status + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TPckgC pckgSyncStatusValue(syncstatus); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: Get sync status")); + TRAPD(err,pckgSyncStatusValue.Set(caleninfo->PropertyValueL( keyBuff ))); + + syncstatus = pckgSyncStatusValue(); + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: Error while retrieving CalFile SYNC Property")); + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(calsession); + + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::FolderSyncStatusL: END")); + + return syncstatus; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::CreateFolderSnapShotItemL +// Create the Folder SnapShot Item +// ----------------------------------------------------------------------------- +TNSmlSnapshotItem CNSmlDefaultAgendaHandlerPlugin::CreateFolderSnapShotItemL( const TCalLocalUid& aUid ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderSnapShotItemL: BEGIN")); + + TNSmlSnapshotItem item( 0 ); + + CNSmlDefaultAgendaHandlerUtil* agendautil = CalendarInfoL( aUid ); + if( NULL == agendautil ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderSnapShotItemL:Invalid CalendarInfo")); + return item; + } + item.SetItemId( aUid ); + item.SetLastChangedDate(agendautil->iModified); + item.SetSoftDelete(EFalse); + delete agendautil; + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CreateFolderSnapShotItemL: END")); + + return item; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL +// Method to Parse the Folder Data Obtained +// ----------------------------------------------------------------------------- +CNSmlDefaultAgendaHandlerUtil* CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL( RBufReadStream& aStream ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL: BEGIN")); + + CNSmlDefaultAgendaHandlerUtil* agendautil = CNSmlDefaultAgendaHandlerUtil::NewL(); + + // Create parser and parse data from Buffer + CNSmlFolderParser* folderparser = CNSmlFolderParser::NewLC(); + TParse name; + + TInt size = aStream.Source()->SizeL(); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL: size:'%d'"), size); + CBufFlat* buffer = CBufFlat::NewL( 64 ); + CleanupStack::PushL( buffer ); + buffer->ResizeL( size ); + TPtr8 ptr = buffer->Ptr( 0 ); + aStream.ReadL( ptr, size ); + HBufC8* dataBuffer = HBufC8::NewLC( buffer->Size() ); + TPtr8 dataBufferPtr = dataBuffer->Des(); + buffer->Read( 0, dataBufferPtr, buffer->Size() ); + + TNSmlParserGeneratorError parseError = + folderparser->ParseXml( dataBuffer ); + CleanupStack::PopAndDestroy( 2 ); // dataBuffer, buffer + + if ( parseError != EErrorNone ) + { + delete agendautil; + CleanupStack::PopAndDestroy( ); // folderparser + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL: end with leave")); + User::Leave( KErrGeneral ); + return NULL; + } + + // Every folder item must have NAME property. Even replace because this + // Plug In does not support field level update for folders. + if ( !folderparser->iName ) + { + delete agendautil; + CleanupStack::PopAndDestroy( ); // folderparser + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL: end with leave")); + User::Leave( KErrArgument ); + return NULL; + } + + // Create Calendar info + agendautil->iName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(folderparser->iName->Des()); + CleanupStack::PopAndDestroy( ); // folderparser; + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::ParseFolderDataL: END")); + return agendautil; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL +// Retrieve the CalendarFile Info using the aUid value +// ----------------------------------------------------------------------------- +CNSmlDefaultAgendaHandlerUtil* CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL( TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: BEGIN")); + + TBuf8 keyBuff; + CNSmlDefaultAgendaHandlerUtil* agendautil = NULL; + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + CleanupStack::PushL(calfilearr); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(*vCalSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + TUint UidVal; + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + TPckgC intBuf(UidVal); + TRAPD(err,intBuf.Set(caleninfo->PropertyValueL(keyBuff))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Error while retrieving CalFile Property")); + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + CleanupStack::PopAndDestroy(calfilearr); + CleanupStack::PopAndDestroy(vCalSession); + return agendautil; + } + + UidVal = intBuf(); + + if(aUid == UidVal) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Found a match")); + agendautil = CNSmlDefaultAgendaHandlerUtil::NewL(); + agendautil->iEnabled = caleninfo->Enabled(); + agendautil->iName = caleninfo->NameL().AllocL(); + agendautil->iFileName = caleninfo->FileNameL().AllocL(); + + TInt err(KErrNone); + + // Created Time + TTime timeval; + keyBuff.Zero(); + keyBuff.AppendNum( ECreationTime ); + TPckgC pckgCreateTimeValue( timeval ); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Get Creation date")); + TRAP(err,pckgCreateTimeValue.Set(caleninfo->PropertyValueL( keyBuff ))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Error while retrieving CalFile CREATED Property")); + } + agendautil->iCreated = pckgCreateTimeValue(); + + // Modified Time + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + TPckgC pckgModifyTimeValue( timeval ); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Get Modified date")); + TRAP(err,pckgModifyTimeValue.Set(caleninfo->PropertyValueL( keyBuff ))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Error while retrieving CalFile MODIFIED Property")); + } + agendautil->iModified = pckgModifyTimeValue(); + + // Sync Status + TBool syncstatus; + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TPckgC pckgSyncStatusValue(syncstatus); + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL(): Get sync status")); + TRAP(err,pckgSyncStatusValue.Set(caleninfo->PropertyValueL( keyBuff ))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: Error while retrieving CalFile SYNC Property")); + } + agendautil->iSyncStatus = pckgSyncStatusValue(); + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + CleanupStack::PopAndDestroy(calfilearr); + CleanupStack::PopAndDestroy(vCalSession); + + FLOG(_L("CNSmlDefaultAgendaHandlerPlugin::CalendarInfoL: END")); + + return agendautil; + } + +/** + * Provides a key value pair table, this is used to identify + * the correct construction function for the requested interface. + */ +const TImplementationProxy ImplementationTable[] = +{ + IMPLEMENTATION_PROXY_ENTRY(0x20029F16, CNSmlDefaultAgendaHandlerPlugin::NewL ) +}; + +/** + * Function used to return an instance of the proxy table.+ + */ +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) +{ + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; +} + +#ifdef EKA2 +GLDEF_C TInt E32Dll() +#else +GLDEF_C TInt E32Dll(TDllReason /*aReason*/) +#endif +// DLL entry point + { + return(KErrNone); + } + +//End of file + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmldefaultagendahandler/src/nsmldefaultagendahandlerutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmldefaultagendahandler/src/nsmldefaultagendahandlerutil.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2009 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: +* +* +*/ + +#include "nsmldefaultagendahandlerutil.h" +#include "nsmldefaultagendahandlerdebug.h" + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerUtil::CNSmlDefaultAgendaHandlerUtil +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNSmlDefaultAgendaHandlerUtil::CNSmlDefaultAgendaHandlerUtil() + { + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::CNSmlDefaultAgendaHandlerUtil(): BEGIN")); + + iFileName = NULL; + iName = NULL; + iEnabled = ETrue; + iSyncStatus = ETrue; + + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::CNSmlDefaultAgendaHandlerUtil(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerUtil::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNSmlDefaultAgendaHandlerUtil* CNSmlDefaultAgendaHandlerUtil::NewL() + { + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::NewL: BEGIN")); + + CNSmlDefaultAgendaHandlerUtil* self = new ( ELeave ) CNSmlDefaultAgendaHandlerUtil(); + + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::NewL: END")); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlDefaultAgendaHandlerUtil::~CNSmlDefaultAgendaHandlerUtil +// Destructor. +// ----------------------------------------------------------------------------- +// +CNSmlDefaultAgendaHandlerUtil::~CNSmlDefaultAgendaHandlerUtil() + { + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::~CNSmlDefaultAgendaHandlerUtil(): BEGIN")); + if(iFileName) + { + delete iFileName; + iFileName = NULL; + } + if(iName) + { + delete iName; + iName = NULL; + } + FLOG(_L("CNSmlDefaultAgendaHandlerUtil::~CNSmlDefaultAgendaHandlerUtil(): END")); + } + +//End of file diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/bld/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/bld/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2004 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: Folder XML Utils build file. +* +*/ + +PRJ_MMPFILES +./nsmlfolderparser.mmp + + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/bld/def/bwinscwfolderparseru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/bld/def/bwinscwfolderparseru.def Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,22 @@ +EXPORTS + ?NewL@CNSmlExtData@@SAPAV1@XZ @ 1 NONAME ; class CNSmlExtData * CNSmlExtData::NewL(void) + ?NewLC@CNSmlExtData@@SAPAV1@XZ @ 2 NONAME ; class CNSmlExtData * CNSmlExtData::NewLC(void) + ?AddXValL@CNSmlExtData@@QAEXPAVHBufC8@@@Z @ 3 NONAME ; void CNSmlExtData::AddXValL(class HBufC8 *) + ?GenerateXmlL@CNSmlExtData@@QBEXAAVTPtr8@@PBVCNSmlXmlParser@@@Z @ 4 NONAME ; void CNSmlExtData::GenerateXmlL(class TPtr8 &, class CNSmlXmlParser const *) const + ??0CNSmlXmlParser@@QAE@XZ @ 5 NONAME ; CNSmlXmlParser::CNSmlXmlParser(void) + ?NewLC@CNSmlFolderParser@@SAPAV1@XZ @ 6 NONAME ; class CNSmlFolderParser * CNSmlFolderParser::NewLC(void) + ?AddExtL@CNSmlFolderParser@@QAEXPAVCNSmlExtData@@@Z @ 7 NONAME ; void CNSmlFolderParser::AddExtL(class CNSmlExtData *) + ?AttributeCount@TNSmlFolderAttributeData@@QBEHXZ @ 8 NONAME ; int TNSmlFolderAttributeData::AttributeCount(void) const + ?ConvertIntoEntitiesL@CNSmlExtData@@QAEXPBVCNSmlXmlParser@@@Z @ 9 NONAME ; void CNSmlExtData::ConvertIntoEntitiesL(class CNSmlXmlParser const *) + ?CountXmlSize@CNSmlExtData@@QBEHPBVCNSmlXmlParser@@@Z @ 10 NONAME ; int CNSmlExtData::CountXmlSize(class CNSmlXmlParser const *) const + ?CountXmlSizeL@CNSmlFolderParser@@UAEHXZ @ 11 NONAME ; int CNSmlFolderParser::CountXmlSizeL(void) + ??1CNSmlXmlParser@@UAE@XZ @ 12 NONAME ; CNSmlXmlParser::~CNSmlXmlParser(void) + ?NewL@CNSmlFolderParser@@SAPAV1@XZ @ 13 NONAME ; class CNSmlFolderParser * CNSmlFolderParser::NewL(void) + ??1CNSmlFolderParser@@UAE@XZ @ 14 NONAME ; CNSmlFolderParser::~CNSmlFolderParser(void) + ?CountXmlSize@TNSmlFolderAttributeData@@QBEHPBVCNSmlXmlParser@@@Z @ 15 NONAME ; int TNSmlFolderAttributeData::CountXmlSize(class CNSmlXmlParser const *) const + ?GenerateXml@CNSmlFolderParser@@UAE?AW4TNSmlParserGeneratorError@@AAPAVHBufC8@@@Z @ 16 NONAME ; enum TNSmlParserGeneratorError CNSmlFolderParser::GenerateXml(class HBufC8 * &) + ??1CNSmlExtData@@UAE@XZ @ 17 NONAME ; CNSmlExtData::~CNSmlExtData(void) + ??0TNSmlFolderAttributeData@@QAE@XZ @ 18 NONAME ; TNSmlFolderAttributeData::TNSmlFolderAttributeData(void) + ?ParseXml@CNSmlFolderParser@@UAE?AW4TNSmlParserGeneratorError@@PAVHBufC8@@@Z @ 19 NONAME ; enum TNSmlParserGeneratorError CNSmlFolderParser::ParseXml(class HBufC8 *) + ?GenerateXml@TNSmlFolderAttributeData@@QBEXAAVTPtr8@@PBVCNSmlXmlParser@@@Z @ 20 NONAME ; void TNSmlFolderAttributeData::GenerateXml(class TPtr8 &, class CNSmlXmlParser const *) const + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/bld/def/eabifolderparseru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/bld/def/eabifolderparseru.def Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,35 @@ +EXPORTS + _ZN12CNSmlExtData20ConvertIntoEntitiesLEPK14CNSmlXmlParser @ 1 NONAME + _ZN12CNSmlExtData4NewLEv @ 2 NONAME + _ZN12CNSmlExtData5NewLCEv @ 3 NONAME + _ZN12CNSmlExtData8AddXValLEP6HBufC8 @ 4 NONAME + _ZN12CNSmlExtDataD0Ev @ 5 NONAME + _ZN12CNSmlExtDataD1Ev @ 6 NONAME + _ZN12CNSmlExtDataD2Ev @ 7 NONAME + _ZN14CNSmlXmlParserC2Ev @ 8 NONAME + _ZN14CNSmlXmlParserD0Ev @ 9 NONAME + _ZN14CNSmlXmlParserD1Ev @ 10 NONAME + _ZN14CNSmlXmlParserD2Ev @ 11 NONAME + _ZN17CNSmlFolderParser11GenerateXmlERP6HBufC8 @ 12 NONAME + _ZN17CNSmlFolderParser13CountXmlSizeLEv @ 13 NONAME + _ZN17CNSmlFolderParser4NewLEv @ 14 NONAME + _ZN17CNSmlFolderParser5NewLCEv @ 15 NONAME + _ZN17CNSmlFolderParser7AddExtLEP12CNSmlExtData @ 16 NONAME + _ZN17CNSmlFolderParser8ParseXmlEP6HBufC8 @ 17 NONAME + _ZN17CNSmlFolderParserD0Ev @ 18 NONAME + _ZN17CNSmlFolderParserD1Ev @ 19 NONAME + _ZN17CNSmlFolderParserD2Ev @ 20 NONAME + _ZN24TNSmlFolderAttributeDataC1Ev @ 21 NONAME + _ZN24TNSmlFolderAttributeDataC2Ev @ 22 NONAME + _ZNK12CNSmlExtData12CountXmlSizeEPK14CNSmlXmlParser @ 23 NONAME + _ZNK12CNSmlExtData12GenerateXmlLER5TPtr8PK14CNSmlXmlParser @ 24 NONAME + _ZNK24TNSmlFolderAttributeData11GenerateXmlER5TPtr8PK14CNSmlXmlParser @ 25 NONAME + _ZNK24TNSmlFolderAttributeData12CountXmlSizeEPK14CNSmlXmlParser @ 26 NONAME + _ZNK24TNSmlFolderAttributeData14AttributeCountEv @ 27 NONAME + _ZTI12CNSmlExtData @ 28 NONAME + _ZTI14CNSmlXmlParser @ 29 NONAME + _ZTI17CNSmlFolderParser @ 30 NONAME + _ZTV12CNSmlExtData @ 31 NONAME + _ZTV14CNSmlXmlParser @ 32 NONAME + _ZTV17CNSmlFolderParser @ 33 NONAME + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/bld/nsmlfolderparser.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/bld/nsmlfolderparser.mmp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2004 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: Folder XML Parser mmp file +* +*/ + + +#include "defaultcaps.hrh" +#include + +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT +TARGET nsmlfolderparser.dll +TARGETTYPE dll +UID 0x1000008d 0x20029F12 + +#if defined(ARMCC) +DEFFILE ./def/eabifolderparser +#elif defined(WINSCW) +DEFFILE ./def/bwinscwfolderparser +#elif defined(WINS) +DEFFILE ./def/bwinsfolderparser +#else +DEFFILE ./def/bmarmfolderparser +#endif + +APP_LAYER_SYSTEMINCLUDE + +SOURCEPATH ../src +USERINCLUDE ../inc +SOURCE nsmlxmlparser.cpp +SOURCE NSmlExtData.cpp +SOURCE NSmlFolderAttributeData.cpp +SOURCE NSmlFolderParser.cpp + +LIBRARY euser.lib estor.lib efsrv.lib + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/inc/nsmlparserconstants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/inc/nsmlparserconstants.h Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2005 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: Folder parser constants +* +*/ + + +#ifndef __NSMLPARSERCONSTANTS_H__ +#define __NSMLPARSERCONSTANTS_H__ + +// ------------------------------------------------------------------------------------------------ +// Defines for binary size optimization +// ------------------------------------------------------------------------------------------------ +#define __NO_XML_COMMENTS_ +//#define __NO_EMPTY_ELEMENTS_ + + +// ------------------------------------------------------------------------------------------------ +// constants +// ------------------------------------------------------------------------------------------------ + +// the length of element start (<) and end (>) +const TInt KElementStartEndWidth = 2; + +// constants used with files +const TInt KReadDataLength = 512; +const TUint KFileReadAccess = EFileRead|EFileShareAny; +const TUint KFileWriteAccess = EFileWrite|EFileShareExclusive; + +// Whitespace characters +const TText KWhitespaceEmpty = ' '; +const TText KWhitespaceLineFeed = '\r'; +const TText KWhitespaceNewLine = '\n'; +const TText KWhitespaceTabular = '\t'; +const TText KWhitespaceLineFeedNewLine = '\r\n'; + +const TText KCharacterSlash = '/'; + +// CData +_LIT8(KCDataStart, ""); +_LIT8(KCDataInnerEnd, "]]]]>>"); +#endif + +const TText KElementStart = '<'; +const TText KElementEnd = '>'; + +// Xml entities +_LIT8(KEntityLT, "<"); +_LIT8(KEntityGT, ">"); +_LIT8(KEntityAMP, "&"); +_LIT8(KEntityAPOS, "'"); +_LIT8(KEntityQUOT, """); + +// special characters +_LIT8(KLessThan, "<"); +_LIT8(KGreaterThan, ">"); +_LIT8(KAmpersand, "&"); +_LIT8(KApostrophe, "\'"); +_LIT8(KQuotation, "\""); + +// boolean string representations +_LIT8(KStringTrue, "true"); +_LIT8(KStringFalse, "false"); + +// empty string +_LIT8(KStringEmpty, ""); + +// truncated info spesific elements +_LIT8(KTruncatedElement, "truncated"); +_LIT8(KTruncatedBodyElement, "body"); +_LIT8(KTruncatedAttachElement, "attach"); +_LIT8(KTruncatedSizeElement, "size"); +_LIT8(KTruncatedTypeElement, "type"); +_LIT8(KTruncatedNameElement, "name"); + +// extension spesific elements +_LIT8(KExtElement, "Ext"); +_LIT8(KExtXNamElement, "XNam"); +_LIT8(KExtXValElement, "XVal"); + +// folder spesific elements +_LIT8(KFolderElement, "Folder"); +_LIT8(KFolderNameElement, "name"); +_LIT8(KFolderCreatedElement, "created"); +_LIT8(KFolderModifiedElement, "modified"); +_LIT8(KFolderAccessedElement, "accessed"); +_LIT8(KFolderAttributesElement, "attributes"); +_LIT8(KFolderRoleElement, "role"); + +// folder attributes +_LIT8(KAttributeHiddenElement, "h"); +_LIT8(KAttributeSystemElement, "s"); +_LIT8(KAttributeArchivedElement, "a"); +_LIT8(KAttributeDeleteElement, "d"); +_LIT8(KAttributeWritableElement, "w"); +_LIT8(KAttributeReadableElement, "r"); +_LIT8(KAttributeExecutableElement, "x"); + + +#endif // __NSMLPARSERCONSTANTS_H__ diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlExtData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlExtData.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 2004 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: Sources +* +*/ + + + +// INCLUDE FILES +#include +#include + +#include +#include "nsmlparserconstants.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CNSmlExtData::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlExtData* CNSmlExtData::NewL() + { + CNSmlExtData* self = CNSmlExtData::NewLC(); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlExtData* CNSmlExtData::NewLC() + { + CNSmlExtData* self = new (ELeave) CNSmlExtData(); + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::~CNSmlExtData +// Destructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlExtData::~CNSmlExtData() + { + if (iXVals) + { + iXVals->ResetAndDestroy(); + delete iXVals; + } + + if (iXNam) delete iXNam; + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::AddXValL +// Adds given buffer to iXVals. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlExtData::AddXValL( HBufC8* aXVal ) + { + iXVals->AppendL(aXVal); + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::GenerateXmlL +// Generates ext data xml using aParser and appends the xml to aXml. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlExtData::GenerateXmlL( TPtr8& aXml, const CNSmlXmlParser* aParser) const + { + if ( aParser == NULL ) + return; + + aParser->AppendElement(aXml, KExtElement()); + + if( iXNam ) + { + aParser->AppendElement(aXml, KExtXNamElement(), *iXNam); + } + else + User::Leave(EMandatoryFieldNotFound); + + if ( iXVals ) + { + for (TInt i=0; i < iXVals->Count(); ++i) + { + aParser->AppendElement(aXml, KExtXValElement(), *iXVals->At(i)); + } + } + + aParser->AppendEndElement(aXml, KExtElement()); + + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::CountXmlSize +// Counts the size of the ext data xml if it was generated with current +// values in member variables. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CNSmlExtData::CountXmlSize( const CNSmlXmlParser* aParser ) const + { + TInt size = 0; + size += aParser->SizeOfElements( KExtElement() ); + + if( iXNam ) + { + size += aParser->SizeOfString( iXNam, KExtXNamElement() ); + } + + if ( iXVals ) + { + for (TInt i=0; i < iXVals->Count(); ++i) + { + size += aParser->SizeOfString( iXVals->At(i), KExtXValElement() ); + } + } + + return size; + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::ConvertIntoEntitiesL +// Converts special characters in member variables into entities. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlExtData::ConvertIntoEntitiesL( const CNSmlXmlParser* aParser ) + { + if( iXNam ) + aParser->CharactersToEntitiesL(iXNam, 0, iXNam->Length()); + + if( iXVals ) + { + for (TInt i=0; i < iXVals->Count(); ++i) + { + aParser->CharactersToEntitiesL(iXVals->At(i), 0, iXVals->At(i)->Length()); + } + } + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::CNSmlExtData +// Constructor. +// ----------------------------------------------------------------------------- +// +CNSmlExtData::CNSmlExtData() + { + } + +// ----------------------------------------------------------------------------- +// CNSmlExtData::ConstructL +// Second phase construction. +// ----------------------------------------------------------------------------- +// +void CNSmlExtData::ConstructL() + { + iXVals = new (ELeave) CNSmlXValArray(3); + } + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlFolderAttributeData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlFolderAttributeData.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,158 @@ +/* +* Copyright (c) 2004 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: Sources +* +*/ + + + +// INCLUDE FILES +#include +#include + +#include +#include "nsmlparserconstants.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TNSmlFolderAttributeData::TNSmlFolderAttributeData +// Constructor +// ----------------------------------------------------------------------------- +// +EXPORT_C TNSmlFolderAttributeData::TNSmlFolderAttributeData() +: iHidden(EBooleanMissing), iSystem(EBooleanMissing), +iArchived(EBooleanMissing), iDelete(EBooleanMissing), +iWritable(EBooleanMissing), iReadable(EBooleanMissing), +iExecutable(EBooleanMissing) + { + } + +// ----------------------------------------------------------------------------- +// TNSmlFolderAttributeData::AttributeCount +// Returns the amount of fields that are not EBooleanMissing +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt TNSmlFolderAttributeData::AttributeCount() const + { + TInt count = 0; + + if ( iHidden ) count++; + if ( iSystem ) count++; + if ( iArchived ) count++; + if ( iDelete ) count++; + if ( iWritable ) count++; + if ( iReadable ) count++; + if ( iExecutable ) count++; + + return count; + } + +// ----------------------------------------------------------------------------- +// TNSmlFolderAttributeData::GenerateXml +// Generates attribute xml +// ----------------------------------------------------------------------------- +// +EXPORT_C void TNSmlFolderAttributeData::GenerateXml( TPtr8& aXml, const CNSmlXmlParser* aParser ) const + { + aParser->AppendElement(aXml, KFolderAttributesElement()); + + if ( iHidden ) + { + aParser->AppendElement(aXml, KAttributeHiddenElement(), aParser->BooleanToString( iHidden )); + } + + if ( iSystem ) + { + aParser->AppendElement(aXml, KAttributeSystemElement(), aParser->BooleanToString( iSystem )); + } + + if ( iArchived ) + { + aParser->AppendElement(aXml, KAttributeArchivedElement(), aParser->BooleanToString( iArchived )); + } + + if ( iDelete ) + { + aParser->AppendElement(aXml, KAttributeDeleteElement(), aParser->BooleanToString( iDelete )); + } + + if ( iWritable ) + { + aParser->AppendElement(aXml, KAttributeWritableElement(), aParser->BooleanToString( iWritable )); + } + + if ( iReadable ) + { + aParser->AppendElement(aXml, KAttributeReadableElement(), aParser->BooleanToString( iReadable )); + } + + if ( iExecutable ) + { + aParser->AppendElement(aXml, KAttributeExecutableElement(), aParser->BooleanToString( iExecutable )); + } + + aParser->AppendEndElement(aXml, KFolderAttributesElement()); + } + +// ----------------------------------------------------------------------------- +// TNSmlFolderAttributeData::CountXmlSize +// Coounts the size of the xml if it was generated using the values currently in +// member variables +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt TNSmlFolderAttributeData::CountXmlSize( const CNSmlXmlParser* aParser ) const + { + TInt size = 0; + size += aParser->SizeOfElements( KFolderAttributesElement() ); + + if ( iHidden ) + { + size += aParser->SizeOfBoolean( iHidden, KAttributeHiddenElement() ); + } + + if ( iSystem ) + { + size += aParser->SizeOfBoolean( iSystem, KAttributeSystemElement() ); + } + + if ( iArchived ) + { + size += aParser->SizeOfBoolean( iArchived, KAttributeArchivedElement() ); + } + + if ( iDelete ) + { + size += aParser->SizeOfBoolean( iDelete, KAttributeDeleteElement() ); + } + + if ( iWritable ) + { + size += aParser->SizeOfBoolean( iWritable, KAttributeWritableElement() ); + } + + if ( iReadable ) + { + size += aParser->SizeOfBoolean( iReadable, KAttributeReadableElement() ); + } + + if ( iExecutable ) + { + size += aParser->SizeOfBoolean( iExecutable, KAttributeExecutableElement() ); + } + + return size; + } + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlFolderParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/src/NSmlFolderParser.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,631 @@ +/* +* Copyright (c) 2004 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: Sources +* +*/ + + + +// INCLUDE FILES +#include +#include + +#include +#include "nsmlparserconstants.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlFolderParser* CNSmlFolderParser::NewL() + { + CNSmlFolderParser* self = CNSmlFolderParser::NewLC(); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlFolderParser* CNSmlFolderParser::NewLC() + { + CNSmlFolderParser* self = new (ELeave) CNSmlFolderParser(); + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::~CNSmlFolderParser +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlFolderParser::~CNSmlFolderParser() + { + if(iExt) + { + iExt->ResetAndDestroy(); + delete iExt; + } + + if(iName) delete iName; + if(iRole) delete iRole; + + if( iExtData ) delete iExtData; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::ParseXml +// Parses through the given XML and places the data to member variables. +// Note: The method does not check whether the member variables +// already contains data or not, but just writes it (if some of them are already +// instantiated dynamically, they should be deleted before this method is called). +// ----------------------------------------------------------------------------- +// +EXPORT_C TNSmlParserGeneratorError CNSmlFolderParser::ParseXml( HBufC8* aXml ) + { + + TRAPD(cdataErr, PreProcessL(aXml)); + if (cdataErr != EErrorNone) + return (TNSmlParserGeneratorError)cdataErr; + + iSetValues.Reset(); + iCurrentState = EFolderNone; + iLastState = EFolderNone; + TPtrC8 ptr(*aXml); + + TRAPD(err, ParseL( ptr )); + + if( err == EErrorNone && iCurrentState != EFolderNone ) + return EInvalidXmlError; + + return CheckError(err); + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::GenerateXml +// Generates Folder-XML using the values in member variables. aXml contains the +// generated xml when the function returns successfully. Note: caller should not +// instantiate the HBufC8, since this method first counts the size of the +// xml to be generated and then instatiates the HBufC8 with a correct maximum size. +// If the given buffer is not NULL, it is destroyed and a new one is instantiated. +// Caller gets the control of the HBufC8 when the function returns. +// ----------------------------------------------------------------------------- +// +EXPORT_C TNSmlParserGeneratorError CNSmlFolderParser::GenerateXml( HBufC8*& aXml ) + { + + TRAPD( err, ConvertIntoEntitiesL(); // convert special characters into entities + + GenerateFolderXmlL( aXml ) ); + + return CheckError(err); + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::GenerateFolderXmlL +// Private methods that does the actual folder xml generation +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::GenerateFolderXmlL( HBufC8*& aXml ) + { + // count the size of the xml + TInt size = CountXmlSizeL(); + + // create buffer for the xml + + if ( aXml ) + { + delete aXml; + aXml = NULL; + } + + aXml = HBufC8::NewLC(size); + TPtr8 ptr = aXml->Des(); + + AppendElement(ptr, KFolderElement()); + + if ( iName ) + { + AppendElement(ptr, KFolderNameElement(), *iName); + } + + if (iCreated != Time::NullTTime()) + { + AppendElement(ptr, KFolderCreatedElement(), DateTimeToStringL(iCreated)); + } + + if (iModified != Time::NullTTime()) + { + AppendElement(ptr, KFolderModifiedElement(), DateTimeToStringL(iModified)); + } + + if (iAccessed != Time::NullTTime()) + { + AppendElement(ptr, KFolderAccessedElement(), DateTimeToStringL(iAccessed)); + } + + if (iAttributes.AttributeCount() > 0) + { + iAttributes.GenerateXml(ptr, this); + } + + if ( iRole ) + { + AppendElement(ptr, KFolderRoleElement(), *iRole); + } + + if ( iExt ) + { + for (TInt i=0; i < iExt->Count(); ++i) + { + iExt->At(i)->GenerateXmlL(ptr, this); + } + + } + + AppendEndElement(ptr, KFolderElement()); + + CleanupStack::Pop(); // aXml + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::CountXmlSizeL +// Counts how long the xml string will be if it was generated using +// the values currently in member variables. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CNSmlFolderParser::CountXmlSizeL() + { + TInt size = 0; + + size += SizeOfElements( KFolderElement() ); + size += KCDataStart().Length() + KCDataEnd().Length(); + + if ( iName ) + { + size += SizeOfString( iName, KFolderNameElement() ); + } + + if (iCreated != Time::NullTTime()) + { + size += SizeOfDatetime( KFolderCreatedElement() ); + } + + if (iModified != Time::NullTTime()) + { + size += SizeOfDatetime( KFolderModifiedElement() ); + } + + if (iAccessed != Time::NullTTime()) + { + size += SizeOfDatetime( KFolderAccessedElement() ); + } + + // attributes, if any present + if (iAttributes.AttributeCount() > 0) + { + size += iAttributes.CountXmlSize( this ); + } + + if ( iRole ) + { + size += SizeOfString( iRole, KFolderRoleElement() ); + } + + if ( iExt ) + { + for (TInt i=0; i < iExt->Count(); ++i) + { + size += iExt->At(i)->CountXmlSize( this ); + } + } + + return size; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::AddExtL +// Adds the given extension to iExt +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlFolderParser::AddExtL( CNSmlExtData* aExt ) + { + iExt->AppendL(aExt); + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::NextElementL +// Base class' ParseL method calls this method, when a new element is found. aElement +// is the name of that element (string inside '<' and '>' characters). +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::NextElementL( TPtrC8 aElement ) + { + if (aElement.Length() == 0) + User::Leave(EInvalidXmlError); + + TBool startElement = ETrue; + + if(aElement[0] == KCharacterSlash) + { + // end element + // remove the '/' character from the beginning + aElement.Set( aElement.Right( aElement.Length() - 1 ) ); + startElement = EFalse; + } +#ifndef __NO_EMPTY_ELEMENTS_ + else if (aElement[aElement.Length()-1] == KCharacterSlash) + { + // empty element + // remove the '/' character from the end + aElement.Set( aElement.Left( aElement.Length() - 1 ) ); + + // empty element == start element, empty data, end element + NextElementL( aElement ); // simulates start element + NextDataL( _L8("") ); // simulates the empty data + + HBufC8* end = HBufC8::NewLC(aElement.Length()+1); + TPtr8 ptr = end->Des(); + ptr.Append( _L8("/") ); + ptr.Append( aElement ); + + NextElementL( ptr ); // simulates end element + + CleanupStack::PopAndDestroy(); // end + + return; + } +#endif + + // variables used for state, init to and not set + TNSmlCurrentFolderElement inner = EFolder; + TNSmlCurrentFolderElement outer = EFolder; + TBool isSet = EFalse; + + if( aElement == KFolderElement ) + { + outer = EFolderNone; + isSet = iSetValues.iFolder; + if ( startElement ) iSetValues.iFolder = ETrue; + } + else if( aElement == KFolderNameElement ) + { + inner = EFolderName; + isSet = iSetValues.iName; + } + else if( aElement == KFolderCreatedElement ) + { + inner = EFolderCreated; + isSet = iSetValues.iCreated; + } + else if( aElement == KFolderModifiedElement ) + { + inner = EFolderModified; + isSet = iSetValues.iModified; + } + else if( aElement == KFolderAccessedElement ) + { + inner = EFolderAccessed; + isSet = iSetValues.iAccessed; + } + else if( aElement == KFolderAttributesElement ) + { + inner = EAttributes; + isSet = iSetValues.iAttributes; + if ( startElement) iSetValues.iAttributes = ETrue; + } + else if( aElement == KAttributeHiddenElement ) + { + inner = EAttributesH; + outer = EAttributes; + isSet = iSetValues.iAttributesH; + } + else if( aElement == KAttributeSystemElement ) + { + inner = EAttributesS; + outer = EAttributes; + isSet = iSetValues.iAttributesS; + } + else if( aElement == KAttributeArchivedElement ) + { + inner = EAttributesA; + outer = EAttributes; + isSet = iSetValues.iAttributesA; + } + else if( aElement == KAttributeDeleteElement ) + { + inner = EAttributesD; + outer = EAttributes; + isSet = iSetValues.iAttributesD; + } + else if( aElement == KAttributeWritableElement ) + { + inner = EAttributesW; + outer = EAttributes; + isSet = iSetValues.iAttributesW; + } + else if( aElement == KAttributeReadableElement ) + { + inner = EAttributesR; + outer = EAttributes; + isSet = iSetValues.iAttributesR; + } + else if( aElement == KAttributeExecutableElement ) + { + inner = EAttributesX; + outer = EAttributes; + isSet = iSetValues.iAttributesX; + } + else if( aElement == KFolderRoleElement ) + { + inner = EFolderRole; + isSet = iSetValues.iRole; + } + else if( aElement == KExtElement ) + { + inner = EFolderExt; + + if ( startElement ) + { + if( iExtData ) + { + delete iExtData; + iExtData = NULL; + } + iExtData = CNSmlExtData::NewL(); + iSetValues.iXNam = EFalse; + } + else + { + if( !iSetValues.iXNam ) User::Leave(EMandatoryFieldNotFound); // xnam not set + iExt->AppendL(iExtData); + iExtData = NULL; + } + } + else if( aElement == KExtXNamElement ) + { + inner = EFolderExtXNam; + outer = EFolderExt; + isSet = iSetValues.iXNam; + } + else if( aElement == KExtXValElement ) + { + inner = EFolderExtXVal; + outer = EFolderExt; + } + else + { + User::Leave(EInvalidXmlError); + } + + + // finally, change state depending on was the element start or end element + if ( startElement ) + { + StartElementStateChangeL( outer, inner, isSet ); + } + else + { + EndElementStateChangeL( inner, outer ); + } + + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::NextDataL +// Base class' ParseL method calls this method, when a data is read from xml, +// but that data is not element name (data inside or between elements). +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::NextDataL( TPtrC8 aData ) + { + switch(iCurrentState) + { + case EFolderNone: + case EFolder: + case EAttributes: + case EFolderExt: + LeaveIfNotWhiteSpaceL( aData ); + break; + case EFolderName: + iName = aData.AllocL(); + iSetValues.iName = ETrue; + break; + case EFolderCreated: + iCreated = StringToTTimeL(aData); + iSetValues.iCreated = ETrue; + break; + case EFolderModified: + iModified = StringToTTimeL(aData); + iSetValues.iModified = ETrue; + break; + case EFolderAccessed: + iAccessed = StringToTTimeL(aData); + iSetValues.iAccessed = ETrue; + break; + case EAttributesH: + iAttributes.iHidden = StringToBooleanL(aData); + iSetValues.iAttributesH = ETrue; + break; + case EAttributesS: + iAttributes.iSystem = StringToBooleanL(aData); + iSetValues.iAttributesS = ETrue; + break; + case EAttributesA: + iAttributes.iArchived = StringToBooleanL(aData); + iSetValues.iAttributesA = ETrue; + break; + case EAttributesD: + iAttributes.iDelete = StringToBooleanL(aData); + iSetValues.iAttributesD = ETrue; + break; + case EAttributesW: + iAttributes.iWritable = StringToBooleanL(aData); + iSetValues.iAttributesW = ETrue; + break; + case EAttributesR: + iAttributes.iReadable = StringToBooleanL(aData); + iSetValues.iAttributesR = ETrue; + break; + case EAttributesX: + iAttributes.iExecutable = StringToBooleanL(aData); + iSetValues.iAttributesX = ETrue; + break; + case EFolderRole: + iRole = aData.AllocL(); + iSetValues.iRole = ETrue; + break; + case EFolderExtXNam: + iExtData->iXNam = aData.AllocL(); + iSetValues.iXNam = ETrue; + break; + case EFolderExtXVal: + iExtData->AddXValL(aData.AllocL()); + break; + default: + User::Leave(EUnknownError); // should never happen + break; + } + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::StartElementStateChangeL +// Checks that the state change (new start element) is legal (right order of +// elements and element not already set) and changes the state. +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::StartElementStateChangeL(TNSmlCurrentFolderElement aCurrentState, + TNSmlCurrentFolderElement aNextState, + TBool aIsSet) + { + if( aIsSet || iCurrentState != aCurrentState || aNextState < iLastState ) + { + User::Leave(EInvalidXmlError); + } + + iLastState = iCurrentState; + iCurrentState = aNextState; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::EndElementStateChangeL +// Checks that the state change (new end element) is legal (right order of +// elements and element not already set) and changes the state. +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::EndElementStateChangeL(TNSmlCurrentFolderElement aCurrentState, + TNSmlCurrentFolderElement aNextState ) + { + if( iCurrentState != aCurrentState ) + { + User::Leave(EInvalidXmlError); + } + + iLastState = iCurrentState; + iCurrentState = aNextState; + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::ConvertIntoEntitiesL +// Converts special characters of this dataobject to corresponding +// characters. +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::ConvertIntoEntitiesL() + { + // name + if ( iName ) + { + CharactersToEntitiesL(iName, 0, iName->Length()); + } + + // role + if ( iRole ) + { + CharactersToEntitiesL(iRole, 0, iRole->Length()); + } + + // extensions + if ( iExt ) + { + for (TInt i=0; i < iExt->Count(); ++i) + { + iExt->At(i)->ConvertIntoEntitiesL(this); + } + } + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::CNSmlFolderParser +// Constructor +// ----------------------------------------------------------------------------- +// +CNSmlFolderParser::CNSmlFolderParser() + : iCreated(Time::NullTTime()), iModified(Time::NullTTime()), + iAccessed(Time::NullTTime()) + { + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::ConstructL +// Second phase construction +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::ConstructL() + { + iExt = new (ELeave) CNSmlExtDataArray(3); + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::TNSmlSetFolderValues::TNSmlSetFolderValues +// ----------------------------------------------------------------------------- +// +CNSmlFolderParser::TNSmlSetFolderValues::TNSmlSetFolderValues() + { + Reset(); + } + +// ----------------------------------------------------------------------------- +// CNSmlFolderParser::TNSmlSetFolderValues::Reset +// ----------------------------------------------------------------------------- +// +void CNSmlFolderParser::TNSmlSetFolderValues::Reset() + { + iFolder = EFalse; + iName = EFalse; + iCreated = EFalse; + iModified = EFalse; + iAccessed = EFalse; + iAttributes = EFalse; + iAttributesH = EFalse; + iAttributesS = EFalse; + iAttributesA = EFalse; + iAttributesD = EFalse; + iAttributesW = EFalse; + iAttributesR = EFalse; + iAttributesX = EFalse; + iXNam = EFalse; + iRole = EFalse; + } + +// End of File diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/dsutils/nsmlfolderutils/src/nsmlxmlparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/nsmlfolderutils/src/nsmlxmlparser.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -0,0 +1,798 @@ +/* +* Copyright (c) 2004 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: Sources +* +*/ + + +// 1.2 Changes: nsmlxmlparser module added + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include +#include +#include "nsmlparserconstants.h" + + +// ------------------------------------------------------------------------------------------------ +// +// CNSmlXmlParser methods +// +// ------------------------------------------------------------------------------------------------ + +// ------------------------------------------------------------------------------------------------ +// Constructor +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlXmlParser::CNSmlXmlParser() + { + } + + +// ------------------------------------------------------------------------------------------------ +// Destructor. +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlXmlParser::~CNSmlXmlParser() + { + if( iBuffer ) delete iBuffer; + if ( iCompleteBuffer ) delete iCompleteBuffer; + } + + +// ------------------------------------------------------------------------------------------------ +// Parses the given string for cdata areas and entitys. If a cdata area is +// found, the data in it is skipped over. The entities outside cdata are converted +// into characters they represent (but only if cdata is found). +// Note: This method is intended for processing the CDATA used right after . +// I.e. this method removes the cdata-elements used for wrapping the whole xml data +// and processes the string so that the inner cdatas used in the xml become valid. +// THIS METHOD SHOULD BE CALLED RIGHT IN THE BEGINNING OF PARSING IF -BLOCK +// IS WRAPPED WITHIN CDATA. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::PreProcessL( HBufC8* aXml ) const + { + // take a modifiable pointer + TPtr8 xml = aXml->Des(); + + // the string used for searching and moving in the string + TPtrC8 searchString(*aXml); + + // the current position in the original string + TInt searchStartPos = 0; + + // find the first cdata start + TInt cdataStartPos = searchString.Find(KCDataStart); + + // If CDATA is not found from beginning then data is not inside CDATA and then + // preprocessing is not needed + if ( cdataStartPos != 0 ) + { + return; + } + + TInt cdataEndPos = KErrNotFound; + + // while cdata is found + while ( cdataStartPos != KErrNotFound ) + { + cdataStartPos += searchStartPos; + + // find an end of cdata before entities are converted + cdataEndPos = searchString.Find(KCDataEnd); + + // convert entities between search start and cdata start + TInt entityChange = EntitiesToCharactersL(aXml, searchStartPos, cdataStartPos); + xml.Set(aXml->Des()); + cdataStartPos += entityChange; + + if ( cdataEndPos != KErrNotFound ) + { + cdataEndPos += entityChange; + cdataEndPos += searchStartPos; + + // if the end is before start -> error + if (cdataEndPos < cdataStartPos) + User::Leave( EInvalidCDataStructure ); + + // remove cdata end + xml.Delete(cdataEndPos, KCDataEnd().Length()); + // remove cdata start + xml.Delete(cdataStartPos, KCDataStart().Length()); + + searchStartPos = cdataEndPos - KCDataStart().Length(); + searchString.Set( xml.Right(xml.Length() - searchStartPos) ); + } + else + { + // the end of cdata was not found or cdata end was before start -> error + User::Leave( EInvalidCDataStructure ); + } + + // find a new cdata start that is after the found end + cdataStartPos = searchString.Find(KCDataStart); + + } + + } + + +// ------------------------------------------------------------------------------------------------ +// Return the TNSmlBoolean-value's string-representation. +// ------------------------------------------------------------------------------------------------ +TPtrC8 CNSmlXmlParser::BooleanToString( const TNSmlBoolean aValue ) const + { + TPtrC8 str; + switch(aValue) + { + case EBooleanTrue: + { + str.Set(KStringTrue); + break; + } + case EBooleanFalse: + { + str.Set(KStringFalse); + break; + } + default: + { + str.Set(KStringEmpty); + } + } + + return str; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the TTime-value's string-representation. +// ------------------------------------------------------------------------------------------------ +TBuf8 CNSmlXmlParser::DateTimeToStringL( const TTime& aValue ) const + { + TBuf str; + + // aValue is not changed but Z character is added to the end of string. + // Messaging uses UTC times and that is reason why time is not changed. + aValue.FormatL( str, _L("%F%Y%M%DT%H%T%SZ") ); + + // from 16-bit to 8-bit + TBuf8 dt; + dt.Copy(str); + + return dt; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the integer value's string-representation. +// ------------------------------------------------------------------------------------------------ +TBuf8 CNSmlXmlParser::IntegerToString( const TInt aValue ) const + { + TBuf8 str; + str.AppendNum(aValue); + return str; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the boolean representation of the string or leaves if error (EInvalidBooleanValue). +// ------------------------------------------------------------------------------------------------ +TNSmlBoolean CNSmlXmlParser::StringToBooleanL( const TPtrC8& aValue ) const + { + if( aValue == KStringTrue ) + return EBooleanTrue; + else if( aValue == KStringFalse || aValue == KStringEmpty ) + return EBooleanFalse; + else + User::Leave(EInvalidBooleanValue); + + return EBooleanMissing; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the integer representation of the string or leaves if error (EInvalidIntegerValue). +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::StringToIntegerL( const TPtrC8& aValue ) const + { + if (aValue.Length() <= 0) + return 0; + + // convert the data to an integer + TLex8 lex(aValue); + TUint uValue = 0; + TBool isNegative = EFalse; + + TChar c = lex.Peek(); + + // check for a minus or plus sign + if ( c == '-' ) + { + isNegative = ETrue; + lex.Inc(); + } + else if ( c == '+' ) + { + lex.Inc(); + } + + TRadix radix = EDecimal; + c = lex.Peek(); + + if (c == '0') // octal or hex + { + lex.Get(); + c = lex.Get(); + if ( c == 'x' || c == 'X' ) + { + radix = EHex; + } + else + { + radix = EOctal; + lex.UnGet(); // back up + } + } + + TInt err = lex.Val(uValue, radix); + if ( err != KErrNone ) + User::Leave(EInvalidIntegerValue); + + TInt value = uValue; + + return isNegative ? value*(-1) : value; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the TTime representation of the string or leaves if error (EInvalidDatetimeValue). +// UTC times are not supported, i.e. datetimes that have Z-ending are treated as +// local times. +// ------------------------------------------------------------------------------------------------ +TTime CNSmlXmlParser::StringToTTimeL( TPtrC8& aValue ) const + { + // check that there is data + if (aValue.Length() <= 0) + User::Leave( EInvalidDatetimeValue ); + + // format the data into a TTime + + if (aValue[aValue.Length()-1] == 'Z') + { + // The datetime is in UTC, which is not supported + // no correction done, treat as local time + aValue.Set( aValue.Left( aValue.Length()-1 ) ); + } + + TDateTime datetime(0,(TMonth)0,0,0,0,0,0); + + // read datetime and check errors + + TInt error = KErrNone; + + // read year + TPtrC8 str = aValue.Left(4); + TLex8 lex(str); + TInt value; + error = lex.Val(value); + CheckDatetimeErrorL( error ); + error = datetime.SetYear(value); + CheckDatetimeErrorL( error ); + + // read month + str.Set(aValue.Mid(4, 2)); + lex.Assign(str); + error = lex.Val(value); + CheckDatetimeErrorL( error ); + --value; + error = datetime.SetMonth((TMonth)value); + CheckDatetimeErrorL( error ); + + // read day + str.Set(aValue.Mid(6, 2)); + lex.Assign(str); + error = lex.Val(value); + CheckDatetimeErrorL( error ); + --value; + error = datetime.SetDay(value); + CheckDatetimeErrorL( error ); + + // Skip character 'T' and read hour + str.Set(aValue.Mid(9, 2)); + lex.Assign(str); + error = lex.Val(value); + CheckDatetimeErrorL( error ); + error = datetime.SetHour(value); + CheckDatetimeErrorL( error ); + + // minutes + str.Set(aValue.Mid(11, 2)); + lex.Assign(str); + error = lex.Val(value); + CheckDatetimeErrorL( error ); + error = datetime.SetMinute(value); + CheckDatetimeErrorL( error ); + + // seconds + str.Set(aValue.Mid(13, 2)); + lex.Assign(str); + error = lex.Val(value); + CheckDatetimeErrorL( error ); + error = datetime.SetSecond(value); + CheckDatetimeErrorL( error ); + + return TTime(datetime); + } + + +// ------------------------------------------------------------------------------------------------ +// Adds start element, the value and end element to aPtr. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::AppendElement( TPtr8& aPtr, const TDesC8& aElementName, const TDesC8& aValue ) const + { + // start element + aPtr.Append(KElementStart); + aPtr.Append(aElementName); + aPtr.Append(KElementEnd); + + // value + aPtr.Append(aValue); + + // end element + aPtr.Append(KElementStart); + aPtr.Append(KCharacterSlash); + aPtr.Append(aElementName); + aPtr.Append(KElementEnd); + } + + +// ------------------------------------------------------------------------------------------------ +// Forms an element using the given element name and appends it to the given string. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::AppendElement( TPtr8& aPtr, const TDesC8& aElementName ) const + { + aPtr.Append(KElementStart); + aPtr.Append(aElementName); + aPtr.Append(KElementEnd); + } + + +// ------------------------------------------------------------------------------------------------ +// Forms an end element using the given element name and appends it to the given string. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::AppendEndElement( TPtr8& aPtr, const TDesC8& aElementName ) const + { + aPtr.Append(KElementStart); + aPtr.Append(KCharacterSlash); + aPtr.Append(aElementName); + aPtr.Append(KElementEnd); + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the total length of start and end tag. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::SizeOfElements( const TDesC8& aElementName ) const + { + TInt size = 0; + + // start element plus end element ( 1 = length of '/' char ) + size += 2*aElementName.Length() + 1; + size += 2*KElementStartEndWidth; // '<' and '>' + + return size; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the length of the given boolean element and it's data if it was a string. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::SizeOfBoolean( const TNSmlBoolean aValue, const TDesC8& aElementName ) const + { + TInt size = 0; + size += SizeOfElements( aElementName ); + switch ( aValue ) + { + case EBooleanTrue: + return size+4; // "true" + case EBooleanFalse: + return size+5; // "false" + default: + return 0; + } + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the length of the given datetime element and it's data if it was a string. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::SizeOfDatetime( const TDesC8& aElementName ) const + { + TInt size = SizeOfElements( aElementName ) + KDateTimeLength; + return size; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the maximum length of the given integer element and it's data if it was a string. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::SizeOfInteger( const TDesC8& aElementName ) const + { + TInt size = SizeOfElements( aElementName ) + KIntegerMaxLength; + return size; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns the length of the given string element and it's data if it was a string. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::SizeOfString( const HBufC8* aValue, const TDesC8& aElementName ) const + { + TInt size = SizeOfElements( aElementName ) + aValue->Length(); + return size; + } + + +// ------------------------------------------------------------------------------------------------ +// Finds entities and replaces them with the characters they represent. Returns +// an integer indicating the size change in aXml. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::EntitiesToCharactersL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const + { + TInt change = 0; + TInt changeSum = 0; + + change = ReplaceL(aXml, KEntityLT, KLessThan, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KEntityGT, KGreaterThan, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KEntityAMP, KAmpersand, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KEntityAPOS, KApostrophe, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KEntityQUOT, KQuotation, aStartPos, aEndPos); + changeSum += change; + + return changeSum; + } + + +// ------------------------------------------------------------------------------------------------ +// Finds special characters and replaces them with corresponding entities. Returns +// an integer indicating the size change in aXml. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::CharactersToEntitiesL( HBufC8*& aXml, TInt aStartPos, TInt aEndPos ) const + { + TInt change = 0; + TInt changeSum = 0; + + // Note: this replace has to be the first one, since it changes + // &-characters to &s and all the other replaces generate + // &-characters as they are entities. + change = ReplaceL(aXml, KAmpersand, KEntityAMP, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KLessThan, KEntityLT, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KGreaterThan, KEntityGT, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KApostrophe, KEntityAPOS, aStartPos, aEndPos); + changeSum += change; + aEndPos += change; + + change = ReplaceL(aXml, KQuotation, KEntityQUOT, aStartPos, aEndPos); + changeSum += change; + + return changeSum; + } + + +// ------------------------------------------------------------------------------------------------ +// Returns ETrue if all the characters in the given text are whitespace +// characters, else EFalse. +// ------------------------------------------------------------------------------------------------ +TBool CNSmlXmlParser::IsWhitespace( const TDesC8& aText ) const + { + // loop the string character by character + TText c; + for ( TInt i=0; i < aText.Length(); ++i ) + { + c = aText[i]; + switch( c ) + { + case KWhitespaceEmpty: + break; + case KWhitespaceLineFeed: + break; + case KWhitespaceNewLine: + break; + case KWhitespaceTabular: + break; + case KWhitespaceLineFeedNewLine: + break; + default: + return EFalse; + } + } + + return ETrue; + } + + +// ------------------------------------------------------------------------------------------------ +// Leaves with EInvalidXmlError if the given string is not whitespace. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::LeaveIfNotWhiteSpaceL( const TDesC8& aText ) const + { + if ( !IsWhitespace( aText ) ) + { + User::Leave( EInvalidXmlError ); + } + } + + +// ------------------------------------------------------------------------------------------------ +// Maps the given value to TNSmlParserGeneratorError. +// ------------------------------------------------------------------------------------------------ +TNSmlParserGeneratorError CNSmlXmlParser::CheckError( const TInt error ) const + { + if ( error == KErrNoMemory ) + { + return EOutOfMemory; + } + else if ( error < KErrNone ) + { + // some system wide error, should not occur + return EUnknownError; + } + else if ( error != EErrorNone ) + { + return (TNSmlParserGeneratorError)error; + } + + return EErrorNone; + } + + +// ------------------------------------------------------------------------------------------------ +// Parses the given xml and calls NextDataL and NextElementL methods when finds +// data or element. +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::ParseL( TPtrC8& aXml ) + { + + ResetBufferL(iBuffer); + ResetBufferL(iCompleteBuffer); + + // boolean indicating if reading element name (true) or insides of + // an element (false) + TBool readingElementName = EFalse; + TText c; + + for( TInt i=0; i < aXml.Length(); ++i ) + { + c = aXml[i]; + switch(c) + { + case KElementStart: + // if currently reading element, error + if( readingElementName ) + { + User::Leave(EInvalidXmlError); + } + + if( aXml.Length()-i >= KCDataStart().Length() && + !aXml.Mid(i, KCDataStart().Length()).Compare(KCDataStart()) ) + { // cdata + aXml.Set( aXml.Right( aXml.Length() - i ) ); + TInt endPos = aXml.Find(KCDataEnd); + + TPtrC8 cdata = _L8(""); + if ( endPos == KErrNotFound ) + { + User::Leave(EInvalidCDataStructure); + } + + cdata.Set( aXml.Mid( KCDataStart().Length(), endPos - KCDataStart().Length() ) ); + aXml.Set( aXml.Right( aXml.Length() - endPos - KCDataEnd().Length() ) ); + + i = -1; + + // add current buffer to complete buffer + EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); + AddToCompleteL(*iBuffer); + ResetBufferL(iBuffer); + AddToCompleteL(cdata); + } +#ifndef __NO_XML_COMMENTS_ + else if( aXml.Length()-i >= KCommentStart().Length() && + !aXml.Mid(i, KCommentStart().Length()).Compare(KCommentStart()) ) + { // comment + aXml.Set( aXml.Right( aXml.Length() - i ) ); + TInt endPos = aXml.Find(KCommentEnd); + + if ( endPos != KErrNotFound ) + { + aXml.Set( aXml.Right( aXml.Length() - endPos - KCommentEnd().Length() ) ); + } + else + { + User::Leave(EInvalidXmlError); + } + + i = -1; + } +#endif + else + { + // send the buffer + EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); + AddToCompleteL(*iBuffer); + NextDataL(*iCompleteBuffer); + ResetBufferL(iBuffer); + ResetBufferL(iCompleteBuffer); + readingElementName = ETrue; + } + + break; + case KElementEnd: + // stop reading element name + if( !readingElementName ) + { + User::Leave(EInvalidXmlError); + } + else + { + NextElementL(*iBuffer); + ResetBufferL(iBuffer); + readingElementName = EFalse; + } + break; + default: + // add char to buffer + AddToBufferL(c, iBuffer); + break; + } + } + + EntitiesToCharactersL( iBuffer, 0, iBuffer->Length() ); + AddToCompleteL(*iBuffer); + NextDataL(*iCompleteBuffer); + } + + +// ------------------------------------------------------------------------------------------------ +// Adds the given string to iCompleteBuffer +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::AddToCompleteL( const TPtrC8 aStr ) + { + if(!iCompleteBuffer) + { + iCompleteBuffer = HBufC8::NewL(aStr.Length()); + } + + TPtr8 ptr = iCompleteBuffer->Des(); + if( ptr.MaxLength() < iCompleteBuffer->Length()+aStr.Length() ) + { + iCompleteBuffer = iCompleteBuffer->ReAllocL(iCompleteBuffer->Length()+aStr.Length()); + ptr.Set(iCompleteBuffer->Des()); + } + + ptr.Append(aStr); + } + + +// ------------------------------------------------------------------------------------------------ +// Deletes the given buffer and initializes it again to length 10 +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::ResetBufferL( HBufC8*& aBuf ) const + { + if( aBuf ) + { + delete aBuf; + aBuf = NULL; + } + + aBuf = HBufC8::NewL(10); + } + + +// ------------------------------------------------------------------------------------------------ +// Adds the given char to given buffer +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::AddToBufferL( const TText c, HBufC8*& aBuf ) const + { + TPtr8 ptr = aBuf->Des(); + if( ptr.MaxLength() == aBuf->Length()+1 ) + { + aBuf = aBuf->ReAllocL(aBuf->Length()+10); + ptr.Set(aBuf->Des()); + } + + TChar str = c; + ptr.Append(str); + } + + + +// ------------------------------------------------------------------------------------------------ +// Replaces all occurances of aTarget in aText with aItem. Returns an integer indicating +// the size change in aText. aStartPos and aEndPos indicate the start and end positions +// of aText to be parsed (if whole string should be parsed, use 0 and aText.Length()). +// ------------------------------------------------------------------------------------------------ +TInt CNSmlXmlParser::ReplaceL( HBufC8*& aText, const TDesC8& aTarget, const TDesC8& aItem, TInt aStartPos, TInt aEndPos ) const + { + TInt change = 0; + TInt searchPos = aStartPos; + TPtrC8 text = aText->Mid(aStartPos, aEndPos-aStartPos); + TInt pos = text.Find(aTarget); + + while ( pos != KErrNotFound ) + { + pos += searchPos; + + TInt currentChange = aItem.Length() - aTarget.Length(); + change += currentChange; + aEndPos += currentChange; + searchPos = pos; + + if ( currentChange > 0 ) + { + searchPos += currentChange; + + // check that aText is large enough + if ( aText->Des().MaxLength() < aText->Length()+currentChange ) + { + aText = aText->ReAllocL(aText->Length()+currentChange); + } + } + + // the actual replace + aText->Des().Replace(pos, aTarget.Length(), aItem); + + text.Set( aText->Mid(searchPos, aEndPos-searchPos) ); + pos = text.Find(aTarget); + } + + return change; + } + + +// ------------------------------------------------------------------------------------------------ +// +// ------------------------------------------------------------------------------------------------ +void CNSmlXmlParser::CheckDatetimeErrorL( const TInt error ) const + { + if ( error != KErrNone ) + { + User::Leave( EInvalidDatetimeValue ); + } + } + +//End of File + diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsextensions/group/bld.inf --- a/omads/omadsextensions/group/bld.inf Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsextensions/group/bld.inf Thu Dec 17 08:39:39 2009 +0200 @@ -17,6 +17,8 @@ #include "../dsutils/cgiscriptutils/bld/bld.inf" +#include "../dsutils/nsmlfolderutils/bld/bld.inf" +#include "../dsutils/nsmldefaultagendahandler/bld/bld.inf" #include "../datamod/bld/bld.inf" #include "../adapters/bld/bld.inf"