# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1278414362 -10800 # Node ID 9ba7f05d28a588946919558cb16f7e7722712694 # Parent 0ca79e3612d9211aeea0aed22d7b010b09cb6be0 Revision: 201025 Kit: 2010127 diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/bwins/sconsyncclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/bwins/sconsyncclientu.def Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,43 @@ +EXPORTS + ??0RSconSyncSession@@QAE@XZ @ 1 NONAME ; RSconSyncSession::RSconSyncSession(void) + ??1CSconDataproviderInfo@@UAE@XZ @ 2 NONAME ; CSconDataproviderInfo::~CSconDataproviderInfo(void) + ??1RSconSyncSession@@QAE@XZ @ 3 NONAME ; RSconSyncSession::~RSconSyncSession(void) + ?AddedItemsL@RSconSyncSession@@QBEXAAV?$RArray@H@@@Z @ 4 NONAME ; void RSconSyncSession::AddedItemsL(class RArray &) const + ?CancelRequest@RSconSyncSession@@QAEXXZ @ 5 NONAME ; void RSconSyncSession::CancelRequest(void) + ?Close@RSconSyncSession@@QAEXXZ @ 6 NONAME ; void RSconSyncSession::Close(void) + ?CloseDataStore@RSconSyncSession@@QBEXXZ @ 7 NONAME ; void RSconSyncSession::CloseDataStore(void) const + ?CommitChangeInfoL@RSconSyncSession@@QAEXABV?$RArray@H@@@Z @ 8 NONAME ; void RSconSyncSession::CommitChangeInfoL(class RArray const &) + ?Connect@RSconSyncSession@@QAEHXZ @ 9 NONAME ; int RSconSyncSession::Connect(void) + ?CreateItemL@RSconSyncSession@@QAEXAAHHABVTDesC8@@11@Z @ 10 NONAME ; void RSconSyncSession::CreateItemL(int &, int, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &) + ?CreateItemL@RSconSyncSession@@QAEXAAV?$TPckg@H@@HABVTDesC8@@11AAVTRequestStatus@@@Z @ 11 NONAME ; void RSconSyncSession::CreateItemL(class TPckg &, int, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TRequestStatus &) + ?DefaultStoreL@CSconDataproviderInfo@@QAEAAVTDesC16@@XZ @ 12 NONAME ; class TDesC16 & CSconDataproviderInfo::DefaultStoreL(void) + ?DeleteAllItems@RSconSyncSession@@QAEXAAVTRequestStatus@@@Z @ 13 NONAME ; void RSconSyncSession::DeleteAllItems(class TRequestStatus &) + ?DeleteItemL@RSconSyncSession@@QAEXH@Z @ 14 NONAME ; void RSconSyncSession::DeleteItemL(int) + ?DeletedItemsL@RSconSyncSession@@QBEXAAV?$RArray@H@@@Z @ 15 NONAME ; void RSconSyncSession::DeletedItemsL(class RArray &) const + ?DisplayNameL@CSconDataproviderInfo@@QAEAAVTDesC16@@XZ @ 16 NONAME ; class TDesC16 & CSconDataproviderInfo::DisplayNameL(void) + ?ExternalizeL@CSconDataproviderInfo@@QBEXAAVRWriteStream@@@Z @ 17 NONAME ; void CSconDataproviderInfo::ExternalizeL(class RWriteStream &) const + ?GetParent@RSconSyncSession@@QAEHHAAH@Z @ 18 NONAME ; int RSconSyncSession::GetParent(int, int &) + ?GetSyncTimeStampL@RSconSyncSession@@QBEXHHAAVTDateTime@@@Z @ 19 NONAME ; void RSconSyncSession::GetSyncTimeStampL(int, int, class TDateTime &) const + ?HasSyncHistoryL@RSconSyncSession@@QBEHXZ @ 20 NONAME ; int RSconSyncSession::HasSyncHistoryL(void) const + ?ImplementationUid@CSconDataproviderInfo@@QBE?AVTUid@@XZ @ 21 NONAME ; class TUid CSconDataproviderInfo::ImplementationUid(void) const + ?InternalizeL@CSconDataproviderInfo@@QAEXAAVRReadStream@@@Z @ 22 NONAME ; void CSconDataproviderInfo::InternalizeL(class RReadStream &) + ?ListAllImplementationsL@RSconSyncSession@@QAEXAAV?$RPointerArray@VCSconDataproviderInfo@@@@@Z @ 23 NONAME ; void RSconSyncSession::ListAllImplementationsL(class RPointerArray &) + ?ListStoresL@CSconDataproviderInfo@@QBEPAVCDesC16Array@@XZ @ 24 NONAME ; class CDesC16Array * CSconDataproviderInfo::ListStoresL(void) const + ?ModifiedItemsL@RSconSyncSession@@QBEXAAV?$RArray@H@@@Z @ 25 NONAME ; void RSconSyncSession::ModifiedItemsL(class RArray &) const + ?MoveItemL@RSconSyncSession@@QAEXHH@Z @ 26 NONAME ; void RSconSyncSession::MoveItemL(int, int) + ?MovedItemsL@RSconSyncSession@@QBEXAAV?$RArray@H@@@Z @ 27 NONAME ; void RSconSyncSession::MovedItemsL(class RArray &) const + ?NewL@CSconDataproviderInfo@@SAPAV1@XZ @ 28 NONAME ; class CSconDataproviderInfo * CSconDataproviderInfo::NewL(void) + ?OpenDataStoreL@RSconSyncSession@@QAEXHABVTDesC16@@H@Z @ 29 NONAME ; void RSconSyncSession::OpenDataStoreL(int, class TDesC16 const &, int) + ?OpenItemL@RSconSyncSession@@QAEXHAAH0AAVTDes8@@1AAVCBufFlat@@@Z @ 30 NONAME ; void RSconSyncSession::OpenItemL(int, int &, int &, class TDes8 &, class TDes8 &, class CBufFlat &) + ?ReplaceItemL@RSconSyncSession@@QAEXHHHABVTDesC8@@@Z @ 31 NONAME ; void RSconSyncSession::ReplaceItemL(int, int, int, class TDesC8 const &) + ?ReplaceItemL@RSconSyncSession@@QAEXHHHABVTDesC8@@AAVTRequestStatus@@@Z @ 32 NONAME ; void RSconSyncSession::ReplaceItemL(int, int, int, class TDesC8 const &, class TRequestStatus &) + ?ResetChangeInfoL@RSconSyncSession@@QAEXXZ @ 33 NONAME ; void RSconSyncSession::ResetChangeInfoL(void) + ?SetDefaultStoreL@CSconDataproviderInfo@@QAEXABVTDesC16@@@Z @ 34 NONAME ; void CSconDataproviderInfo::SetDefaultStoreL(class TDesC16 const &) + ?SetDisplayNameL@CSconDataproviderInfo@@QAEXABVTDesC16@@@Z @ 35 NONAME ; void CSconDataproviderInfo::SetDisplayNameL(class TDesC16 const &) + ?SetImplementationUid@CSconDataproviderInfo@@QAEXVTUid@@@Z @ 36 NONAME ; void CSconDataproviderInfo::SetImplementationUid(class TUid) + ?SetRemoteStoreFormatL@RSconSyncSession@@QAEXABVCSmlDataStoreFormat@@@Z @ 37 NONAME ; void RSconSyncSession::SetRemoteStoreFormatL(class CSmlDataStoreFormat const &) + ?SetStoresL@CSconDataproviderInfo@@QAEXABVCDesC16Array@@@Z @ 38 NONAME ; void CSconDataproviderInfo::SetStoresL(class CDesC16Array const &) + ?SoftDeleteItemL@RSconSyncSession@@QAEXH@Z @ 39 NONAME ; void RSconSyncSession::SoftDeleteItemL(int) + ?SoftDeletedItemsL@RSconSyncSession@@QBEXAAV?$RArray@H@@@Z @ 40 NONAME ; void RSconSyncSession::SoftDeletedItemsL(class RArray &) const + ?StoreFormatL@RSconSyncSession@@QAEPAVCSmlDataStoreFormat@@ABVRStringPool@@@Z @ 41 NONAME ; class CSmlDataStoreFormat * RSconSyncSession::StoreFormatL(class RStringPool const &) + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/eabi/sconsyncclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/eabi/sconsyncclientu.def Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,49 @@ +EXPORTS + _ZN16RSconSyncSession11CreateItemLER5TPckgIiEiRK6TDesC8S5_S5_R14TRequestStatus @ 1 NONAME + _ZN16RSconSyncSession11CreateItemLERiiRK6TDesC8S3_S3_ @ 2 NONAME + _ZN16RSconSyncSession11DeleteItemLEi @ 3 NONAME + _ZN16RSconSyncSession12ReplaceItemLEiiiRK6TDesC8 @ 4 NONAME + _ZN16RSconSyncSession12ReplaceItemLEiiiRK6TDesC8R14TRequestStatus @ 5 NONAME + _ZN16RSconSyncSession12StoreFormatLERK11RStringPool @ 6 NONAME + _ZN16RSconSyncSession13CancelRequestEv @ 7 NONAME + _ZN16RSconSyncSession14DeleteAllItemsER14TRequestStatus @ 8 NONAME + _ZN16RSconSyncSession14OpenDataStoreLEiRK7TDesC16i @ 9 NONAME + _ZN16RSconSyncSession15SoftDeleteItemLEi @ 10 NONAME + _ZN16RSconSyncSession16ResetChangeInfoLEv @ 11 NONAME + _ZN16RSconSyncSession17CommitChangeInfoLERK6RArrayIiE @ 12 NONAME + _ZN16RSconSyncSession21SetRemoteStoreFormatLERK19CSmlDataStoreFormat @ 13 NONAME + _ZN16RSconSyncSession23ListAllImplementationsLER13RPointerArrayI21CSconDataproviderInfoE @ 14 NONAME + _ZN16RSconSyncSession5CloseEv @ 15 NONAME + _ZN16RSconSyncSession7ConnectEv @ 16 NONAME + _ZN16RSconSyncSession9GetParentEiRi @ 17 NONAME + _ZN16RSconSyncSession9MoveItemLEii @ 18 NONAME + _ZN16RSconSyncSession9OpenItemLEiRiS0_R5TDes8S2_R8CBufFlat @ 19 NONAME + _ZN16RSconSyncSessionC1Ev @ 20 NONAME + _ZN16RSconSyncSessionC2Ev @ 21 NONAME + _ZN16RSconSyncSessionD1Ev @ 22 NONAME + _ZN16RSconSyncSessionD2Ev @ 23 NONAME + _ZN21CSconDataproviderInfo10SetStoresLERK12CDesC16Array @ 24 NONAME + _ZN21CSconDataproviderInfo12DisplayNameLEv @ 25 NONAME + _ZN21CSconDataproviderInfo12InternalizeLER11RReadStream @ 26 NONAME + _ZN21CSconDataproviderInfo13DefaultStoreLEv @ 27 NONAME + _ZN21CSconDataproviderInfo15SetDisplayNameLERK7TDesC16 @ 28 NONAME + _ZN21CSconDataproviderInfo16SetDefaultStoreLERK7TDesC16 @ 29 NONAME + _ZN21CSconDataproviderInfo20SetImplementationUidE4TUid @ 30 NONAME + _ZN21CSconDataproviderInfo4NewLEv @ 31 NONAME + _ZN21CSconDataproviderInfoD0Ev @ 32 NONAME + _ZN21CSconDataproviderInfoD1Ev @ 33 NONAME + _ZN21CSconDataproviderInfoD2Ev @ 34 NONAME + _ZNK16RSconSyncSession11AddedItemsLER6RArrayIiE @ 35 NONAME + _ZNK16RSconSyncSession11MovedItemsLER6RArrayIiE @ 36 NONAME + _ZNK16RSconSyncSession13DeletedItemsLER6RArrayIiE @ 37 NONAME + _ZNK16RSconSyncSession14CloseDataStoreEv @ 38 NONAME + _ZNK16RSconSyncSession14ModifiedItemsLER6RArrayIiE @ 39 NONAME + _ZNK16RSconSyncSession15HasSyncHistoryLEv @ 40 NONAME + _ZNK16RSconSyncSession17GetSyncTimeStampLEiiR9TDateTime @ 41 NONAME + _ZNK16RSconSyncSession17SoftDeletedItemsLER6RArrayIiE @ 42 NONAME + _ZNK21CSconDataproviderInfo11ListStoresLEv @ 43 NONAME + _ZNK21CSconDataproviderInfo12ExternalizeLER12RWriteStream @ 44 NONAME + _ZNK21CSconDataproviderInfo17ImplementationUidEv @ 45 NONAME + _ZTI21CSconDataproviderInfo @ 46 NONAME ; ## + _ZTV21CSconDataproviderInfo @ 47 NONAME ; ## + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009-2010 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: Build information file for project SyncClient +* +*/ + + +PRJ_EXPORTS +../rom/sconsyncclient.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconsyncclient.iby) + +PRJ_PLATFORMS +DEFAULT + +PRJ_MMPFILES +sconsyncclient.mmp + +PRJ_TESTMMPFILES diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/group/sconsyncclient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/group/sconsyncclient.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,50 @@ +/* +* 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: Client side of sconsyncserver +* +*/ + + +// To get the APP_LAYER_SYSTEMINCLUDE-definition +#include +#include + +TARGET sconsyncclient.dll +TARGETTYPE dll + +CAPABILITY CAP_CLIENT_DLL + +UID 0x1000008d 0x2001A963 +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE sconsyncclient.cpp +SOURCE scondataproviderinfo.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../../inc + +// Server +USERINCLUDE ../../../servers/syncserver/inc + + +// Default system include paths for middleware layer modules. +APP_LAYER_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY estor.lib +LIBRARY bafl.lib +LIBRARY charconv.lib +LIBRARY smlstoreformat.lib +DEBUGLIBRARY flogger.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/inc/scondataproviderinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/inc/scondataproviderinfo.h Tue Jul 06 14:06:02 2010 +0300 @@ -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: CSconDataproviderInfo header +* +*/ + + +#ifndef SCONDATAPROVIDERINFO_H_ +#define SCONDATAPROVIDERINFO_H_ + +#include +#include + +class RWriteStream; +class RReadStream; + +/** + * Contains information about DataSync dataprovider. + */ +class CSconDataproviderInfo : public CBase +{ +public: + IMPORT_C static CSconDataproviderInfo* NewL(); + IMPORT_C ~CSconDataproviderInfo(); + + IMPORT_C void ExternalizeL( RWriteStream& aStream ) const; + IMPORT_C void InternalizeL( RReadStream& aStream ); + + IMPORT_C TUid ImplementationUid() const; + IMPORT_C void SetImplementationUid( const TUid aUid ); + IMPORT_C TDesC& DisplayNameL(); + IMPORT_C void SetDisplayNameL( const TDesC& aName ); + IMPORT_C TDesC& DefaultStoreL(); + IMPORT_C void SetDefaultStoreL( const TDesC& aStore ); + IMPORT_C CDesCArray* ListStoresL() const; + IMPORT_C void SetStoresL( const CDesCArray& aStores ); +private: + CSconDataproviderInfo(); + void ConstructL(); + +private: + TInt iUid; + HBufC* iName; + HBufC* iDefaultStore; + CDesCArrayFlat* iStores; +}; + +typedef RPointerArray RSconDataProviderInfoArray; + +#endif /*SCONDATAPROVIDERINFO_H_*/ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/inc/sconsyncclient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/inc/sconsyncclient.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,99 @@ +/* +* 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: RSconSyncSession header +* +*/ + + +#ifndef _SCONSYNCCLIENT_H_ +#define _SCONSYNCCLIENT_H_ + +#include +#include +#include +#include + +#include "scondataproviderinfo.h" + + + +class CNSmlDataItemUidSet; + +class RSconSyncSession : public RSessionBase +{ +public: + IMPORT_C RSconSyncSession(); + IMPORT_C ~RSconSyncSession(); + + IMPORT_C TInt Connect(); + IMPORT_C void Close(); + + IMPORT_C void ListAllImplementationsL( RSconDataProviderInfoArray& aInfoArray ); + + IMPORT_C void OpenDataStoreL( const TSmlDataProviderId aProviderId, const TDesC& aStoreName, const TInt aContextId ); + + IMPORT_C void OpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, + CBufFlat& aItemData ); + + IMPORT_C void CreateItemL(TSmlDbItemUid& aUid, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, const TDesC8& aData); + IMPORT_C void CreateItemL(TPckg& aUidPckg, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, const TDesC8& aData, + TRequestStatus& aStatus ); + + IMPORT_C void ReplaceItemL(TSmlDbItemUid aUid, TSmlDbItemUid aParent, + TBool aFieldChange, const TDesC8& aData); + IMPORT_C void ReplaceItemL(TSmlDbItemUid aUid, TSmlDbItemUid aParent, + TBool aFieldChange, const TDesC8& aData, + TRequestStatus& aStatus ); + + IMPORT_C void MoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent); + IMPORT_C void DeleteItemL(TSmlDbItemUid aUid); + IMPORT_C void SoftDeleteItemL(TSmlDbItemUid aUid); + IMPORT_C void DeleteAllItems( TRequestStatus& aStatus ); + + IMPORT_C TBool HasSyncHistoryL() const; + IMPORT_C void AddedItemsL( RArray& aItems ) const; + IMPORT_C void DeletedItemsL( RArray& aItems ) const; + IMPORT_C void SoftDeletedItemsL( RArray& aItems ) const; + IMPORT_C void ModifiedItemsL( RArray& aItems ) const; + IMPORT_C void MovedItemsL( RArray& aItems ) const; + + IMPORT_C void CloseDataStore() const; + + IMPORT_C void ResetChangeInfoL(); + IMPORT_C void CommitChangeInfoL(const RArray& aItems ); + + IMPORT_C void GetSyncTimeStampL( const TSmlDataProviderId aProviderId, const TInt aContextId, TDateTime& aTimeStamp ) const; + + IMPORT_C CSmlDataStoreFormat* StoreFormatL( const RStringPool& aStringPool ); + IMPORT_C void SetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat ); + + + IMPORT_C void CancelRequest(); + + IMPORT_C TInt GetParent( TSmlDbItemUid aUid, TSmlDbItemUid& aParent ); +private: + TInt StartServer(); + TInt CreateAndSendChunkHandle(); +private: + RChunk iChunk; + TIpcArgs iArgs; + +}; + +#endif // _SCONSYNCCLIENT_H_ + +// End of File diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/rom/sconsyncclient.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/rom/sconsyncclient.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2010 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: IBY file for SconSyncClient +* +*/ + +#ifndef _SCONSYNCCLIENT_IBY_ +#define _SCONSYNCCLIENT_IBY_ + +#include + +file=ABI_DIR\BUILD_DIR\sconsyncclient.dll SHARED_LIB_DIR\sconsyncclient.dll + +#endif \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/src/scondataproviderinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/src/scondataproviderinfo.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,220 @@ +/* +* 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: CSconDataproviderInfo implementation +* +*/ + + +#include "scondataproviderinfo.h" +#include +#include +#include // for CnvUtfConverter +#include "debug.h" + +CSconDataproviderInfo::CSconDataproviderInfo() + { + } + +EXPORT_C CSconDataproviderInfo::~CSconDataproviderInfo() + { + delete iName; + delete iDefaultStore; + delete iStores; + } + +EXPORT_C CSconDataproviderInfo* CSconDataproviderInfo::NewL() + { + return new (ELeave) CSconDataproviderInfo(); + } + +EXPORT_C void CSconDataproviderInfo::ExternalizeL( RWriteStream& aStream ) const + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("iUid: 0x%x", iUid); + aStream.WriteInt32L( iUid ); + if ( iName ) + { + HBufC8* temp = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iName->Des() ); + CleanupStack::PushL( temp ); + TPtrC8 tempPtr = temp->Des(); + aStream.WriteUint16L( tempPtr.Length() ); + aStream.WriteL( tempPtr ); + CleanupStack::PopAndDestroy( temp ); + } + else + { + aStream.WriteUint16L( 0 ); + } + + if ( iDefaultStore ) + { + HBufC8* temp = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iDefaultStore->Des() ); + CleanupStack::PushL( temp ); + TPtrC8 tempPtr = temp->Des(); + aStream.WriteUint16L( tempPtr.Length() ); + aStream.WriteL( tempPtr ); + CleanupStack::PopAndDestroy( temp ); + } + else + { + aStream.WriteUint16L( 0 ); + } + if ( iStores ) + { + aStream.WriteUint16L( iStores->Count() ); + for ( TInt i=0; iCount(); i++ ) + { + TPtrC storePtr = (*iStores)[i]; + HBufC8* temp = CnvUtfConverter::ConvertFromUnicodeToUtf8L( storePtr ); + CleanupStack::PushL( temp ); + TPtrC8 tempPtr = temp->Des(); + aStream.WriteUint16L( tempPtr.Length() ); + if ( tempPtr.Length() > 0 ) + { + aStream.WriteL( tempPtr ); + } + CleanupStack::PopAndDestroy( temp ); + } + } + else + { + aStream.WriteUint16L( 0 ); + } + aStream.CommitL(); + TRACE_FUNC_EXIT; + } + +EXPORT_C void CSconDataproviderInfo::InternalizeL( RReadStream& aStream ) + { + TRACE_FUNC_ENTRY; + delete iName; + iName = NULL; + delete iDefaultStore; + iDefaultStore = NULL; + delete iStores; + iStores = NULL; + iStores = new ( ELeave ) CDesCArrayFlat( 1 ); + iUid = aStream.ReadInt32L(); + TInt len = aStream.ReadUint16L(); + if ( len > 0 ) + { + HBufC8* tempBuf = HBufC8::NewLC( len ); + TPtr8 tempPtr = tempBuf->Des(); + aStream.ReadL( tempPtr, len ); + + iName = CnvUtfConverter::ConvertToUnicodeFromUtf8L( tempPtr ); + CleanupStack::PopAndDestroy( tempBuf ); + } + + len = aStream.ReadUint16L(); + if ( len > 0 ) + { + HBufC8* tempBuf = HBufC8::NewLC( len ); + TPtr8 tempPtr = tempBuf->Des(); + aStream.ReadL( tempPtr, len ); + + iDefaultStore = CnvUtfConverter::ConvertToUnicodeFromUtf8L( tempPtr ); + CleanupStack::PopAndDestroy( tempBuf ); + } + + TInt storeCount = aStream.ReadUint16L(); + for (TInt i=0; i 0 ) + { + HBufC8* tempBuf8 = HBufC8::NewLC( len ); + TPtr8 tempPtr8 = tempBuf8->Des(); + aStream.ReadL( tempPtr8, len ); + + HBufC* temp = CnvUtfConverter::ConvertToUnicodeFromUtf8L( tempPtr8 ); + CleanupStack::PushL( temp ); + TPtr tempPtr = temp->Des(); + iStores->AppendL( tempPtr ); + CleanupStack::PopAndDestroy( temp ); + CleanupStack::PopAndDestroy( tempBuf8 ); + } + } + TRACE_FUNC_EXIT; + } + +EXPORT_C TUid CSconDataproviderInfo::ImplementationUid() const + { + return TUid::Uid( iUid ); + } + +EXPORT_C void CSconDataproviderInfo::SetImplementationUid( const TUid aUid ) + { + iUid = aUid.iUid; + } + +EXPORT_C TDesC& CSconDataproviderInfo::DisplayNameL() + { + if ( iName ) + { + return *iName; + } + else + { + iName = KNullDesC().AllocL(); + return *iName; + } + } + +EXPORT_C void CSconDataproviderInfo::SetDisplayNameL( const TDesC& aName ) + { + delete iName; + iName = NULL; + iName = aName.AllocL(); + } + +EXPORT_C TDesC& CSconDataproviderInfo::DefaultStoreL() + { + if ( iDefaultStore ) + { + return *iDefaultStore; + } + else + { + iDefaultStore = KNullDesC().AllocL(); + return *iDefaultStore; + } + } + +EXPORT_C void CSconDataproviderInfo::SetDefaultStoreL( const TDesC& aStore ) + { + delete iDefaultStore; + iDefaultStore = NULL; + iDefaultStore = aStore.AllocL(); + } + +EXPORT_C CDesCArray* CSconDataproviderInfo::ListStoresL() const + { + if ( !iStores ) + { + User::Leave( KErrNotFound ); + } + return iStores; + } + +EXPORT_C void CSconDataproviderInfo::SetStoresL( const CDesCArray& aStores ) + { + delete iStores; + iStores = NULL; + iStores = new ( ELeave ) CDesCArrayFlat( 1 ); + for ( TInt i=0; iAppendL( aStores[i] ); + } + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/clients/syncclient/src/sconsyncclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/clients/syncclient/src/sconsyncclient.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,668 @@ +/* +* 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: RSconSyncSession implementation +* +*/ + + +#include "sconsyncclient.h" + +#include +#include + +#include "sconsyncclientserver.h" +#include "debug.h" + +const TInt KSConSyncChunkSize = 0xFFFF; // 65535 bytes; +const TInt KSConSyncChunkMaxSize = 0x400000; // 4194304 bytes + +EXPORT_C RSconSyncSession::RSconSyncSession() + { + TRACE_FUNC; + } + +EXPORT_C RSconSyncSession::~RSconSyncSession() + { + TRACE_FUNC; + } + +EXPORT_C TInt RSconSyncSession::Connect() + { + TRACE_FUNC_ENTRY; + TInt retryCount = 2; + TInt error = KErrNone; + while(retryCount) + { + error = CreateSession(KSconSyncServerName, TVersion(1,0,0)); + if ( error != KErrNotFound && error != KErrServerTerminated ) + { + break; + } + error = StartServer(); + if( error != KErrNone && error != KErrAlreadyExists ) + { + break; + } + --retryCount; + } + + if ( error == KErrNone ) + { + error = CreateAndSendChunkHandle(); + if ( error != KErrNone ) + { + LOGGER_WRITE("CreateAndSendChunkHandle failed, close session"); + Close(); + } + } + TRACE_FUNC_EXIT; + return error; + } + +// ----------------------------------------------------------------------------- +// RSconSyncSession::Close() +// Closes the server connection +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSconSyncSession::Close() + { + TRACE_FUNC_ENTRY; + iChunk.Close(); + RSessionBase::Close(); + TRACE_FUNC_EXIT + } + +EXPORT_C void RSconSyncSession::ListAllImplementationsL( RSconDataProviderInfoArray& aInfoArray ) + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EListImplementations, args ); + + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::ListAllImplementationsL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + + // copy data from the chunk + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + TInt count( readStream.ReadUint16L() ); + LOGGER_WRITE_1("count: %d", count); + for ( TInt i=0; iInternalizeL( readStream ); + aInfoArray.AppendL( dpInfo ); + CleanupStack::Pop( dpInfo ); + } + + CleanupStack::PopAndDestroy( &readStream ); + + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::OpenDataStoreL( const TSmlDataProviderId aProviderId, const TDesC& aStoreName, TInt aContextId ) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( iChunk.Adjust( + sizeof(TInt32) + + sizeof(TInt32) + + aStoreName.Size() + + sizeof(TInt) )); + + RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() ); + writeBuf.WriteInt32L( aProviderId ); + + writeBuf.WriteInt32L( aStoreName.Length() ); + writeBuf.WriteL( aStoreName ); + + writeBuf.WriteInt32L( aContextId ); + + writeBuf.CommitL(); + writeBuf.Close(); + + TIpcArgs args; + TInt ret = SendReceive ( EOpenStore, args ); + + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::OpenDataStoreL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::OpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, CBufFlat& aItemData ) + { + TRACE_FUNC_ENTRY; + TIpcArgs args( aUid ); + TInt ret = SendReceive ( EOpenItem, args ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::OpenItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + + // copy data from the chunk + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + TInt32 length ( 0 ); + + aItemData.Reset(); + length = readStream.ReadInt32L(); + + HBufC8* data = HBufC8::NewLC( length ); + TPtr8 dataPtr = data->Des(); + + readStream.ReadL( dataPtr, length ); + aItemData.ExpandL( 0, length ); + aItemData.Write ( 0, dataPtr ); + + CleanupStack::PopAndDestroy( data ); + + aFieldChange = readStream.ReadInt8L(); + + aParent = readStream.ReadInt32L(); + length = readStream.ReadInt32L(); + readStream.ReadL( aMimeType, length ); + + length = readStream.ReadInt32L(); + readStream.ReadL( aMimeVer, length ); + + CleanupStack::PopAndDestroy( &readStream ); + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::CreateItemL(TSmlDbItemUid& aUid/*, TInt aSize*/, + TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& aMimeVer, + const TDesC8& aData) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( iChunk.Adjust( + sizeof(TInt32) + + sizeof(TInt32) + + aMimeType.Length() + + sizeof(TInt32) + + aMimeVer.Length() + + sizeof(TInt32) + + aData.Length() )); + RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( writeBuf ); + writeBuf.WriteInt32L( aParent ); + writeBuf.WriteInt32L( aMimeType.Length() ); + writeBuf.WriteL( aMimeType ); + writeBuf.WriteInt32L( aMimeVer.Length() ); + writeBuf.WriteL( aMimeVer ); + writeBuf.WriteInt32L( aData.Length() ); + writeBuf.WriteL( aData ); + + writeBuf.CommitL(); + CleanupStack::PopAndDestroy( &writeBuf ); + + + + TPckg pckg(aUid); + iArgs = TIpcArgs( &pckg ); + + TInt ret = SendReceive ( ECreateItem, iArgs ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::CreateItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + LOGGER_WRITE_1("aUid: %d", aUid); + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::CreateItemL(TPckg& aUidPckg, + TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& aMimeVer, + const TDesC8& aData, TRequestStatus& aStatus) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( iChunk.Adjust( + sizeof(TInt32) + + sizeof(TInt32) + + aMimeType.Length() + + sizeof(TInt32) + + aMimeVer.Length() + + sizeof(TInt32) + + aData.Length() )); + RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( writeBuf ); + writeBuf.WriteInt32L( aParent ); + writeBuf.WriteInt32L( aMimeType.Length() ); + writeBuf.WriteL( aMimeType ); + writeBuf.WriteInt32L( aMimeVer.Length() ); + writeBuf.WriteL( aMimeVer ); + writeBuf.WriteInt32L( aData.Length() ); + writeBuf.WriteL( aData ); + + writeBuf.CommitL(); + CleanupStack::PopAndDestroy( &writeBuf ); + + iArgs = TIpcArgs( &aUidPckg ); + SendReceive( ECreateItem, iArgs, aStatus ); + + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::ReplaceItemL(TSmlDbItemUid aUid, + TSmlDbItemUid aParent, TBool aFieldChange, const TDesC8& aData) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( iChunk.Adjust( + sizeof(TInt32) + + sizeof(TInt32) + + sizeof(TInt8) + + sizeof(TInt32) + + aData.Length() )); + RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( writeBuf ); + writeBuf.WriteInt32L( aUid ); + writeBuf.WriteInt32L( aParent ); + writeBuf.WriteInt8L( aFieldChange ); + writeBuf.WriteInt32L( aData.Length() ); + writeBuf.WriteL( aData ); + writeBuf.CommitL(); + CleanupStack::PopAndDestroy( &writeBuf ); + + TIpcArgs args; + TInt ret = SendReceive( EReplaceItem, args ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::ReplaceItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::ReplaceItemL(TSmlDbItemUid aUid, + TSmlDbItemUid aParent, TBool aFieldChange, const TDesC8& aData, + TRequestStatus& aStatus) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( iChunk.Adjust( + sizeof(TInt32) + + sizeof(TInt32) + + sizeof(TInt8) + + sizeof(TInt32) + + aData.Length() )); + RMemWriteStream writeBuf( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( writeBuf ); + writeBuf.WriteInt32L( aUid ); + writeBuf.WriteInt32L( aParent ); + writeBuf.WriteInt8L( aFieldChange ); + writeBuf.WriteInt32L( aData.Length() ); + writeBuf.WriteL( aData ); + writeBuf.CommitL(); + CleanupStack::PopAndDestroy( &writeBuf ); + + TIpcArgs args; + SendReceive( EReplaceItem, args, aStatus ); + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::MoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid aNewParent ) + { + TRACE_FUNC_ENTRY; + + TIpcArgs args(aUid, aNewParent); + TInt ret = SendReceive ( EMoveItem, args ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::MoveItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::DeleteItemL( TSmlDbItemUid aUid ) + { + TRACE_FUNC_ENTRY; + + TIpcArgs args( aUid ); + TInt ret = SendReceive ( EDeleteItem, args ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::DeleteItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + TRACE_FUNC_EXIT; + } + + +EXPORT_C void RSconSyncSession::SoftDeleteItemL( TSmlDbItemUid aUid ) + { + TRACE_FUNC_ENTRY; + + TIpcArgs args( aUid ); + TInt ret = SendReceive ( ESoftDeleteItem, args ); + if ( ret != KErrNone) + { + LOGGER_WRITE_1( "RSconSyncSession::SoftDeleteItemL() :\ + Send Receive failed with code %d", ret ); + User::Leave( ret ); + }; + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::DeleteAllItems( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + SendReceive( EDeleteAllItems, args, aStatus ); + TRACE_FUNC_EXIT; + } + + +EXPORT_C TBool RSconSyncSession::HasSyncHistoryL() const + { + TRACE_FUNC; + TBool history(EFalse); + TPckg pck(history); + TIpcArgs args(&pck); + TInt ret = SendReceive ( EHasHistory, args ); + User::LeaveIfError( ret ); + TRACE_FUNC_EXIT; + return history; + } + +EXPORT_C void RSconSyncSession::AddedItemsL( RArray& aItems) const + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EAddedItems, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + aItems.Reset(); + TInt itemCount = readStream.ReadInt32L(); + for (TInt i=0; i& aItems) const + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EDeletedItems, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + aItems.Reset(); + TInt itemCount = readStream.ReadInt32L(); + for (TInt i=0; i& aItems) const + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( ESoftDeletedItems, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + aItems.Reset(); + TInt itemCount = readStream.ReadInt32L(); + for (TInt i=0; i& aItems) const + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EModifiedItems, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + aItems.Reset(); + TInt itemCount = readStream.ReadInt32L(); + for (TInt i=0; i& aItems) const + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EMovedItems, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + aItems.Reset(); + TInt itemCount = readStream.ReadInt32L(); + for (TInt i=0; i& aItems ) + { + TRACE_FUNC_ENTRY; + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + LOGGER_WRITE_1("items count: %d", aItems.Count()); + stream.WriteInt32L( aItems.Count() ); + for (TInt i=0; i < aItems.Count(); i++ ) + { + LOGGER_WRITE("Write item"); + stream.WriteInt32L( aItems[i] ); + } + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + + TIpcArgs args; + TInt ret = SendReceive ( ECommitChangeInfo, args ); + User::LeaveIfError( ret ); + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::GetSyncTimeStampL( const TSmlDataProviderId aProviderId, const TInt aContextId, TDateTime& aTimeStamp ) const + { + TRACE_FUNC_ENTRY; + + TPckg timeBuf( aTimeStamp ); + TIpcArgs args( aProviderId, aContextId, &timeBuf ); + TInt ret = SendReceive ( EGetSyncTimeStamp, args ); + User::LeaveIfError( ret ); + + TRACE_FUNC_EXIT; + } + +EXPORT_C CSmlDataStoreFormat* RSconSyncSession::StoreFormatL( const RStringPool& aStringPool ) + { + TRACE_FUNC_ENTRY; + TIpcArgs args; + TInt ret = SendReceive ( EExportStoreFormat, args ); + User::LeaveIfError( ret ); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + TInt len = readStream.ReadInt32L(); + LOGGER_WRITE_1("data size from server: %d", len); + LOGGER_WRITE("CSmlDataStoreFormat::NewLC"); + CSmlDataStoreFormat* tempStoreFormat = CSmlDataStoreFormat::NewLC( aStringPool, readStream ); + LOGGER_WRITE("CSmlDataStoreFormat::NewLC -ok"); + CleanupStack::Pop( tempStoreFormat ); + + LOGGER_WRITE("PopAndDestroy( &readStream )"); + CleanupStack::PopAndDestroy( &readStream ); + LOGGER_WRITE("return"); + TRACE_FUNC_EXIT; + return tempStoreFormat; + } + +EXPORT_C void RSconSyncSession::SetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat ) + { + TRACE_FUNC_ENTRY; + const TInt KMaximumDataStoreFormatSize = 100000; // 100kb should be enought + User::LeaveIfError( iChunk.Adjust( KMaximumDataStoreFormatSize )); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + + aServerDataStoreFormat.ExternalizeL( stream ); + + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + + TIpcArgs args; + TInt ret = SendReceive ( ESetRemoteStoreFormat, args ); + User::LeaveIfError( ret ); + TRACE_FUNC_EXIT; + } + +EXPORT_C void RSconSyncSession::CancelRequest() + { + TRACE_FUNC_ENTRY; + SendReceive( ECancelRequest, TIpcArgs() ); + TRACE_FUNC_EXIT; + } + +EXPORT_C TInt RSconSyncSession::GetParent( TSmlDbItemUid aUid, TSmlDbItemUid& aParent ) + { + TRACE_FUNC_ENTRY; + TPckg pckg(aParent); + TIpcArgs args( aUid, &pckg ); + TInt ret = SendReceive( EReadParent, args ); + TRACE_FUNC_EXIT; + return ret; + } + +TInt RSconSyncSession::StartServer() + { + TRACE_FUNC_ENTRY; + + RProcess server; + TInt error = server.Create(KSconSyncServerExe, KNullDesC); + if ( error != KErrNone ) + { + return error; + } + // start server and wait for signal before proceeding + TRequestStatus status; + server.Rendezvous(status); + if ( status.Int() != KRequestPending ) + { + server.Kill(0); + } + else + { + server.Resume(); + } + + User::WaitForRequest( status ); + error = server.ExitType() == EExitPanic ? KErrGeneral : status.Int(); + server.Close(); + TRACE_FUNC_EXIT; + return error; + } + +// ----------------------------------------------------------------------------- +// RSconSyncSession::CreateAndSendChunkHandle() +// Creates a chunk and sends a handle to server +// ----------------------------------------------------------------------------- +// +TInt RSconSyncSession::CreateAndSendChunkHandle() + { + TRACE_FUNC_ENTRY; + + TInt err = iChunk.CreateGlobal( KNullDesC, + KSConSyncChunkSize, + KSConSyncChunkMaxSize ); + if ( err != KErrNone ) + { + LOGGER_WRITE_1("iChunk.CreateGlobal failed, err: %d", err); + return err; + } + TIpcArgs args; + args.Set( 0, iChunk ); + err = SendReceive( ESendChunkHandle, args ); + + LOGGER_WRITE_1("RSconSyncSession::CreateAndSendChunkHandle : returned: %d", err); + return err; + } + +// End of File diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/cntparser/bld/bld.inf --- a/connectivitymodules/SeCon/cntparser/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/cntparser/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,6 +16,8 @@ */ +PRJ_EXPORTS +../rom/cntparser.iby CORE_APP_LAYER_IBY_EXPORT_PATH(cntparser.iby) PRJ_PLATFORMS DEFAULT diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/cntparser/rom/cntparser.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/cntparser/rom/cntparser.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2009-2010 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: Image description file for Contact Parser Client and Server. +* +*/ + + +#ifndef _CNTPARSER_IBY_ +#define _CNTPARSER_IBY_ + +file=ABI_DIR\BUILD_DIR\cntparserserverexe.exe PROGRAMS_DIR\cntparserserverexe.exe +file=ABI_DIR\BUILD_DIR\cntparserserver.dll SHARED_LIB_DIR\cntparserserver.dll + +#endif \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/cntparser/src/cntparserserverexe.cpp --- a/connectivitymodules/SeCon/cntparser/src/cntparserserverexe.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/cntparser/src/cntparserserverexe.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -261,7 +261,7 @@ { LOGGER_WRITE( "CntParserServer: Complete phonebook request" ); iSessionIter.SetToFirst(); - while( iSessionIter!=NULL ) //Go through all sessions + while( iSessionIter ) //Go through all sessions { ( (CCntParserServerSession*) (iSessionIter++) )->CompletePhoneBookRequest( aErr ); } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/common/conmltask/inc/sconconmltask.h --- a/connectivitymodules/SeCon/common/conmltask/inc/sconconmltask.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/common/conmltask/inc/sconconmltask.h Tue Jul 06 14:06:02 2010 +0300 @@ -287,6 +287,7 @@ //used only with reply TBool iComplete; //task complete TInt iProgress; //task progress + HBufC8* iData; }; //============================================================ @@ -309,6 +310,7 @@ //used only with reply TBool iComplete; //task complete TInt iProgress; //task progress + HBufC8* iData; }; //============================================================ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/common/conmltask/src/sconconmltask.cpp --- a/connectivitymodules/SeCon/common/conmltask/src/sconconmltask.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/common/conmltask/src/sconconmltask.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -25,7 +25,7 @@ // // ----------------------------------------------------------------------------- // -CSConReboot::CSConReboot() : iComplete( EFalse ), iProgress( 0 ) +CSConReboot::CSConReboot() { } @@ -117,13 +117,7 @@ // // ----------------------------------------------------------------------------- // -CSConUpdateDeviceInfo::CSConUpdateDeviceInfo() : - iInstallSupp(EFalse), iUninstallSupp(EFalse), - iInstParamsSupp(EFalse), iInstAppsSupp(EFalse), - iDataOwnersSupp(EFalse), iSetBURModeSupp(EFalse), - iGetSizeSupp(EFalse), iReqDataSupp(EFalse), - iSupplyDataSupp(EFalse), iRebootSupp(EFalse), - iComplete( EFalse ), iProgress( 0 ) +CSConUpdateDeviceInfo::CSConUpdateDeviceInfo() { } @@ -187,7 +181,7 @@ // // ----------------------------------------------------------------------------- // -CSConListInstApps::CSConListInstApps() : iComplete( EFalse ), iProgress( 0 ) +CSConListInstApps::CSConListInstApps() { //Initialize iDriveList with zeros iDriveList.Fill( '\x0' ); @@ -271,7 +265,7 @@ // // ----------------------------------------------------------------------------- // -CSConInstall::CSConInstall() : iMode( EUnknown ), iComplete( EFalse ), iProgress( 0 ) +CSConInstall::CSConInstall() : iMode( EUnknown ) { } @@ -282,6 +276,7 @@ // CSConInstall::~CSConInstall() { + delete iData; } // ----------------------------------------------------------------------------- @@ -297,6 +292,11 @@ copy->iComplete = iComplete; copy->iProgress = iProgress; + + if ( iData ) + { + copy->iData = iData->Alloc(); + } return copy; } @@ -306,7 +306,7 @@ // // ----------------------------------------------------------------------------- // -CSConUninstall::CSConUninstall() : iMode( EUnknown ), iComplete( EFalse ), iProgress( 0 ) +CSConUninstall::CSConUninstall() : iMode( EUnknown ) { } @@ -317,6 +317,7 @@ // CSConUninstall::~CSConUninstall() { + delete iData; } // ----------------------------------------------------------------------------- @@ -334,6 +335,11 @@ copy->iComplete = iComplete; copy->iProgress = iProgress; + + if ( iData ) + { + copy->iData = iData->Alloc(); + } return copy; } @@ -343,7 +349,7 @@ // // ----------------------------------------------------------------------------- // -CSConListDataOwners::CSConListDataOwners() : iComplete( EFalse ), iProgress( 0 ) +CSConListDataOwners::CSConListDataOwners() { } @@ -398,7 +404,7 @@ // // ----------------------------------------------------------------------------- // -CSConSetBURMode::CSConSetBURMode() : iComplete( EFalse ), iProgress( 0 ) +CSConSetBURMode::CSConSetBURMode() { //Initialize iDriveList with zeros iDriveList.Fill( '\x0' ); @@ -436,7 +442,7 @@ // // ----------------------------------------------------------------------------- // -CSConGetDataSize::CSConGetDataSize() : iComplete( EFalse ), iProgress( 0 ) +CSConGetDataSize::CSConGetDataSize() { } @@ -490,7 +496,7 @@ // // ----------------------------------------------------------------------------- // -CSConListPublicFiles::CSConListPublicFiles() : iComplete( EFalse ), iProgress( 0 ) +CSConListPublicFiles::CSConListPublicFiles() { } @@ -545,8 +551,7 @@ // // ----------------------------------------------------------------------------- // -CSConRequestData::CSConRequestData() : iDataOwner( NULL ), iBackupData( NULL ), - iMoreData( EFalse ), iComplete( EFalse ), iProgress( 0 ) +CSConRequestData::CSConRequestData() { iDataOwner = new CSConDataOwner(); } @@ -633,7 +638,7 @@ // // ----------------------------------------------------------------------------- // -CSConGetDataOwnerStatus::CSConGetDataOwnerStatus() : iComplete( EFalse ), iProgress( 0 ) +CSConGetDataOwnerStatus::CSConGetDataOwnerStatus() { } @@ -688,8 +693,7 @@ // // ----------------------------------------------------------------------------- // -CSConSupplyData::CSConSupplyData() : iDataOwner( NULL ), iRestoreData( NULL ), - iComplete( EFalse ), iProgress( 0 ) +CSConSupplyData::CSConSupplyData() { iDataOwner = new CSConDataOwner(); } @@ -760,8 +764,7 @@ // // ----------------------------------------------------------------------------- // -CSConGetMetadata::CSConGetMetadata() : iData( NULL ), - iMoreData( EFalse ), iComplete( EFalse ), iProgress( 0 ) +CSConGetMetadata::CSConGetMetadata() { } @@ -772,11 +775,7 @@ // CSConGetMetadata::~CSConGetMetadata() { - if ( iData ) - { - delete iData; - iData = NULL; - } + delete iData; } // ----------------------------------------------------------------------------- @@ -1687,7 +1686,7 @@ // // ----------------------------------------------------------------------------- // -CSConStatusReply::CSConStatusReply() : iNoTasks( EFalse ) +CSConStatusReply::CSConStatusReply() { } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/group/bld.inf --- a/connectivitymodules/SeCon/group/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -22,9 +22,15 @@ #include "../services/csc/bld/bld.inf" #include "../services/ftp/bld/bld.inf" #include "../services/pcd/bld/bld.inf" +// #include "../services/oviaccounthandler/group/bld.inf" + #include "../wbxml/conmlhandler/bld/bld.inf" #include "../servers/pcconn/bld/bld.inf" +#include "../servers/syncserver/group/bld.inf" + #include "../clients/pcconn/bld/bld.inf" +#include "../clients/syncclient/group/bld.inf" + #include "../plugins/pcconn/bld/bld.inf" #include "../plugins/ftp/bld/bld.inf" #include "../plugins/hapticsconnplugin/group/bld.inf" @@ -36,12 +42,6 @@ stubs/sconpcconnplugin_stub.sis /epoc32/data/z/system/install/sconpcconnplugin_stub.sis stubs/sconftpplugin_stub.sis /epoc32/data/z/system/install/sconftpplugin_stub.sis -../rom/sconpcd.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconpcd.iby) -../rom/sconpcconnplugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconpcconnplugin.iby) -../rom/sconpcconnclientserver.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconpcconnclientserver.iby) -../rom/sconftpresources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(sconftpresources.iby) -../rom/sconftpplugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconftpplugin.iby) -../rom/sconftp.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconftp.iby) -../rom/sconcsc.iby CORE_MW_LAYER_IBY_EXPORT_PATH(sconcsc.iby) -../rom/cntparser.iby CORE_MW_LAYER_IBY_EXPORT_PATH(cntparser.iby) +../rom/sconpcconnclientserver.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconpcconnclientserver.iby) + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/group/stubs/secon_stub.SIS Binary file connectivitymodules/SeCon/group/stubs/secon_stub.SIS has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/group/stubs/secon_stub.pkg --- a/connectivitymodules/SeCon/group/stubs/secon_stub.pkg Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/group/stubs/secon_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ ; -; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; Copyright (c) 2010 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" @@ -17,7 +17,7 @@ &EN ; Header -#{"Service Controllers"},(0x101F99F6),1,0,0, TYPE=SA +#{"Service Controllers"},(0x101F99F6),1,72,0, TYPE=SA ; Localised Vendor name %{"Nokia"} diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/inc/debug.h --- a/connectivitymodules/SeCon/inc/debug.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/inc/debug.h Tue Jul 06 14:06:02 2010 +0300 @@ -21,10 +21,8 @@ #ifdef _DEBUG - #ifdef __WINS__ - // Enable file logging - #define __FLOGGING__ - #endif //__WINS__ + // Enable file logging + #define __FLOGGING__ #include #ifdef __FLOGGING__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/plugins/ftp/bld/bld.inf --- a/connectivitymodules/SeCon/plugins/ftp/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/plugins/ftp/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -14,7 +14,8 @@ * Description: File Transfer Profile Plug-in build information file. * */ - +PRJ_EXPORTS +../rom/sconftpplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconftpplugin.iby) PRJ_PLATFORMS DEFAULT diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/plugins/ftp/rom/sconftpplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/plugins/ftp/rom/sconftpplugin.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* 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: Image description file for FTPplugin +* +*/ + + +#ifndef __SCONFTP_PLUGIN_IBY__ +#define __SCONFTP_PLUGIN_IBY__ +//file content + +ECOM_PLUGIN(sconftpplugin.dll,101F9686.RSC) + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/plugins/pcconn/bld/bld.inf --- a/connectivitymodules/SeCon/plugins/pcconn/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/plugins/pcconn/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -15,6 +15,8 @@ * */ +PRJ_EXPORTS +../rom/sconpcconnplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconpcconnplugin.iby) PRJ_PLATFORMS DEFAULT diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/plugins/pcconn/rom/sconpcconnplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/plugins/pcconn/rom/sconpcconnplugin.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* 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: Image description file for PC Connectivity Plug-in. +* +*/ +#ifndef __SCONPCCONN_PLUGIN_IBY__ +#define __SCONPCCONN_PLUGIN_IBY__ +//file content + +ECOM_PLUGIN(sconpcconnplugin.dll,101F9688.RSC) + +file=ABI_DIR\BUILD_DIR\catalogspcconnectivityplugin.dll SHARED_LIB_DIR\catalogspcconnectivityplugin.dll + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/cntparser.iby --- a/connectivitymodules/SeCon/rom/cntparser.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -/* -* 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: Image description file for Contact Parser Client and Server. -* -*/ - - -file=ABI_DIR\BUILD_DIR\cntparserserverexe.exe PROGRAMS_DIR\cntparserserverexe.exe -file=ABI_DIR\BUILD_DIR\cntparserserver.dll SHARED_LIB_DIR\cntparserserver.dll - diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconcsc.iby --- a/connectivitymodules/SeCon/rom/sconcsc.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* -* Copyright (c) 2005-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: Image description file for project SConCSC -* -*/ - - -#ifndef __SCONCSC_IBY__ -#define __SCONCSC_IBY__ -//file content - -file=ABI_DIR\BUILD_DIR\sconcsc.dll SHARED_LIB_DIR\sconcsc.dll -data=ZPRIVATE\101F99F6\capability\101F9698.xml PRIVATE\101F99F6\capability\101F9698.xml -data=ZPRIVATE\101F99F6\capability\fwdcomp.xml PRIVATE\101F99F6\capability\fwdcomp.xml -data=ZPRIVATE\101F99F6\capability\101F99F6.xml PRIVATE\101F99F6\capability\101F99F6.xml -#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconftp.iby --- a/connectivitymodules/SeCon/rom/sconftp.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* -* 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: Image description file for CSConFTP -* -*/ - - -#ifndef __SCONFTP_IBY__ -#define __SCONFTP_IBY__ -//file content - -file=ABI_DIR\BUILD_DIR\sconftp.dll SHARED_LIB_DIR\sconftp.dll - -#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconftpplugin.iby --- a/connectivitymodules/SeCon/rom/sconftpplugin.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* -* 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: Image description file for FTPplugin -* -*/ - - -#ifndef __SCONFTP_PLUGIN_IBY__ -#define __SCONFTP_PLUGIN_IBY__ -//file content - -ECOM_PLUGIN(sconftpplugin.dll,101F9686.RSC) - -#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconftpresources.iby --- a/connectivitymodules/SeCon/rom/sconftpresources.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -/* -* 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: Image description file for SConFTP resources. -* -*/ - -#ifndef __SCONFTP_RESOURCE_IBY__ -#define __SCONFTP_RESOURCE_IBY__ - -data=DATAZ_\RESOURCE_FILES_DIR\sconftp.rsc RESOURCE_FILES_DIR\sconftp.rsc - -#endif \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconpcconnplugin.iby --- a/connectivitymodules/SeCon/rom/sconpcconnplugin.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* -* 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: Image description file for PC Connectivity Plug-in. -* -*/ -#ifndef __SCONPCCONN_PLUGIN_IBY__ -#define __SCONPCCONN_PLUGIN_IBY__ -//file content - -ECOM_PLUGIN(sconpcconnplugin.dll,101F9688.RSC) - -file=ABI_DIR\BUILD_DIR\catalogspcconnectivityplugin.dll SHARED_LIB_DIR\catalogspcconnectivityplugin.dll - -#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/rom/sconpcd.iby --- a/connectivitymodules/SeCon/rom/sconpcd.iby Wed Jun 23 18:02:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/* -* 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: Image description file for SConPCD. -* -*/ -#ifndef __SCONPCD_IBY__ -#define __SCONPCD_IBY__ -//file content - -file=ABI_DIR\BUILD_DIR\sconpcd.dll system\libs\sconpcd.dll - -data=ZPRIVATE\10202D56\sbeconfig.xml PRIVATE\10202D56\sbeconfig.xml - -#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/bld/sconpcconnserver.mmp --- a/connectivitymodules/SeCon/servers/pcconn/bld/sconpcconnserver.mmp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/servers/pcconn/bld/sconpcconnserver.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -27,7 +27,7 @@ TARGET sconpcconnserver.exe TARGETTYPE exe -EPOCSTACKSIZE 49152 +EPOCSTACKSIZE 0x10000 EPOCHEAPSIZE 0x10000 0x800000 UID 0 0x101F99F6 @@ -35,6 +35,9 @@ // Server SOURCEPATH ../src SOURCE sconpcconnserver.cpp +SOURCE sconimsireader.cpp +SOURCE sconfolderlister.cpp +SOURCE sconbtengine.cpp // ConML SOURCEPATH ../../../wbxml/conmlhandler/src @@ -49,6 +52,7 @@ USERINCLUDE ../../../common/conmltask/inc USERINCLUDE ../../../services/pcd/inc USERINCLUDE ../../../services/csc/inc +USERINCLUDE ../../../services/oviaccounthandler/inc USERINCLUDE ../../../wbxml/conmlhandler/inc // Default system include paths. @@ -58,4 +62,17 @@ LIBRARY estor.lib // RMemWriteStream, RMemReadStream LIBRARY efsrv.lib // Rfs, RFile LIBRARY charconv.lib // For Unicode conversion + +LIBRARY etel3rdparty.lib +LIBRARY platformenv.lib // For pathinfo +LIBRARY directorylocalizer.lib // For localizing directories +LIBRARY centralrepository.lib +LIBRARY commonengine.lib // For resource reader +LIBRARY bafl.lib // Basic Application Framework Library +LIBRARY btengdevman.lib +LIBRARY btmanclient.lib +LIBRARY btdevice.lib +LIBRARY bluetooth.lib +LIBRARY btengsettings.lib DEBUGLIBRARY flogger.lib + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/inc/sconbtengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/inc/sconbtengine.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,82 @@ +/* +* 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: CSconBtEngine declaration +* +*/ + + + +#ifndef SCONBTENGINE_H_ +#define SCONBTENGINE_H_ + +#include +#include +#include +#include +#include + +const TInt KCenRepAddrBufSize = 2 * KBTDevAddrSize; + +class CSconBtEngine : public CBase, + public MBTEngDevManObserver, + public MBTEngSettingsObserver + { +public: + static CSconBtEngine* NewL(); + ~CSconBtEngine(); + + void ReadBTInfoL( RBufWriteStream& aStream ); + + void SetBtAuthorizedL( const TDesC& aBtDevAddress, TBool aAuthorized ); + + TInt SetBtPowerState( TBool aPower ); + + TInt SetBtName( const TDesC& aBtName ); + +protected: + // From MBTEngDevManObserver + void HandleDevManComplete( TInt aErr ); + void HandleGetDevicesComplete( TInt aErr, + CBTDeviceArray* aDeviceArray ); + + // From MBTEngSettingsObserver + void PowerStateChanged( TBTPowerStateValue aState ); + void VisibilityModeChanged( TBTVisibilityMode aState ); + +private: + CSconBtEngine(); + void ConstructL(); + + void PrintDevicesL(); + +private: + enum TState + { + EIdle, + ERequestBtInfo, + EChangeBtState, + EChangeAuthorized + }; + TState iState; + TInt iOperationError; + CActiveSchedulerWait iWait; + RBufWriteStream* iStream; + CBTEngDevMan* iBtEng; + CBTDeviceArray* iBtDevArray; + CBTEngSettings* iBtSettings; + TBool iAuthorizedValue; + TBuf iBtAddress; + }; + +#endif /* SCONBTENGINE_H_ */ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/inc/sconfolderlister.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/inc/sconfolderlister.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,136 @@ +/* +* 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: CSconFolderLister declaration +* +*/ + + +#ifndef CSCONFOLDERLISTER_H +#define CSCONFOLDERLISTER_H + +// INCLUDES +#include +#include +#include // For RMemReadStream +#include +// CLASS DECLARATION + +class TSconDriveInfoEntry + { +public: + TUint8 iDriveType; + TUint8 iDriveTypeCount; + TInt64 iSize; + TInt64 iFree; + }; + +class TSconDriveInfo : public TSconDriveInfoEntry + { +public: + TUint iDriveStatus; + TBuf16<2> iDriveLetter; + TUint iDriveAttr; + TBufC iVolumeName; + }; + + +class CSconFolderEntry : public CBase + { +public: + static CSconFolderEntry* NewLC(); + static CSconFolderEntry* NewLC( const TEntry& aEntry ); + ~CSconFolderEntry(); +private: + CSconFolderEntry(); + void ConstructL( const TEntry& aEntry ); + +public: + TUint iAtt; + TTime iModified; + HBufC *iName; + HBufC *iLabel; + TBool iDriveInfoEntryExists; + TSconDriveInfoEntry iDriveInfoEntry; + }; + + +class CDirectoryLocalizer; + +/** + * CSconFolderLister + * + */ +class CSconFolderLister : public CBase + { +public: + // Constructors and destructor + + /** + * Destructor. + */ + ~CSconFolderLister(); + + /** + * Two-phased constructor. + */ + static CSconFolderLister* NewL( RFs& aFs ); + + /** + * + * @param aStream + * @param aStartPath + * @param aLevelsToSearch -1 = Search all levels, 0 = Search only current level, 1..N Search N levels + */ + void GenerateFolderListL( RBufWriteStream& aStream, const TDesC& aStartPath, const TInt aLevelsToSearch ); + +private: + + void ListAllDrivesL( RBufWriteStream& aStream, const TInt aLevelsToSearch ); + void ListDriveAndPathL( RBufWriteStream& aStream, TInt aDrive, const TDesC& aStartPath, const TInt aLevelsToSearch ); + + void ExportDriveL( RBufWriteStream& aStream, const TSconDriveInfo& aDriveInfo, + const TDesC& aPathName, const TInt aLevelsToSearch ); + + /** + * + * @param aStream + * @param aPathName + */ + void ExportPathL( RBufWriteStream& aStream, const TDesC& aPathName, + const CSconFolderEntry& aEntry, const TBool aLocalize, const TInt aLevelsToSearch ); + + void GetDriveTypeNumberL( TInt aDrive , TUint driveStatus, TInt& aTypeNumber); + + /** + * Constructor for performing 1st stage construction + */ + CSconFolderLister( RFs& aFs ); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + + TBool IsDirectoryPrintable( const TDesC& aParentPath, const TEntry& aFolderEntry ); + + void GetLocalizedVolumeNameL( CSconFolderEntry& aDriveEntry ); +private: + RFs& iFs; + TInt iFolders; + TInt iFiles; + TInt iCriticalLevel; + CDirectoryLocalizer* iLocalizer; + }; + +#endif // CSCONFOLDERLISTER_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/inc/sconimsireader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/inc/sconimsireader.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2009-2010 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: Imsi reader +* +*/ + + +#ifndef __SCONIMSIREADER_H__ +#define __SCONIMSIREADER_H__ + +#include +#include + +enum TImsiReaderStatus + { + EIdle, + ERequestingImsi, + ERequestingNetworkStatus + }; + +class CSconImsiReader : public CActive + { + public: + + static TInt GetImsiL( TDes& aImsi ); + + static TInt GetNetworkStatusL( CTelephony::TRegistrationStatus& aRegistrationStatus ); + + private: + CSconImsiReader( TDes& aImsi, CTelephony::TRegistrationStatus& aRegistrationStatus ); + void ConstructL(); + ~CSconImsiReader(); + + void RequestImsi(); + void RequestNetworkStatus(); + + private: // From CActive + + void RunL(); + void DoCancel(); + + private: // data + TDes& iImsi; + CTelephony::TRegistrationStatus& iNetworkStatus; + CTelephony* iTelephony; + CTelephony::TSubscriberIdV1 iSubscriberIdV1; + CTelephony::TSubscriberIdV1Pckg iSubscriberIdV1Pckg; + + CTelephony::TNetworkRegistrationV1 iNetworkRegistrationV1; + CTelephony::TNetworkRegistrationV1Pckg iNetworkRegistrationV1Pckg; + TImsiReaderStatus iImsiReaderStatus; + }; + +#endif // __SCONIMSIREADER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/inc/sconpcconnserver.h --- a/connectivitymodules/SeCon/servers/pcconn/inc/sconpcconnserver.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/servers/pcconn/inc/sconpcconnserver.h Tue Jul 06 14:06:02 2010 +0300 @@ -127,6 +127,10 @@ }; + +class CSconFolderLister; +class CSconBtEngine; + //********************************** //CSConPCConnSession - Server session class, handles the requested operations //********************************** @@ -216,7 +220,9 @@ TDesC8& HashToDesLC( const TDesC& aBuf ); TPtr DesToHashLC( const TDesC8& aDes ); TBool IsJavaHash( const TDesC8& aDes ); - + + TInt ReadOviAccountInfoL( RWriteStream& aAccountInfoStream ); + // data private: CSConPCConnServer& iServer; @@ -232,6 +238,10 @@ RChunk iChunk; CBufFlat* iBuffer; TInt iResult; + + CSconFolderLister* iFolderLister; + RFs iFs; + CSconBtEngine* iBtEngine; }; #endif // __SCONPCCONNSERVER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/src/sconbtengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/src/sconbtengine.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,415 @@ +/* +* 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: CSconBtEngine implementation +* +*/ + + + +#include +#include + +#include +#include +#include + +#include "sconbtengine.h" +#include "debug.h" + +CSconBtEngine* CSconBtEngine::NewL() + { + TRACE_FUNC; + CSconBtEngine* self = new (ELeave) CSconBtEngine(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CSconBtEngine::~CSconBtEngine() + { + TRACE_FUNC; + if ( iBtEng ) + { + iBtEng->Cancel(); + delete iBtEng; + } + + delete iBtSettings; + } + +CSconBtEngine::CSconBtEngine() + { + } + +void CSconBtEngine::ConstructL() + { + iBtEng = CBTEngDevMan::NewL( this ); + iBtSettings = CBTEngSettings::NewL( this ); + iState = EIdle; + } + +void CSconBtEngine::ReadBTInfoL( RBufWriteStream& aStream ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + User::Leave( KErrInUse ); + } + iStream = &aStream; + iOperationError = KErrNone; + + // Write local name (8 bit name length + unicode name) + TBuf<100> localName; + TInt err = iBtSettings->GetLocalName( localName ); + User::LeaveIfError( err ); + LOGGER_WRITE_1("localName: %S", &localName); + iStream->WriteUint8L( localName.Length() ); + iStream->WriteL( localName, localName.Length() ); + + if ( iBtAddress.Length() == 0 ) + { + LOGGER_WRITE("Try to read bt address"); + + CRepository* cenRep = NULL; + // Use TRAP to catch a leave if the CenRep key does not exist. + TRAP( err, cenRep = CRepository::NewL( KCRUidBluetoothLocalDeviceAddress ) ); + CleanupStack::PushL( cenRep ); + if( !err ) + { + err = cenRep->Get( KBTLocalDeviceAddress, iBtAddress ); + LOGGER_WRITE_1("cenRep->Get err: %d", err); + } + CleanupStack::PopAndDestroy( cenRep ); + + if ( err ) + { + iBtAddress.Zero(); + } + } + + // Write bt address (8 bit addr length + unicode address) + if ( iBtAddress.Length() > 0 ) + { + LOGGER_WRITE_1("btAddr: %S", &iBtAddress); + iStream->WriteUint8L( iBtAddress.Length() ); + iStream->WriteL( iBtAddress, iBtAddress.Length() ); + } + else + { + iStream->WriteUint8L( 0 ); + } + + // Write BT Power State (8-bit, 0=Off, 1=On) + TBTPowerStateValue state; + err = iBtSettings->GetPowerState( state ); + User::LeaveIfError( err ); + LOGGER_WRITE_1("PowerState: %d", state); + iStream->WriteUint8L( state ); + + // Get device info + TBTRegistrySearch crit; + crit.FindAll(); + if ( !iBtDevArray ) + { + LOGGER_WRITE("create arr"); + iBtDevArray = new (ELeave) CBTDeviceArray(5); + LOGGER_WRITE("create arr -ok"); + } + else + { + iBtDevArray->ResetAndDestroy(); + } + err = iBtEng->GetDevices( crit, iBtDevArray ); + LOGGER_WRITE_1("GetDevices err: %d", err); + User::LeaveIfError( err ); + iState = ERequestBtInfo; + + // Wait until completed + iWait.Start(); + iState = EIdle; + if ( iOperationError ) + { + LOGGER_WRITE_1("Operation failed, leave %d", iOperationError); + User::Leave( iOperationError ); + } + TRACE_FUNC_EXIT; + } + +void CSconBtEngine::SetBtAuthorizedL( const TDesC& aBtDevAddress, TBool aAuthorized ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + User::Leave( KErrInUse ); + } + + TBTRegistrySearch crit; + TBTDevAddr addr; + addr.SetReadable( aBtDevAddress ); + crit.FindAddress( addr ); + + if ( !iBtDevArray ) + { + LOGGER_WRITE("create arr"); + iBtDevArray = new (ELeave) CBTDeviceArray(5); + LOGGER_WRITE("create arr -ok"); + } + else + { + iBtDevArray->ResetAndDestroy(); + } + TInt err = iBtEng->GetDevices( crit, iBtDevArray ); + LOGGER_WRITE_1("GetDevices err: %d", err); + User::LeaveIfError( err ); + iState = EChangeAuthorized; + iOperationError = KErrNone; + iAuthorizedValue = aAuthorized; + + // Wait until completed + iWait.Start(); + iState = EIdle; + if ( iOperationError ) + { + LOGGER_WRITE_1("Operation failed, leave %d", iOperationError); + User::Leave( iOperationError ); + + } + + TRACE_FUNC_EXIT; + } + +TInt CSconBtEngine::SetBtPowerState( TBool aPower ) + { + TRACE_FUNC_ENTRY; + if ( iState != EIdle ) + { + return KErrInUse; + } + + TBTPowerStateValue state; + iOperationError = iBtSettings->GetPowerState( state ); + if ( iOperationError ) + { + return iOperationError; + } + else if ( ( aPower && state == EBTPowerOn ) + || ( !aPower && state == EBTPowerOff ) ) + { + // No need to change state + return KErrNone; + } + + state = EBTPowerOff; + if ( aPower ) + { + state = EBTPowerOn; + } + iOperationError = iBtSettings->SetPowerState( state ); + if ( iOperationError ) + { + return iOperationError; + } + iState = EChangeBtState; + + // Wait until completed + iWait.Start(); + + iState = EIdle; + TRACE_FUNC_RET( iOperationError ); + return iOperationError; + } + +TInt CSconBtEngine::SetBtName( const TDesC& aBtName ) + { + LOGGER_WRITE_1("SetBtName aBtName: %S", &aBtName); + TInt err = iBtSettings->SetLocalName( static_cast( aBtName ) ); + TRACE_FUNC_RET( err ); + return err; + } + +// From MBTEngDevManObserver +void CSconBtEngine::HandleDevManComplete( TInt aErr ) + { + TRACE_FUNC; + LOGGER_WRITE_1("aErr: %d", aErr ); + if ( iState == EChangeAuthorized ) + { + if ( iWait.IsStarted() ) + { + iOperationError = aErr; + iWait.AsyncStop(); + } + } + + } + +void CSconBtEngine::HandleGetDevicesComplete( TInt aErr, + CBTDeviceArray* aDeviceArray ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aErr: %d", aErr); + //iBtReqOngoing = EFalse; + if ( iState == ERequestBtInfo ) + { + // Continue to write devices info + TRAP( iOperationError, PrintDevicesL() ); + LOGGER_WRITE_1("PrintDevicesL err: %d", iOperationError); + + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + else if ( iState == EChangeAuthorized ) + { + iOperationError = aErr; + if ( !aErr && aDeviceArray->Count() == 1 ) + { + CBTDevice* btRef = aDeviceArray->At(0); + TBTDeviceSecurity devSec = btRef->GlobalSecurity(); + if ( btRef->IsPaired() && !devSec.Banned() ) + { + LOGGER_WRITE8_1("btAdrr: %S", &btRef->BDAddr().Des() ); + CBTDevice* btDevice = CBTDevice::NewLC( btRef->BDAddr() ); + + btDevice->SetPaired( ETrue ); + + btDevice->SetDeviceNameL( btRef->DeviceName() ); + btDevice->SetFriendlyNameL( btRef->FriendlyName() ); + LOGGER_WRITE8_1("name: %S", &btRef->DeviceName()); + LOGGER_WRITE8_1("FriendlyName: %S", &btRef->FriendlyName()); + + LOGGER_WRITE_1("iAuthorizedValue: %d", iAuthorizedValue); + // Set as authorized and store the device + TBTDeviceSecurity security; + security.SetNoAuthenticate( EFalse ); + security.SetNoAuthorise( iAuthorizedValue ); + security.SetBanned( EFalse ); + + btDevice->SetGlobalSecurity (security ); + + //iOperationError = iBtEng->ModifyDevice(*aDeviceArray->At(0)); + iOperationError = iBtEng->ModifyDevice( *btDevice ); + LOGGER_WRITE_1( "ModifyDevice err: %d", iOperationError ); + CleanupStack::PopAndDestroy( btDevice ); + } + else + { + LOGGER_WRITE("Device was not paired or it's banned") + iOperationError = KErrAccessDenied; + } + } + + // If error occured stop waiting, otherwise continue waiting until + // HandleDevManComplete has been called + if ( iOperationError && iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + TRACE_FUNC_EXIT; + } + +void CSconBtEngine::PrintDevicesL() + { + TRACE_FUNC_ENTRY; + // calculate devices count + TInt devCount(0); + + for ( TInt i=0 ; iCount(); i++ ) + { + CBTDevice* device = iBtDevArray->At(i); + // show only paired and banned devices + if ( device->IsPaired() || device->GlobalSecurity().Banned() ) + { + devCount++; + } + } + + // Print info + iStream->WriteUint8L( devCount ); + + for ( TInt i=0 ; iCount(); i++ ) + { + CBTDevice* device = iBtDevArray->At(i); + + const TBTDeviceSecurity btSec = device->GlobalSecurity(); + + // show only paired and banned devices + if ( device->IsPaired() || btSec.Banned() ) + { + LOGGER_WRITE_1("IsValidDeviceName: %d", device->IsValidDeviceName()); + const TDesC8& deviceName = device->DeviceName(); + LOGGER_WRITE8_1("DeviceName: %S", &deviceName ); + iStream->WriteUint8L( deviceName.Length() ); + iStream->WriteL( deviceName, deviceName.Length() ); + + LOGGER_WRITE_1("IsValidFriendlyName: %d", device->IsValidFriendlyName()); + LOGGER_WRITE_1("FriendlyName: %S", &device->FriendlyName() ); + + const TBTDevAddr& addr = device->BDAddr(); + + TBuf<100> readable; + addr.GetReadable( readable ); + LOGGER_WRITE_1("readable addr: %S", &readable); + iStream->WriteUint8L( readable.Length() ); + iStream->WriteL( readable, readable.Length() ); + + LOGGER_WRITE_1("paired: %d", device->IsPaired() ); + LOGGER_WRITE_1("IsValidPaired: %d", device->IsValidPaired() ); + TUint8 paired(0); + if ( device->IsPaired() && device->IsValidPaired() ) + { + paired = 1; + } + iStream->WriteUint8L( paired ); + + TUint8 noAuthorise(0); + if ( btSec.NoAuthorise() ) + { + noAuthorise = 1; + } + iStream->WriteUint8L( noAuthorise ); + + TUint8 banned(0); + if ( btSec.Banned() ) + { + banned = 1; + } + iStream->WriteUint8L( banned ); + + LOGGER_WRITE(""); + } + } + iStream->CommitL(); + iStream = NULL; //delete reference only + TRACE_FUNC_EXIT; + } + +// From MBTEngSettingsObserver +void CSconBtEngine::PowerStateChanged( TBTPowerStateValue /*aState*/ ) + { + TRACE_FUNC; + if ( iState == EChangeBtState && iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + + } + +void CSconBtEngine::VisibilityModeChanged( TBTVisibilityMode /*aState*/ ) + { + TRACE_FUNC; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/src/sconfolderlister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/src/sconfolderlister.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,717 @@ +/* +* 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: CSconFolderLister implementation +* +*/ + + +#include "sconfolderlister.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" + +const TUint16 KFormatVersion( 1 ); + +// Obex package size +const TInt KPackageSize = 65536; + +const TInt KMaxLevelsToSearch = 80; + +_LIT( KSConResourceName, "z:\\Resource\\sconftp.rsc" ); + +CSconFolderEntry* CSconFolderEntry::NewLC() + { + CSconFolderEntry* self = new (ELeave) CSconFolderEntry(); + CleanupStack::PushL( self ); + return self; + } +CSconFolderEntry* CSconFolderEntry::NewLC( const TEntry& aEntry ) + { + CSconFolderEntry* self = new (ELeave) CSconFolderEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aEntry ); + return self; + } +CSconFolderEntry::CSconFolderEntry() + { + } +CSconFolderEntry::~CSconFolderEntry() + { + delete iName; + delete iLabel; + } + + +void CSconFolderEntry::ConstructL( const TEntry& aEntry ) + { + iAtt = aEntry.iAtt; + iModified = aEntry.iModified.Int64(); + iName = aEntry.iName.AllocL(); + } + +CSconFolderLister::CSconFolderLister( RFs& aFs ) : iFs(aFs) + { + // No implementation required + } + +CSconFolderLister::~CSconFolderLister() + { + TRACE_FUNC; + delete iLocalizer; + } + +CSconFolderLister* CSconFolderLister::NewL( RFs& aFs ) + { + TRACE_FUNC_ENTRY; + CSconFolderLister* self = new (ELeave) CSconFolderLister( aFs ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT; + return self; + } + +void CSconFolderLister::ConstructL() + { + TRACE_FUNC_ENTRY; + + iLocalizer = CDirectoryLocalizer::NewL(); + + // set free memory up to critical level for all drives + CRepository* repository = CRepository::NewLC( KCRUidDiskLevel ); + TInt iCriticalLevel(0); + User::LeaveIfError( repository->Get( KDiskCriticalThreshold, iCriticalLevel ) ); + CleanupStack::PopAndDestroy( repository ); + iCriticalLevel += KPackageSize; // add obex package size to critical level + TRACE_FUNC_EXIT; + } + + +void CSconFolderLister::GenerateFolderListL( RBufWriteStream& aStream, const TDesC& aStartPath, + const TInt aLevelsToSearch ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aStartPath: %S", &aStartPath ); + LOGGER_WRITE_1("aLevelsToSearch: %d", aLevelsToSearch ); + TInt levelsToSearch = aLevelsToSearch; + if ( levelsToSearch > KMaxLevelsToSearch || levelsToSearch == KErrNotFound ) + levelsToSearch = KMaxLevelsToSearch; + iFolders = 0; + iFiles = 0; + const TInt KDriveNameLength( 3 ); + + if ( aStartPath.CompareF( _L("\\") ) == 0 ) + { + LOGGER_WRITE("List all drives"); + aStream.WriteUint16L( KFormatVersion ); + ListAllDrivesL( aStream, levelsToSearch ); + } + else if ( aStartPath.Length() >= KDriveNameLength ) + { + if ( aStartPath.Length() > KDriveNameLength ) + { + // check root path permissions, is listing allowed + TPtrC path = aStartPath.Mid(KDriveNameLength); + LOGGER_WRITE_1("pathFromRoot: %S", &path); + TInt pathEndMark = path.Locate(TChar('\\')); + if ( pathEndMark == KErrNotFound ) + { + User::Leave( KErrArgument ); + } + //"private\" locate = 7" + TPtrC pathName = aStartPath.Left( KDriveNameLength+pathEndMark ); + LOGGER_WRITE_1("pathName: %S", &path); + TEntry pathEntry; + User::LeaveIfError( iFs.Entry(pathName, pathEntry) ); + + TBool printable = IsDirectoryPrintable( aStartPath.Left(3), pathEntry ); + if ( !printable ) + { + // access denied + LOGGER_WRITE("Access denied!"); + User::Leave( KErrAccessDenied ); + } + User::LeaveIfError( iFs.Entry(aStartPath, pathEntry) ); + if ( pathEntry.IsSystem() ) + { + // access denied + LOGGER_WRITE("System folder, Access denied!"); + User::Leave( KErrAccessDenied ); + } + } + + + aStream.WriteUint16L( KFormatVersion ); + + TInt drive; + User::LeaveIfError( iFs.CharToDrive( aStartPath[0], drive) ); + ListDriveAndPathL( aStream, drive, aStartPath, levelsToSearch); + + } + else + { + LOGGER_WRITE("aStartPath KErrArgument"); + User::Leave( KErrArgument ); + } + + + LOGGER_WRITE_1("iFolders: %d", iFolders); + LOGGER_WRITE_1("iFiles: %d", iFiles); + TRACE_FUNC_EXIT; + } + +void CSconFolderLister::ListAllDrivesL( RBufWriteStream& aStream, const TInt aLevelsToSearch ) + { + TRACE_FUNC_ENTRY; + TInt devDriveCount = 0; + TInt mmcDriveCount = 0; + TChar driveLetter; + TBuf8<1> driveBuf; + RArray sconDriveInfo(5); + + // Write all drives to folderlisting object + TDriveList driveList; + // Get all drives that are visible to the user. + TInt driveCount; + User::LeaveIfError( DriveInfo::GetUserVisibleDrives( iFs, driveList, driveCount ) ); + + for( TInt i = EDriveA; i < KMaxDrives; i++ ) + { + if( driveList[i] ) + { + TUint driveStatus; + User::LeaveIfError( DriveInfo::GetDriveStatus( iFs, i, driveStatus ) ); + //LOGGER_WRITE_1( "DriveInfo for drive: %d", i); + + if( !(driveStatus & DriveInfo::EDrivePresent ) + || driveStatus & DriveInfo::EDriveCorrupt + || (driveStatus & DriveInfo::EDriveRemote) ) + { + //LOGGER_WRITE_1( "skip drive %d", i); + continue; + } + + User::LeaveIfError( iFs.DriveToChar( i, driveLetter ) ); + //Letter to uppercase form. + driveLetter.UpperCase(); + + TSconDriveInfo info; + info.iDriveStatus = driveStatus; + info.iDriveLetter.Zero(); + info.iDriveLetter.Append( driveLetter ); + info.iDriveLetter.Append( _L(":") ); + + + info.iDriveAttr = KEntryAttNormal; // ReadWrite + + if( driveStatus & DriveInfo::EDriveInternal && devDriveCount==0 ) + { + //permission always R for first internal drive + info.iDriveAttr = KEntryAttReadOnly; + } + + //memory type + if( driveStatus & DriveInfo::EDriveInternal ) + { + LOGGER_WRITE( "DriveInfo::EDriveInternal" ); + devDriveCount++; + info.iDriveType = DriveInfo::EDriveInternal; // =1 + info.iDriveTypeCount = devDriveCount; + + } + else if( driveStatus & DriveInfo::EDriveRemovable ) + { + LOGGER_WRITE( "DriveInfo::EDriveRemovable" ); + mmcDriveCount++; + info.iDriveType = DriveInfo::EDriveRemovable;; // =2 + info.iDriveTypeCount = mmcDriveCount; + } + + TVolumeInfo volumeInfo; + User::LeaveIfError( iFs.Volume( volumeInfo, i) ); + + info.iVolumeName = volumeInfo.iName; + if ( volumeInfo.iFree > iCriticalLevel ) + { + volumeInfo.iFree = volumeInfo.iFree - iCriticalLevel; + } + else + { + volumeInfo.iFree = 0; + } + + info.iFree = volumeInfo.iFree; + info.iSize = volumeInfo.iSize; + + + sconDriveInfo.AppendL( info ); + + } + } + + LOGGER_WRITE_1("Drives: %d", sconDriveInfo.Count()); + aStream.WriteUint8L( sconDriveInfo.Count() ); + for ( TInt i=0; i < sconDriveInfo.Count(); i++ ) + { + + TBuf<3> path(KNullDesC); + path.Copy(sconDriveInfo[i].iDriveLetter); + path.Append(_L("\\")); + + ExportDriveL( aStream, sconDriveInfo[i], path, aLevelsToSearch); + } + sconDriveInfo.Close(); + TRACE_FUNC_EXIT; + } + +void CSconFolderLister::ListDriveAndPathL( RBufWriteStream& aStream, TInt aDrive, const TDesC& aStartPath, const TInt aLevelsToSearch ) + { + TRACE_FUNC_ENTRY; + TVolumeInfo volumeInfo; + User::LeaveIfError( iFs.Volume(volumeInfo, aDrive) ); + TInt driveCount(0); + TUint driveStatus; + User::LeaveIfError( DriveInfo::GetDriveStatus( iFs, aDrive, driveStatus ) ); + GetDriveTypeNumberL( aDrive, driveStatus, driveCount ); + + + TSconDriveInfo info; + info.iDriveLetter.Copy( aStartPath.Left(2) ); + info.iVolumeName = volumeInfo.iName; + + info.iDriveAttr = KEntryAttNormal; // ReadWrite + if( driveStatus & DriveInfo::EDriveInternal && driveCount==0 ) + { + //permission always R for first internal drive + info.iDriveAttr = KEntryAttReadOnly; + } + info.iDriveType = 0; + if( driveStatus & DriveInfo::EDriveInternal ) + { + info.iDriveType = DriveInfo::EDriveInternal; // =1 + } + else if( driveStatus & DriveInfo::EDriveRemovable ) + { + info.iDriveType = DriveInfo::EDriveRemovable;; // =2 + } + + if ( volumeInfo.iFree > iCriticalLevel ) + { + volumeInfo.iFree = volumeInfo.iFree - iCriticalLevel; + } + else + { + volumeInfo.iFree = 0; + } + + info.iFree = volumeInfo.iFree; + info.iSize = volumeInfo.iSize; + + aStream.WriteUint8L( 1 ); + ExportDriveL( aStream, info, aStartPath, aLevelsToSearch); + + TRACE_FUNC_EXIT; + } + +void CSconFolderLister::ExportDriveL( RBufWriteStream& aStream, const TSconDriveInfo& aDriveInfo, + const TDesC& aPathName, const TInt aLevelsToSearch ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("Drive: %S", &aDriveInfo.iDriveLetter); + LOGGER_WRITE_1("aLevelsToSearch: %d", aLevelsToSearch ); + + CSconFolderEntry* driveEntry = CSconFolderEntry::NewLC(); + driveEntry->iName = aDriveInfo.iDriveLetter.AllocL(); + + if ( driveEntry->iLabel ) + { + LOGGER_WRITE_1("Label: %S", &driveEntry->iLabel->Des()); + } + driveEntry->iAtt = aDriveInfo.iDriveAttr; + + driveEntry->iDriveInfoEntryExists = ETrue; + driveEntry->iDriveInfoEntry.iDriveType = aDriveInfo.iDriveType; + driveEntry->iDriveInfoEntry.iDriveTypeCount = aDriveInfo.iDriveTypeCount; + + driveEntry->iDriveInfoEntry.iFree = aDriveInfo.iFree; + driveEntry->iDriveInfoEntry.iSize = aDriveInfo.iSize; + + driveEntry->iLabel = aDriveInfo.iVolumeName.AllocL(); + GetLocalizedVolumeNameL( *driveEntry ); + + ExportPathL( aStream, aPathName, *driveEntry, ETrue, aLevelsToSearch ); + CleanupStack::PopAndDestroy( driveEntry ); + TRACE_FUNC_EXIT; + } + +void CSconFolderLister::GetLocalizedVolumeNameL( CSconFolderEntry& aDriveEntry ) + { + TRACE_FUNC_ENTRY; + // Get localized names + if ( aDriveEntry.iDriveInfoEntry.iDriveType == DriveInfo::EDriveInternal + && aDriveEntry.iDriveInfoEntry.iDriveTypeCount > 1 ) + { + LOGGER_WRITE("Internal mass memory"); + // internal second memory (Mass memory) + TFileName file( KSConResourceName ); + BaflUtils::NearestLanguageFile( iFs, file ); + + CStringResourceReader* reader = CStringResourceReader::NewL( file ); + if ( aDriveEntry.iLabel ) + { + delete aDriveEntry.iLabel; + aDriveEntry.iLabel = NULL; + } + aDriveEntry.iLabel = reader->ReadResourceString( R_SECON_VALUE_MASS_STORAGE ).AllocL(); + delete reader; + } + else if ( aDriveEntry.iLabel && aDriveEntry.iLabel->Length()>0 ) + { + LOGGER_WRITE("Use normal volume label"); + + } + else + { + TFileName file( KSConResourceName ); + BaflUtils::NearestLanguageFile( iFs, file ); + CStringResourceReader* reader = CStringResourceReader::NewL( file ); + if (aDriveEntry.iLabel) + { + delete aDriveEntry.iLabel; + aDriveEntry.iLabel = NULL; + } + if ( aDriveEntry.iDriveInfoEntry.iDriveType == DriveInfo::EDriveRemovable ) + { + LOGGER_WRITE("EDriveRemovable"); + // read default MMC name + aDriveEntry.iLabel = reader->ReadResourceString( R_SECON_VALUE_MMC ).AllocL(); + } + else + { + LOGGER_WRITE("EDriveInternal"); + // read default DEV name + aDriveEntry.iLabel = reader->ReadResourceString( R_SECON_VALUE_DEVICE ).AllocL(); + } + delete reader; + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSconFolderLister::GetDriveTypeNumberL() +// +// ----------------------------------------------------------------------------- +// +void CSconFolderLister::GetDriveTypeNumberL( TInt aDrive, TUint aDriveStatus , TInt& aTypeNumber) + { + TRACE_FUNC_ENTRY; + aTypeNumber = 0; + + //TUint driveStatus; + // + // if true, search internal drives, else search removable drives + TBool searchInternalDrives = (aDriveStatus & DriveInfo::EDriveInternal); + + TInt driveCount; + TDriveList driveList; + + User::LeaveIfError( DriveInfo::GetUserVisibleDrives( iFs, driveList, driveCount ) ); + + for( TInt i = EDriveA; i <= aDrive; i++ ) + { + if( driveList[i] ) + { + TUint driveStatus; + User::LeaveIfError( DriveInfo::GetDriveStatus( iFs, i, driveStatus ) ); + + if( !(driveStatus & DriveInfo::EDrivePresent ) + || driveStatus & DriveInfo::EDriveCorrupt ) + { + LOGGER_WRITE( "not present or corrupted" ); + continue; + } + + if( driveStatus & DriveInfo::EDriveInternal ) + { + if( searchInternalDrives ) + { + aTypeNumber++; + } + } + else if( driveStatus & DriveInfo::EDriveRemovable ) + { + if( !searchInternalDrives ) + { + aTypeNumber++; + } + } + } + } + TRACE_FUNC_EXIT; + } + + +void CSconFolderLister::ExportPathL( RBufWriteStream& aStream, const TDesC& aPathName, + const CSconFolderEntry& aEntry, const TBool aLocalize, const TInt aLevelsToSearch ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aPathName: %S", &aPathName ); + LOGGER_WRITE_1("aLevelsToSearch: %d", aLevelsToSearch ); + + LOGGER_WRITE_1("aEntry.iName: %S", &aEntry.iName->Des() ); + + TBool localized(EFalse); + + // foldername length + name + aStream.WriteUint8L( aEntry.iName->Length() ); + aStream.WriteL( aEntry.iName->Des() ); + + TUint att = aEntry.iAtt; + + if ( aEntry.iLabel && aEntry.iLabel->Length() > 0 ) + { + aStream.WriteUint8L( aEntry.iLabel->Length() ); + aStream.WriteL( aEntry.iLabel->Des() ); + } + else + { + if ( aLocalize ) + { + // initialize Localizer + iLocalizer->SetFullPath( aPathName ); + localized = iLocalizer->IsLocalized(); + } + + if( localized ) + { + const TDesC& localizedName = iLocalizer->LocalizedName(); + aStream.WriteUint8L( localizedName.Length() ); + aStream.WriteL( localizedName ); + LOGGER_WRITE_1("LocalizedName: %S", &localizedName ); + } + else if ( aPathName.CompareF(_L("C:\\Data\\")) == 0 ) + { + TFileName file( KSConResourceName ); + + BaflUtils::NearestLanguageFile( iFs, file ); + + CStringResourceReader* reader = CStringResourceReader::NewL( file ); + CleanupStack::PushL( reader ); + + const TDesC& localizedName = reader->ReadResourceString( R_SECON_DATA_FOLDER ); + aStream.WriteUint8L( localizedName.Length() ); + aStream.WriteL( localizedName ); + LOGGER_WRITE_1("LocalizedName: %S", &localizedName ); + + CleanupStack::PopAndDestroy( reader ); + localized = ETrue; + } + else + { + aStream.WriteUint8L( 0 ); + } + // attributes + if ( localized ) + { + // localized folder, set readonly flag + att = att | KEntryAttReadOnly; + } + } + + if ( aPathName.Length() == 3 && aLocalize ) + { + // enable subfolder localization, even when root cannot be localized + localized = ETrue; + } + + // DriveInfoEntry + if ( aEntry.iDriveInfoEntryExists ) + { + aStream.WriteUint8L( 1 ); + aStream.WriteUint8L( aEntry.iDriveInfoEntry.iDriveType ); + aStream.WriteUint8L( aEntry.iDriveInfoEntry.iDriveTypeCount ); + aStream << aEntry.iDriveInfoEntry.iFree; + aStream << aEntry.iDriveInfoEntry.iSize; + } + else + { + aStream.WriteUint8L( 0 ); + } + + + // modified time + TDateTime time = aEntry.iModified.DateTime(); + aStream.WriteInt16L( time.Year() ); + aStream.WriteInt8L( time.Month()+1 ); // range 1...12 + aStream.WriteInt8L( time.Day()+1 ); + aStream.WriteInt8L( time.Hour() ); + aStream.WriteInt8L( time.Minute() ); + aStream.WriteInt8L( time.Second() ); + + // write attribute + aStream.WriteUint32L( att ); + + + if ( aLevelsToSearch == 0 ) + { + // don't list directory content + LOGGER_WRITE("Not listing directory content"); + aStream.WriteInt16L( 0 ); // files count + aStream.WriteInt16L( 0 ); // directory count + return; + } + + CDir *fileList = 0; + CDir *dirList = 0; + + // show normal and hidden files and folders + TUint entryAttMask = KEntryAttNormal | KEntryAttHidden; + + // get folders and files + TInt err = iFs.GetDir( aPathName, entryAttMask, ESortByName, + fileList, dirList ); + + if ( err ) + { + LOGGER_WRITE_1( "ParseFolderListL GetDir returned: %d", err ); + User::Leave( err ); + } + + CleanupStack::PushL( dirList ); + CleanupStack::PushL( fileList ); + + + LOGGER_WRITE_1("files: %d", fileList->Count()); + aStream.WriteUint16L( fileList->Count() ); + + // Print files to folder listing object + for( TInt i = 0; i < fileList->Count(); i++ ) + { + const TEntry& fileEntry = ( *fileList )[i]; + iFiles++; + LOGGER_WRITE_1("fileEntry.iName: %S", &fileEntry.iName); + // filename length + name + aStream.WriteUint8L( fileEntry.iName.Length() ); + aStream.WriteL( fileEntry.iName ); + + // modified time + TDateTime time = fileEntry.iModified.DateTime(); + aStream.WriteInt16L( time.Year() ); + aStream.WriteInt8L( time.Month()+1 ); // range 1...12 + aStream.WriteInt8L( time.Day()+1 ); + aStream.WriteInt8L( time.Hour() ); + aStream.WriteInt8L( time.Minute() ); + aStream.WriteInt8L( time.Second() ); + + // attributes + aStream.WriteUint32L( fileEntry.iAtt ); + + // file size + aStream.WriteUint32L( fileEntry.iSize ); + } + CleanupStack::PopAndDestroy( fileList ); + + + // calculate ow many directories we are going to list + TInt directoryCount(0); + for( TInt i = 0; i < dirList->Count(); i++ ) + { + if ( IsDirectoryPrintable(aPathName, ( *dirList )[i] ) ) + { + directoryCount++; + } + } + LOGGER_WRITE_1("directories: %d", directoryCount); + aStream.WriteUint16L( directoryCount ); + + HBufC* fullpath = HBufC::NewL( KMaxPath ); + TPtr fullpathPtr = fullpath->Des(); + CleanupStack::PushL( fullpath ); + + // Print folders to folder listing object + for( TInt i = 0; i < dirList->Count(); i++ ) + { + const TEntry& folderEntry = ( *dirList )[i]; + if ( !IsDirectoryPrintable(aPathName, folderEntry) ) + { + continue; + } + iFolders++; + + fullpathPtr.Copy( aPathName ); + fullpathPtr.Append( folderEntry.iName ); + fullpathPtr.Append( _L("\\") ); + CSconFolderEntry* subFolderEntry = CSconFolderEntry::NewLC( folderEntry ); + if ( aLevelsToSearch == KErrNotFound ) + { + ExportPathL( aStream, fullpathPtr, *subFolderEntry, localized, aLevelsToSearch); + } + else + { + ExportPathL( aStream, fullpathPtr, *subFolderEntry, localized, aLevelsToSearch-1); + } + CleanupStack::PopAndDestroy( subFolderEntry ); + } + CleanupStack::PopAndDestroy( fullpath ); + CleanupStack::PopAndDestroy( dirList ); + + TRACE_FUNC_EXIT; + } +TBool CSconFolderLister::IsDirectoryPrintable( const TDesC& aParentPath, const TEntry& aFolderEntry ) + { + if ( aFolderEntry.IsSystem() ) + { + LOGGER_WRITE_1("folder '%S' was system folder", &aFolderEntry.iName); + return EFalse; + } + if ( aParentPath.Length() == 3 ) + { + if ( aParentPath.FindF(_L("C:\\")) == 0 && aFolderEntry.iName.CompareF(_L("data")) != 0 ) + { + // C root not visible, exept Data folder + LOGGER_WRITE_1("folder '%S' not visible to user in c-root", &aFolderEntry.iName); + return EFalse; + } + + if ( aFolderEntry.iName.CompareF(_L("private")) == 0 ) + { + LOGGER_WRITE_1("folder '%S' not visible to user", &aFolderEntry.iName); + return EFalse; + } + else if ( aFolderEntry.iName.CompareF(_L("sys")) == 0 ) + { + LOGGER_WRITE_1("folder '%S' not visible to user", &aFolderEntry.iName); + return EFalse; + } + else if ( aFolderEntry.iName.CompareF(_L("system")) == 0 ) + { + LOGGER_WRITE_1("folder '%S' not visible to user", &aFolderEntry.iName); + return EFalse; + } + else if ( aFolderEntry.iName.CompareF(_L("resource")) == 0 ) + { + LOGGER_WRITE_1("folder '%S' not visible to user", &aFolderEntry.iName); + return EFalse; + } + } + return ETrue; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/src/sconimsireader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/pcconn/src/sconimsireader.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,123 @@ +/* +* Copyright (c) 2009-2010 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: CSconImsiReader implementation +* +*/ + + +#include "sconimsireader.h" +#include "debug.h" + +TInt CSconImsiReader::GetImsiL( TDes& aImsi ) + { + TRACE_FUNC_ENTRY; + CTelephony::TRegistrationStatus temp; + CSconImsiReader* self = new (ELeave) CSconImsiReader(aImsi, temp); + CleanupStack::PushL(self); + self->ConstructL(); + + self->RequestImsi(); + + TInt err = self->iStatus.Int(); + CleanupStack::PopAndDestroy(self); + TRACE_FUNC_RET(err); + return err; + } + +TInt CSconImsiReader::GetNetworkStatusL( CTelephony::TRegistrationStatus& aRegistrationStatus ) + { + TRACE_FUNC_ENTRY; + TBuf temp; + CSconImsiReader* self = new (ELeave) CSconImsiReader(temp, aRegistrationStatus); + CleanupStack::PushL(self); + self->ConstructL(); + + self->RequestNetworkStatus(); + + TInt err = self->iStatus.Int(); + CleanupStack::PopAndDestroy(self); + TRACE_FUNC_RET(err); + return err; + } + +void CSconImsiReader::ConstructL() + { + TRACE_FUNC_ENTRY; + iTelephony = CTelephony::NewL(); + CActiveScheduler::Add(this); + TRACE_FUNC_EXIT; + } + +void CSconImsiReader::RequestImsi() + { + iImsiReaderStatus = ERequestingImsi; + iTelephony->GetSubscriberId(iStatus,iSubscriberIdV1Pckg); + SetActive(); + CActiveScheduler::Start(); + } + +void CSconImsiReader::RequestNetworkStatus() + { + iImsiReaderStatus = ERequestingNetworkStatus; + iTelephony->GetNetworkRegistrationStatus(iStatus, iNetworkRegistrationV1Pckg); + SetActive(); + CActiveScheduler::Start(); + } + +CSconImsiReader::~CSconImsiReader() + { + TRACE_FUNC_ENTRY; + delete iTelephony; + TRACE_FUNC_EXIT; + } + +CSconImsiReader::CSconImsiReader(TDes& aImsi, CTelephony::TRegistrationStatus& aRegistrationStatus): CActive(EPriorityStandard), + iImsi(aImsi), iNetworkStatus(aRegistrationStatus), iSubscriberIdV1Pckg(iSubscriberIdV1), iNetworkRegistrationV1Pckg(iNetworkRegistrationV1) + { + } + +void CSconImsiReader::RunL() + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("iStatus: %d", iStatus.Int() ); + if ( iStatus == KErrNone ) + { + if ( iImsiReaderStatus == ERequestingImsi ) + { + iImsi = iSubscriberIdV1.iSubscriberId; + LOGGER_WRITE_1("iImsi: %S", &iImsi); + } + else if ( iImsiReaderStatus == ERequestingNetworkStatus ) + { + iNetworkStatus = iNetworkRegistrationV1.iRegStatus; + LOGGER_WRITE_1( "iNetworkStatus: %d", (TInt)iNetworkStatus); + } + } + CActiveScheduler::Stop(); + TRACE_FUNC_EXIT; + } + +void CSconImsiReader::DoCancel() + { + TRACE_FUNC_ENTRY; + if ( iImsiReaderStatus == ERequestingImsi ) + { + iTelephony->CancelAsync( CTelephony::EGetSubscriberIdCancel ); + } + else if ( iImsiReaderStatus == ERequestingNetworkStatus ) + { + iTelephony->CancelAsync( CTelephony::EGetNetworkRegistrationStatusCancel ); + } + TRACE_FUNC_EXIT; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/pcconn/src/sconpcconnserver.cpp --- a/connectivitymodules/SeCon/servers/pcconn/src/sconpcconnserver.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/servers/pcconn/src/sconpcconnserver.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -18,12 +18,18 @@ #include // For RMemReadStream #include +#include +#include #include "sconpcconnclientserver.h" #include "sconpcconnserver.h" #include "sconpcd.h" #include "sconcsc.h" #include "sconconmlhandler.h" +#include "sconimsireader.h" +#include "sconoviaccounthandler.h" +#include "sconfolderlister.h" +#include "sconbtengine.h" #include "debug.h" #ifdef DEBUG_XML @@ -33,6 +39,15 @@ #endif _LIT( KSCONGetMetadataRequest, "METADATA:" ); +_LIT8( KSCONSyncRequest, "SYNC:" ); +_LIT( KSCONReadImsi, "READIMSI"); +_LIT( KSCONReadNetworkInfo, "READNETWORKINFO"); +_LIT( KSCONReadOviAccount, "READOVIACCOUNT"); +_LIT( KSCONListPath, "LISTP:"); +_LIT( KSCONReadBtInfo, "READBTINFO" ); +_LIT( KSCONSetBtPower, "SETBTPOWER:" ); +_LIT( KSCONSetBtName, "SETBTNAME:" ); +_LIT( KSCONSetBtAuthorized, "SETBTAUTHORIZED:" ); //------------------------------------------------------------ // Global functions @@ -272,7 +287,12 @@ } iChunk.Close(); - + delete iFolderLister; + + iFs.Close(); + + delete iBtEngine; + TRACE_FUNC_EXIT; } @@ -304,21 +324,18 @@ TInt ret ( KErrNone ); iResult = KErrNone; + User::LeaveIfError( iFs.Connect() ); + #ifdef DEBUG_XML // create log file - RFs fs; - User::LeaveIfError( fs.Connect () ); - CleanupClosePushL( fs ); RFile file; - TInt err = file.Create ( fs, KSConConMLDebugFile, EFileWrite ); + TInt err = file.Create ( iFs, KSConConMLDebugFile, EFileWrite ); if( err == KErrNone ) { // file created, close it file.Close(); - } - - CleanupStack::PopAndDestroy( &fs ); + } #endif // initialize buffer @@ -355,7 +372,9 @@ User::Leave ( ret ); } } - + + iFolderLister = CSconFolderLister::NewL( iFs ); + TRACE_FUNC_EXIT; } @@ -457,9 +476,14 @@ iBuffer->Reset(); length = buf.ReadInt32L(); - HBufC8* name = HBufC8::NewLC( length ); - TPtr8 namePtr = name->Des(); - buf.ReadL( namePtr, length); + HBufC8* name8 = HBufC8::NewLC( length ); + TPtr8 namePtr8 = name8->Des(); + buf.ReadL( namePtr8, length); + + const TUint8* ptr8 = namePtr8.Ptr(); + const TUint16* ptr16 = reinterpret_cast( ptr8 ); + TPtrC namePtr; + namePtr.Set( ptr16, length/2 ); length = buf.ReadInt32L(); HBufC8* type = HBufC8::NewLC( length ); @@ -478,12 +502,9 @@ buf.Close(); #ifdef DEBUG_XML - RFs fs; - User::LeaveIfError( fs.Connect() ); - CleanupClosePushL( fs ); RFile file; - if ( file.Open( fs, KSConConMLDebugFile, EFileWrite ) == KErrNone ) + if ( file.Open( iFs, KSConConMLDebugFile, EFileWrite ) == KErrNone ) { RFileWriteStream fws; TInt fileSize; @@ -507,11 +528,25 @@ CleanupStack::PopAndDestroy( &fws ); } - file.Close(); - CleanupStack::PopAndDestroy( &fs ); + file.Close(); #endif - - if ( ( typePtr.Compare( KSConPCDWBXMLObjectType ) == KErrNone) || + if ( ( ( typePtr.CompareC( KSConPCDWBXMLObjectType)== KErrNone ) || + ( typePtr.CompareC( KSConPCDWBXMLObjectType2 )== KErrNone ) ) + && namePtr8.Find(KSCONSyncRequest) == 0 ) + { + LOGGER_WRITE_1("Sync request: %S", &namePtr); + RBufReadStream stream( *iBuffer ); + + CleanupClosePushL( stream ); + TRAP( ret, iPCDHandler->HandlePutSyncRequestL( namePtr8, stream )); + if ( ret ) + { + LOGGER_WRITE_1("HandlePutSyncRequestL() Leaved with %d", ret); + } + + CleanupStack::PopAndDestroy( &stream ); + } + else if ( ( typePtr.Compare( KSConPCDWBXMLObjectType ) == KErrNone) || ( typePtr.Compare( KSConPCDWBXMLObjectType2 )== KErrNone) ) { LOGGER_WRITE( "CSConPCConnSession::HandlePutMessageL() : Object type PCD " ); @@ -533,7 +568,7 @@ } CleanupStack::PopAndDestroy( data ); CleanupStack::PopAndDestroy( type ); - CleanupStack::PopAndDestroy( name ); + CleanupStack::PopAndDestroy( name8 ); LOGGER_WRITE_1( "CSConPCConnSession::HandlePutMessageL() end : Heap count : %d", User::Heap().Count() ); LOGGER_WRITE_1( "CSConPCConnSession::HandlePutMessageL() : returned %d", ret ); return ret; @@ -587,12 +622,9 @@ ret = iCSCHandler->CapabilityObject( *iBuffer ); #ifdef DEBUG_XML - RFs fs; - User::LeaveIfError(fs.Connect()); - CleanupClosePushL(fs); - + RFile file; - if ( file.Open(fs, KSConConMLDebugFile, EFileWrite ) == KErrNone ) + if ( file.Open(iFs, KSConConMLDebugFile, EFileWrite ) == KErrNone ) { RFileWriteStream fws; TInt fileSize; @@ -616,13 +648,218 @@ CleanupStack::PopAndDestroy( &fws ); } file.Close(); - CleanupStack::PopAndDestroy( &fs ); #endif } else if ( typePtr.CompareC( KSConPCDWBXMLObjectType) == KErrNone ) { - ret = HandleWBXMLGetRequestL( namePtr ); + if ( namePtr8.Find(KSCONSyncRequest) == 0 ) // 8-bit search + { + LOGGER_WRITE("Sync request"); + + RBufWriteStream stream( *iBuffer ); + + CleanupClosePushL( stream ); + + TRAP( ret, iPCDHandler->HandleGetSyncRequestL( namePtr8, stream, iChunk.MaxSize() - sizeof(TInt32) )); + if ( ret ) + { + LOGGER_WRITE_1("HandleGetSyncRequestL() Leaved with %d", ret); + } + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + + LOGGER_WRITE_1("iBuffer size: %d", iBuffer->Size()); + + } + else if ( namePtr.Find(KSCONReadImsi) == 0 ) // 16-bit search + { + LOGGER_WRITE("Read IMSI"); + TBuf imsi; + ret = CSconImsiReader::GetImsiL( imsi ); + + if ( ret == KErrNone ) + { + TBuf8 imsi8; + User::LeaveIfError( CnvUtfConverter::ConvertFromUnicodeToUtf8(imsi8,imsi) ); + + iBuffer->ResizeL( imsi8.Length() ); + iBuffer->Write( 0, imsi8 ); + } + else + { + // Change error code more generic + ret = KErrNotFound; + } + } + else if ( namePtr.Find(KSCONReadNetworkInfo) == 0 ) // 16-bit search + { + LOGGER_WRITE("Read NetworkInfo"); + CTelephony::TRegistrationStatus regStatus; + ret = CSconImsiReader::GetNetworkStatusL( regStatus ); + + if ( ret == KErrNone ) + { + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + stream.WriteInt8L( regStatus ); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + else + { + // Change error code more generic + ret = KErrNotFound; + } + } + else if ( namePtr.Find(KSCONReadOviAccount) == 0 ) + { + LOGGER_WRITE("Read Ovi account"); + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + + ret = ReadOviAccountInfoL( stream ); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + + } + else if ( namePtr.Find(KSCONListPath) == 0 ) + { + LOGGER_WRITE("List path"); + // LISTP:0:pathname + if ( namePtr.Length() > KSCONListPath().Length()+2) + { + TPtrC pathname = namePtr.Mid( KSCONListPath().Length()+2 ); + + const TUint16 levelsChar = namePtr[ KSCONListPath().Length() ]; + TInt level(KErrNotFound); + if ( levelsChar >= TChar('0') ) + { + level = levelsChar - TChar('0'); + } + + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + TRAP( ret, iFolderLister->GenerateFolderListL( stream, pathname, level )); + LOGGER_WRITE_1("GenerateFolderListL leaved with err: %d", ret); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + else + { + ret = KErrArgument; + } + + } + else if ( namePtr.Find(KSCONReadBtInfo) == 0 ) + { + LOGGER_WRITE( "Read BT info"); + if ( !iBtEngine ) + { + iBtEngine = CSconBtEngine::NewL(); + } + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + TRAP( ret, iBtEngine->ReadBTInfoL( stream ) ); + LOGGER_WRITE_1("ReadBTInfoL leaved with err: %d", ret); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + else if ( namePtr.Find(KSCONSetBtPower) == 0 ) + { + LOGGER_WRITE( "Change BT Power state"); + if ( namePtr.Length() == KSCONSetBtPower().Length()+1 ) + { + const TUint16 lastChar = namePtr[ KSCONSetBtPower().Length() ]; + TBool changeBtOn; + if ( lastChar == TChar('0') ) + { + changeBtOn = EFalse; + } + else if ( lastChar == TChar('1') ) + { + changeBtOn = ETrue; + } + else + { + ret = KErrArgument; + } + + if ( !ret ) + { + if ( !iBtEngine ) + { + iBtEngine = CSconBtEngine::NewL(); + } + TInt err = iBtEngine->SetBtPowerState( changeBtOn ); + + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + stream.WriteInt32L( err ); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + } + else + { + ret = KErrArgument; + } + } + else if ( namePtr.Find(KSCONSetBtName) == 0 ) + { + LOGGER_WRITE( "Set BT Name"); + TPtrC btName = namePtr.Mid( KSCONSetBtName().Length() ); + TInt err = iBtEngine->SetBtName( btName ); + + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + stream.WriteInt32L( err ); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + else if ( namePtr.Find(KSCONSetBtAuthorized) == 0 ) + { + LOGGER_WRITE( "Set BT Authorized"); + ret = KErrArgument; + // SETBTAUTHORIZED:0:00245f8d6a26 + // 1. param = auth. state ("0"=off, "1"=true) + // 2. param = bt address (hex string) + + if ( namePtr.Length() > KSCONSetBtAuthorized().Length()+2) + { + TPtrC btAddr = namePtr.Mid( KSCONSetBtAuthorized().Length()+2 ); + + const TUint16 authStateChar = namePtr[ KSCONSetBtAuthorized().Length() ]; + TBool authorize(EFalse); + if ( authStateChar == TChar('0') ) + { + authorize = EFalse; + ret = KErrNone; + } + else if ( authStateChar == TChar('1') ) + { + authorize = ETrue; + ret = KErrNone; + } + + if ( !iBtEngine ) + { + iBtEngine = CSconBtEngine::NewL(); + } + TRAPD(err, iBtEngine->SetBtAuthorizedL( btAddr, authorize ) ); + + RBufWriteStream stream( *iBuffer ); + CleanupClosePushL( stream ); + stream.WriteInt32L( err ); + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + } + + } + else + { + ret = HandleWBXMLGetRequestL( namePtr ); + } } else { @@ -760,6 +997,59 @@ return ret; } + +// ----------------------------------------------------------------------------- +// CSConPCConnSession::ReadOviAccountInfoL() +// Reads ovi account information to stream +// ----------------------------------------------------------------------------- +// +TInt CSConPCConnSession::ReadOviAccountInfoL( RWriteStream& aAccountInfoStream ) + { + TRACE_FUNC_ENTRY; + RLibrary oviaccounthandlerLib; + CleanupClosePushL( oviaccounthandlerLib ); + // Dynamically load DLL + TInt err = oviaccounthandlerLib.Load( KSconOviAccountHandlerDllName ); + if ( err ) + { + LOGGER_WRITE_1("oviaccounthandlerLib.Load err: %d", err); + err = KErrNotSupported; + } + else if( oviaccounthandlerLib.Type()[1] != KSconOviAccountHandlerDllUid ) + { + LOGGER_WRITE_1( "KSconOviAccountHandlerDllUid incorrect... (0x%08X)",oviaccounthandlerLib.Type()[1].iUid ); + err = KErrNotSupported; + } + + if ( err == KErrNone ) + { + TSConCreateCSconOviAccountHandlerFunc CreateCSconOviAccountHandlerL = + (TSConCreateCSconOviAccountHandlerFunc)oviaccounthandlerLib.Lookup(1); + + CSconOviAccountHandler* oviAccountHandler = (CSconOviAccountHandler*)CreateCSconOviAccountHandlerL(); + + TRAP(err, oviAccountHandler->GetOviAccountDetailsL( aAccountInfoStream ) ); + LOGGER_WRITE_1("GetOviAccountDetailsL err: %d", err); + + delete oviAccountHandler; + oviAccountHandler = NULL; + + if ( err ) + { + // change error code + err = KErrNotFound; + } + } + else + { + err = KErrNotSupported; + } + + CleanupStack::PopAndDestroy( &oviaccounthandlerLib ); + TRACE_FUNC_EXIT; + return err; + } + // ----------------------------------------------------------------------------- // CSConPCConnSession::HandleResetMessage() // Resets the PCCS service @@ -878,12 +1168,8 @@ #ifdef DEBUG_XML iConMLHandler->GenerateDocument( aContent ); - RFs fs; - User::LeaveIfError(fs.Connect()); - CleanupClosePushL(fs); RFile file; - - if ( file.Open(fs, KSConConMLDebugFile, EFileWrite) == KErrNone ) + if ( file.Open(iFs, KSConConMLDebugFile, EFileWrite) == KErrNone ) { RFileWriteStream fws; TInt fileSize; @@ -910,7 +1196,6 @@ CleanupStack::PopAndDestroy( &fws ); } file.Close(); - CleanupStack::PopAndDestroy( &fs ); #endif @@ -2216,6 +2501,12 @@ aContent->complete = new ( ELeave ) pcdata_t(); } AppendProgressL( aContent, aResult->iProgress ); + + if ( aResult->iData && aResult->iData->Length() > 0 ) + { + aContent->data = new ( ELeave ) pcdata_t(); + aContent->data->SetDataL( aResult->iData->Des() ); + } } TRACE_FUNC_EXIT; } @@ -2238,6 +2529,12 @@ } LOGGER_WRITE_1( "CSConPCConnSession::AppendUninstallResultsL() iProgress: %d", aResult->iProgress ); AppendProgressL( aContent, aResult->iProgress ); + + if ( aResult->iData && aResult->iData->Length() > 0 ) + { + aContent->data = new ( ELeave ) pcdata_t(); + aContent->data->SetDataL( aResult->iData->Des() ); + } } TRACE_FUNC_EXIT; } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009-2010 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: Build information file for project SyncServer +* +*/ + + +PRJ_EXPORTS +../rom/sconsyncserver.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconsyncserver.iby) + +PRJ_PLATFORMS +DEFAULT + +PRJ_MMPFILES +sconsyncserver.mmp + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/group/sconsyncserver.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/group/sconsyncserver.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2009-2010 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: sconsyncserver mmp file +* +*/ + + +#include +#include + + +TARGET sconsyncserver.exe +TARGETTYPE exe + +// Same capabilities than in DS Ui application +CAPABILITY LocalServices ReadUserData WriteUserData ReadDeviceData WriteDeviceData NetworkServices UserEnvironment ProtServ SwEvent NetworkControl Location + +UID 0x0 0x2001A964 +VENDORID VID_DEFAULT + +EPOCSTACKSIZE 0x2000 +EPOCHEAPSIZE 0x500 0x800000 // minimum and maximum heap sizes + +SOURCEPATH ../src +SOURCE sconsyncserver.cpp +SOURCE sconsyncsession.cpp +SOURCE sconsyncrelationship.cpp +SOURCE sconasynchandler.cpp +SOURCE cscontimeout.cpp + +// common components (dataproviderinfo) +SOURCEPATH ../../../clients/syncclient/src +USERINCLUDE ../../../clients/syncclient/inc +SOURCE scondataproviderinfo.cpp + +USERINCLUDE ..\inc + +// Default system include paths +APP_LAYER_SYSTEMINCLUDE + +DEBUGLIBRARY flogger.lib +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY ecom.lib +LIBRARY estor.lib // CDictionaryFileStore +LIBRARY smldataprovider.lib +LIBRARY nsmlchangefinder.lib +LIBRARY smlstoreformat.lib +LIBRARY charconv.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/cscontimeout.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/cscontimeout.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,79 @@ +/* +* 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: CCSconTimeOut header file +* +*/ + + +#ifndef CSCONTIMEOUT_H +#define CSCONTIMEOUT_H + +#include // For CActive, link against: euser.lib +#include // For RTimer, link against: euser.lib + +class MTimeOutObserver + { +public: + virtual void TimeOut() = 0; + }; + +class CCSconTimeOut : public CActive + { +public: + // Cancel and destroy + ~CCSconTimeOut(); + + // Two-phased constructor. + static CCSconTimeOut* NewL( MTimeOutObserver& aTimeOutObserver ); + +public: + // New functions + // Function for making the timeout request + void Start(TTimeIntervalMicroSeconds32 aDelay); + +private: + // C++ constructor + CCSconTimeOut( MTimeOutObserver& aTimeOutObserver ); + + // Second-phase constructor + void ConstructL(); + +private: + // From CActive + // Handle completion + void RunL(); + + // How to cancel me + void DoCancel(); + + // Override to handle leaves from RunL(). Default implementation causes + // the active scheduler to panic. + TInt RunError(TInt aError); + +private: + enum TCSconTimeOutState + { + EUninitialized, // Uninitialized + EInitialized, // Initalized + EError + // Error condition + }; + +private: + TInt iState; // State of the active object + RTimer iTimer; // Provides async timing service + MTimeOutObserver& iTimeOutObserver; + }; + +#endif // CSCONTIMEOUT_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/debug.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,130 @@ +/* +* 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: Debug utility for SyncServer +* +*/ + + +#ifndef _SECON_DEBUG_H +#define _SECON_DEBUG_H + +#ifdef _DEBUG + + // File logging + #define __FLOGGING__ + + #include + #ifdef __FLOGGING__ + #include + #include + #endif + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT( KLogDir, "SECON" ); + _LIT( KLogFile, "SeconDebug.txt" ); + + _LIT(KTracePrefix16, "[SeConSync] "); + _LIT8(KTracePrefix8, "[SeConSync] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + // old function loggin macros + #define FLOG(a) {FPrint(a);} + #define FLOG_1(a,b) {FPrint(a,b);} + #define FLOG_2(a,b,c) {FPrint(a,b,c);} + #define FTRACE(a) {a;} + #define LOGGER_ENTERFN( name ) {TRACE_FUNC_ENTRY;} + #define LOGGER_LEAVEFN( name ) {TRACE_FUNC_EXIT;} + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE8_1( text,par1 ) {_LIT8( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + #define LOGGER_WRITE_3( text,par1,par2,par3 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2, par3 );} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + // Declare the FPrint function + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else + + // No loggings --> reduced code size + #define FLOG(a) + #define FLOG_1(a,b) + #define FLOG_2(a,b,c) + #define FTRACE(a) + #define LOGGER_ENTERFN( name ) + #define LOGGER_LEAVEFN( name ) + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text, par1 ) + #define LOGGER_WRITE8_1( text, par1 ) + #define LOGGER_WRITE_2( text, par1, par2 ) + #define LOGGER_WRITE_3( text, par1, par2, par3 ) + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + +#endif //_DEBUG + +#endif // SECON_DEBUG_H + +// End of file + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/logdatastoreformat.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/logdatastoreformat.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2010 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: Simple class for tracing datastore format +* +*/ + +#ifndef LOGDATASTOREFORMAT_H_ +#define LOGDATASTOREFORMAT_H_ + +// +#include "debug.h" + +NONSHARABLE_CLASS(TLogDataStoreFormat) + { + public: +#ifndef _DEBUG +// does nothing on release version +static void TLogDataStoreFormat::LogDataStoreFormatL( const TDesC& /*aLogInfo*/, const CSmlDataStoreFormat& /*aDataStoreFormat*/ ) + { + } +#else +static void TLogDataStoreFormat::LogDataStoreFormatL( const TDesC& aLogInfo, const CSmlDataStoreFormat& aDataStoreFormat ) + { + LOGGER_WRITE_1("LogDataStoreFormatL, aLogInfo: %S", &aLogInfo); + LOGGER_WRITE_1("DisplayName: %S", &aDataStoreFormat.DisplayName()); + TBool hasMaxSize = aDataStoreFormat.IsSupported( CSmlDataStoreFormat::EOptionHasMaxSize ); + TBool hasMaxItems = aDataStoreFormat.IsSupported( CSmlDataStoreFormat::EOptionHasMaxItems ); + TBool hierarcial = aDataStoreFormat.IsSupported( CSmlDataStoreFormat::EOptionHierarchial ); + LOGGER_WRITE_1("hasMaxSize: %d", (TInt)hasMaxSize); + LOGGER_WRITE_1("hasMaxItems: %d", (TInt)hasMaxItems); + LOGGER_WRITE_1("hierarcial: %d", (TInt)hierarcial); + LOGGER_WRITE_1("MimeFormatCount: %d", aDataStoreFormat.MimeFormatCount()); + for ( TInt i = 0; i < aDataStoreFormat.MimeFormatCount(); i++) + { + LOGGER_WRITE_1(" MimeFormat(%d)",i); + const CSmlMimeFormat& mimeformat = aDataStoreFormat.MimeFormat(i); + LOGGER_WRITE8_1(" MimeType: %S", &mimeformat.MimeType().DesC()); + LOGGER_WRITE8_1(" MimeVersion: %S", &mimeformat.MimeVersion().DesC()); + LOGGER_WRITE_1( " FieldLevel, bool: %d", (TInt) mimeformat.FieldLevel()); + LOGGER_WRITE_1( " PropertyCount: %d", mimeformat.PropertyCount()); + for ( TInt j=0; j +#include + +#include +#include + +#include "cscontimeout.h" + +class CSmlDataStore; +class CSconSyncRelationship; +class CSmlDataProvider; +class CNSmlDataItemUidSet; +class CSmlDataStoreFormat; + +NONSHARABLE_CLASS ( CSconAsyncHandler ): public CActive, MTimeOutObserver +{ +public: + static CSconAsyncHandler* NewL(); + ~CSconAsyncHandler(); + void HandleServiceL( const RMessage2& aMessage ); + +private: // From CActive + void RunL(); + TInt RunError(TInt aError); + void DoCancel(); + +private: // From MTimeOutObserver + void TimeOut(); + +private: + + CSconAsyncHandler(); + void ConstructL(); + + void HandleChunkMessage(); + void ListAllImplementationsL(); + void OpenStoreL(); + + void OpenItemL(); + void OpenItemCompletedL( TInt aError ); + + void CreateItemL(); + void CreateItemCompletedL( TInt aError ); + void ReplaceItemL(); + void ReplaceItemCompletedL( TInt aError ); + void MoveItemL(); + void DeleteItemL(); + void SoftDeleteItemL(); + void DeleteAllItemsL(); + void ReadParentL(); + void ReadParentCompletedL( TInt aError ); + + void HasHistoryL(); + void AddedItemsL(); + void DeletedItemsL(); + void SoftDeletedItemsL(); + void ModifiedItemsL(); + void MovedItemsL(); + //void ListChangesL(); + void ResetChangeInfoL(); + void CommitChangeInfoL(); + void CloseStore(); + + void SetSyncTimeStampL(); + void GetSyncTimeStampL(); + + void ExportStoreFormatL(); + void SetRemoteStoreFormatL(); + + void LeaveIfNoInstanceL(); + + void DoCloseStore(); + + void CleanOldStoresL(); + void CompleteRequest( TInt aError ); +private: + RChunk iChunk; + + RStringPool iStringPool; + CSmlDataStoreFormat* iStoreFormat; + CSmlDataProvider* iDataProvider; + CSmlDataStore* iDataStore; + CSconSyncRelationship* iContext; + RFs iFs; + RMessage2 iMessage; + + // for committing changes + CNSmlDataItemUidSet* iItems; + + // for opening item + TBool iFieldChange; + TInt iSize; + TInt iParent; + TBuf8<64> iMimeType; + TBuf8<64> iMimeVer; + + // for creating item + TSmlDbItemUid iNewItem; + HBufC8* iWriteData; + TBool iCommitInProgress; + + CCSconTimeOut* iTimeOut; + TBool iForceCancel; +}; + +#endif /*SCONASYNCHANDLER_H_*/ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/sconsyncclientserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/sconsyncclientserver.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,64 @@ +/* +* 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: Sync Client-Server header +* +*/ + + +#ifndef SCONSYNCCLIENTSERVER_H +#define SCONSYNCCLIENTSERVER_H + +#include + +_LIT(KSconSyncServerName, "sconsyncserver"); +_LIT(KSconSyncServerExe, "sconsyncserver.exe"); + + +enum TService +{ + ESendChunkHandle, + ECancelRequest, + EListImplementations, + + EOpenStore, + EOpenItem, + ECreateItem, + EReplaceItem, + EMoveItem, + EDeleteItem, + ESoftDeleteItem, + EDeleteAllItems, + EReadParent, + + EHasHistory, + EAddedItems, + EDeletedItems, + ESoftDeletedItems, + EModifiedItems, + EMovedItems, + + //EListChanges, + EResetChangeInfo, + ECommitChangeInfo, + + ECloseStore, + ESetSyncTimeStamp, + EGetSyncTimeStamp, + EExportStoreFormat, + ESetRemoteStoreFormat, + + EMaxService // Not an actual service +}; + +#endif // SCONSYNCCLIENTSERVER_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/sconsyncrelationship.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/sconsyncrelationship.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,90 @@ +/* +* 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: CSconSyncRelationship header +* +*/ + + +#ifndef SCONSYNCRELATIONSHIP_H_ +#define SCONSYNCRELATIONSHIP_H_ + +#include +#include +#include +#include +#include + +class CDictionaryFileStore; + +NONSHARABLE_CLASS ( CSconSyncRelationship ) : public CBase, public MSmlSyncRelationship + { +public: + /** + * Creates CSconSyncRelationship object. + * @param aFs reference to open RFs connection + * @param aRelationUid uniqueID for each server-client pair + * @return new CSconSyncRelationship object + */ + static CSconSyncRelationship* NewL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aProviderId ); + ~CSconSyncRelationship(); + + static void SetTimeStampL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aId ); + static void GetTimeStampL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aId, TDateTime& aTimeStamp ); + +public: // From MSmlSyncRelationship + + /** + * Returns the unique identifier for the synchronisation relationship. + * + * @return A unique identifier for the sync relationship. + */ + TSmlSyncTaskKey SyncTaskKey() const; + + /** + * Opens a specified stream for reading, and places an item on the cleanup stack to close it. + * + * @param aReadStream On return, an open read stream + * @param aStreamUid The UID of the stream to open for reading. + */ + void OpenReadStreamLC(RReadStream& aReadStream, TUid aStreamUid); + + /** + * Opens the specified stream, or creates a new one if it does not exist, and places an item on the cleanup stack to close it. + * + * @param aWriteStream On return, an open write stream + * @param aStreamUid The UID of the stream to open or create + */ + void OpenWriteStreamLC(RWriteStream& aWriteStream, TUid aStreamUid); + + /** + * Tests if the specified stream identified exists in the store. + * + * @param aStreamUid The stream UID + * @return Non-zero if the stream exists, otherwise EFalse. + */ + TBool IsStreamPresentL(TUid aStreamUid) const; + +private: + CSconSyncRelationship( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aProviderId ); + void ConstructL(); + +private: + + CDictionaryFileStore* iDictionaryStore; + RFs& iFs; + TUid iID; + TSmlDataProviderId iProviderId; + }; + +#endif /*SCONSYNCRELATIONSHIP_H_*/ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/sconsyncserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/sconsyncserver.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,46 @@ +/* +* 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: CSconSyncServer header +* +*/ + + +#ifndef __SCONSYNCSERVER_H__ +#define __SCONSYNCSERVER_H__ + +#include + +class CSconSyncServer : public CPolicyServer +{ +public: + static CSconSyncServer* NewL(); + static CSconSyncServer* NewLC(); + virtual ~CSconSyncServer(); + + void AddSession(); + void RemoveSession(); + +private: + CSconSyncServer(); + void ConstructL(); + + CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const; + TInt RunError(TInt aError); + +private: + TInt iSessionCount; + +}; + +#endif // __SCONSYNCSERVER_H__ \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/inc/sconsyncsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/inc/sconsyncsession.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,47 @@ +/* +* 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: CSconSyncSession header +* +*/ + + +#ifndef __SCONSYNCSESSION_H__ +#define __SCONSYNCSESSION_H__ + +#include + + +class CSconSyncServer; +class CSconAsyncHandler; + +class CSconSyncSession : public CSession2 + { +public: + static CSconSyncSession* NewL(); + + void CreateL(); + +private: + CSconSyncSession(); + ~CSconSyncSession(); + void ConstructL(); + + CSconSyncServer& Server(); + void ServiceL(const RMessage2& aMessage); + +private: + CSconAsyncHandler* iAsyncHandler; + }; + +#endif // __SCONSYNCSESSION_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/rom/sconsyncserver.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/rom/sconsyncserver.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2010 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: IBY file for SconSyncServer +* +*/ + +#ifndef _SCONSYNCSERVER_IBY_ +#define _SCONSYNCSERVER_IBY_ + +#include + +//file content +file=ABI_DIR\BUILD_DIR\sconsyncserver.exe PROGRAMS_DIR\sconsyncserver.exe + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/src/cscontimeout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/src/cscontimeout.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,85 @@ +/* +* 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: CCSconTimeOut implementation +* +*/ + +#include "cscontimeout.h" + +CCSconTimeOut::CCSconTimeOut( MTimeOutObserver& aTimeOutObserver ) : + CActive(EPriorityStandard), // Standard priority + iTimeOutObserver(aTimeOutObserver) + { + } + + +CCSconTimeOut* CCSconTimeOut::NewL( MTimeOutObserver& aTimeOutObserver ) + { + CCSconTimeOut* self = new (ELeave) CCSconTimeOut( aTimeOutObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +void CCSconTimeOut::ConstructL() + { + User::LeaveIfError(iTimer.CreateLocal()); // Initialize timer + CActiveScheduler::Add(this); // Add to scheduler + } + +CCSconTimeOut::~CCSconTimeOut() + { + Cancel(); // Cancel any request, if outstanding + iTimer.Close(); // Destroy the RTimer object + // Delete instance variables if any + } + +void CCSconTimeOut::DoCancel() + { + iTimer.Cancel(); + } + +void CCSconTimeOut::Start(TTimeIntervalMicroSeconds32 aDelay) + { + Cancel(); // Cancel any request, just to be sure + iState = EUninitialized; + iTimer.After(iStatus, aDelay); // Set for later + SetActive(); // Tell scheduler a request is active + } + +void CCSconTimeOut::RunL() + { + /*if (iState == EUninitialized) + { + // Do something the first time RunL() is called + iState = EInitialized; + } + else if (iState != EError) + { + // Do something + } + iTimer.After(iStatus, 1000000); // Set for 1 sec later + SetActive(); // Tell scheduler a request is active*/ + if ( iState == KErrNone ) + { + iTimeOutObserver.TimeOut(); + } + + } + +TInt CCSconTimeOut::RunError(TInt aError) + { + return aError; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/src/sconasynchandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/src/sconasynchandler.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1179 @@ +/* +* 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: CSconAsyncHandler implementation +* +*/ + + +#include "sconasynchandler.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "sconsyncclientserver.h" +#include "sconsyncrelationship.h" +#include "scondataproviderinfo.h" +#include "debug.h" +#include "logdatastoreformat.h" + +// Data Store interface implementation Uid. +// Load all plugins with this uid. +const TUid KDSEcomIFUid = {0x101F4D3A}; + +const TInt KDefaultExpandSize = 1024; + +// one store per computer, max store count. +const TInt KMaxStoresCount = 10; + +const TInt KDefaultTimeOutInMicroSeconds = 30 * 1000000; // 30 seconds +const TInt KDeleteAllTimeOutInMicroSeconds = 300 * 1000000; // 5 minutes +const TInt KOpenStoreTimeOutInMicroSeconds = 180 * 1000000; // 180 seconds + +CSconAsyncHandler::~CSconAsyncHandler() + { + TRACE_FUNC_ENTRY; + Cancel(); + DoCloseStore(); + delete iItems; + delete iWriteData; + delete iDataStore; + delete iDataProvider; + delete iContext; + delete iStoreFormat; + iStringPool.Close(); + iFs.Close(); + REComSession::FinalClose(); + iChunk.Close(); + delete iTimeOut; + TRACE_FUNC_EXIT; + } + +CSconAsyncHandler::CSconAsyncHandler(): CActive( EPriorityStandard ) + { + TRACE_FUNC; + CActiveScheduler::Add( this ); + } + +CSconAsyncHandler* CSconAsyncHandler::NewL() + { + TRACE_FUNC; + CSconAsyncHandler* self = new(ELeave) CSconAsyncHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +void CSconAsyncHandler::ConstructL() + { + TRACE_FUNC; + User::LeaveIfError( iFs.Connect() ); + TInt err = iFs.CreatePrivatePath( EDriveC ); + LOGGER_WRITE_1("CreatePrivatePath err: %d", err); + iStringPool.OpenL(); + iTimeOut = CCSconTimeOut::NewL( *this ); + } + +// ----------------------------------------------------------------------------- +// CSconAsyncHandler::HandleServiceL() +// Handles the client request +// ----------------------------------------------------------------------------- +// +void CSconAsyncHandler::HandleServiceL( const RMessage2& aMessage ) + { + TRACE_FUNC_ENTRY; + if ( aMessage.Function() == ECancelRequest ) + { + LOGGER_WRITE("ECancelRequest"); + if ( IsActive() ) + { + Cancel(); + LOGGER_WRITE("iMessage.Complete( KErrCancel )"); + CompleteRequest( KErrCancel ); + } + + LOGGER_WRITE("aMessage.Complete( KErrNone )"); + aMessage.Complete( KErrNone ); + TRACE_FUNC_EXIT; + return; + } + + iTimeOut->Start( KDefaultTimeOutInMicroSeconds ); + + iMessage = aMessage; + switch ( aMessage.Function() ) + { + case ESendChunkHandle: + LOGGER_WRITE( "CSconSyncSession::ServiceL() : ESendChunkHandle" ); + HandleChunkMessage(); + break; + + case EListImplementations: + LOGGER_WRITE( "CSconSyncSession::ServiceL() : EListImplementations" ); + ListAllImplementationsL(); + break; + + case EOpenStore: + LOGGER_WRITE( "CSconSyncSession::ServiceL() : EOpenStore" ); + iTimeOut->Start( KOpenStoreTimeOutInMicroSeconds ); + OpenStoreL(); + break; + + case EOpenItem: + OpenItemL(); + break; + case ECreateItem: + CreateItemL(); + break; + case EReplaceItem: + ReplaceItemL(); + break; + case EMoveItem: + MoveItemL(); + break; + case EDeleteItem: + DeleteItemL(); + break; + case ESoftDeleteItem: + SoftDeleteItemL(); + break; + case EDeleteAllItems: + iTimeOut->Start( KDeleteAllTimeOutInMicroSeconds ); + DeleteAllItemsL(); + break; + case EReadParent: + ReadParentL(); + break; + + case EHasHistory: + HasHistoryL(); + break; + case EAddedItems: + AddedItemsL(); + break; + case EDeletedItems: + DeletedItemsL(); + break; + case ESoftDeletedItems: + SoftDeletedItemsL(); + break; + case EModifiedItems: + ModifiedItemsL(); + break; + case EMovedItems: + MovedItemsL(); + break; + case EResetChangeInfo: + ResetChangeInfoL(); + break; + case ECommitChangeInfo: + CommitChangeInfoL(); + break; + case ECloseStore: + CloseStore(); + break; + case ESetSyncTimeStamp: + SetSyncTimeStampL(); + break; + case EGetSyncTimeStamp: + GetSyncTimeStampL(); + break; + case EExportStoreFormat: + ExportStoreFormatL(); + break; + case ESetRemoteStoreFormat: + SetRemoteStoreFormatL(); + break; + + default: + aMessage.Complete(KErrNotSupported); + break; + } + TRACE_FUNC_EXIT; + } + + +void CSconAsyncHandler::RunL() + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("iStatus.Int(): %d", iStatus.Int()); + switch ( iMessage.Function() ) + { + case EOpenStore: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EOpenStore" ); + CompleteRequest( iStatus.Int() ); + break; + + case EOpenItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EOpenItem" ); + OpenItemCompletedL( iStatus.Int() ); + break; + + case ECreateItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECreateItem" ); + if (!iCommitInProgress) + { + // Write data to item + CreateItemCompletedL( iStatus.Int() ); + } + else + { + // commit is done, all ready + LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECreateItem, commit done" ); + TPckg pckg(iNewItem); + iMessage.WriteL( 0, pckg, 0); + CompleteRequest( iStatus.Int() ); + } + break; + + case EReplaceItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReplaceItem" ); + if (!iCommitInProgress) + { + // Write data to item + ReplaceItemCompletedL( iStatus.Int() ); + } + else + { + // commit is done, all ready + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReplaceItem, commit done" ); + CompleteRequest( iStatus.Int() ); + } + break; + + case EMoveItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EMoveItem" ); + CompleteRequest( iStatus.Int() ); + break; + + case EDeleteItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EDeleteItem" ); + CompleteRequest( iStatus.Int() ); + break; + + case ESoftDeleteItem: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : ESoftDeleteItem" ); + CompleteRequest( iStatus.Int() ); + break; + + case EDeleteAllItems: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EDeleteAllItems" ); + CompleteRequest( iStatus.Int() ); + break; + + case EReadParent: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReadParent" ); + ReadParentCompletedL( iStatus.Int() ); + break; + + case EResetChangeInfo: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : EResetChangeInfo" ); + CompleteRequest( iStatus.Int() ); + break; + + case ECommitChangeInfo: + LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECommitChangeInfo" ); + delete iItems; + iItems = NULL; + CompleteRequest( iStatus.Int() ); + break; + + default: + LOGGER_WRITE("Not asynchronous function") + CompleteRequest( KErrNotSupported ); + break; + } + TRACE_FUNC_EXIT; + } + +TInt CSconAsyncHandler::RunError(TInt aError) + { + LOGGER_WRITE_1("CSconAsyncHandler::RunError() aError: %d", aError); + delete iItems; + iItems = NULL; + delete iWriteData; + iWriteData = NULL; + + if ( IsActive() ) + { + LOGGER_WRITE("IsActive"); + //iDataStore->CancelRequest(); + Cancel(); + } + + if ( iDataStore && iMessage.Function() == EOpenItem ) + { + LOGGER_WRITE( "CSconAsyncHandler::RunError() : EOpenItem" ); + iDataStore->CloseItem(); + } + + CompleteRequest( aError ); + aError = KErrNone; + LOGGER_WRITE_1("CSconAsyncHandler::RunError() : Return %d", aError); + return aError; + //return KErrNone;//aError; + } + +void CSconAsyncHandler::DoCancel() + { + TRACE_FUNC_ENTRY; + iDataStore->CancelRequest(); + iTimeOut->Cancel(); + + if ( iStatus == KRequestPending ) + { + LOGGER_WRITE( "iStatus == KRequestPending" ); + } + + if ( iDataStore && iMessage.Function() == EOpenItem ) + { + LOGGER_WRITE( "CSconAsyncHandler::RunError() : EOpenItem" ); + iDataStore->CloseItem(); + } + + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::TimeOut() + { + TRACE_FUNC_ENTRY; + if ( IsActive() ) + { + Cancel(); + CompleteRequest( KErrCancel ); + } + TRACE_FUNC_EXIT; + } + + +void CSconAsyncHandler::HandleChunkMessage() + { + TRACE_FUNC_ENTRY; + TInt ret ( KErrNone ); + + ret = iChunk.Open( iMessage, 0, EFalse ); + + LOGGER_WRITE_1( "CSconAsyncHandler::HandleChunkMessageL() : ret %d", ret ); + CompleteRequest( ret ); + } + + + +void CSconAsyncHandler::ListAllImplementationsL() + { + TRACE_FUNC_ENTRY; + + RImplInfoPtrArray implInfoArray; + CleanupResetAndDestroyPushL( implInfoArray ); + REComSession::ListImplementationsL( KDSEcomIFUid, implInfoArray ); + + const TInt KDataproviderInfoSize = 250; // 250 bytes should be enought + TInt requiredSize = implInfoArray.Count() * KDataproviderInfoSize; + if ( iChunk.Size() < requiredSize ) + { + User::LeaveIfError( iChunk.Adjust( requiredSize ) ); + } + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + + RSconDataProviderInfoArray dpInfoArray; + CleanupResetAndDestroyPushL( dpInfoArray ); + + // Collect information from dataproviders + for ( TInt i=0; i < implInfoArray.Count(); i++ ) + { + LOGGER_WRITE_1("implInfoArray: %d",i); + CImplementationInformation& implInfo = *implInfoArray[i]; + + CSmlDataProvider* dp(NULL); + TRAPD( err, dp = CSmlDataProvider::NewL( implInfo.ImplementationUid().iUid ) ); + LOGGER_WRITE_2("CSmlDataProvider::NewL, uid(0x%08x) err: %d",implInfo.ImplementationUid().iUid, err ); + if ( !err ) + { + CleanupStack::PushL( dp ); + + CSconDataproviderInfo *dpInfo = CSconDataproviderInfo::NewL(); + CleanupStack::PushL( dpInfo ); + + dpInfo->SetImplementationUid( implInfo.ImplementationUid() ); + LOGGER_WRITE_1("ImplementationUid: 0x%08x", implInfo.ImplementationUid().iUid ); + dpInfo->SetDisplayNameL( implInfo.DisplayName() ); + LOGGER_WRITE_1("DisplayName: %S", &implInfo.DisplayName() ); + + dpInfo->SetDefaultStoreL( dp->DefaultStoreL() ); + LOGGER_WRITE_1("DefaultStoreL: %S", &dp->DefaultStoreL() ); + CDesCArray* stores = dp->ListStoresLC(); + dpInfo->SetStoresL( *stores ); + CleanupStack::PopAndDestroy( stores ); + + dpInfoArray.AppendL( dpInfo ); + CleanupStack::Pop( dpInfo ); + + CleanupStack::PopAndDestroy( dp ); + } + } + + // Wrtie to stream + stream.WriteUint16L( dpInfoArray.Count() ); + for ( TInt i = 0; i < dpInfoArray.Count(); i++ ) + { + CSconDataproviderInfo& dpInfo = *dpInfoArray[i]; + dpInfo.ExternalizeL( stream ); + } + + stream.CommitL(); + + CleanupStack::PopAndDestroy( &dpInfoArray ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( &implInfoArray ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::OpenStoreL() + { + TRACE_FUNC_ENTRY; + if ( iDataStore ) + { + LOGGER_WRITE("Warning: Previous DataStore was not closed properly."); + DoCloseStore(); + } + + // copy data from the chunk + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + TSmlDataProviderId providerId = readStream.ReadUint32L(); + LOGGER_WRITE_1("providerId: 0x%08x", providerId); + + TInt len = readStream.ReadUint32L(); + HBufC* storeName = HBufC::NewLC(len); + TPtr storeNamePtr = storeName->Des(); + readStream.ReadL(storeNamePtr, len); + LOGGER_WRITE_1("storeName: %S", &storeNamePtr); + + TInt contextUid = readStream.ReadUint32L(); + + LOGGER_WRITE_1("contextIdentifier: 0x%08x", contextUid); + + LOGGER_WRITE("Open provider"); + delete iDataProvider; + iDataProvider = NULL; + iDataProvider = CSmlDataProvider::NewL( providerId ); + + delete iContext; + iContext = NULL; + + delete iStoreFormat; + iStoreFormat = NULL; + + LOGGER_WRITE("Create context"); + iContext = CSconSyncRelationship::NewL( iFs, TUid::Uid(contextUid), providerId ); + + + LOGGER_WRITE("Create NewStoreInstanceLC"); + iDataStore = iDataProvider->NewStoreInstanceLC(); + CleanupStack::Pop( iDataStore ); + + SetActive(); + iStatus = KRequestPending; + LOGGER_WRITE("OpenL"); + TRAPD(err, iDataStore->OpenL(storeNamePtr,*iContext, iStatus)); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->OpenL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + + CleanupStack::PopAndDestroy( storeName ); + CleanupStack::PopAndDestroy( &readStream ); + + TRACE_FUNC_EXIT; + } + + +void CSconAsyncHandler::OpenItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + if ( IsActive() ) + { + LOGGER_WRITE("Was still in Active"); + Cancel(); + } + + TSmlDbItemUid itemUid = iMessage.Int0(); + LOGGER_WRITE_1("Open item: %d", itemUid); + + // set default values + iFieldChange = EFalse; + iSize = 0; + iParent = 0; + iMimeType.Copy(KNullDesC); + iMimeVer.Copy(KNullDesC); + + SetActive(); + LOGGER_WRITE("iDataStore->OpenItemL"); + iStatus = KRequestPending; + TRAPD( err, iDataStore->OpenItemL(itemUid,iFieldChange,iSize,iParent,iMimeType,iMimeVer,iStatus)); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->OpenItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::OpenItemCompletedL( TInt aError ) + { + TRACE_FUNC_ENTRY; + // item opened, now read it + if ( aError ) + { + CompleteRequest( aError ); + return; + } + LeaveIfNoInstanceL(); + + LOGGER_WRITE_1("item size: %d", iSize); + + TInt totalObjectSize( 0 ); + totalObjectSize+= sizeof(TInt32); // data length + totalObjectSize+= iSize; // data + totalObjectSize+= sizeof(TInt8); // iFieldChange + totalObjectSize+= sizeof(TInt32); // iParent + totalObjectSize+= sizeof(TInt32); // iMimeType + totalObjectSize+= iMimeType.Length(); // iMimeType + totalObjectSize+= sizeof(TInt32); // iMimeVer + totalObjectSize+= iMimeVer.Length(); // iMimeType + + LOGGER_WRITE_1("iChunk.Size(): %d", iChunk.Size()); + LOGGER_WRITE_1("iChunk.MaxSize(): %d", iChunk.MaxSize()); + LOGGER_WRITE_1("totalObjectSize: %d", totalObjectSize); + + if ( iChunk.Size() < totalObjectSize ) + { + LOGGER_WRITE("adjust chunk"); + TInt err = iChunk.Adjust( totalObjectSize ); + LOGGER_WRITE_1("Chunk.Adjust err: %d", err); + User::LeaveIfError( err ); + } + LOGGER_WRITE_1("new Chunk size: %d", iChunk.Size()); + LOGGER_WRITE_1("new ChunkMaxSize(): %d", iChunk.MaxSize()); + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + + LOGGER_WRITE("ReadItemL"); + HBufC8* tempBuf = HBufC8::NewLC(iSize); + TPtr8 tempPtr = tempBuf->Des(); + + TUint8* ptr = (TUint8*) tempPtr.Ptr(); + + TPtr8 tempPtr2( ptr, 0, iSize ); + LOGGER_WRITE_1( "tempPtr2.Size(): %d", tempPtr2.Size()); + iDataStore->ReadItemL( tempPtr2 ); + LOGGER_WRITE("ReadItemL -ok"); + + LOGGER_WRITE_1("readed Length: %d", tempPtr2.Length() ); + LOGGER_WRITE_1("readed Size: %d", tempPtr2.Size() ); + + LOGGER_WRITE8_1("iMimeType: %S", &iMimeType ); + LOGGER_WRITE_1("iMimeType.Length(): %d", iMimeType.Length() ); + LOGGER_WRITE_1("iMimeType Size: %d", iMimeType.Size() ); + + LOGGER_WRITE8_1("iMimeVer: %S", &iMimeVer ); + LOGGER_WRITE_1("iMimeVer.Length(): %d", iMimeVer.Length() ); + LOGGER_WRITE_1("iMimeVer Size: %d", iMimeVer.Size() ); + + iDataStore->CloseItem(); + LOGGER_WRITE("Write to chunk"); + stream.WriteInt32L( tempPtr2.Length() ); + stream.WriteL( tempPtr2 ); + CleanupStack::PopAndDestroy( tempBuf ); + + stream.WriteInt8L( (TInt)iFieldChange ); + stream.WriteInt32L( iParent ); + stream.WriteInt32L( iMimeType.Length() ); + stream.WriteL( iMimeType ); + stream.WriteInt32L( iMimeVer.Length() ); + stream.WriteL( iMimeVer ); + + stream.CommitL(); + LOGGER_WRITE("Writed ok"); + CleanupStack::PopAndDestroy( &stream ); + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CreateItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + iCommitInProgress = EFalse; + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + TSmlDbItemUid parent = readStream.ReadUint32L(); + TInt len = readStream.ReadUint32L(); + readStream.ReadL(iMimeType, len); + len = readStream.ReadUint32L(); + readStream.ReadL(iMimeVer, len); + len = readStream.ReadUint32L(); + delete iWriteData; + iWriteData = NULL; + iWriteData = HBufC8::New(len); + TPtr8 dataPtr = iWriteData->Des(); + readStream.ReadL(dataPtr, len); + CleanupStack::PopAndDestroy( &readStream ); + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->CreateItemL( iNewItem, dataPtr.Size(), parent, iMimeType, iMimeVer, iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->CreateItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CreateItemCompletedL( TInt aError ) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( aError ); + LeaveIfNoInstanceL(); + // CreateItem completed, now we must write the data to the created item and commit it. + + iDataStore->WriteItemL( iWriteData->Des() ); + delete iWriteData; + iWriteData = NULL; + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->CommitItemL( iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + iCommitInProgress = ETrue; + + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ReplaceItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + + iCommitInProgress = EFalse; + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + TSmlDbItemUid uid = readStream.ReadUint32L(); + TSmlDbItemUid parent = readStream.ReadUint32L(); + TBool fieldChange = readStream.ReadUint8L(); + TInt len = readStream.ReadUint32L(); + delete iWriteData; + iWriteData = NULL; + iWriteData = HBufC8::New(len); + TPtr8 dataPtr = iWriteData->Des(); + readStream.ReadL(dataPtr, len); + + CleanupStack::PopAndDestroy( &readStream ); + SetActive(); + iStatus = KRequestPending; + TRAPD(err,iDataStore->ReplaceItemL( uid,dataPtr.Size(),parent,fieldChange, iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ReplaceItemCompletedL( TInt aError ) + { + TRACE_FUNC_ENTRY; + User::LeaveIfError( aError ); + LeaveIfNoInstanceL(); + // CreateItem completed, now we must write the data to the created item and commit it. + + iDataStore->WriteItemL( iWriteData->Des() ); + delete iWriteData; + iWriteData = NULL; + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->CommitItemL( iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + iCommitInProgress = ETrue; + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::MoveItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + TSmlDbItemUid uid = iMessage.Int0(); + TSmlDbItemUid newParent = iMessage.Int1(); + LOGGER_WRITE_1( "uid: %d", uid ); + LOGGER_WRITE_1( "newParent: %d", newParent ); + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->MoveItemL( uid, newParent, iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->MoveItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::DeleteItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + + TSmlDbItemUid uid = iMessage.Int0(); + LOGGER_WRITE_1( "uid: %d", uid ); + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->DeleteItemL( uid, iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->DeleteItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::SoftDeleteItemL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + + TSmlDbItemUid uid = iMessage.Int0(); + LOGGER_WRITE_1( "uid: %d", uid ); + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->SoftDeleteItemL( uid, iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->SoftDeleteItemL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::DeleteAllItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->DeleteAllItemsL( iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->DeleteAllItemsL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ReadParentL() + { + TRACE_FUNC_ENTRY; + OpenItemL(); + + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ReadParentCompletedL( TInt aError ) + { + TRACE_FUNC_ENTRY; + // item opened, now read it + if ( aError ) + { + CompleteRequest( aError ); + return; + } + LeaveIfNoInstanceL(); + + iDataStore->CloseItem(); + + TPckg pckg(iParent); + iMessage.WriteL( 1, pckg, 0); + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::HasHistoryL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + TBool hasHistory = iDataStore->HasSyncHistory(); + + TPckgC pckg(hasHistory); + iMessage.WriteL( 0, pckg, 0); + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::AddedItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + const MSmlDataItemUidSet& items = iDataStore->AddedItems(); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + items.ExternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::DeletedItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + const MSmlDataItemUidSet& items = iDataStore->DeletedItems(); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + items.ExternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::SoftDeletedItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + const MSmlDataItemUidSet& items = iDataStore->SoftDeletedItems(); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + items.ExternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ModifiedItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + const MSmlDataItemUidSet& items = iDataStore->ModifiedItems(); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + items.ExternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::MovedItemsL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + const MSmlDataItemUidSet& items = iDataStore->MovedItems(); + + RMemWriteStream stream ( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( stream ); + items.ExternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ResetChangeInfoL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->ResetChangeInfoL( iStatus )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->ResetChangeInfoL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CommitChangeInfoL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + if ( iItems ) + { + delete iItems; + iItems = NULL; + } + iItems = new (ELeave) CNSmlDataItemUidSet(); + iItems->InternalizeL( readStream ); + + CleanupStack::PopAndDestroy( &readStream ); + + SetActive(); + iStatus = KRequestPending; + TRAPD(err, iDataStore->CommitChangeInfoL( iStatus, *iItems )); + if ( err ) + { + // we are on active state, call request completed (RunL) + LOGGER_WRITE_1("iDataStore->CommitChangeInfoL leaved with err: %d", err); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + } + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CloseStore() + { + TRACE_FUNC_ENTRY; + DoCloseStore(); + REComSession::FinalClose(); + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::SetSyncTimeStampL() + { + TRACE_FUNC_ENTRY; + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + TInt relationId = readStream.ReadInt32L(); + TInt providerId = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy( &readStream ); + + CSconSyncRelationship::SetTimeStampL( iFs, TUid::Uid(relationId), providerId); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::GetSyncTimeStampL() + { + TRACE_FUNC_ENTRY; + TInt providerId = iMessage.Int0(); + TInt relationId = iMessage.Int1(); + + TDateTime time; + CSconSyncRelationship::GetTimeStampL( iFs, TUid::Uid(relationId), providerId, time); + + // write timestamp + TPckgC timeBuf(time); + iMessage.WriteL( 2, timeBuf, 0); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::ExportStoreFormatL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + if ( !iDataProvider ) + { + User::Leave( KErrNotReady ); + } + CBufFlat* buffer = CBufFlat::NewL( KDefaultExpandSize ); + CleanupStack::PushL( buffer ); + RBufWriteStream stream( *buffer ); + CleanupClosePushL( stream ); + + const CSmlDataStoreFormat& storeFormat = iDataProvider->StoreFormatL(); + TRAP_IGNORE( TLogDataStoreFormat::LogDataStoreFormatL( _L("iDataProvider->StoreFormatL()"), storeFormat )); + + storeFormat.ExternalizeL( stream ); + + stream.CommitL(); + CleanupStack::PopAndDestroy( &stream ); + buffer->Compress(); + + RMemWriteStream chunkStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( chunkStream ); + + chunkStream.WriteInt32L( buffer->Size() ); + chunkStream.WriteL( buffer->Ptr(0), buffer->Size()); + chunkStream.CommitL(); + CleanupStack::PopAndDestroy( &chunkStream ); + + CleanupStack::PopAndDestroy( buffer ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::SetRemoteStoreFormatL() + { + TRACE_FUNC_ENTRY; + LeaveIfNoInstanceL(); + + RMemReadStream readStream( iChunk.Base(), iChunk.Size() ); + CleanupClosePushL( readStream ); + + if ( iStoreFormat ) + { + delete iStoreFormat; + iStoreFormat = NULL; + } + iStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, readStream); + CleanupStack::Pop( iStoreFormat ); + TRAP_IGNORE( TLogDataStoreFormat::LogDataStoreFormatL( _L("iDataProvider->SetRemoteStoreFormatL()"), *iStoreFormat )); + iDataStore->SetRemoteStoreFormatL( *iStoreFormat ); + + CleanupStack::PopAndDestroy( &readStream ); + + CompleteRequest( KErrNone ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::LeaveIfNoInstanceL() + { + if ( !iDataStore ) + { + LOGGER_WRITE("DataStore instance was not ready, leaving KErrNotReady"); + User::Leave( KErrNotReady ); + } + } + +void CSconAsyncHandler::DoCloseStore() + { + TRACE_FUNC_ENTRY; + delete iItems; + iItems = NULL; + delete iWriteData; + iWriteData = NULL; + if ( iDataProvider && iContext ) + { + TInt providerId = iDataProvider->Identifier(); + TInt contextId = iContext->SyncTaskKey(); + TRAP_IGNORE( CSconSyncRelationship::SetTimeStampL( iFs, TUid::Uid(contextId), providerId) ); + } + delete iDataStore; + iDataStore = NULL; + delete iDataProvider; + iDataProvider = NULL; + delete iContext; + iContext = NULL; + delete iStoreFormat; + iStoreFormat = NULL; + + CleanOldStoresL(); + + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CleanOldStoresL() + { + TRACE_FUNC_ENTRY; + TFileName path; + User::LeaveIfError( iFs.PrivatePath( path ) ); + CDir* dir; + iFs.GetDir( path, KEntryAttNormal, ESortByDate, dir ); + CleanupStack::PushL( dir ); + TInt storesCount(0); + LOGGER_WRITE_1("count: %d", dir->Count() ); + for ( TInt i=dir->Count()-1; i >= 0; i-- ) + { + LOGGER_WRITE_1("dir[%d]", i); + TEntry entry = (*dir)[i]; + LOGGER_WRITE_1("file: %S", &entry.iName); + _LIT(KContextStoreName, "contextstore"); + _LIT(KTimeStoreName, "timestore"); + if ( entry.iName.Find(KContextStoreName) == 0 ) + { + storesCount++; + LOGGER_WRITE_1("storeNro: %d", storesCount); +#ifdef _DEBUG + TTime time = entry.iModified; + TDateTime dt = time.DateTime(); + _LIT(KFormat, "%d.%d %02d:%02d"); + TFileName mod; + mod.Format(KFormat, dt.Day()+1, dt.Month()+1, dt.Hour()+1,dt.Minute() ); + LOGGER_WRITE_1("time: %S", &mod); +#endif + if ( storesCount > KMaxStoresCount ) + { + LOGGER_WRITE_1("delete contextstore: '%S'", &entry.iName ); + iFs.Delete( entry.iName ); + TFileName timeStoreFile; + timeStoreFile = entry.iName.Right(15); + timeStoreFile.Insert(0, KTimeStoreName); + LOGGER_WRITE_1("delete timeStoreFile: %S", &timeStoreFile); + iFs.Delete( timeStoreFile ); + } + } + + } + CleanupStack::PopAndDestroy( dir ); + TRACE_FUNC_EXIT; + } + +void CSconAsyncHandler::CompleteRequest( TInt aError ) + { + TRACE_FUNC; + iTimeOut->Cancel(); + LOGGER_WRITE_1("iMessage.Complete( %d )", aError); + iMessage.Complete( aError ); + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/src/sconsyncrelationship.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/src/sconsyncrelationship.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,181 @@ +/* +* 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: CSconSyncRelationship implementation +* +*/ + + +#include "sconsyncrelationship.h" +#include +#include + +#include "debug.h" + +_LIT(KContextStore, "contextstore_0x%08x.dat"); +_LIT(KTimeStore, "timestore_0x%08x.dat"); + +CSconSyncRelationship::~CSconSyncRelationship() + { + TRACE_FUNC_ENTRY; + if ( iDictionaryStore ) + { + iDictionaryStore->Commit(); + delete iDictionaryStore; + } + TRACE_FUNC_EXIT; + } + +CSconSyncRelationship::CSconSyncRelationship( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aProviderId ) + : iFs(aFs), iID(aRelationUid), iProviderId(aProviderId) + { + TRACE_FUNC; + + } + +CSconSyncRelationship* CSconSyncRelationship::NewL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aProviderId ) + { + TRACE_FUNC_ENTRY; + CSconSyncRelationship* self = new (ELeave) CSconSyncRelationship( aFs, aRelationUid, aProviderId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT; + return self; + } + +void CSconSyncRelationship::SetTimeStampL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aId ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aRelationUid: 0x%08x", aRelationUid.iUid ); + LOGGER_WRITE_1("aId: 0x%08x", aId ); + aFs.SetSessionToPrivate( EDriveC ); + TFileName file; + file.Format(KTimeStore, aRelationUid.iUid); + CDictionaryFileStore* dictionaryStore = CDictionaryFileStore::OpenLC(aFs, file, TUid::Uid(0x0001)); + + RDictionaryWriteStream stream; + stream.AssignLC( *dictionaryStore, TUid::Uid(aId) ); + + TTime time; + time.UniversalTime(); + + TDateTime dateTime = time.DateTime(); + TPckgBuf timeBuf(dateTime); + + stream.WriteL( timeBuf ); + stream.CommitL(); + + CleanupStack::PopAndDestroy( &stream ); //AssingLC + dictionaryStore->Commit(); + CleanupStack::PopAndDestroy( dictionaryStore ); + TRACE_FUNC_EXIT; + } + +void CSconSyncRelationship::GetTimeStampL( RFs& aFs, TUid aRelationUid, TSmlDataProviderId aId, TDateTime& aTimeStamp ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aRelationUid: 0x%08x", aRelationUid.iUid ); + LOGGER_WRITE_1("aId: 0x%08x", aId ); + User::LeaveIfError( aFs.SetSessionToPrivate( EDriveC ) ); + TFileName file; + file.Format(KTimeStore, aRelationUid.iUid); + CDictionaryFileStore* dictionaryStore = CDictionaryFileStore::OpenLC(aFs, file, TUid::Uid(0x0001)); + TBool present = dictionaryStore->IsPresentL( TUid::Uid(aId) ); + if ( !present ) + { + LOGGER_WRITE("Stream was not present"); + User::Leave(KErrNotFound); + } + RDictionaryReadStream stream; + stream.OpenLC( *dictionaryStore, TUid::Uid(aId) ); + TPckgBuf timeBuf; + stream.ReadL( timeBuf ); + aTimeStamp = timeBuf(); + CleanupStack::PopAndDestroy(); //OpenLC + CleanupStack::PopAndDestroy( dictionaryStore ); + + TRACE_FUNC_EXIT; + } + +void CSconSyncRelationship::ConstructL() + { + TRACE_FUNC_ENTRY; + iFs.SetSessionToPrivate( EDriveC ); + TFileName file; + file.Format(KContextStore, iID.iUid); + iDictionaryStore = CDictionaryFileStore::OpenL( + iFs, file, TUid::Uid(0x0001)); + + TRACE_FUNC_EXIT; + } + + +TSmlSyncTaskKey CSconSyncRelationship::SyncTaskKey() const + { + TRACE_FUNC; + return static_cast(iID.iUid); + } + +void CSconSyncRelationship::OpenReadStreamLC(RReadStream& aReadStream, TUid aStreamUid) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aStreamUid: 0x%08x", aStreamUid); + TUid streamUid(aStreamUid); + if ( aStreamUid.iUid == KNSmlDefaultSnapshotStreamUID ) + { + LOGGER_WRITE_1(" Default stream uid was used, use provider uid (0x%08x) as stream uid", iProviderId); + streamUid.iUid = iProviderId; + } + if ( !IsStreamPresentL( streamUid ) ) + { + LOGGER_WRITE("Stream was not present"); + User::Leave(KErrNotFound); + } + + + static_cast(aReadStream).OpenLC( + *iDictionaryStore, streamUid ); + TRACE_FUNC_EXIT; + } + +void CSconSyncRelationship::OpenWriteStreamLC(RWriteStream& aWriteStream, TUid aStreamUid) + { + TRACE_FUNC_ENTRY; + + LOGGER_WRITE_1("aStreamUid: 0x%08x", aStreamUid); + TUid streamUid(aStreamUid); + if ( aStreamUid.iUid == KNSmlDefaultSnapshotStreamUID ) + { + LOGGER_WRITE_1(" Default stream uid was used, use provider uid (0x%08x) as stream uid", iProviderId); + streamUid.iUid = iProviderId; + } + static_cast(aWriteStream).AssignLC( + *iDictionaryStore, streamUid ); + TRACE_FUNC_EXIT; + } + +TBool CSconSyncRelationship::IsStreamPresentL(TUid aStreamUid) const + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aStreamUid: 0x%08x", aStreamUid.iUid ); + TUid streamUid(aStreamUid); + if ( aStreamUid.iUid == KNSmlDefaultSnapshotStreamUID ) + { + LOGGER_WRITE_1(" Default stream uid was used, use provider uid (0x%08x) as stream uid", iProviderId); + streamUid.iUid = iProviderId; + } + TBool present = iDictionaryStore->IsPresentL( streamUid ); + LOGGER_WRITE_1("CSconSyncRelationship::IsStreamPresentL() return: %d",(TInt)present); + return present; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/src/sconsyncserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/src/sconsyncserver.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,177 @@ +/* +* 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: CSconSyncServer implementation +* +*/ + + +#include "sconsyncserver.h" +#include "sconsyncclientserver.h" + +#include "sconsyncsession.h" +#include "debug.h" + +const TInt KSConPCConnServerUid = 0x101F99F6; + +// Security policy +const TUint KServerPolicyRangeCount = 2; + +const TInt KServerPolicyRanges[KServerPolicyRangeCount] = + { + 0, // range is 0 inclusive + EMaxService // range is 1-KMaxTInt inclusive + }; + +const TUint8 KServerPolicyElementsIndex[KServerPolicyRangeCount] = + { + 0, // applies to 0th range + CPolicyServer::ENotSupported // applies to 1st range + }; + +const CPolicyServer::TPolicyElement KServerPolicyElements[] = + { + { _INIT_SECURITY_POLICY_S0(KSConPCConnServerUid) /*_INIT_SECURITY_POLICY_C1(ECapabilityReadDeviceData)*/, CPolicyServer::EFailClient } + }; + +const CPolicyServer::TPolicy KServerPolicy = + { + 0 /*CPolicyServer::EAlwaysPass*/, // specifies all connect attempts should pass + KServerPolicyRangeCount, + KServerPolicyRanges, + KServerPolicyElementsIndex, + KServerPolicyElements + }; + + +CSconSyncServer* CSconSyncServer::NewL() + { + CSconSyncServer* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +CSconSyncServer* CSconSyncServer::NewLC() + { + CSconSyncServer* self = new(ELeave) CSconSyncServer(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CSconSyncServer::CSconSyncServer() : + CPolicyServer(EPriorityStandard, KServerPolicy, ESharableSessions) + { + } + +void CSconSyncServer::ConstructL() + { + TRACE_FUNC_ENTRY; + TInt error = Start(KSconSyncServerName); + + if (error != KErrNone) + { + User::Panic(KSconSyncServerName, error); + } + TRACE_FUNC_EXIT; + } + +CSconSyncServer::~CSconSyncServer() + { + TRACE_FUNC; + } + +CSession2* CSconSyncServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const + { + TRACE_FUNC; + TVersion v(1,0,0); + if ( !User::QueryVersionSupported(v,aVersion) ) + { + TVersionName vname = aVersion.Name(); + LOGGER_WRITE_1("Client has wrong version: %S", &vname); + User::Leave( KErrNotSupported ); + } + + return CSconSyncSession::NewL(); + } + +TInt CSconSyncServer::RunError(TInt aError) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aError: %d", aError); + // Bad descriptor implies bad client + if (aError == KErrBadDescriptor) + { + Message().Panic(KSconSyncServerName, aError); + } + else + { + Message().Complete(aError); + } + + // Continue handling requests + ReStart(); + TRACE_FUNC_EXIT; + return KErrNone; + } + +void CSconSyncServer::AddSession() + { + ++iSessionCount; + LOGGER_WRITE_1("CSconSyncServer::AddSession(), iSessionCount: %d", iSessionCount); + } + +void CSconSyncServer::RemoveSession() + { + --iSessionCount; + LOGGER_WRITE_1("CSconSyncServer::RemoveSession(), iSessionCount: %d", iSessionCount); + if (iSessionCount == 0) + { + CActiveScheduler::Stop(); + } + } + +LOCAL_C void ExeMainL() + { + TRACE_FUNC_ENTRY; + // Install active scheduler + CActiveScheduler* scheduler = new(ELeave) CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + CSconSyncServer::NewLC(); + + User::LeaveIfError(User::RenameThread(KSconSyncServerName)); + RProcess::Rendezvous(KErrNone); + + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(); // CSconSyncServer + CleanupStack::PopAndDestroy(); // CActiveScheduler + TRACE_FUNC_EXIT; + } + +GLDEF_C TInt E32Main() + { + TRACE_FUNC_ENTRY; + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + TRAPD(error, ExeMainL()); + __ASSERT_ALWAYS(!error, User::Panic(KSconSyncServerName, error)); + + delete cleanup; + __UHEAP_MARKEND; + TRACE_FUNC_EXIT; + return 0; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/servers/syncserver/src/sconsyncsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/servers/syncserver/src/sconsyncsession.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,96 @@ +/* +* 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: CSconSyncSession implementation +* +*/ + + +#include "sconsyncsession.h" + +#include "sconsyncserver.h" +#include "sconsyncclientserver.h" +#include "sconasynchandler.h" +#include "debug.h" + + +CSconSyncSession::CSconSyncSession() + { + TRACE_FUNC; + } + +CSconSyncSession* CSconSyncSession::NewL() + { + TRACE_FUNC; + CSconSyncSession* self = new(ELeave) CSconSyncSession(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +void CSconSyncSession::ConstructL() + { + TRACE_FUNC_ENTRY; + iAsyncHandler = CSconAsyncHandler::NewL(); + TRACE_FUNC_EXIT; + } + +void CSconSyncSession::CreateL() + { + TRACE_FUNC; + Server().AddSession(); + } + +CSconSyncSession::~CSconSyncSession() + { + TRACE_FUNC_ENTRY; + delete iAsyncHandler; + + Server().RemoveSession(); + + TRACE_FUNC_EXIT; + } + +CSconSyncServer& CSconSyncSession::Server() + { + return *static_cast(const_cast(CSession2::Server())); + } + + +// ----------------------------------------------------------------------------- +// CSconSyncSession::ServiceL() +// Handles the client request +// ----------------------------------------------------------------------------- +// +void CSconSyncSession::ServiceL(const RMessage2& aMessage) + { + TRACE_FUNC_ENTRY; + + TRAPD( err, iAsyncHandler->HandleServiceL( aMessage )); + if ( err ) + { + LOGGER_WRITE_1("iAsyncHandler->HandleServiceL leaved: %d", err); + if ( iAsyncHandler->IsActive() ) + { + LOGGER_WRITE(" and it was active -> Cancel it"); + iAsyncHandler->Cancel(); + } + // do server error processing + User::Leave( err ); + } + + TRACE_FUNC_EXIT; + } + + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/bld/101F99F6.xml Binary file connectivitymodules/SeCon/services/csc/bld/101F99F6.xml has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/bld/bld.inf --- a/connectivitymodules/SeCon/services/csc/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/csc/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -22,17 +22,12 @@ DEFAULT PRJ_EXPORTS -./101f9698.xml /epoc32/data/z/private/101f99f6/capability/101f9698.xml -./fwdcomp.xml /epoc32/data/z/private/101f99f6/capability/fwdcomp.xml -./101f99f6.xml /epoc32/data/z/private/101f99f6/capability/101f99f6.xml - -./101f9698.xml /epoc32/release/winscw/udeb/z/private/101f99f6/capability/101f9698.xml -./fwdcomp.xml /epoc32/release/winscw/udeb/z/private/101f99f6/capability/fwdcomp.xml -./101f99f6.xml /epoc32/release/winscw/udeb/z/private/101f99f6/capability/101f99f6.xml +../rom/sconcsc.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconcsc.iby) +./101f9698.xml Z:/private/101F99F6/capability/101f9698.xml +./fwdcomp.xml Z:/private/101F99F6/capability/fwdcomp.xml +./101f99f6.xml Z:/private/101F99F6/capability/101f99f6.xml PRJ_MMPFILES - sconcsc.mmp - diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/rom/sconcsc.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/csc/rom/sconcsc.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2005-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: Image description file for project SConCSC +* +*/ + + +#ifndef __SCONCSC_IBY__ +#define __SCONCSC_IBY__ +//file content + +file=ABI_DIR\BUILD_DIR\sconcsc.dll SHARED_LIB_DIR\sconcsc.dll +data=ZPRIVATE\101F99F6\capability\101F9698.xml PRIVATE\101F99F6\capability\101F9698.xml +data=ZPRIVATE\101F99F6\capability\fwdcomp.xml PRIVATE\101F99F6\capability\fwdcomp.xml +data=ZPRIVATE\101F99F6\capability\101F99F6.xml PRIVATE\101F99F6\capability\101F99F6.xml +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/src/caplist.cpp --- a/connectivitymodules/SeCon/services/csc/src/caplist.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/csc/src/caplist.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -34,12 +34,10 @@ // CCapList* CCapList::NewL() { - TRACE_FUNC_ENTRY; CCapList* self = new(ELeave) CCapList(); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); - TRACE_FUNC_EXIT; return self; } @@ -50,9 +48,7 @@ // CCapList::~CCapList() { - TRACE_FUNC_ENTRY; delete iList; - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -71,9 +67,7 @@ // void CCapList::ConstructL() { - TRACE_FUNC_ENTRY; iList = CStringList::NewL(); - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -94,7 +88,6 @@ // TInt CCapList::FindFromMark(TInt aId, TInt aType) { - TRACE_FUNC_ENTRY; TInt mark = List()->Mark(); TInt count= List()->Count(); @@ -106,7 +99,6 @@ TInt index=Find(aId, aType, mark); if ( index == KErrNotFound ) { - LOGGER_WRITE_1( "CCapList::FindFromMark(TInt aId, TInt aType) returned : %d", KErrNotFound ); return KErrNotFound; } @@ -114,7 +106,6 @@ __ASSERT_DEBUG(index>=mark, CapUtil::Panic(KErrGeneral)); List()->SetMark(index+1); - LOGGER_WRITE_1( "CCapList::FindFromMark(TInt aId, TInt aType) returned : %d", index ); return index; } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/src/caputils.cpp --- a/connectivitymodules/SeCon/services/csc/src/caputils.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/csc/src/caputils.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -198,12 +198,23 @@ mobilePhone.GetCurrentNetwork( status, mobilePhoneNetworkInfoPckg, mobilePhoneLocationArea ); User::WaitForRequest( status ); - User::LeaveIfError( status.Int() ); + User::LeaveIfError( status.Int() ); } CleanupStack::PopAndDestroy( &mobilePhone ); CleanupStack::PopAndDestroy( &server ); - StrCopy( aLongName, mobilePhoneNetworkInfo.iLongName ); + if ( mobilePhoneNetworkInfo.iLongName.Length() > 0 ) + { + StrCopy( aLongName, mobilePhoneNetworkInfo.iLongName ); + } + else if ( mobilePhoneNetworkInfo.iShortName.Length() > 0 ) + { + StrCopy( aLongName, mobilePhoneNetworkInfo.iShortName ); + } + else + { + StrCopy( aLongName, mobilePhoneNetworkInfo.iDisplayTag ); + } StrCopy( aCountryCode, mobilePhoneNetworkInfo.iCountryCode ); StrCopy( aNetworkID, mobilePhoneNetworkInfo.iNetworkId ); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/csc/src/stringlist.cpp --- a/connectivitymodules/SeCon/services/csc/src/stringlist.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/csc/src/stringlist.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -33,10 +33,8 @@ // CStringList* CStringList::NewL() { - TRACE_FUNC_ENTRY; CStringList* self = CStringList::NewLC(); CleanupStack::Pop( self ); - TRACE_FUNC_EXIT; return self; } @@ -47,11 +45,9 @@ // CStringList* CStringList::NewLC() { - TRACE_FUNC_ENTRY; CStringList* self = new ( ELeave ) CStringList(); CleanupStack::PushL( self ); self->ConstructL(); - TRACE_FUNC_EXIT; return self; } @@ -62,7 +58,6 @@ // CStringList::CStringList() { - TRACE_FUNC; } // ----------------------------------------------------------------------------- @@ -72,10 +67,8 @@ // CStringList::~CStringList() { - TRACE_FUNC_ENTRY; delete iLines; iLines = NULL; - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -85,11 +78,9 @@ // void CStringList::ConstructL() { - TRACE_FUNC_ENTRY; const TInt KDefaultArrayGranularity = 10; iLines = new (ELeave) CDesCArrayFlat(KDefaultArrayGranularity); SetMark(0); - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/bld/bld.inf --- a/connectivitymodules/SeCon/services/ftp/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/ftp/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 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" @@ -21,7 +21,9 @@ DEFAULT PRJ_EXPORTS -../loc/sconftp.loc MW_LAYER_LOC_EXPORT_PATH(sconftp.loc) +../rom/sconftp.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconftp.iby) +../rom/sconftpresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(sconftpresources.iby) +../loc/sconftp.loc APP_LAYER_LOC_EXPORT_PATH(sconftp.loc) PRJ_MMPFILES ../bld/sconftp.mmp diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/inc/sconconsts.h --- a/connectivitymodules/SeCon/services/ftp/inc/sconconsts.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/ftp/inc/sconconsts.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -19,7 +19,11 @@ #ifndef _SCONCONSTS_H_ #define _SCONCONSTS_H_ +// Define this to show C-drive logs folder to user +#define SCON_SHOW_LOGS_FOLDER + _LIT( K_C_ROOT, "C:\\" ); +_LIT( KSConLogsPath, "logs\\" ); // logs folder // Following folders on MMC are exluded from folder listing _LIT( KSConResource, "resource\\" ); // resource folder on MMC diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/inc/sconftp.h --- a/connectivitymodules/SeCon/services/ftp/inc/sconftp.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/ftp/inc/sconftp.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -234,6 +234,8 @@ */ void UpdateDriveTypeInfoL(); + void CreateObexBufObjectL( CObexBufObject*& aObject, CBufFlat*& aBuffer ); + CSConFTP(); virtual void ConstructL(); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/rom/sconftp.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/ftp/rom/sconftp.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* 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: Image description file for CSConFTP +* +*/ + + +#ifndef __SCONFTP_IBY__ +#define __SCONFTP_IBY__ +//file content + +file=ABI_DIR\BUILD_DIR\sconftp.dll SHARED_LIB_DIR\sconftp.dll + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/rom/sconftpresources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/ftp/rom/sconftpresources.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +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 "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: Image description file for SConFTP resources. +* +*/ + +#ifndef __SCONFTP_RESOURCE_IBY__ +#define __SCONFTP_RESOURCE_IBY__ + +data=DATAZ_\RESOURCE_FILES_DIR\sconftp.rsc RESOURCE_FILES_DIR\sconftp.rsc + +#endif \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/src/sconfshandler.cpp --- a/connectivitymodules/SeCon/services/ftp/src/sconfshandler.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/ftp/src/sconfshandler.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1454,6 +1454,13 @@ // C:\\Data is visible, not exluded exluded = EFalse; } +#ifdef SCON_SHOW_LOGS_FOLDER + else if ( aFullPath.FindF( KSConLogsPath ) == KDriveLength ) + { + // C:\\Logs is visible, not exluded + exluded = EFalse; + } +#endif else { // other paths on C-drive are exluded LOGGER_WRITE_1("CSConFsHandler::IsExludedPath() Path '%S' is not visible to user", &aFullPath); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/ftp/src/sconftp.cpp --- a/connectivitymodules/SeCon/services/ftp/src/sconftp.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/ftp/src/sconftp.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -378,21 +378,7 @@ if( ret == KErrNone ) { - delete aObject; - aObject = CObexBufObject::NewL( NULL ); - - if( aBuffer ) - { - aBuffer->Reset(); - delete aBuffer; - } - - aBuffer = CBufFlat::NewL( KSConBufferSize ); - aBuffer->ResizeL( KSConBufferSize ); - - TObexFilenameBackedBuffer bufferdetails( *aBuffer, iTempFileName, - CObexBufObject::EDoubleBuffering ); - aObject->SetDataBufL( bufferdetails ); + CreateObexBufObjectL( aObject, aBuffer ); } } else @@ -432,21 +418,7 @@ if( ret == KErrNone ) { - delete aObject; - aObject = CObexBufObject::NewL( NULL ); - - if( aBuffer ) - { - aBuffer->Reset(); - delete aBuffer; - } - - aBuffer = CBufFlat::NewL( KSConBufferSize ); - aBuffer->ResizeL( KSConBufferSize ); - - TObexFilenameBackedBuffer bufferdetails( *aBuffer, iTempFileName, - CObexBufObject::EDoubleBuffering ); - aObject->SetDataBufL( bufferdetails ); + CreateObexBufObjectL( aObject, aBuffer ); if( lowMemory ) { @@ -460,6 +432,31 @@ return ret; } +void CSConFTP::CreateObexBufObjectL( CObexBufObject*& aObject, CBufFlat*& aBuffer ) + { + delete aObject; + aObject = NULL; + aObject = CObexBufObject::NewL( NULL ); + + delete aBuffer; + aBuffer = NULL; + + aBuffer = CBufFlat::NewL( KSConBufferSize ); + aBuffer->ResizeL( KSConBufferSize ); + + TObexFilenameBackedBuffer bufferdetails( *aBuffer, iTempFileName, + CObexBufObject::EDoubleBuffering ); + TRAPD( err, aObject->SetDataBufL( bufferdetails )); + if ( err == KErrNoMemory ) + { + LOGGER_WRITE( "KErrNoMemory, Using singe buffer strategy"); + // If fails, use singe buffer strategy to save RAM + TObexFilenameBackedBuffer lowMemBufferdetails( *aBuffer, iTempFileName, + CObexBufObject::ESingleBuffering ); + aObject->SetDataBufL( lowMemBufferdetails ); + } + } + // ----------------------------------------------------------------------------- // CSConFTP::PutFileObjectFinalizeL( CObexBufObject*& aObject ) // Stores the relayed file object to inbox or file system. diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/bwins/sconoviaccounthandleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/bwins/sconoviaccounthandleru.def Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + ?CreateCSconOviAccountHandlerL@@YAPAVCSconOviAccountHandler@@XZ @ 1 NONAME ; class CSconOviAccountHandler * CreateCSconOviAccountHandlerL(void) + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/eabi/sconoviaccounthandleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/eabi/sconoviaccounthandleru.def Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ +EXPORTS + _Z29CreateCSconOviAccountHandlerLv @ 1 NONAME + _ZTI22CSconOviAccountHandler @ 2 NONAME ; ## + _ZTV22CSconOviAccountHandler @ 3 NONAME ; ## + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2009-2010 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: SconOviAccountHandler bld.inf file +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +../rom/sconoviaccounthandler.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconoviaccounthandler.iby) + +PRJ_MMPFILES +sconoviaccounthandler.mmp diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/group/sconoviaccounthandler.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/group/sconoviaccounthandler.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2009-2010 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: sconoviaccounthandler mmp file +* +*/ + + +#include +#include +#include + +VENDORID VID_DEFAULT + +CAPABILITY CAP_GENERAL_DLL + +TARGETPATH sys/bin + +TARGET sconoviaccounthandler.dll +TARGETTYPE DLL +DEFFILE sconoviaccounthandler.def +UID 0x10009D8D 0x2001A97A + +SOURCEPATH ../src +SOURCE sconoviaccounthandler.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../../inc + +// System include paths +APP_LAYER_SYSTEMINCLUDE +NON_FOUNDATION_MW_LAYER_SYSTEMINCLUDE + +DEBUGLIBRARY flogger.lib +LIBRARY euser.lib +LIBRARY wsaccountmanager.lib +LIBRARY estor.lib // For RWriteStream diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/inc/sconoviaccounthandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/inc/sconoviaccounthandler.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,58 @@ +/* +* 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: CSconOviAccountHandler header file +* +*/ + + +#ifndef _SCONOVIACCOUNTHANDLER_H_ +#define _SCONOVIACCOUNTHANDLER_H_ + +#include +#include + +_LIT(KSconOviAccountHandlerDllName, "sconoviaccounthandler.dll"); +const TUid KSconOviAccountHandlerDllUid={0x10009D8D}; + +class CWSOviAccountManager; + +/** + * CSconOviAccountHandler provides Ovi account information. + * Dynamically loadable dll. + */ +class CSconOviAccountHandler : public CBase +{ + public: + static CSconOviAccountHandler* NewL(); + ~CSconOviAccountHandler(); + + /** + * Reads account information from device + * @param aAccountInfoStream stream where to export account details. + * @leave KErrNotFound if account information does not exist. + */ + virtual void GetOviAccountDetailsL( RWriteStream& aAccountInfoStream ); + + private: + void ConstructL(); + + private: // Data + CWSOviAccountManager* iOviAccountManager; + +}; + +IMPORT_C CSconOviAccountHandler* CreateCSconOviAccountHandlerL(); +typedef CSconOviAccountHandler* (*TSConCreateCSconOviAccountHandlerFunc) (); + +#endif // _SCONOVIACCOUNTHANDLER_H_ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/rom/sconoviaccounthandler.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/rom/sconoviaccounthandler.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,24 @@ +/* +* Copyright (c) 2009-2010 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: Image description file for SConOviAccountHandler. +* +*/ + + +#ifndef _SCONOVIACCOUNTHANDLER_IBY_ +#define _SCONOVIACCOUNTHANDLER_IBY_ + +file=ABI_DIR\BUILD_DIR\sconoviaccounthandler.dll SHARED_LIB_DIR\sconoviaccounthandler.dll + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/oviaccounthandler/src/sconoviaccounthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/oviaccounthandler/src/sconoviaccounthandler.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,152 @@ +/* +* 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: CSconOviAccountHandler implementation +* +*/ + + +#include "sconoviaccounthandler.h" +#include +#include "debug.h" + +// Constants +_LIT8( KUserId, "#UserID: " ); +_LIT8( KFirstName, "\n#FirstName: " ); +_LIT8( KLastName, "\n#LastName: " ); +_LIT8( KEmail, "\n#Email: " ); +_LIT8( KEmailVerified, "\n#EmailVerified: " ); +_LIT8( KMobile, "\n#Mobile: " ); +_LIT8( KMobileVerified, "\n#MobileVerified: " ); + + + +// ----------------------------------------------------------------------------- +// CreateCSconOviAccountHandlerL() +// Entry to CSconOviAccountHandler +// ----------------------------------------------------------------------------- +// +EXPORT_C CSconOviAccountHandler* CreateCSconOviAccountHandlerL() + { + TRACE_FUNC; + return CSconOviAccountHandler::NewL(); + } + +CSconOviAccountHandler* CSconOviAccountHandler::NewL() + { + TRACE_FUNC; + CSconOviAccountHandler* self = new (ELeave) CSconOviAccountHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CSconOviAccountHandler::~CSconOviAccountHandler() + { + TRACE_FUNC; + delete iOviAccountManager; + } + +void CSconOviAccountHandler::ConstructL() + { + TRACE_FUNC_ENTRY; + iOviAccountManager = CWSOviAccountManager::NewL(); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// GetOviAccountDetailsL() +// Reads account info and prints details to aAccountInfoStream +// ----------------------------------------------------------------------------- +// +void CSconOviAccountHandler::GetOviAccountDetailsL( RWriteStream& aAccountInfoStream ) + { + TRACE_FUNC_ENTRY; + + // not owned + CWSAccount* account = iOviAccountManager->Account(); + if ( !account ) + { + // Account information not found. + LOGGER_WRITE("Account information not found, leaving KErrNotFound"); + User::Leave( KErrNotFound ); + } + + // Write userId + const TDesC8& userId = account->UserId(); + aAccountInfoStream.WriteL( KUserId ); + aAccountInfoStream.WriteL( userId ); + + // Write first name + HBufC8* temp = account->AccountItemL( KWSAccAttrAccountFirstName ); + if ( temp ) + { + aAccountInfoStream.WriteL( KFirstName ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + // Write last name + temp = account->AccountItemL( KWSAccAttrAccountLastName ); + if ( temp ) + { + aAccountInfoStream.WriteL( KLastName ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + // Write email + temp = account->AccountItemL( KWSAccAttrAccountEmail ); + if ( temp ) + { + aAccountInfoStream.WriteL( KEmail ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + // Write email verified (true/false) + temp = account->AccountItemL( KWSAccAttrAccountEmailVerified ); + if ( temp ) + { + aAccountInfoStream.WriteL( KEmailVerified ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + // Write mobile number + temp = account->AccountItemL( KWSAccAttrAccountMobile ); + if ( temp ) + { + aAccountInfoStream.WriteL( KMobile ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + // Write mobile verified + temp = account->AccountItemL( KWSAccAttrAccountMobileVerified ); + if ( temp ) + { + aAccountInfoStream.WriteL( KMobileVerified ); + aAccountInfoStream.WriteL( temp->Des() ); + delete temp; + temp = NULL; + } + + TRACE_FUNC_EXIT; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/bld/bld.inf --- a/connectivitymodules/SeCon/services/pcd/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -23,7 +23,8 @@ DEFAULT PRJ_EXPORTS -./sbeconfig.xml /epoc32/data/z/private/10202d56/sbeconfig.xml +../rom/sconpcd.iby CORE_APP_LAYER_IBY_EXPORT_PATH(sconpcd.iby) +./sbeconfig.xml Z:/private/10202d56/sbeconfig.xml PRJ_MMPFILES sconpcd.mmp diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/bld/sconpcd.mmp --- a/connectivitymodules/SeCon/services/pcd/bld/sconpcd.mmp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/bld/sconpcd.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -51,6 +51,7 @@ SOURCE sconpcdutility.cpp SOURCE sconmetadata.cpp SOURCE sconvideoparser.cpp +SOURCE sconsynchandler.cpp SOURCE cscontimeout.cpp SOURCEPATH ../../../common/conmltask/src @@ -59,6 +60,7 @@ USERINCLUDE ../inc USERINCLUDE ../../../inc USERINCLUDE ../../../common/conmltask/inc +USERINCLUDE ../../../clients/syncclient/inc // Default system include paths APP_LAYER_SYSTEMINCLUDE @@ -84,5 +86,12 @@ LIBRARY imageconversion.lib // for CImageEncoder LIBRARY mmfcontrollerframework.lib // for CMMFMetaDataEntry LIBRARY bafl.lib // for BaflUtils + +LIBRARY ecom.lib +LIBRARY estor.lib // CDictionaryFileStore +LIBRARY sconsyncclient.lib +LIBRARY smlstoreformat.lib +LIBRARY centralrepository.lib +LIBRARY sif.lib DEBUGLIBRARY flogger.lib // End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconbackuprestore.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconbackuprestore.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconbackuprestore.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -37,13 +37,12 @@ /** * Two-phase constructor * @param aQueue The address of CSConBackupRestoreQueue - * @param aMaxObjectSize Max object size * @param aFs aReference to RFs connection. * @return CSConBackupRestore instance */ static CSConBackupRestore* NewL( CSConBackupRestoreQueue* aQueue, - const TInt aMaxObjectSize, RFs& aFs ); + RFs& aFs ); /** * Destructor * @return none @@ -84,10 +83,9 @@ CSConBackupRestore( CSConBackupRestoreQueue* aQueue, RFs& aFs ); /** * Initializes member data - * @param aMaxObjectSize Max object size * @return none */ - void ConstructL( const TInt aMaxObjectSize ); + void ConstructL(); /** * Implementation of CActive::DoCancel() * @return none @@ -103,7 +101,6 @@ CSConBackupRestoreQueue* iQueue; CSConSBEClient* iSBEClient; TInt iCurrentTask; - TInt iMaxObjectSize; TBool iBackupRestoreActive; RFs& iFs; }; diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconbrqueue.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconbrqueue.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconbrqueue.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-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" @@ -31,11 +31,10 @@ public: /** * Two-phase constructor - * @param aMaxObjectSize Max object size * @param aFs aReference to RFs connection. * @return CSConBackupRestoreQueue instance */ - static CSConBackupRestoreQueue* NewL( const TInt aMaxObjectSize, RFs& aFs ); + static CSConBackupRestoreQueue* NewL( RFs& aFs ); /** * Destructor * @return CSConBackupRestoreQueue instance @@ -82,11 +81,10 @@ CSConBackupRestoreQueue(); /** * Initializes member data - * @param aMaxObjectSize Max object size * @param aFs aReference to RFs connection. * @return none */ - void ConstructL( const TInt aMaxObjectSize, RFs& aFs ); + void ConstructL( RFs& aFs ); /** * Polls queue * @return none diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconinstaller.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconinstaller.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconinstaller.h Tue Jul 06 14:06:02 2010 +0300 @@ -23,7 +23,7 @@ #include #include -#include +#include #include "sconinstqueue.h" @@ -35,12 +35,12 @@ NONSHARABLE_CLASS ( CSConAppInstaller ): public CActive { public: - /** - * Constructor - * @param aQueue The address of CSConInstallerQueu - * @return none - */ - CSConAppInstaller( CSConInstallerQueue* aQueue, RFs& aFs ); + /** + * Constructor + * @param aQueue The address of CSConInstallerQueu + * @return none + */ + static CSConAppInstaller* NewL( CSConInstallerQueue* aQueue, RFs& aFs ); /** * Destructor @@ -68,6 +68,14 @@ private: /** + * Constructor + * @param aQueue The address of CSConInstallerQueu + * @return none + */ + CSConAppInstaller( CSConInstallerQueue* aQueue, RFs& aFs ); + + void ConstructL(); + /** * Implementation of CActive::DoCancel() * @return none */ @@ -77,21 +85,33 @@ * @return none */ void RunL(); + + void WriteTaskDataL( CSConTask& aTask ); + + void ExternalizeResultArrayIntValL( const TDesC& aName, RWriteStream& aStream ); + void ExternalizeResultIntValL( const TDesC& aName, RWriteStream& aStream ); + void ExternalizeResultStringValL( const TDesC& aName, RWriteStream& aStream ); /** * Executes ListInstalledApps task * @return none */ void ProcessListInstalledAppsL(); /** - * Execures UnInstall task + * Executes Install task + * @param CSConInstall install params + * @return none + */ + void ProcessInstallL( const CSConInstall& aInstallParams ); + /** + * Executes UnInstall task * @param CSConUninstall uninstall params * @return none */ void ProcessUninstallL( const CSConUninstall& aUninstallParams ); - void UninstallSisL( const CSConUninstall& aUninstallParams ); - void UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ); - void UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ); + //void UninstallSisL( const CSConUninstall& aUninstallParams ); + //void UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ); + //void UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ); void DeleteFile( const TDesC& aPath ); private: @@ -106,11 +126,14 @@ ESilentCustomUnistalling, EListingInstalledApps }; - TInstallerState iInstallerState; + //TInstallerState iInstallerState; CSConInstallerQueue* iQueue; // Not owned - SwiUI::RSWInstLauncher iSWInst; - SwiUI::TInstallOptions iOptions; - SwiUI::TInstallOptionsPckg iOptionsPckg; + //SwiUI::RSWInstLauncher iSWInst; + //SwiUI::TInstallOptions iOptions; + //SwiUI::TInstallOptionsPckg iOptionsPckg; + Usif::RSoftwareInstall iSwInstaller; + Usif::COpaqueNamedParams* iSifOptions; + Usif::COpaqueNamedParams* iSifResults; TInt iCurrentTask; RFs& iFs; }; diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconinstqueue.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconinstqueue.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconinstqueue.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-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" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconpcd.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconpcd.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconpcd.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -23,11 +23,13 @@ #include #include +#include #include "sconconmltask.h" class CSConInstallerQueue; class CSConBackupRestoreQueue; +class CSconSyncHandler; enum TSConLastConMLOperation { @@ -68,6 +70,9 @@ * @return none */ virtual void ResetPCD(); + + virtual void HandleGetSyncRequestL( const TDesC8& aRequest, RWriteStream& aResult, TInt aMaxObjectSize ); + virtual void HandlePutSyncRequestL( const TDesC8& aRequest, RReadStream& aResult ); private: /** @@ -120,12 +125,6 @@ * @return none */ TInt UpdateDeviceInfoL( TInt aMaxObjectSize ); - /** - * Gets the current max object size - * @param aClientObjectSize The object size of the client - * @return the max object size - */ - TInt GetMaxObjectSize( TInt aClientObjectSize ) const; /** * Stores a reply @@ -150,9 +149,9 @@ CSConBackupRestoreQueue* iBackupRestoreQueue; CSConStatusReply* iLatestReply; TInt iTaskNumber; - TInt iMaxObjectSize; TSConLastConMLOperation iLastOperation; RFs iFs; + CSconSyncHandler* iSyncHandler; }; IMPORT_C CSConPCD* CreateCSConPCDL(); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h Tue Jul 06 14:06:02 2010 +0300 @@ -58,6 +58,22 @@ const TInt KSConCodeInstErrAccessDenied = 608; // Target location of package is not accessible const TInt KSConCodeInstUpgradeError = 609; // The package is an invalid upgrade +const TInt KSConCodeInstErrSifMissingBasePackage = 610; +const TInt KSConCodeInstErrSifOverflow = 611; +const TInt KSConCodeInstErrSifSameVersionAlreadyInstalled = 612; +const TInt KSConCodeInstErrSifNewerVersionAlreadyInstalled = 613; +const TInt KSConCodeInstErrSifAlreadyActivated = 614; +const TInt KSConCodeInstErrSifAlreadyDeactivated = 615; +const TInt KSConCodeInstErrSifBadComponentId = 616; +const TInt KSConCodeInstErrSifBadInstallerConfiguration = 617; +const TInt KSConCodeInstErrSifPackageCannotBeInstalledOnThisDevice = 618; +const TInt KSConCodeInstErrSifUnsupportedLanguage = 619; +const TInt KSConCodeInstErrScrWriteOperationInProgress = 620; +const TInt KSConCodeInstErrScrReadOperationInProgress = 621; +const TInt KSConCodeInstErrScrNoActiveTransaction = 622; +const TInt KSConCodeInstErrScrUnsupportedLocale = 623; + + // ConML Status code: 1001...1050 System wide error code const TInt KSConCodeFirstSymbianErr( 1000 ); @@ -83,11 +99,11 @@ }; // Supported ConML version -_LIT8( KCONMLVERSION, "2.0" ); +_LIT8( KConMLVersion, "2.0" ); // SIS mime type for installer -_LIT8( KSISMIMEType, "x-epoc/x-sisx-app" ); +_LIT8( KSisMimeType, "x-epoc/x-sisx-app" ); // Java mime type for installer -_LIT8( KMidletMIMEType, "application/java-archive" ); +_LIT8( KMidletMimeType, "application/java-archive" ); #endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconqueue.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconqueue.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconqueue.h Tue Jul 06 14:06:02 2010 +0300 @@ -64,14 +64,14 @@ * @param aError The task error code * @return none */ - virtual void CompleteTask( TInt aTask, TInt aError ); + virtual TInt CompleteTask( TInt aTask, TInt aError ); /** * Set the task progress value * @param aTask The task number * @param aProgressValue The progress value * @return none */ - virtual void SetTaskProgress( TInt aTask, TInt aProgressValue ); + virtual TInt SetTaskProgress( TInt aTask, TInt aProgressValue ); /** * Receives a specified task * @param aTaskId The task number @@ -82,9 +82,9 @@ /** * Removes a task from the queue * @param aTask The task number - * @return none + * @return KErrNone if no errors, else system wide error codes */ - virtual void RemoveTask( TInt aTask ); + virtual TInt RemoveTask( TInt aTask ); /** * Cancels a task * @param aTask The task number diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconsbeclient.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconsbeclient.h Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconsbeclient.h Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -33,11 +33,10 @@ public: /** * Two-phase constructor - * @param aMaxObjectSize Max object size * @param aFs aReference to RFs connection. * @return CSConSBEClient instance */ - static CSConSBEClient* NewL( const TInt aMaxObjectSize, RFs& aFs ); + static CSConSBEClient* NewL( RFs& aFs ); /** * Destructor * @return none @@ -96,11 +95,10 @@ private: /** * Constructor - * @paran aMaxObjectSize Max object size * @param aFs aReference to RFs connection. * @return none */ - CSConSBEClient( const TInt aMaxObjectSize, RFs& aFs ); + CSConSBEClient( RFs& aFs ); /** * Implementation of CActive::DoCancel() @@ -138,7 +136,12 @@ * @return KErrNone if no erros. Else system wide error codes. */ TInt ProcessRequestDataL(); - /** + /** + * Request data to iDataBuffer + * @return none + */ + void RequestDataL( CSBGenericTransferType& aGenericTransferType ); + /** * Executes GetDataOwnerStatus task * @return none */ @@ -153,7 +156,7 @@ * @param aDrive Drive number as TInt * @return drive number as TDriveNumber */ - TDriveNumber GetDriveNumber( const TInt& aDrive ) const; + TDriveNumber GetDriveNumber( TInt aDrive ) const; /** * Filters the drive list * @param aDriveList Drive list to be filtered @@ -209,25 +212,20 @@ * @param TDriveList drives to include * @return dataowner data size in specified drives */ - TUint JavaDataSizeL( const TDesC& aJavaHash, const TDriveList& aDriveList ) const; - - private: - CSBEClient* iSBEClient; - TRequestStatus* iCallerStatus; - TBool iProcessComplete; - TInt iProcessIndex; - TInt iMaxObjectSize; - - CSConTask* iCurrentTask; - TInt iDataPos; - TBool iDataLeft; - TPtrC8 iDataPtr; - TBool iLastChunk; - TBool iBURModeNormal; - TBool iRestoreMode; - RFs& iFs; - TBool iAllSnapshotsSuppliedCalled; - }; + TUint JavaDataSizeL( const TDesC& aJavaHash, const TDriveList& aDriveList ) const; + + private: + CSBEClient* iSBEClient; + TRequestStatus* iCallerStatus; + CSConTask* iCurrentTask; + TBool iBURModeNormal; + TBool iRestoreMode; + RFs& iFs; + TBool iAllSnapshotsSuppliedCalled; + TBool iLastChunk; + CBufFlat* iDataBuffer; + TInt iDataBufferSize; + }; #endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/inc/sconsynchandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconsynchandler.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,138 @@ +/* +* 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: CSconSyncHandler header +* +*/ + + +#ifndef SCONSYNCHANDLER_H_ +#define SCONSYNCHANDLER_H_ + +#include +#include +#include "sconsyncclient.h" + +class RFs; +class RWriteStream; +class RReadStream; +class RFileReadStream; + +NONSHARABLE_CLASS( TCreatedItem ) + { +public: + TInt iTemporaryId; + TInt iErrorCode; + TSmlDbItemUid iNewUid; + }; + +NONSHARABLE_CLASS( TReplacedItem ) + { +public: + TSmlDbItemUid iItemUid; + TInt iErrorCode; + }; + +NONSHARABLE_CLASS( CSconSyncHandler ) : public CActive +{ +public: + static CSconSyncHandler* NewL( RFs& aFs ); + ~CSconSyncHandler(); + + void HandleGetSyncRequestL( const TDesC8& aRequest, RWriteStream& aResult, TInt aMaxObjectSize ); + void HandlePutSyncRequestL( const TDesC8& aRequest, RReadStream& aData ); +private: + CSconSyncHandler( RFs& aFs ); + void ConstructL(); + + void ListStoresL( RWriteStream& aResult ); + void OpenStoreL( const TDesC8& aParams, RWriteStream& aResult ); + void CloseStoreL( RWriteStream& aResult ); + + void ListChangesL( RWriteStream& aResult ); + void ResetChangeInfoL( RWriteStream& aResult ); + void CommitChangesL( const TDesC8& aParams, RWriteStream& aResult ); + void ReadItemsL( const TDesC8& aParams, RWriteStream& aResult ); + void GetParentsL( const TDesC8& aParams, RWriteStream& aResult ); + void CreateItemsL( RReadStream& aData ); + void GetCreateItemsResponseL( const TDesC8& aParams, RWriteStream& aResult ); + void ReplaceItemsL( RReadStream& aData ); + void GetReplaceItemsResponseL( const TDesC8& aParams, RWriteStream& aResult ); + void MoveItemsL( const TDesC8& aParams, RWriteStream& aResult ); + void DeleteItemsL( const TDesC8& aParams, RWriteStream& aResult ); + void SoftDeleteItemsL( const TDesC8& aParams, RWriteStream& aResult ); + void DeleteAllItemsL( RWriteStream& aResult ); + void GetDeleteAllItemsStatusL( RWriteStream& aResult ); + void GetStoreFormatL( RWriteStream& aResult ); + void SetRemoteStoreFormatL( RReadStream& aData ); + + void CreateNextItemOnStreamL(); + void ReplaceNextItemOnStreamL(); + + void ReadNextDataBlockL( RWriteStream& aResult ); + void ReadItemL( TSmlDbItemUid aUid, CBufFlat& aItemData ); + + void LoadRemoteStoreFormatL( TInt aContextId, TInt aProviderId ); + void SaveRemoteStoreFormatL( CSmlDataStoreFormat& aStoreFormat, TInt aContextId, TInt aProviderId ); + + void CancelOperationsL( RWriteStream& aResult ); + + void Reset(); + + void SetCalendarCenrepL( TInt aProfileId, const TDesC& aServerId ); + void ClearCalendarCenrepL(); + +private: // from CActive + void DoCancel(); + void RunL(); + TInt RunError( TInt aError ); + +private: + RFs& iFs; // Not owned + RSconSyncSession iSyncSession; + TBool iConnected; + + TInt iCurrentDataProviderUid; + TInt iCurrentContextUid; + + CBufFlat* iResponseData; + + enum TSyncStatus + { + EReady, + ECreatingItemsFromFile, + EItemsCreated, + EReplacingItemsFromFile, + EItemsReplaced, + EDeletingAllItems + }; + TSyncStatus iSyncStatus; + + TInt iMaxObjectSize; + TInt iBytesWrited; + TBool iHasFileStream; + RFileReadStream iFileStream; + TSmlDbItemUid iCreatedItemUid; + TPckg iCreatedItemUidPckg; + TSmlDbItemUid iTemporaryItemUid; + TInt iItemsLeftInStream; + TInt iItemInProgress; // =1 if item is in progress + RArray iCreatedItems; + RArray iReplacedItems; + RArray iItemsToRead; + TReplacedItem iReplacedItem; + TFileName iFileInProgress; + TBool iCalendarCenrepUsed; +}; + +#endif /*SCONSYNCHANDLER_H_*/ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/rom/sconpcd.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/rom/sconpcd.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* 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: Image description file for SConPCD. +* +*/ +#ifndef __SCONPCD_IBY__ +#define __SCONPCD_IBY__ +//file content + +file=ABI_DIR\BUILD_DIR\sconpcd.dll system\libs\sconpcd.dll + +data=ZPRIVATE\10202D56\sbeconfig.xml PRIVATE\10202D56\sbeconfig.xml + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconbackuprestore.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconbackuprestore.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconbackuprestore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -36,14 +36,12 @@ // ----------------------------------------------------------------------------- // CSConBackupRestore* CSConBackupRestore::NewL( CSConBackupRestoreQueue* aQueue, - const TInt aMaxObjectSize, RFs& aFs ) + RFs& aFs ) { - TRACE_FUNC_ENTRY; CSConBackupRestore* self = new (ELeave) CSConBackupRestore( aQueue, aFs ); CleanupStack::PushL( self ); - self->ConstructL( aMaxObjectSize ); + self->ConstructL(); CleanupStack::Pop( self ); - TRACE_FUNC_EXIT; return self; } @@ -55,6 +53,7 @@ CSConBackupRestore::CSConBackupRestore( CSConBackupRestoreQueue* aQueue, RFs& aFs ) : CActive( EPriorityStandard ), iQueue( aQueue ), iFs( aFs ) { + CActiveScheduler::Add( this ); } // ----------------------------------------------------------------------------- @@ -62,11 +61,9 @@ // Initializes member data // ----------------------------------------------------------------------------- // -void CSConBackupRestore::ConstructL( const TInt aMaxObjectSize ) +void CSConBackupRestore::ConstructL() { - iMaxObjectSize = aMaxObjectSize; - iSBEClient = CSConSBEClient::NewL( aMaxObjectSize, iFs ); - CActiveScheduler::Add( iSBEClient ); + iSBEClient = CSConSBEClient::NewL( iFs ); } // ----------------------------------------------------------------------------- @@ -76,18 +73,12 @@ // CSConBackupRestore::~CSConBackupRestore() { - TRACE_FUNC_ENTRY; if( iSBEClient ) { - if( iSBEClient->IsActive() ) - { - iSBEClient->Cancel(); - } - + iSBEClient->Cancel(); delete iSBEClient; iSBEClient = NULL; } - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -166,21 +157,12 @@ TRACE_FUNC_ENTRY; if( iSBEClient ) { - if( iSBEClient->IsActive() ) - { - iSBEClient->Cancel(); - } - + iSBEClient->Cancel(); delete iSBEClient; iSBEClient = NULL; } - TRAPD( err, iSBEClient = CSConSBEClient::NewL( iMaxObjectSize, iFs ) ); - - if( err == KErrNone ) - { - CActiveScheduler::Add( iSBEClient ); - } + TRAP_IGNORE( iSBEClient = CSConSBEClient::NewL( iFs ) ); iBackupRestoreActive = EFalse; TRACE_FUNC_EXIT; @@ -212,11 +194,9 @@ // void CSConBackupRestore::RunL() { - TRACE_FUNC_ENTRY; - + TRACE_FUNC; iQueue->CompleteTask( iCurrentTask, iStatus.Int() ); iBackupRestoreActive = EFalse; - TRACE_FUNC_EXIT; } // End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -24,15 +24,15 @@ #include "debug.h" // ----------------------------------------------------------------------------- -// CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize ) +// CSConBackupRestoreQueue::NewL( RFs& aFs ) // Two-phase constructor // ----------------------------------------------------------------------------- // -CSConBackupRestoreQueue* CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize, RFs& aFs ) +CSConBackupRestoreQueue* CSConBackupRestoreQueue::NewL( RFs& aFs ) { CSConBackupRestoreQueue* self = new (ELeave) CSConBackupRestoreQueue(); CleanupStack::PushL( self ); - self->ConstructL( aMaxObjectSize, aFs ); + self->ConstructL( aFs ); CleanupStack::Pop( self ); return self; } @@ -45,17 +45,17 @@ CSConBackupRestoreQueue::CSConBackupRestoreQueue() : CActive( EPriorityStandard ) { + CActiveScheduler::Add( this ); } // ----------------------------------------------------------------------------- -// CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize ) +// CSConBackupRestoreQueue::ConstructL( RFs& aFs ) // Initializes member data // ----------------------------------------------------------------------------- // -void CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize, RFs& aFs ) +void CSConBackupRestoreQueue::ConstructL( RFs& aFs ) { - iBackupRestore = CSConBackupRestore::NewL( this, aMaxObjectSize, aFs ); - CActiveScheduler::Add( iBackupRestore ); + iBackupRestore = CSConBackupRestore::NewL( this, aFs ); User::LeaveIfError( iTimer.CreateLocal() ); } @@ -192,7 +192,7 @@ { TRACE_FUNC_ENTRY; CSConTask* task = NULL; - CSConTaskQueue::GetTask( aTaskId, task ); + User::LeaveIfError( CSConTaskQueue::GetTask( aTaskId, task ) ); LOGGER_WRITE_1( "CSConBackupRestoreQueue::GetTaskMethodL( TInt aTaskId ) : returned %d", task->GetServiceId() ); return task->GetServiceId(); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconinstaller.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconinstaller.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconinstaller.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -17,30 +17,36 @@ // INCLUDE FILES +#include // For RBufWriteStream +#include // for CnvUtfConverter +//#include +#include -#include -#include -#include -#include -#include -#include -#include - -using namespace Java; +using namespace Usif; #include "debug.h" #include "sconinstaller.h" #include "sconpcdconsts.h" #include "sconpcdutility.h" -_LIT8( KWidgetMimeType, "application/x-nokia-widget"); const TInt KSConSeConUidValue = 0x101f99f6; const TUid KSConSeConUid = {KSConSeConUidValue}; +_LIT8(KValSep, "="); +_LIT8(KComma, ","); +_LIT8(KLineEnd, "\r\n"); + // ============================= MEMBER FUNCTIONS =============================== - +CSConAppInstaller* CSConAppInstaller::NewL( CSConInstallerQueue* aQueue, RFs& aFs ) + { + CSConAppInstaller* self = new (ELeave) CSConAppInstaller( aQueue, aFs ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } // ----------------------------------------------------------------------------- // CSConAppInstaller::CSConAppInstaller( CSConInstallerQueue* aQueue ) // Constructor @@ -49,7 +55,13 @@ CSConAppInstaller::CSConAppInstaller( CSConInstallerQueue* aQueue, RFs& aFs ) : CActive( EPriorityStandard ), iQueue( aQueue ), iFs( aFs ) { - TRACE_FUNC; + CActiveScheduler::Add( this ); + } + +void CSConAppInstaller::ConstructL() + { + iSifOptions = COpaqueNamedParams::NewL(); + iSifResults = COpaqueNamedParams::NewL(); } // ----------------------------------------------------------------------------- @@ -60,7 +72,10 @@ CSConAppInstaller::~CSConAppInstaller() { TRACE_FUNC; - iSWInst.Close(); + Cancel(); + iSwInstaller.Close(); + delete iSifOptions; + delete iSifResults; } // ----------------------------------------------------------------------------- @@ -79,7 +94,7 @@ if( aTaskId > 0 && ret != KErrNotFound ) { - if ( iInstallerState != EIdle || IsActive() ) + if ( IsActive() ) { LOGGER_WRITE("WARNING! SConAppInstaller was not on idle state!"); iQueue->CompleteTask( aTaskId, KErrInUse ); @@ -95,32 +110,24 @@ { case EInstall : iQueue->ChangeQueueProcessStatus(); - err = iSWInst.Connect(); - + err = iSwInstaller.Connect(); if( err == KErrNone ) { - if ( task->iInstallParams->iMode == ESilentInstall ) - { - LOGGER_WRITE( "Begin silent installation.. " ); - iOptions.iUntrusted = SwiUI::EPolicyNotAllowed; - iOptions.iOCSP = SwiUI::EPolicyNotAllowed; - iOptionsPckg = iOptions; - iInstallerState = ESilentInstalling; - iSWInst.SilentInstall( iStatus, task->iInstallParams->iPath, iOptionsPckg ); - } - else - { - LOGGER_WRITE( "Begin to install.. " ); - iInstallerState = EInstalling; - iSWInst.Install( iStatus, task->iInstallParams->iPath ); - } + TRAP(err, ProcessInstallL( *task->iInstallParams )); + if( err != KErrNone ) + { + LOGGER_WRITE_1( "StartInstaller ProcessInstallL err: %d", err ); + iStatus = KRequestPending; + SetActive(); + status = &iStatus; + User::RequestComplete( status, err ); + } } break; case EUninstall : iQueue->ChangeQueueProcessStatus(); - err = iSWInst.Connect(); - + err = iSwInstaller.Connect(); if( err == KErrNone ) { LOGGER_WRITE( "Begin to uninstall.. " ); @@ -129,6 +136,8 @@ if( err != KErrNone ) { LOGGER_WRITE_1( "StartInstaller ProcessUninstallL err: %d", err ); + iStatus = KRequestPending; + SetActive(); status = &iStatus; User::RequestComplete( status, err ); } @@ -137,7 +146,8 @@ break; case EListInstalledApps : iQueue->ChangeQueueProcessStatus(); - iInstallerState = EListingInstalledApps; + iStatus = KRequestPending; + SetActive(); TRAP( err, ProcessListInstalledAppsL() ); status = &iStatus; User::RequestComplete( status, err ); @@ -145,8 +155,6 @@ default : break; } - - SetActive(); } TRACE_FUNC_EXIT; } @@ -163,7 +171,7 @@ if( iCurrentTask == aTaskId ) { Cancel(); - iSWInst.Close(); + iSwInstaller.Close(); } TRACE_FUNC_EXIT; } @@ -175,14 +183,7 @@ // TBool CSConAppInstaller::InstallerActive() const { - if ( iInstallerState == EIdle ) - { - return EFalse; - } - else - { - return ETrue; - } + return IsActive(); } // ----------------------------------------------------------------------------- @@ -194,38 +195,9 @@ { TRACE_FUNC_ENTRY; - switch (iInstallerState) - { - case EInstalling: - LOGGER_WRITE("Cancel normal install"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestInstall ); - break; - case ESilentInstalling: - LOGGER_WRITE("Cancel silent install"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentInstall ); - break; - case EUninstalling: - LOGGER_WRITE("Cancel normal uninstall"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestUninstall ); - break; - case ESilentUninstalling: - LOGGER_WRITE("Cancel silent uninstall"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentUninstall ); - break; - case ECustomUninstalling: - LOGGER_WRITE("Cancel custom uninstall"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestCustomUninstall ); - break; - case ESilentCustomUnistalling: - LOGGER_WRITE("Cancel silent custom uninstall"); - iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentCustomUninstall ); - break; - default: - LOGGER_WRITE("WARNING! Unknown state"); - break; - } - iInstallerState = EIdle; - + LOGGER_WRITE("Cancel iSwInstaller"); + iSwInstaller.CancelOperation(); + /* // find and complete current task CSConTask* task = NULL; TInt ret = iQueue->GetTask( iCurrentTask, task ); @@ -245,6 +217,7 @@ break; } } + */ TRACE_FUNC_EXIT; } @@ -256,19 +229,24 @@ void CSConAppInstaller::RunL() { TRACE_FUNC_ENTRY; - iInstallerState = EIdle; - iSWInst.Close(); + iSwInstaller.Close(); iQueue->ChangeQueueProcessStatus(); TInt err( iStatus.Int() ); LOGGER_WRITE_1( "CSConAppInstaller::RunL() iStatus.Int() : returned %d", err ); CSConTask* task = NULL; TInt taskErr = iQueue->GetTask( iCurrentTask, task ); - - LOGGER_WRITE_1( "CSConAppInstaller::RunL() GetTask %d", taskErr ); - if( taskErr == KErrNone ) { + if ( task->GetServiceId() == EInstall || task->GetServiceId() == EUninstall ) + { + TRAPD(dataErr, WriteTaskDataL( *task )); + if (dataErr) + { + LOGGER_WRITE_1("WriteTaskDataL err: %d", dataErr); + } + } + if( task->GetServiceId() == EInstall && err == KErrNone ) { LOGGER_WRITE( "CSConAppInstaller::RunL() : before DeleteFile" ); @@ -281,10 +259,190 @@ TRACE_FUNC_EXIT; } +// ----------------------------------------------------------------------------- +// CSConAppInstaller::WriteTaskDataL() +// Writes data to task +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::WriteTaskDataL( CSConTask& aTask ) + { + TRACE_FUNC_ENTRY; + CBufFlat* buffer = CBufFlat::NewL(200); + CleanupStack::PushL(buffer); + RBufWriteStream stream( *buffer ); + CleanupClosePushL( stream ); + + ExternalizeResultArrayIntValL( KSifOutParam_ComponentId , stream); + ExternalizeResultIntValL( KSifOutParam_ErrCategory , stream); + ExternalizeResultIntValL( KSifOutParam_ErrCode , stream); + ExternalizeResultIntValL( KSifOutParam_ExtendedErrCode , stream); + ExternalizeResultStringValL( KSifOutParam_ErrMessage , stream); + ExternalizeResultStringValL( KSifOutParam_ErrMessageDetails , stream); + + stream.CommitL(); + + buffer->Compress(); + + HBufC8* data = HBufC8::NewL( buffer->Size() ); + TPtr8 dataPtr = data->Des(); + buffer->Read( 0, dataPtr, buffer->Size() ); + + if ( aTask.GetServiceId() == EInstall ) + { + if ( aTask.iInstallParams->iData ) + { + delete aTask.iInstallParams->iData; + aTask.iInstallParams->iData = NULL; + } + aTask.iInstallParams->iData = data; + data = NULL; + } + else if ( aTask.GetServiceId() == EUninstall ) + { + if ( aTask.iUninstallParams->iData ) + { + delete aTask.iUninstallParams->iData; + aTask.iUninstallParams->iData = NULL; + } + aTask.iUninstallParams->iData = data; + data = NULL; + } + else + { + delete data; + data = NULL; + } + + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + TRACE_FUNC_EXIT; + } + +void CSConAppInstaller::ExternalizeResultArrayIntValL( const TDesC& aName, RWriteStream& aStream ) + { + TRACE_FUNC_ENTRY; + RArray valueArray; + TRAPD(err, valueArray = iSifResults->IntArrayByNameL(aName)); + if ( !err && valueArray.Count() > 0 ) + { + LOGGER_WRITE_1("count: %d", valueArray.Count()); + TBuf8<100> nameBuf; + err = CnvUtfConverter::ConvertFromUnicodeToUtf8( nameBuf, aName ); + if (!err) + { + LOGGER_WRITE("2"); + aStream.WriteL( nameBuf, nameBuf.Length() ); + aStream.WriteL( KValSep, 1 ); + aStream.WriteInt32L( valueArray[0] ); + for (TInt i=1; iGetIntByNameL(aName, value); + + if (found) + { + TBuf8<100> nameBuf; + TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8( nameBuf, aName ); + if (!err) + { + aStream.WriteL( nameBuf, nameBuf.Length() ); + aStream.WriteL( KValSep, 1 ); + aStream.WriteInt32L( value ); + aStream.WriteL( KLineEnd, 2 ); + } + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::ExternalizeResultStringValL() +// Read string value and write it to stream +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::ExternalizeResultStringValL( const TDesC& aName, RWriteStream& aStream ) + { + TRACE_FUNC_ENTRY; + const TDesC& strValue = iSifResults->StringByNameL( aName ); + if (strValue.Length() > 0) + { + TBuf8<100> nameBuf; + TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8( nameBuf, aName ); + if (!err) + { + HBufC8* nameVal = CnvUtfConverter::ConvertFromUnicodeToUtf8L( strValue ); + CleanupStack::PushL( nameVal ); + aStream.WriteL( nameBuf, nameBuf.Length() ); + aStream.WriteL( KValSep, 1 ); + aStream.WriteL( nameVal->Des(), nameVal->Length() ); + aStream.WriteL( KLineEnd, 2 ); + CleanupStack::PopAndDestroy( nameVal ); + } + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::ProcessInstallL() +// Executes Install task +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::ProcessInstallL( const CSConInstall& aInstallParams ) + { + TRACE_FUNC_ENTRY; + iSifOptions->Cleanup(); + iSifResults->Cleanup(); + + if ( aInstallParams.iMode == ESilentInstall ) + { + LOGGER_WRITE( "Begin silent installation.. " ); + + iSifOptions->AddIntL( Usif::KSifInParam_InstallSilently, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_PerformOCSP, EFalse ); + // Note if upgrade is allowed, see NeedsInstallingL function. + iSifOptions->AddIntL( Usif::KSifInParam_AllowUpgrade, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_AllowUntrusted, EFalse ); + iSifOptions->AddIntL( Usif::KSifInParam_GrantCapabilities, EFalse ); + // Defined for the install. + iSifOptions->AddIntL( Usif::KSifInParam_InstallOptionalItems, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_IgnoreOCSPWarnings, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_AllowAppShutdown, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_AllowDownload, ETrue ); + iSifOptions->AddIntL( Usif::KSifInParam_AllowOverwrite, ETrue ); + + iSwInstaller.Install( aInstallParams.iPath, *iSifOptions, + *iSifResults, iStatus, ETrue ); + } + else + { + LOGGER_WRITE( "Begin to install.. " ); + + iSwInstaller.Install( aInstallParams.iPath, *iSifOptions, + *iSifResults, iStatus, ETrue ); + } + SetActive(); + TRACE_FUNC_EXIT; + } // ----------------------------------------------------------------------------- // CSConAppInstaller::ProcessUninstallL( const CSConUninstall& aUninstallParams ) -// Execures UnInstall task +// Executes UnInstall task // ----------------------------------------------------------------------------- // void CSConAppInstaller::ProcessUninstallL( const CSConUninstall& aUninstallParams ) @@ -295,209 +453,29 @@ LOGGER_WRITE_1( "aVendor: %S", &aUninstallParams.iVendor ); LOGGER_WRITE_1( "aType: %d", aUninstallParams.iType ); LOGGER_WRITE_1( "aMode: %d", aUninstallParams.iMode ); - switch ( aUninstallParams.iType ) - { - case ESisApplication: - case ESisAugmentation: - UninstallSisL( aUninstallParams ); - break; - case EJavaApplication: - UninstallJavaL( aUninstallParams.iUid, - aUninstallParams.iMode); - break; - case EWidgetApplication: - UninstallWidget( aUninstallParams.iUid, - aUninstallParams.iMode ); - break; - default: - User::Leave( KErrNotSupported ); - } - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CSConAppInstaller::UninstallSisL( const CSConUninstall& aUninstallParams ) -// Uninstall sis package or augmentation -// ----------------------------------------------------------------------------- -// -void CSConAppInstaller::UninstallSisL( const CSConUninstall& aUninstallParams ) - { - TRACE_FUNC_ENTRY; - - if ( aUninstallParams.iUid == KSConSeConUid ) + if ( aUninstallParams.iUid == KSConSeConUid ) { LOGGER_WRITE("Cannot uninstall itself, leave"); // cannot uninstall itself - User::Leave( SwiUI::KSWInstErrFileInUse ); + User::Leave( KErrInUse ); //SwiUI::KSWInstErrFileInUse ); } - - Swi::RSisRegistrySession sisRegistry; - User::LeaveIfError( sisRegistry.Connect() ); - CleanupClosePushL( sisRegistry ); - //Check if uid belongs to SIS package - if( !sisRegistry.IsInstalledL( aUninstallParams.iUid ) ) - { - CleanupStack::PopAndDestroy( &sisRegistry ); - User::Leave( KErrNotFound ); - } + TComponentId componentId = aUninstallParams.iUid.iUid; + iSifOptions->Cleanup(); + iSifResults->Cleanup(); - Swi::RSisRegistryEntry entry; - CleanupClosePushL(entry); - User::LeaveIfError( entry.Open( sisRegistry, aUninstallParams.iUid ) ); - if ( aUninstallParams.iType == ESisAugmentation ) + if ( aUninstallParams.iMode == ESilentInstall) { - // augmentation pkg - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL ESisAugmentation" ); - - TBool augmentationFound(EFalse); - // Get possible augmentations - RPointerArray augPackages; - CleanupResetAndDestroyPushL( augPackages ); - entry.AugmentationsL( augPackages ); - for ( TInt j( 0 ); j < augPackages.Count() && !augmentationFound; j++ ) - { - Swi::RSisRegistryEntry augmentationEntry; - CleanupClosePushL( augmentationEntry ); - augmentationEntry.OpenL( sisRegistry, *augPackages[j] ); - - HBufC* augPackageName = augmentationEntry.PackageNameL(); - CleanupStack::PushL( augPackageName ); - HBufC* augUniqueVendorName = augmentationEntry.UniqueVendorNameL(); - CleanupStack::PushL( augUniqueVendorName ); - - if ( !augmentationEntry.IsInRomL() - && augmentationEntry.IsPresentL() - && aUninstallParams.iName.Compare( *augPackageName ) == 0 - && aUninstallParams.iVendor.Compare( *augUniqueVendorName ) == 0 ) - { - // Correct augmentation found, uninstall it. - augmentationFound = ETrue; - TInt augmentationIndex = augPackages[j]->Index(); - LOGGER_WRITE_1( "CSConAppInstaller::ProcessUninstallL augmentationIndex %d", augmentationIndex ); - - SwiUI::TOpUninstallIndexParam params; - params.iUid = aUninstallParams.iUid; - params.iIndex = augmentationIndex; - SwiUI::TOpUninstallIndexParamPckg pckg( params ); - SwiUI::TOperation operation( SwiUI::EOperationUninstallIndex ); - if( aUninstallParams.iMode == ESilentInstall ) - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : silent aug-sis-uninstall" ); - SwiUI::TUninstallOptionsPckg options; - iInstallerState = ESilentCustomUnistalling; - iSWInst.SilentCustomUninstall( iStatus, operation, options, pckg, KSISMIMEType ); - } - else - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : unsilent aug-sis-uninstall" ) - iInstallerState = ECustomUninstalling; - iSWInst.CustomUninstall( iStatus, operation, pckg, KSISMIMEType ); - } - } - CleanupStack::PopAndDestroy( augUniqueVendorName ); - CleanupStack::PopAndDestroy( augPackageName ); - CleanupStack::PopAndDestroy( &augmentationEntry ); - } - CleanupStack::PopAndDestroy( &augPackages ); - - if ( !augmentationFound ) - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL augmentation not found -> Leave" ); - User::Leave( KErrNotFound ); - } + iSifOptions->AddIntL( Usif::KSifInParam_InstallSilently, ETrue ); + iSwInstaller.Uninstall( componentId, *iSifOptions, *iSifResults, iStatus, ETrue ); } else { - // Only uninstall if not in rom and is present - if ( !entry.IsInRomL() && entry.IsPresentL() ) - { - if ( aUninstallParams.iMode == ESilentInstall ) - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : silent sis-uninstall" ); - SwiUI::TUninstallOptionsPckg options; - iInstallerState = ESilentUninstalling; - iSWInst.SilentUninstall( iStatus, aUninstallParams.iUid, options, KSISMIMEType ); - } - else - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : unsilent sis-uninstall" ) - iInstallerState = EUninstalling; - iSWInst.Uninstall( iStatus, aUninstallParams.iUid, KSISMIMEType ); - } - } - else - { - LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL sis not present -> Leave" ); - User::Leave( KErrNotFound ); - } + iSwInstaller.Uninstall( componentId, *iSifOptions, *iSifResults, iStatus, ETrue ); } - - CleanupStack::PopAndDestroy( &entry ); - CleanupStack::PopAndDestroy( &sisRegistry ); - TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CSConAppInstaller::UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ) -// Uninstall java package -// ----------------------------------------------------------------------------- -// -void CSConAppInstaller::UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ) - { - TRACE_FUNC_ENTRY; - CJavaRegistry* javaRegistry = CJavaRegistry::NewLC( ); - TBool entryExist = javaRegistry->RegistryEntryExistsL( aUid ); - CleanupStack::PopAndDestroy( javaRegistry ); - - if( entryExist ) - { - if( aMode == ESilentInstall ) - { - LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL : silent midlet-uninstall" ) - SwiUI::TUninstallOptionsPckg options; - iInstallerState = ESilentUninstalling; - iSWInst.SilentUninstall( iStatus, aUid, options, KMidletMIMEType ); - } - else - { - LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL : unsilent midlet-uninstall" ) - iInstallerState = EUninstalling; - iSWInst.Uninstall( iStatus, aUid, KMidletMIMEType ); - } - } - else - { - LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL java entry does not exist -> Leave" ) - User::Leave( KErrNotFound ); - } + SetActive(); TRACE_FUNC_EXIT; - } - -// ----------------------------------------------------------------------------- -// CSConAppInstaller::UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ) -// Uninstall widget -// ----------------------------------------------------------------------------- -// -void CSConAppInstaller::UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ) - { - TRACE_FUNC_ENTRY; - if( aMode == ESilentInstall ) - { - LOGGER_WRITE( "CSConAppInstaller::UninstallWidget : silent uninstall" ) - SwiUI::TUninstallOptionsPckg options; - iInstallerState = ESilentUninstalling; - iSWInst.SilentUninstall( iStatus, aUid, options, KWidgetMimeType ); - } - else - { - LOGGER_WRITE( "CSConAppInstaller::UninstallWidget : unsilent uninstall" ) - iInstallerState = EUninstalling; - iSWInst.Uninstall( iStatus, aUid, KWidgetMimeType ); - } - TRACE_FUNC_EXIT; - } - + } //-------------------------------------------------------------------------------- //void CSConAppInstaller::ProcessListInstalledAppsL() diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconinstqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconinstqueue.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconinstqueue.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-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" @@ -48,6 +48,7 @@ // CSConInstallerQueue::CSConInstallerQueue( RFs& aFs ) : CActive( EPriorityStandard ), iFs( aFs ) { + CActiveScheduler::Add( this ); } // ----------------------------------------------------------------------------- @@ -58,8 +59,7 @@ void CSConInstallerQueue::ConstructL() { TRACE_FUNC_ENTRY; - iInstaller = new (ELeave) CSConAppInstaller( this, iFs ); - CActiveScheduler::Add( iInstaller ); + iInstaller = CSConAppInstaller::NewL( this, iFs ); User::LeaveIfError( iTimer.CreateLocal() ); TRACE_FUNC_EXIT; } @@ -151,7 +151,7 @@ // void CSConInstallerQueue::PollQueue() { - TRACE_FUNC_ENTRY; + TRACE_FUNC; // find and start next task if installer and BR is inactive if( !iInstaller->InstallerActive() && !iBRQueueAddress->QueueProcessActive() ) @@ -168,7 +168,6 @@ } } } - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconpcd.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconpcd.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconpcd.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -23,8 +23,11 @@ #include "sconinstqueue.h" #include "sconbrqueue.h" #include "sconmetadata.h" +#include "sconsynchandler.h" #include "debug.h" +const TInt KMaxObjectSize(65536); // informed to PC + // ============================= MEMBER FUNCTIONS =============================== @@ -60,11 +63,8 @@ // Constructor // ----------------------------------------------------------------------------- // -CSConPCD::CSConPCD() : iInstallerQueue( NULL ), iBackupRestoreQueue( NULL ), - iLatestReply(NULL), iTaskNumber( 0 ), iMaxObjectSize( 65536 ), - iLastOperation( ENoTask ) +CSConPCD::CSConPCD() { - TRACE_FUNC; } // ----------------------------------------------------------------------------- @@ -76,18 +76,18 @@ { TRACE_FUNC_ENTRY; User::LeaveIfError( iFs.Connect() ); - iInstallerQueue = CSConInstallerQueue::NewL( iFs ); - iBackupRestoreQueue = CSConBackupRestoreQueue::NewL( iMaxObjectSize, iFs ); - iInstallerQueue->QueueAddress( iBackupRestoreQueue ); - iBackupRestoreQueue->QueueAddress( iInstallerQueue ); - if ( !CActiveScheduler::Current() ) { CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); CActiveScheduler::Install( scheduler ); } - CActiveScheduler::Add( iInstallerQueue ); - CActiveScheduler::Add( iBackupRestoreQueue ); + + iInstallerQueue = CSConInstallerQueue::NewL( iFs ); + iBackupRestoreQueue = CSConBackupRestoreQueue::NewL( iFs ); + iInstallerQueue->QueueAddress( iBackupRestoreQueue ); + iBackupRestoreQueue->QueueAddress( iInstallerQueue ); + + iSyncHandler = CSconSyncHandler::NewL( iFs ); TRACE_FUNC_EXIT; } @@ -99,26 +99,10 @@ CSConPCD::~CSConPCD() { TRACE_FUNC_ENTRY; - if ( iInstallerQueue ) - { - iInstallerQueue->Cancel(); - delete iInstallerQueue; - iInstallerQueue = NULL; - } - - if ( iBackupRestoreQueue ) - { - iBackupRestoreQueue->Cancel(); - delete iBackupRestoreQueue; - iBackupRestoreQueue = NULL; - } - - if ( iLatestReply ) - { - delete iLatestReply; - iLatestReply = NULL; - } - + delete iInstallerQueue; + delete iBackupRestoreQueue; + delete iLatestReply; + delete iSyncHandler; iFs.Close(); TRACE_FUNC_EXIT; } @@ -260,6 +244,32 @@ } // ----------------------------------------------------------------------------- +// CSConPCD::HandleGetSyncRequestL() +// +// ----------------------------------------------------------------------------- +// +void CSConPCD::HandleGetSyncRequestL( const TDesC8& aRequest, RWriteStream& aResult, TInt aMaxObjectSize ) + { + TRACE_FUNC_ENTRY; + iSyncHandler->HandleGetSyncRequestL( aRequest, aResult, aMaxObjectSize ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConPCD::HandlePutSyncRequestL() +// +// ----------------------------------------------------------------------------- +// +void CSConPCD::HandlePutSyncRequestL( const TDesC8& aRequest, RReadStream& aResult ) + { + TRACE_FUNC_ENTRY; + iSyncHandler->HandlePutSyncRequestL( aRequest, aResult ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- // CSConPCD::SupportedInstTaskL( CSConTask* aTask ) // Fills a reply with predefined supported task -information // ----------------------------------------------------------------------------- @@ -563,9 +573,8 @@ } } - taskReply->iDevInfoParams->iVersion.Copy( KCONMLVERSION ); - taskReply->iDevInfoParams->iMaxObjectSize = - GetMaxObjectSize( aMaxObjectSize ); + taskReply->iDevInfoParams->iVersion.Copy( KConMLVersion ); + taskReply->iDevInfoParams->iMaxObjectSize = KMaxObjectSize; reply->iNoTasks = EFalse; @@ -577,16 +586,5 @@ LOGGER_WRITE_1( "CSConPCD::UpdateDeviceInfo() : returned %d", ret ); return ret; } - -// ----------------------------------------------------------------------------- -// CSConPCD::GetMaxObjectSize( TInt /*aClientObjectSize*/ ) const -// Gets the current max object size -// ----------------------------------------------------------------------------- -// -TInt CSConPCD::GetMaxObjectSize( TInt /*aClientObjectSize*/ ) const - { - LOGGER_WRITE_1( "CSConPCD::GetMaxObjectSize() : returned %d", iMaxObjectSize ); - return iMaxObjectSize; - } // End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -214,7 +214,6 @@ void SConPcdUtility::AppendInstalledJavaL( CSConListInstApps& aListInstApps ) { TRACE_FUNC_ENTRY; - // Java related functionality was removed as it was on APP layer. CJavaRegistry* javaRegistry = CJavaRegistry::NewLC( ); RArray packageUids; CleanupClosePushL( packageUids ); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -22,6 +22,7 @@ #include "sconpcdconsts.h" #include "debug.h" #include // installer errors +#include // ============================= MEMBER FUNCTIONS =============================== @@ -165,12 +166,16 @@ // Set the task to completed -mode // ----------------------------------------------------------------------------- // -void CSConTaskQueue::CompleteTask( TInt aTask, TInt aError ) +TInt CSConTaskQueue::CompleteTask( TInt aTask, TInt aError ) { LOGGER_WRITE_1( "CSConTaskQueue::CompleteTask aError: %d", aError ); + TInt ret(KErrNone); TInt index( KErrNotFound ); CSConTask* temp = new CSConTask(); + if (!temp) + return KErrNoMemory; + temp->iTaskId = aTask; index = iQueue.Find( temp, CSConTaskQueue::Match ); delete temp; @@ -203,16 +208,19 @@ progress = KSConCodeInstErrUserCancel; break; case SwiUI::KSWInstErrFileCorrupted: + case KErrSifCorruptedPackage: LOGGER_WRITE("File is corrupted"); iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstErrFileCorrupted; break; case SwiUI::KSWInstErrInsufficientMemory: + case KErrSifNotEnoughSpace: LOGGER_WRITE("Insufficient free memory in the drive to perform the operation"); iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstErrInsufficientMemory; break; case SwiUI::KSWInstErrPackageNotSupported: + case KErrSifUnsupportedSoftwareType: LOGGER_WRITE("Installation of the package is not supported"); iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstErrPackageNotSupported; @@ -223,6 +231,7 @@ progress = KSConCodeInstErrSecurityFailure; break; case SwiUI::KSWInstErrMissingDependency: + case KErrSifMissingDependencies: LOGGER_WRITE("Package cannot be installed due to missing dependency"); iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstErrMissingDependency; @@ -233,6 +242,7 @@ progress = KSConCodeInstErrFileInUse; break; case SwiUI::KSWInstErrGeneralError: + case KErrSifUnknown: LOGGER_WRITE("Unknown error"); iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstErrGeneralError; @@ -262,6 +272,77 @@ iQueue[index]->SetCompleteValue( complete ); progress = KSConCodeInstUpgradeError; break; + + case KErrSifMissingBasePackage: + LOGGER_WRITE("KErrSifMissingBasePackage"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifMissingBasePackage; + break; + case KErrSifOverflow: + LOGGER_WRITE("KErrSifOverflow"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifOverflow; + break; + case KErrSifSameVersionAlreadyInstalled: + LOGGER_WRITE("KErrSifSameVersionAlreadyInstalled"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifSameVersionAlreadyInstalled; + break; + case KErrSifNewerVersionAlreadyInstalled: + LOGGER_WRITE("KErrSifNewerVersionAlreadyInstalled"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifNewerVersionAlreadyInstalled; + break; + case KErrSifAlreadyActivated: + LOGGER_WRITE("KErrSifAlreadyActivated"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifAlreadyActivated; + break; + case KErrSifAlreadyDeactivated: + LOGGER_WRITE("KErrSifAlreadyDeactivated"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifAlreadyDeactivated; + break; + case KErrSifBadComponentId: + LOGGER_WRITE("KErrSifBadComponentId"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifBadComponentId; + break; + case KErrSifBadInstallerConfiguration: + LOGGER_WRITE("KErrSifBadInstallerConfiguration"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifBadInstallerConfiguration; + break; + case KErrSifPackageCannotBeInstalledOnThisDevice: + LOGGER_WRITE("KErrSifPackageCannotBeInstalledOnThisDevice"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifPackageCannotBeInstalledOnThisDevice; + break; + case KErrSifUnsupportedLanguage: + LOGGER_WRITE("KErrSifUnsupportedLanguage"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSifUnsupportedLanguage; + break; + case KErrScrWriteOperationInProgress: + LOGGER_WRITE("KErrScrWriteOperationInProgress"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrScrWriteOperationInProgress; + break; + case KErrScrReadOperationInProgress: + LOGGER_WRITE("KErrScrReadOperationInProgress"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrScrReadOperationInProgress; + break; + case KErrScrNoActiveTransaction: + LOGGER_WRITE("KErrScrNoActiveTransaction"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrScrNoActiveTransaction; + break; + case KErrScrUnsupportedLocale: + LOGGER_WRITE("KErrScrUnsupportedLocale"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrScrUnsupportedLocale; + break; default : iQueue[index]->SetCompleteValue( complete ); @@ -281,7 +362,12 @@ iQueue[index]->SetProgressValue( progress ); } + else + { + ret = KErrNotFound; + } StartQueue(); + return ret; } // ----------------------------------------------------------------------------- @@ -289,19 +375,32 @@ // Set the task progress value // ----------------------------------------------------------------------------- // -void CSConTaskQueue::SetTaskProgress( TInt aTask, TInt aProgressValue ) +TInt CSConTaskQueue::SetTaskProgress( TInt aTask, TInt aProgressValue ) { + TInt ret( KErrNone ); TInt index( KErrNotFound ); CSConTask* temp = new CSConTask(); - temp->iTaskId = aTask; - index = iQueue.Find( temp, CSConTaskQueue::Match ); - delete temp; - - if ( index != KErrNotFound ) + if (temp) { - iQueue[index]->SetProgressValue( aProgressValue ); + temp->iTaskId = aTask; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + iQueue[index]->SetProgressValue( aProgressValue ); + } + else + { + ret = KErrNotFound; + } } + else + { + ret = KErrNoMemory; + } + return ret; } // ----------------------------------------------------------------------------- @@ -315,17 +414,24 @@ TInt index; CSConTask* temp = new CSConTask(); - temp->iTaskId = aTaskId; - index = iQueue.Find( temp, CSConTaskQueue::Match ); - delete temp; - - if ( index != KErrNotFound ) + if (temp) { - aTask = iQueue[index]; + temp->iTaskId = aTaskId; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + aTask = iQueue[index]; + } + else + { + ret = KErrNotFound; + } } else { - ret = KErrNotFound; + ret = KErrNoMemory; } return ret; } @@ -335,27 +441,40 @@ // Removes a task from the queue // ----------------------------------------------------------------------------- // -void CSConTaskQueue::RemoveTask( TInt aTask ) +TInt CSConTaskQueue::RemoveTask( TInt aTask ) { + TInt ret(KErrNone); TInt index( KErrNotFound ); CSConTask* temp = new CSConTask(); - temp->iTaskId = aTask; - index = iQueue.Find( temp, CSConTaskQueue::Match ); - delete temp; - - if ( index != KErrNotFound ) + if (temp) { - delete iQueue[index]; - iQueue.Remove( index ); - iQueue.Compress(); + temp->iTaskId = aTask; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + delete iQueue[index]; + iQueue.Remove( index ); + iQueue.Compress(); + } + else + { + ret = KErrNotFound; + } + + if ( iQueue.Count() == 0 ) + { + StopQueue(); + iQueue.Reset(); + } } - - if ( iQueue.Count() == 0 ) + else { - StopQueue(); - iQueue.Reset(); + ret = KErrNoMemory; } + return ret; } // ----------------------------------------------------------------------------- diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconsbeclient.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconsbeclient.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconsbeclient.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -24,7 +24,8 @@ #include "sconsbeclient.h" #include "debug.h" - +const TInt KDataBufExpandSize( 1024 ); +const TInt KMaxObjectSize( 1048576 - 1024 ); // Max chunk size is 1MB, but give some space for ConML wbxml _LIT( KSConNoDrive, "\x0" ); _LIT( KSConDriveExists, "\x1" ); // ============================= MEMBER FUNCTIONS ============================== @@ -34,10 +35,10 @@ // Two-phase constructor // ----------------------------------------------------------------------------- // -CSConSBEClient* CSConSBEClient::NewL( const TInt aMaxObjectSize, RFs& aFs ) +CSConSBEClient* CSConSBEClient::NewL( RFs& aFs ) { TRACE_FUNC; - CSConSBEClient* self = new (ELeave) CSConSBEClient( aMaxObjectSize, aFs ); + CSConSBEClient* self = new (ELeave) CSConSBEClient( aFs ); return self; } @@ -46,13 +47,10 @@ // Constructor // ----------------------------------------------------------------------------- // -CSConSBEClient::CSConSBEClient( const TInt aMaxObjectSize, RFs& aFs ) : - CActive( EPriorityStandard ), iSBEClient(NULL), - iProcessComplete(EFalse), iProcessIndex( 0 ), iDataPos( 0 ), - iDataLeft( EFalse ), iBURModeNormal( ETrue ), - iRestoreMode( EFalse ), iFs( aFs ) +CSConSBEClient::CSConSBEClient( RFs& aFs ) : + CActive( EPriorityStandard ), iBURModeNormal( ETrue ), iFs( aFs ) { - iMaxObjectSize = aMaxObjectSize; + CActiveScheduler::Add( this ); } // ----------------------------------------------------------------------------- @@ -63,6 +61,7 @@ CSConSBEClient::~CSConSBEClient() { TRACE_FUNC_ENTRY; + Cancel(); TInt err( KErrNone ); if( !iBURModeNormal && iSBEClient ) @@ -89,6 +88,8 @@ delete iSBEClient; iSBEClient = NULL; } + + delete iDataBuffer; TRACE_FUNC_EXIT; } @@ -263,67 +264,52 @@ LOGGER_WRITE( "CSConSBEClient::RunL() : ESetBURMode" ); TRAP( err, ProcessSetBURModeL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessSetBURModeL() : returned %d", err ); - HandleSBEErrorL( err ); - User::RequestComplete( iCallerStatus, err ); break; case EListPublicFiles : LOGGER_WRITE( "CSConSBEClient::RunL() : EListPublicFiles" ); TRAP( err, ProcessListPublicFilesL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessListPublicFilesL() : returned %d", err ); - HandleSBEErrorL( err ); - User::RequestComplete( iCallerStatus, err ); break; case EListDataOwners : LOGGER_WRITE( "CSConSBEClient::RunL() : EListDataOwners" ); TRAP( err, ProcessListDataOwnersL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessListDataOwnersL() : returned %d", err ); - HandleSBEErrorL( err ); - User::RequestComplete( iCallerStatus, err ); break; case EGetDataSize : LOGGER_WRITE( "CSConSBEClient::RunL() : EGetDataSize" ); TRAP( err, ProcessGetDataSizeL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessGetDataSizeL() : returned %d", err ); - HandleSBEErrorL( err ); - User::RequestComplete( iCallerStatus, err ); break; case ERequestData : LOGGER_WRITE( "CSConSBEClient::RunL() : ERequestData" ); TRAP( err, ret = ProcessRequestDataL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessRequestDataL() : returned %d", err ); - HandleSBEErrorL( err ); - - if( err == KErrNone ) - { - err = ret; - } - - User::RequestComplete( iCallerStatus, err ); break; case EGetDataOwnerStatus : LOGGER_WRITE( "CSConSBEClient::RunL() : EGetDataOwnerStatus" ); TRAP( err, ProcessGetDataOwnerStatusL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : ProcessGetDataOwnerStatusL() : returned %d", err ); - HandleSBEErrorL( err ); - User::RequestComplete( iCallerStatus, err ); break; case ESupplyData : LOGGER_WRITE( "CSConSBEClient::RunL() : ESupplyData" ); TRAP( err, ret = ProcessSupplyDataL() ); LOGGER_WRITE_1( "CSConSBEClient::RunL() : SupplyDataL() : returned %d", err ); - HandleSBEErrorL( err ); - - if( err == KErrNone ) - { - err = ret; - } - - User::RequestComplete( iCallerStatus, err ); break; default : + err = KErrNotSupported; LOGGER_WRITE( "CSConSBEClient::RunL() : ERROR! Unknown!" ); break; } + + if ( err ) + { + HandleSBEErrorL( err ); + } + else + { + err = ret; + } + User::RequestComplete( iCallerStatus, err ); TRACE_FUNC_EXIT; } @@ -338,6 +324,7 @@ TRACE_FUNC_ENTRY; iAllSnapshotsSuppliedCalled = EFalse; + iLastChunk = EFalse; TDriveList driveList = iCurrentTask->iBURModeParams->iDriveList; @@ -368,6 +355,21 @@ break; } + if ( partialType == EBURBackupFull || partialType == ESConBurBackupPartial ) + { + // initialize buffer + if ( !iDataBuffer ) + iDataBuffer = CBufFlat::NewL( KDataBufExpandSize ); + else + iDataBuffer->Reset(); + iDataBufferSize=0; + } + else + { + delete iDataBuffer; + iDataBuffer = 0; + } + TBackupIncType incType = ENoBackup; switch( iCurrentTask->iBURModeParams->iIncType ) @@ -719,7 +721,7 @@ //Add sid packageDataOwner->iUid.iUid = sid.iId; iCurrentTask->iListDataOwnersParams->iDataOwners.AppendL( packageDataOwner ); - CleanupStack::PopAndDestroy( packageDataOwner ); + CleanupStack::Pop( packageDataOwner ); } if( !includeToList ) @@ -842,11 +844,6 @@ { TRACE_FUNC_ENTRY; TInt ret( KErrNone ); - - if( iMaxObjectSize <= 1 ) - { - User::Leave( KErrGeneral ); - } TBool packageData = EFalse; TTransferDataType transferDataType( ERegistrationData ); @@ -921,95 +918,42 @@ sid = iCurrentTask->iRequestDataParams->iDataOwner->iUid; LOGGER_WRITE_1("CSConSBEClient::ProcessRequestDataL() sid: 0x%08x", sid.iId); } - - CSBPackageTransferType* ptt( NULL ); - CSBSIDTransferType* stt( NULL ); - CSBJavaTransferType* jtt( NULL ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - Begin - Data left: %d", iDataLeft ); + LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ Begin - Package data: %d", packageData ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - Begin - iDataPos: %d", iDataPos ); + + LOGGER_WRITE_1("iLastChunk: %d", (TInt) iLastChunk ); + LOGGER_WRITE_1("iDataBufferSize: %d", iDataBufferSize ); - //Are there old data left to be transfered? - if( !iDataLeft ) + // if was't last chunk and there are free space left on our packet + if( !iLastChunk && iDataBufferSize < KMaxObjectSize ) { //No data left, request more from the server if( packageData && !iCurrentTask->iRequestDataParams->iDataOwner->iJavaHash ) { - ptt = CSBPackageTransferType::NewL( uid, driveNumber, - packageDataType ); + CSBPackageTransferType* ptt = CSBPackageTransferType::NewL( + uid, driveNumber, packageDataType ); CleanupStack::PushL( ptt ); - LOGGER_WRITE( "iSBEClient->RequestDataL( ptt ) : start" ); - TRequestStatus status; - iSBEClient->RequestDataL( *ptt, status ); - User::WaitForRequest( status ); - LOGGER_WRITE( "iSBEClint->RequestDataL( ptt ) : stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : status.Int() %d", status.Int() ); - User::LeaveIfError( status.Int() ); - - //Get the data and store the handle - CSBGenericTransferType* gtt = NULL; - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ) : start" ); - iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iLastChunk ) ); - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ) : stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Received data size %d", iDataPtr.Length() ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Received from DO 0x%08x", uid ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Is last chunk %d", iLastChunk ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Transfertype %d", iCurrentTask->iRequestDataParams->iDataOwner->iTransDataType ); - - if( gtt ) - { - delete gtt; - } - + RequestDataL( *ptt ); + CleanupStack::PopAndDestroy( ptt ); } else if( !iCurrentTask->iRequestDataParams->iDataOwner->iJavaHash ) { - stt = CSBSIDTransferType::NewL( sid, driveNumber, transferDataType ); + CSBSIDTransferType* stt = CSBSIDTransferType::NewL( + sid, driveNumber, transferDataType ); CleanupStack::PushL( stt ); - LOGGER_WRITE( "iSBEClient->RequestDataL( stt ) : start" ); - TRequestStatus status; - iSBEClient->RequestDataL( *stt, status ); - User::WaitForRequest( status ); - LOGGER_WRITE( "iSBEClient->RequestDataL( stt ) : stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - status.Int() %d", status.Int() ); - User::LeaveIfError( status.Int() ); - - //Get the data and store the handle - CSBGenericTransferType* gtt = NULL; - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ) : start" ); - iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iLastChunk ) ); - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ) : stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Received data size %d", iDataPtr.Length() ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Is last chunk %d", iLastChunk ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Transfertype %d", - iCurrentTask->iRequestDataParams->iDataOwner->iTransDataType ); - - if( gtt ) - { - delete gtt; - } - + RequestDataL( *stt ); + CleanupStack::PopAndDestroy( stt ); } else { TPtr javaHashPtr = iCurrentTask->iRequestDataParams->iDataOwner->iJavaHash->Des(); - + CSBJavaTransferType* jtt( NULL ); //When ESystemData is requested, request EJavaMIDlet if( packageDataType == ESystemData ) { @@ -1024,52 +968,25 @@ if( packageDataType == ESystemData || transferDataType == EPassiveBaseData ) { CleanupStack::PushL( jtt ); - LOGGER_WRITE( "iSBEClient->RequestDataL( jtt ) : start" ); - TRequestStatus status; - iSBEClient->RequestDataL( *jtt, status ); - User::WaitForRequest( status ); - LOGGER_WRITE( "iSBEClient->RequestDataL( jtt ) : stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - status.Int() %d", status.Int() ); - User::LeaveIfError( status.Int() ); - - //Get the data and store the handle - CSBGenericTransferType* gtt = NULL; - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ) : start" ); - iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iLastChunk ) ); - LOGGER_WRITE( "iDataPtr.Set( iSBEClient->TransferDataInfoL( gtt, iSBEDataLeft ): stop" ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Received data size %d", iDataPtr.Length() ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Is last chunk %d", iLastChunk ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() :\ - Transfertype %d", - iCurrentTask->iRequestDataParams->iDataOwner->iTransDataType ); - - if( gtt ) - { - delete gtt; - } - + RequestDataL( *jtt ); + CleanupStack::PopAndDestroy( jtt ); } else { //No data - iDataPtr.Set( KNullDesC8 ); + iDataBuffer->Reset(); + iDataBufferSize = 0; iLastChunk = ETrue; } } - } + } + + LOGGER_WRITE_1("readed iLastChunk: %d", (TInt) iLastChunk ); + LOGGER_WRITE_1("readed iDataBufferSize: %d", iDataBufferSize ); - TInt dataBufLength = iDataPtr.Length(); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - Data received: %d", dataBufLength ); - TInt maxLength = iMaxObjectSize - 1024; - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - Max length: %d", maxLength ); if( iCurrentTask->iRequestDataParams->iBackupData ) { @@ -1077,57 +994,71 @@ iCurrentTask->iRequestDataParams->iBackupData = NULL; } + TInt dataToRead = KMaxObjectSize; + if ( dataToRead > iDataBufferSize ) + dataToRead = iDataBufferSize; + //Initialize the task data buffer - iCurrentTask->iRequestDataParams->iBackupData = HBufC8::NewL( maxLength ); + iCurrentTask->iRequestDataParams->iBackupData = HBufC8::NewL( dataToRead ); //Get descriptor task's buffer TPtr8 backupDataPtr = iCurrentTask->iRequestDataParams->iBackupData->Des(); - TInt copyPos = 0; - //Copy data to task buffer - for( ; iDataPos < dataBufLength && copyPos < maxLength; - iDataPos++ ) + iDataBuffer->Read(0, backupDataPtr, dataToRead ); + iDataBuffer->Delete(0, dataToRead); + iDataBufferSize -= dataToRead; + + if ( !iLastChunk || iDataBufferSize>0 ) { - backupDataPtr.Append( iDataPtr[iDataPos] ); - copyPos++; - } - - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - End - copyPos: %d", copyPos ); - LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : \ - End - iDataPos: %d", iDataPos ); - - //Are there more data left in the buffer - if( iDataPos < dataBufLength ) - { - LOGGER_WRITE( "iSBEClient->RequestDataL( stt ) : There is more data in buffer" ); - iDataLeft = ETrue; + LOGGER_WRITE( "CSConSBEClient::ProcessRequestDataL() : There are more data available" ); iCurrentTask->iRequestDataParams->iMoreData = ETrue; //Another task is needed to transfer the data to the client ret = KErrCompletion; } else { - //Check if the backup server has more data from the dataowner - if( !iLastChunk ) - { - iCurrentTask->iRequestDataParams->iMoreData = ETrue; - //Another task is needed to transfer the data to the client - ret = KErrCompletion; - LOGGER_WRITE( "iSBEClient->RequestDataL( stt ) : There are more data available from SBE" ); - } - else - { - iCurrentTask->iRequestDataParams->iMoreData = EFalse; - } - - iDataPos = 0; - iDataLeft = EFalse; + LOGGER_WRITE( "CSConSBEClient::ProcessRequestDataL() : All data readed" ); + iDataBuffer->Reset(); + iDataBufferSize = 0; + // task will be completed, initialize iLastChunk value for next operation + iLastChunk = EFalse; } + LOGGER_WRITE_1( "CSConSBEClient::ProcessRequestDataL() : returned %d", ret ); return ret; } + +void CSConSBEClient::RequestDataL( CSBGenericTransferType& aGenericTransferType ) + { + TRACE_FUNC_ENTRY; + if ( !iDataBuffer ) + User::Leave( KErrArgument ); + + do + { + LOGGER_WRITE( "iSBEClient->RequestDataL() : start" ); + TRequestStatus status; + iSBEClient->RequestDataL( aGenericTransferType, status ); + User::WaitForRequest( status ); + LOGGER_WRITE_1( "iSBEClient->RequestDataL() : status.Int() %d", status.Int() ); + User::LeaveIfError( status.Int() ); + + //Get the data and store the handle + CSBGenericTransferType* gtt = NULL; + const TPtrC8& dataPtr = iSBEClient->TransferDataInfoL( gtt, iLastChunk ); + LOGGER_WRITE_1("data size: %d", dataPtr.Length()); + delete gtt; + iDataBuffer->ExpandL( iDataBufferSize, dataPtr.Length() ); + iDataBuffer->Write(iDataBufferSize, dataPtr); + iDataBufferSize += dataPtr.Length(); + LOGGER_WRITE_1("total buffer size: %d", iDataBufferSize); + } + // Continue if there are more data, and our packet is not full + while ( !iLastChunk && iDataBufferSize < KMaxObjectSize ); + + TRACE_FUNC_EXIT; + } // ----------------------------------------------------------------------------- // CSConSBEClient::ProcessGetDataOwnerStatusL() @@ -1402,11 +1333,11 @@ } // ----------------------------------------------------------------------------- -// CSConSBEClient::GetDriveNumber( const TInt& aDrive ) const +// CSConSBEClient::GetDriveNumber( TInt aDrive ) const // Maps TInt drive number to TDriveNumber // ----------------------------------------------------------------------------- // -TDriveNumber CSConSBEClient::GetDriveNumber( const TInt& aDrive ) const +TDriveNumber CSConSBEClient::GetDriveNumber( TInt aDrive ) const { TDriveNumber driveNumber; switch( aDrive ) @@ -1560,6 +1491,15 @@ iSBEClient = NULL; iSBEClient = CSBEClient::NewL(); } + else if ( aErr ) // error + { + if ( iDataBuffer ) + { + iDataBuffer->Reset(); + iDataBufferSize = 0; + } + iLastChunk = EFalse; + } TRACE_FUNC_EXIT; } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconsynchandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconsynchandler.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1460 @@ +/* +* 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: CSconSyncHandler implementation +* +*/ + + +#include "sconsynchandler.h" +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" + +// versions up to 5 must be backward compatible +const TUint16 KFormatVersionNumber ( 1 ); + +_LIT8(KCommandListStores, "SYNC: ListStores"); +_LIT8(KCommandOpenStore, "SYNC: OpenStore: "); +_LIT8(KCommandCloseStore, "SYNC: CloseStore"); +_LIT8(KCommandListChanges, "SYNC: ListChanges"); +_LIT8(KCommandResetChangeInfo, "SYNC: ResetChangeInfo"); +_LIT8(KCommandCommitChanges, "SYNC: CommitChanges: "); +_LIT8(KCommandReadItems, "SYNC: ReadItems: "); +_LIT8(KCommandGetParents, "SYNC: GetParents: "); +_LIT8(KCommandCreateItems, "SYNC: CreateItems"); +_LIT8(KCommandGetCreateItemsResponse, "SYNC: GetCreateItemsResponse"); +_LIT8(KCommandGetCreateItems, "SYNC: GetCreateItems: "); +_LIT8(KCommandReplaceItems, "SYNC: ReplaceItems"); +_LIT8(KCommandGetReplaceItemsResponse, "SYNC: GetReplaceItemsResponse"); +_LIT8(KCommandGetReplaceItems, "SYNC: GetReplaceItems: "); +_LIT8(KCommandMoveItems, "SYNC: MoveItems"); +_LIT8(KCommandDeleteItems, "SYNC: DeleteItems: "); +_LIT8(KCommandSoftDeleteItems, "SYNC: SoftDeleteItems: "); +_LIT8(KCommandDeleteAllItems, "SYNC: DeleteAllItems"); +_LIT8(KCommandDeleteAllItemsStatus, "SYNC: GetDeleteAllItemsStatus"); +_LIT8(KCommandGetStoreFormat, "SYNC: GetStoreFormat"); +_LIT8(KCommandSetRemoteStoreFormat, "SYNC: SetRemoteStoreFormat"); +_LIT8(KCommandGetRestOfData, "SYNC: GetRestOfData"); +_LIT8(KCommandCancel, "SYNC: Cancel"); + + +_LIT(KRemoteFormatStore, "remoteformatstore_0x%08x.dat"); +_LIT(KDataFileExtension, ".tmp"); + +const TInt KTimeStampLength = 16; +_LIT8(KTimeStampFormat, "%02d%02d%04dT%02d%02d%02dZ"); + +const TInt KDefaultExpandSize = 1024; + +// Calendar sync specific constants +const TInt KCalendarDsUid = 0x101F6DDE; + +CSconSyncHandler::~CSconSyncHandler() + { + TRACE_FUNC_ENTRY; + Cancel(); + iSyncSession.Close(); + delete iResponseData; + iFileStream.Close(); + iCreatedItems.Close(); + iReplacedItems.Close(); + iItemsToRead.Close(); + iFs.Delete( iFileInProgress ); + ClearCalendarCenrepL(); + TRACE_FUNC_EXIT; + } + +CSconSyncHandler::CSconSyncHandler( RFs& aFs ) + : CActive( EPriorityStandard ), iFs(aFs), iCreatedItemUidPckg(iCreatedItemUid) + { + CActiveScheduler::Add( this ); + } + +CSconSyncHandler* CSconSyncHandler::NewL( RFs& aFs) + { + TRACE_FUNC_ENTRY; + CSconSyncHandler* self = new (ELeave) CSconSyncHandler(aFs); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT; + return self; + } + +void CSconSyncHandler::ConstructL() + { + TInt err = iFs.CreatePrivatePath( EDriveC ); + LOGGER_WRITE_1("CreatePrivatePath err: %d", err); + iFs.SetSessionToPrivate( EDriveC ); + } + +void CSconSyncHandler::HandleGetSyncRequestL( const TDesC8& aRequest, RWriteStream& aResult, TInt aMaxObjectSize ) + { + TRACE_FUNC_ENTRY; + iMaxObjectSize = aMaxObjectSize; + iBytesWrited = 0; + LOGGER_WRITE_1("iMaxObjectSize: %d", iMaxObjectSize); + if ( !iConnected ) + { + LOGGER_WRITE("Try to connect") + User::LeaveIfError( iSyncSession.Connect() ); + iConnected = ETrue; + } + + if ( aRequest.Compare( KCommandListStores ) == KErrNone ) + { + ListStoresL( aResult ); + } + else if ( aRequest.Find( KCommandOpenStore ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandOpenStore().Length() ); + OpenStoreL( params, aResult ); + } + else if ( aRequest.Find( KCommandCloseStore ) == 0 ) + { + CloseStoreL( aResult ); + } + else if ( aRequest.Find( KCommandListChanges ) == 0 ) + { + ListChangesL( aResult ); + } + else if ( aRequest.Find( KCommandResetChangeInfo ) == 0 ) + { + ResetChangeInfoL( aResult ); + } + else if ( aRequest.Find( KCommandCommitChanges ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandCommitChanges().Length() ); + CommitChangesL( params, aResult ); + } + else if ( aRequest.Find( KCommandReadItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandReadItems().Length() ); + ReadItemsL( params, aResult ); + } + else if ( aRequest.Find( KCommandGetParents ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandGetParents().Length() ); + GetParentsL( params, aResult ); + } + else if ( aRequest.Find( KCommandGetRestOfData ) == 0 ) + { + // Get rest of data + ReadNextDataBlockL( aResult ); + } + else if ( aRequest.Find( KCommandGetCreateItemsResponse ) == 0 ) + { + GetCreateItemsResponseL( KNullDesC8(), aResult ); + } + else if ( aRequest.Find( KCommandGetCreateItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandGetCreateItems().Length() ); + GetCreateItemsResponseL( params, aResult ); + } + else if ( aRequest.Find( KCommandGetReplaceItemsResponse ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandGetReplaceItemsResponse().Length() ); + GetReplaceItemsResponseL( KNullDesC8(), aResult ); + } + else if ( aRequest.Find( KCommandGetReplaceItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandGetReplaceItems().Length() ); + GetReplaceItemsResponseL( params, aResult ); + } + else if ( aRequest.Find( KCommandMoveItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandMoveItems().Length() ); + MoveItemsL( params, aResult ); + } + else if ( aRequest.Find( KCommandDeleteItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandDeleteItems().Length() ); + DeleteItemsL( params, aResult ); + } + else if ( aRequest.Find( KCommandSoftDeleteItems ) == 0 ) + { + TPtrC8 params = aRequest.Mid( KCommandSoftDeleteItems().Length() ); + SoftDeleteItemsL( params, aResult ); + } + else if ( aRequest.Find( KCommandDeleteAllItems ) == 0 ) + { + DeleteAllItemsL( aResult ); + } + else if ( aRequest.Find( KCommandDeleteAllItemsStatus ) == 0 ) + { + GetDeleteAllItemsStatusL( aResult ); + } + else if ( aRequest.Find( KCommandGetStoreFormat ) == 0 ) + { + GetStoreFormatL( aResult ); + } + else if ( aRequest.Find( KCommandCancel ) == 0 ) + { + CancelOperationsL( aResult ); + } + else + { + LOGGER_WRITE("Unknown command"); + User::Leave( KErrNotSupported ); + } + TRACE_FUNC_EXIT; + } + + +void CSconSyncHandler::HandlePutSyncRequestL( const TDesC8& aRequest, RReadStream& aData ) + { + TRACE_FUNC_ENTRY; + if ( !iConnected ) + { + LOGGER_WRITE("Try to connect") + User::LeaveIfError( iSyncSession.Connect() ); + iConnected = ETrue; + } + if ( aRequest.Find( KCommandCreateItems ) == KErrNone ) + { + CreateItemsL( aData ); + } + else if ( aRequest.Find( KCommandReplaceItems ) == 0 ) + { + ReplaceItemsL( aData ); + } + else if ( aRequest.Find( KCommandSetRemoteStoreFormat ) == 0 ) + { + SetRemoteStoreFormatL( aData ); + } + else + { + LOGGER_WRITE("Unknown command"); + User::Leave( KErrNotSupported ); + } + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ListStoresL( RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + RSconDataProviderInfoArray infoArray(5); + CleanupResetAndDestroyPushL( infoArray ); + iSyncSession.ListAllImplementationsL( infoArray ); + LOGGER_WRITE_1("infoArray.Count(): %d", infoArray.Count()); + aResult.WriteInt32L( infoArray.Count() ); + for (TInt i=0; iDes(); + stream.ReadL( bufPtr8, len ); + + LOGGER_WRITE8_1("storeName8: %S", &bufPtr8); + + // and convert it to unicode + HBufC* storeName = CnvUtfConverter::ConvertToUnicodeFromUtf8L( bufPtr8 ); + CleanupStack::PopAndDestroy( buf8 ); + CleanupStack::PushL( storeName ); + + TPtr storeNamePtr = storeName->Des(); + LOGGER_WRITE_1("storeName: %S", &storeNamePtr); + + if ( providerId == KCalendarDsUid && aParams.Size() > + sizeof(TInt32) // providerId + + sizeof(TInt32) // contextId + + sizeof(TUint16)// storeName len + + len ) // storeName + { + TInt profileId = stream.ReadInt32L(); + len = stream.ReadUint16L(); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 bufferPtr8 = buffer->Des(); + stream.ReadL( bufferPtr8, len ); + HBufC* serverId = CnvUtfConverter::ConvertToUnicodeFromUtf8L( bufferPtr8 ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PushL( serverId ); + SetCalendarCenrepL( profileId, serverId->Des() ); + CleanupStack::PopAndDestroy(serverId); + } + + aResult.WriteUint16L( KFormatVersionNumber ); + TRAPD( err, iSyncSession.OpenDataStoreL( providerId, storeName->Des(), contextId)); + if ( err == KErrServerTerminated ) + { + // server terminated, try to reconnect + iConnected = EFalse; + LOGGER_WRITE("Try to re-connect"); + err = iSyncSession.Connect(); + LOGGER_WRITE_1("iSyncSession.Connect() err: %d", err); + if ( !err ) + { + iConnected = ETrue; + TRAP( err, iSyncSession.OpenDataStoreL( providerId, storeName->Des(), contextId)); + } + } + + CleanupStack::PopAndDestroy( storeName ); + CleanupStack::PopAndDestroy( &stream ); + + aResult.WriteInt32L( err ); + + if ( err ) + { + LOGGER_WRITE_1("Error: %d", err); + LOGGER_WRITE("iSyncSession.CloseDataStore()"); + iSyncSession.CloseDataStore(); + ClearCalendarCenrepL(); + return; + } + iCurrentDataProviderUid = providerId; + iCurrentContextUid = contextId; + + + // Now the store is opened + TRAP(err, LoadRemoteStoreFormatL( contextId, providerId )); + if ( err ) + { + aResult.WriteUint8L( 1 ); // Remote store format needed + } + else + { + aResult.WriteUint8L( 0 ); // Remote store format not needed + } + + // return last sync timestamp, if has synced before. + TBool hasHistory = iSyncSession.HasSyncHistoryL(); + TUint8 historyFlag(0); + if ( hasHistory ) + { + historyFlag = 1; + } + aResult.WriteUint8L( historyFlag ); + + if ( hasHistory ) + { + TDateTime timeStamp; + TInt err(KErrNone); + TRAP(err, iSyncSession.GetSyncTimeStampL( providerId, contextId, timeStamp)); + LOGGER_WRITE_1("GetSyncTimeStampL err: %d", err); + + TBuf8 timeStampBuf; + + timeStampBuf.Format( KTimeStampFormat, + timeStamp.Day()+1,timeStamp.Month()+1, timeStamp.Year(), + timeStamp.Hour(), timeStamp.Minute(), timeStamp.Second() ); + LOGGER_WRITE8_1("timeStamp: %S", &timeStampBuf); + aResult.WriteL( timeStampBuf ); + } + + + // for testin purposes only + /* + if (!remoteStoreSetted) + { + RStringPool pool; + pool.OpenL(); + CleanupClosePushL( pool ); + CSmlDataStoreFormat* storeFormat(NULL); + TRAPD( err, storeFormat = iSyncSession.StoreFormatL( pool ) ); + CleanupStack::PushL( storeFormat ); + + iSyncSession.SetRemoteStoreFormatL( *storeFormat ); + SaveRemoteStoreFormatL( *storeFormat, contextId, providerId ); + + CleanupStack::PopAndDestroy( storeFormat ); + CleanupStack::PopAndDestroy( &pool ); + } + */ + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::LoadRemoteStoreFormatL( TInt aContextId, TInt aProviderId ) + { + TRACE_FUNC_ENTRY; + TFileName remoteFormatStore; + iFs.SetSessionToPrivate( EDriveC ); + remoteFormatStore.Format( KRemoteFormatStore, aContextId ); + + CDictionaryFileStore* dictionaryStore = + CDictionaryFileStore::OpenLC(iFs, remoteFormatStore, TUid::Uid(0x0001)); + TBool present = dictionaryStore->IsPresentL( TUid::Uid(aProviderId) ); + if ( !present ) + { + LOGGER_WRITE("Remote store was not saved"); + User::Leave( KErrNotFound ); + } + else + { + RDictionaryReadStream stream; + stream.OpenLC( *dictionaryStore, TUid::Uid(aProviderId) ); + RStringPool stringPool; + stringPool.OpenL(); + CleanupClosePushL( stringPool ); + CSmlDataStoreFormat* storeFormat = CSmlDataStoreFormat::NewLC(stringPool, stream); + iSyncSession.SetRemoteStoreFormatL( *storeFormat ); + CleanupStack::PopAndDestroy( storeFormat ); + CleanupStack::PopAndDestroy( &stringPool ); + CleanupStack::PopAndDestroy(); //OpenLC + } + CleanupStack::PopAndDestroy( dictionaryStore ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::SaveRemoteStoreFormatL( CSmlDataStoreFormat& aStoreFormat, TInt aContextId, TInt aProviderId) + { + TRACE_FUNC_ENTRY; + iFs.SetSessionToPrivate( EDriveC ); + TFileName remoteFormatStore; + remoteFormatStore.Format( KRemoteFormatStore, aContextId ); + CDictionaryFileStore* dictionaryStore = + CDictionaryFileStore::OpenLC(iFs, remoteFormatStore, TUid::Uid(0x0001)); + + RDictionaryWriteStream stream; + stream.AssignLC( *dictionaryStore, TUid::Uid(aProviderId) ); + + aStoreFormat.ExternalizeL( stream ); + stream.CommitL(); + CleanupStack::PopAndDestroy(); //AssignLC + dictionaryStore->CommitL(); + + CleanupStack::PopAndDestroy( dictionaryStore ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::CloseStoreL( RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + iSyncSession.CloseDataStore(); + ClearCalendarCenrepL(); + + // Get last used timestamp if provider was open + if ( iCurrentDataProviderUid != 0 ) + { + TDateTime timeStamp; + iSyncSession.GetSyncTimeStampL(iCurrentDataProviderUid, iCurrentContextUid, timeStamp ); + + iCurrentDataProviderUid = 0; + iCurrentContextUid = 0; + + const TInt KTimeStampLength = 16; + TBuf8 timeStampBuf; + + + timeStampBuf.Format( KTimeStampFormat, + timeStamp.Day()+1,timeStamp.Month()+1, timeStamp.Year(), + timeStamp.Hour(), timeStamp.Minute(), timeStamp.Second() ); + aResult.WriteL( timeStampBuf ); + } + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ListChangesL( RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + RArray items; + CleanupClosePushL( items ); + + iSyncSession.AddedItemsL( items ); + LOGGER_WRITE_1("Added items count: %d", items.Count()); + aResult.WriteInt32L( items.Count() ); + for (TInt i=0; i items; + CleanupClosePushL( items ); + for ( TInt i=0; i 0 ) + { + iSyncSession.CommitChangeInfoL( items ); + } + + CleanupStack::PopAndDestroy( &items ); + CleanupStack::PopAndDestroy( &stream ); + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ReadItemsL( const TDesC8& aParams, RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + iItemsToRead.Reset(); + LOGGER_WRITE_1("aParams length: %d", aParams.Length()); + + const TUint8* ptr = aParams.Ptr(); + RMemReadStream stream( ptr , aParams.Size() ); + CleanupClosePushL( stream ); + + // Read item uids from parameter + TInt itemCount = stream.ReadInt32L(); + LOGGER_WRITE_1("Item count: %d", itemCount); + for ( TInt i=0; iSize() == 0 ) && iItemsToRead.Count() == 0 ) + { + // no data + LOGGER_WRITE("no more data or items"); + User::Leave(KErrEof); + } + + if ( iResponseData ) + { + // write data from tempbuffer to response buffer + TInt writeLength = iResponseData->Size(); + if ( writeLength > iMaxObjectSize-iBytesWrited ) + { + writeLength = iMaxObjectSize-iBytesWrited; + } + aResult.WriteL( iResponseData->Ptr(0), writeLength ); + iBytesWrited += writeLength; + + if ( iResponseData->Size() > writeLength ) + { + iResponseData->Delete(0, writeLength); + } + else + { + iResponseData->Reset(); + } + } + if ( iBytesWrited == iMaxObjectSize ) + { + // responce buffer is full, return it. + LOGGER_WRITE("Stream is full, return it"); + return; + } + + TBool streamIsFull( EFalse ); + // Read items from server + CBufFlat* dataBuffer = CBufFlat::NewL(KDefaultExpandSize); + CleanupStack::PushL( dataBuffer ); + while ( iItemsToRead.Count() > 0 && !streamIsFull ) + { + if ( iMaxObjectSize-iBytesWrited < sizeof(TUint32) ) + { + streamIsFull = ETrue; + LOGGER_WRITE("Stream is full, don't read next item"); + continue; + } + ReadItemL( iItemsToRead[0], *dataBuffer ); + aResult.WriteUint32L( dataBuffer->Size() ); + iBytesWrited += sizeof( TUint32 ); + + TInt writeLength = dataBuffer->Size(); + if ( writeLength > iMaxObjectSize-iBytesWrited ) + { + writeLength = iMaxObjectSize-iBytesWrited; + LOGGER_WRITE_1("Write only %d bytes", writeLength); + } + aResult.WriteL( dataBuffer->Ptr(0), writeLength ); + iBytesWrited += writeLength; + + if ( dataBuffer->Size() > writeLength ) + { + // write rest to next data block + if ( !iResponseData ) + { + iResponseData = CBufFlat::NewL(KDefaultExpandSize); + } + iResponseData->Reset(); + LOGGER_WRITE_1("Save %d bytes for next request", dataBuffer->Size() - writeLength); + iResponseData->ResizeL( dataBuffer->Size() - writeLength ); + iResponseData->Write(0, dataBuffer->Ptr( writeLength )); + streamIsFull = ETrue; + } + + iItemsToRead.Remove(0); + + if ( iBytesWrited == iMaxObjectSize ) + { + // writestream is full + LOGGER_WRITE("Stream is full"); + streamIsFull = ETrue; + } + + } + aResult.CommitL(); + + CleanupStack::PopAndDestroy( dataBuffer ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ReadItemL( TSmlDbItemUid aUid, CBufFlat& aItemData ) + { + TRACE_FUNC_ENTRY; + aItemData.Reset(); + CBufFlat* dataBuffer = CBufFlat::NewL(KDefaultExpandSize); + CleanupStack::PushL( dataBuffer ); + TSmlDbItemUid parent(-1); + TBool fieldChange(EFalse); + + TBuf8<256> mimeType; + TBuf8<100> mimeVer; + TRAPD( err, iSyncSession.OpenItemL( aUid, fieldChange, + parent, mimeType, mimeVer, *dataBuffer )); + if ( err ) + { + LOGGER_WRITE_1("Could not read item %d", aUid); + // only item uid and errorcode will be writed + aItemData.ResizeL( + sizeof(TInt32) + + sizeof(TInt32)); + + } + else + { + // reserve memory for all fields + aItemData.ResizeL( + sizeof(TInt32) + + sizeof(TInt32) + + sizeof(TUint8) + + sizeof(TInt32) + + sizeof(TUint16) + + mimeType.Length() + + sizeof(TUint16) + + mimeVer.Length() + + sizeof(TInt32) + + dataBuffer->Size() + ); + } + + RBufWriteStream tempStream( aItemData ); + CleanupClosePushL( tempStream ); + tempStream.WriteInt32L( aUid ); + tempStream.WriteInt32L( err ); + if ( !err ) + { + tempStream.WriteUint8L( fieldChange ); + tempStream.WriteInt32L( parent ); + tempStream.WriteUint16L( mimeType.Length() ); + tempStream.WriteL( mimeType ); + tempStream.WriteUint16L( mimeVer.Length() ); + tempStream.WriteL( mimeVer ); + tempStream.WriteInt32L( dataBuffer->Size() ); + tempStream.WriteL( dataBuffer->Ptr(0), dataBuffer->Size() ); + } + tempStream.CommitL(); + CleanupStack::PopAndDestroy( &tempStream ); + CleanupStack::PopAndDestroy( dataBuffer ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::CreateItemsL( RReadStream& aData ) + { + TRACE_FUNC_ENTRY; + delete iResponseData; + iResponseData = NULL; + iResponseData = CBufFlat::NewL(KDefaultExpandSize); + RBufWriteStream responseStream( *iResponseData ); + CleanupClosePushL( responseStream ); + // Read item uids from parameter + TInt itemCount = aData.ReadInt32L(); + LOGGER_WRITE_1("itemCount: %d", itemCount); + responseStream.WriteInt32L( itemCount ); + for ( TInt i=0; iDes(); + aData.ReadL(mimeTypePtr, len); + + len = aData.ReadUint16L(); + HBufC8* mimeVerBuf = HBufC8::NewLC( len ); + TPtr8 mimeVerPtr = mimeVerBuf->Des(); + aData.ReadL(mimeVerPtr, len); + + len = aData.ReadInt32L(); + HBufC8* dataBuf = HBufC8::NewLC( len ); + TPtr8 dataPtr = dataBuf->Des(); + aData.ReadL( dataPtr, len ); + + TSmlDbItemUid newUid(-1); + LOGGER_WRITE("read from aData stream -readed ok"); + TRAPD( err, iSyncSession.CreateItemL(newUid, + parent, mimeTypePtr, + mimeVerPtr, dataPtr)); + + CleanupStack::PopAndDestroy( dataBuf ); + CleanupStack::PopAndDestroy( mimeVerBuf ); + CleanupStack::PopAndDestroy( mimeTypeBuf ); + LOGGER_WRITE("Write to responseStream"); + responseStream.WriteInt32L( tempUid ); + responseStream.WriteInt32L( err ); + if ( !err ) + { + responseStream.WriteInt32L( newUid ); + } + LOGGER_WRITE("Write to responseStream -writed ok"); + } + + responseStream.CommitL(); + CleanupStack::PopAndDestroy( &responseStream ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::GetCreateItemsResponseL( const TDesC8& aParams, RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + if ( aParams.Length() > 0 ) + { + LOGGER_WRITE_1("params length: %d", aParams.Length()); + + //LOGGER_WRITE8_1("aParams: %S", &aParams); + if ( iSyncStatus == EReady ) + { + LOGGER_WRITE("Start creating items from file"); + iCreatedItems.Reset(); + const TUint8* ptr = aParams.Ptr(); + RMemReadStream stream( ptr , aParams.Size() ); + CleanupClosePushL( stream ); + TInt filenameLength = stream.ReadInt32L(); + LOGGER_WRITE_1("filename length: %d", filenameLength ); + HBufC8* filenameBuf8 = HBufC8::NewLC( /*stream,*/ filenameLength ); // filename + TPtr8 filenamePtr = filenameBuf8->Des(); + stream.ReadL( filenamePtr, filenameLength); + LOGGER_WRITE("filename ok"); + TInt err = CnvUtfConverter::ConvertToUnicodeFromUtf8(iFileInProgress, filenamePtr ); + LOGGER_WRITE_1("ConvertToUnicodeFromUtf8 err: %d", err); + User::LeaveIfError( err ); + LOGGER_WRITE_1("iFileInProgress: %S", &iFileInProgress); + + if ( iFileInProgress.RightTPtr(KDataFileExtension().Length()).CompareF(KDataFileExtension) != 0 ) + { + iFileInProgress = KNullDesC(); + LOGGER_WRITE("File extendion was not correct"); + User::Leave( KErrAccessDenied ); + } + + CleanupStack::PopAndDestroy( filenameBuf8 ); + + LOGGER_WRITE("open file"); + err = iFileStream.Open(iFs,iFileInProgress, EFileShareReadersOnly); + LOGGER_WRITE_1("iFileStream.Open err: %d", err); + User::LeaveIfError( err ); + + CleanupStack::PopAndDestroy( &stream ); + + iSyncStatus = ECreatingItemsFromFile; + iItemsLeftInStream = iFileStream.ReadInt32L(); + LOGGER_WRITE_1("iItemsLeftInStream: %d", iItemsLeftInStream); + aResult.WriteInt32L( iItemsLeftInStream ); + aResult.WriteInt32L( 0 ); // completed items since last sync + CreateNextItemOnStreamL(); + iItemsLeftInStream--; + } + else if ( iSyncStatus == ECreatingItemsFromFile || iSyncStatus == EItemsCreated ) + { + LOGGER_WRITE("Read status"); + TInt temp = 0; + if ( iSyncStatus == ECreatingItemsFromFile ) + { + // one item is on progress, add it to to "left" items. + temp = 1; + } + LOGGER_WRITE_1("left items: %d", iItemsLeftInStream + temp); + LOGGER_WRITE_1("completed items: %d", iCreatedItems.Count()); + aResult.WriteInt32L( iItemsLeftInStream + temp ); // items in progress + aResult.WriteInt32L( iCreatedItems.Count() ); // completed items since last get + + while ( iCreatedItems.Count() > 0 ) + { + aResult.WriteInt32L( iCreatedItems[0].iTemporaryId ); + aResult.WriteInt32L( iCreatedItems[0].iErrorCode ); + if ( !iCreatedItems[0].iErrorCode ) + { + aResult.WriteInt32L( iCreatedItems[0].iNewUid ); + } + iCreatedItems.Remove(0); + } + if ( iSyncStatus == EItemsCreated ) + { + // all done + iSyncStatus = EReady; + LOGGER_WRITE("iSyncStatus = EReady"); + } + } + else + { + LOGGER_WRITE_1("Wrong sync status: %d", iSyncStatus); + User::Leave( KErrInUse ); + } + } + else + { + LOGGER_WRITE("Read response"); + if ( !iResponseData ) + { + User::Leave( KErrNotReady ); + } + aResult.WriteL( iResponseData->Ptr(0), iResponseData->Size() ); + delete iResponseData; + iResponseData = NULL; + } + aResult.CommitL(); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ReplaceItemsL( RReadStream& aData ) + { + TRACE_FUNC_ENTRY; + delete iResponseData; + iResponseData = NULL; + iResponseData = CBufFlat::NewL(KDefaultExpandSize); + RBufWriteStream responseStream( *iResponseData ); + CleanupClosePushL( responseStream ); + // Read item uids from parameter + TInt itemCount = aData.ReadInt32L(); + + responseStream.WriteInt32L( itemCount ); + for ( TInt i=0; iDes(); + aData.ReadL( dataPtr, len ); + + TRAPD( err, iSyncSession.ReplaceItemL(uid, + parent, + fieldChange, dataPtr)); + CleanupStack::PopAndDestroy( dataBuf ); + + responseStream.WriteInt32L( uid ); + responseStream.WriteInt32L( err ); + } + responseStream.CommitL(); + CleanupStack::PopAndDestroy( &responseStream ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::GetReplaceItemsResponseL( const TDesC8& aParams, RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + if ( aParams.Length() > 0 ) + { + LOGGER_WRITE8_1("aParams: %S", &aParams); + if ( iSyncStatus == EReady ) + { + LOGGER_WRITE("Start replacing items from file"); + iReplacedItems.Reset(); + + // create parameter stream reader + const TUint8* ptr = aParams.Ptr(); + RMemReadStream stream( ptr , aParams.Size() ); + CleanupClosePushL( stream ); + + // read filename + TInt filenameLength = stream.ReadInt32L(); + LOGGER_WRITE_1("filename length: %d", filenameLength ); + HBufC8* filenameBuf8 = HBufC8::NewLC( filenameLength ); // filename + TPtr8 filenamePtr = filenameBuf8->Des(); + stream.ReadL( filenamePtr, filenameLength); + LOGGER_WRITE("filename ok"); + + TInt err = CnvUtfConverter::ConvertToUnicodeFromUtf8(iFileInProgress, filenameBuf8->Des() ); + LOGGER_WRITE_1("ConvertToUnicodeFromUtf8 err: %d", err); + User::LeaveIfError( err ); + if ( iFileInProgress.RightTPtr(KDataFileExtension().Length()).CompareF(KDataFileExtension) != 0 ) + { + iFileInProgress = KNullDesC(); + LOGGER_WRITE("File extendion was not correct"); + User::Leave( KErrAccessDenied ); + } + + // open file + err = iFileStream.Open(iFs, iFileInProgress, EFileShareReadersOnly); + LOGGER_WRITE_1("iFileStream.Open err: %d", err); + User::LeaveIfError( err ); + + CleanupStack::PopAndDestroy( filenameBuf8 ); + CleanupStack::PopAndDestroy( &stream ); + + iSyncStatus = EReplacingItemsFromFile; + iItemsLeftInStream = iFileStream.ReadInt32L(); + LOGGER_WRITE_1("iItemsLeftInStream: %d", iItemsLeftInStream); + // write results to return stream + aResult.WriteInt32L( iItemsLeftInStream ); + aResult.WriteInt32L( 0 ); // completed items since last sync + ReplaceNextItemOnStreamL(); + iItemsLeftInStream--; + } + else if ( iSyncStatus == EReplacingItemsFromFile || iSyncStatus == EItemsReplaced ) + { + LOGGER_WRITE("Read status"); + TInt temp = 0; + if ( iSyncStatus == EReplacingItemsFromFile ) + { + // one item is on progress, add it to to "left" items. + temp = 1; + } + LOGGER_WRITE_1("left items: %d", iItemsLeftInStream + temp); + LOGGER_WRITE_1("completed items: %d", iReplacedItems.Count()); + aResult.WriteInt32L( iItemsLeftInStream + temp ); // items in progress + aResult.WriteInt32L( iReplacedItems.Count() ); // completed items since last get + //for (TInt i=0; i 0 ) + { + aResult.WriteInt32L( iReplacedItems[0].iItemUid ); + aResult.WriteInt32L( iReplacedItems[0].iErrorCode ); + iReplacedItems.Remove(0); + } + if ( iSyncStatus == EItemsReplaced ) + { + // all done + iSyncStatus = EReady; + LOGGER_WRITE("iSyncStatus = EReady"); + } + } + } + else + { + if ( !iResponseData ) + { + LOGGER_WRITE("No response data, leave KErrNotReady"); + User::Leave( KErrNotReady ); + } + aResult.WriteL( iResponseData->Ptr(0), iResponseData->Size() ); + aResult.CommitL(); + delete iResponseData; + iResponseData = NULL; + } + aResult.CommitL(); + + + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::MoveItemsL( const TDesC8& aParams, RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + const TUint8* ptr = aParams.Ptr(); + RMemReadStream stream( ptr , aParams.Size() ); + CleanupClosePushL( stream ); + + // Read item uids from parameter + TInt itemCount = stream.ReadInt32L(); + aResult.WriteInt32L( itemCount ); + for ( TInt i=0; iExternalizeL( aResult ); + } + CleanupStack::PopAndDestroy( storeFormat ); + CleanupStack::PopAndDestroy( &pool ); + TRACE_FUNC_EXIT; + } + + +void CSconSyncHandler::SetRemoteStoreFormatL( RReadStream& aData ) + { + TRACE_FUNC_ENTRY; + RStringPool pool; + pool.OpenL(); + CleanupClosePushL( pool ); + CSmlDataStoreFormat* serverDataStoreFormat = CSmlDataStoreFormat::NewLC( pool, aData ); + iSyncSession.SetRemoteStoreFormatL( *serverDataStoreFormat ); + // Save format for later use + TRAPD(err, SaveRemoteStoreFormatL( *serverDataStoreFormat, iCurrentContextUid, iCurrentDataProviderUid )); + if ( err ) + { + LOGGER_WRITE_1("SaveRemoteStoreFormatL err: %d", err); + } + CleanupStack::PopAndDestroy( serverDataStoreFormat ); + CleanupStack::PopAndDestroy( &pool ); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::CreateNextItemOnStreamL() + { + TRACE_FUNC_ENTRY; + if ( IsActive() ) + { + LOGGER_WRITE("Warning: Was on active state!"); + Cancel(); + } + iTemporaryItemUid = iFileStream.ReadInt32L(); + TSmlDbItemUid parent = iFileStream.ReadInt32L(); + + TInt len = iFileStream.ReadUint16L(); + HBufC8* mimeTypeBuf = HBufC8::NewLC( len ); + TPtr8 mimeTypePtr = mimeTypeBuf->Des(); + iFileStream.ReadL(mimeTypePtr, len); + + len = iFileStream.ReadUint16L(); + HBufC8* mimeVerBuf = HBufC8::NewLC( len ); + TPtr8 mimeVerPtr = mimeVerBuf->Des(); + iFileStream.ReadL(mimeVerPtr, len); + + len = iFileStream.ReadInt32L(); + HBufC8* dataBuf = HBufC8::NewLC( len ); + TPtr8 dataPtr = dataBuf->Des(); + iFileStream.ReadL( dataPtr, len ); + + SetActive(); + iStatus = KRequestPending; + iSyncSession.CreateItemL(iCreatedItemUidPckg, + parent, mimeTypePtr, + mimeVerPtr, dataPtr, iStatus); + + CleanupStack::PopAndDestroy( dataBuf ); + CleanupStack::PopAndDestroy( mimeVerBuf ); + CleanupStack::PopAndDestroy( mimeTypeBuf ); + + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::ReplaceNextItemOnStreamL() + { + TRACE_FUNC_ENTRY; + if ( IsActive() ) + { + LOGGER_WRITE("Warning: Was on active state!"); + Cancel(); + } + TSmlDbItemUid uid = iFileStream.ReadInt32L(); + TSmlDbItemUid parent = iFileStream.ReadInt32L(); + TBool fieldChange = iFileStream.ReadUint8L(); + TInt len = iFileStream.ReadInt32L(); + HBufC8* dataBuf = HBufC8::NewLC( len ); + TPtr8 dataPtr = dataBuf->Des(); + iFileStream.ReadL( dataPtr, len ); + + iReplacedItem.iItemUid = uid; + + SetActive(); + iStatus = KRequestPending; + + iSyncSession.ReplaceItemL(uid, + parent, + fieldChange, dataPtr, iStatus); + + CleanupStack::PopAndDestroy( dataBuf ); + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::CancelOperationsL( RWriteStream& aResult ) + { + TRACE_FUNC_ENTRY; + Cancel(); + // all done + iFileStream.Close(); + iTemporaryItemUid = -1; + iCreatedItemUid = -1; + iSyncStatus = EItemsCreated; + iFs.Delete( iFileInProgress ); + iFileInProgress = KNullDesC(); + iItemsLeftInStream = 0; + _LIT8(KDummyParam, "Cancel"); + if ( iSyncStatus == EItemsCreated ) + { + GetCreateItemsResponseL( KDummyParam, aResult ); + } + else if ( iSyncStatus == EItemsReplaced ) + { + GetReplaceItemsResponseL( KDummyParam, aResult ); + } + + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::DoCancel() + { + TRACE_FUNC_ENTRY; + iSyncSession.CancelRequest(); + Reset(); + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::RunL() + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("iSyncStatus: %d", iSyncStatus); + LOGGER_WRITE_1("iStatus: %d", iStatus.Int()); + if ( iSyncStatus == ECreatingItemsFromFile ) + { + LOGGER_WRITE_1("iTemporaryItemUid: %d", iTemporaryItemUid); + LOGGER_WRITE_1("iCreatedItemUid: %d", iCreatedItemUid); + TCreatedItem item; + item.iTemporaryId = iTemporaryItemUid; + item.iErrorCode = iStatus.Int(); + item.iNewUid = iCreatedItemUid; + iCreatedItems.Append( item ); + if ( iItemsLeftInStream > 0 ) + { + CreateNextItemOnStreamL(); + iItemsLeftInStream--; + LOGGER_WRITE_1("iItemsLeftInStream: %d", iItemsLeftInStream); + } + else + { + // all done + LOGGER_WRITE("All items added."); + iFileStream.Close(); + iTemporaryItemUid = -1; + iCreatedItemUid = -1; + iSyncStatus = EItemsCreated; + TInt err = iFs.Delete( iFileInProgress ); + LOGGER_WRITE_2("iFs.Delete( '%S' ) ret: %d", &iFileInProgress, err); + iFileInProgress = KNullDesC(); + } + } + else if ( iSyncStatus == EReplacingItemsFromFile ) + { + iReplacedItem.iErrorCode = iStatus.Int(); + iReplacedItems.Append( iReplacedItem ); + if ( iItemsLeftInStream > 0 ) + { + ReplaceNextItemOnStreamL(); + iItemsLeftInStream--; + LOGGER_WRITE_1("iItemsLeftInStream: %d", iItemsLeftInStream); + } + else + { + // all done + LOGGER_WRITE("All items replaced."); + iFileStream.Close(); + iSyncStatus = EItemsReplaced; + TInt err = iFs.Delete( iFileInProgress ); + LOGGER_WRITE_2("iFs.Delete( '%S' ) ret: %d", &iFileInProgress, err); + iFileInProgress = KNullDesC(); + } + } + else if ( iSyncStatus == EDeletingAllItems ) + { + iSyncStatus = EReady; + } + TRACE_FUNC_EXIT; + } + +TInt CSconSyncHandler::RunError( TInt aError ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aError: %d", aError); + LOGGER_WRITE_1("iSyncStatus: %d", iSyncStatus); + TInt err( aError ); + if ( iSyncStatus == ECreatingItemsFromFile ) + { + iSyncStatus = EItemsCreated; + iItemsLeftInStream = 0; + iFileStream.Close(); + err = iFs.Delete( iFileInProgress ); + LOGGER_WRITE_2("iFs.Delete( '%S' ) ret: %d", &iFileInProgress, err); + iFileInProgress = KNullDesC(); + err = KErrNone; + } + else if ( iSyncStatus == EReplacingItemsFromFile ) + { + iSyncStatus = EItemsReplaced; + iItemsLeftInStream = 0; + iFileStream.Close(); + err = iFs.Delete( iFileInProgress ); + LOGGER_WRITE_2("iFs.Delete( '%S' ) ret: %d", &iFileInProgress, err); + iFileInProgress = KNullDesC(); + err = KErrNone; + } + else if ( iSyncStatus == EDeletingAllItems ) + { + iSyncStatus = EReady; + } + + TRACE_FUNC_EXIT; + return err; + } + +void CSconSyncHandler::Reset() + { + TRACE_FUNC_ENTRY; + iFileStream.Close(); + TInt err = iFs.Delete( iFileInProgress ); + LOGGER_WRITE_2("iFs.Delete( '%S' ) ret: %d", &iFileInProgress, err); + iFileInProgress = KNullDesC(); + iSyncStatus = EReady; + TRACE_FUNC_EXIT; + } + +void CSconSyncHandler::SetCalendarCenrepL( TInt aProfileId, const TDesC& aServerId ) + { + LOGGER_WRITE(" Write cenrep values"); + CRepository* rep = CRepository::NewLC(KNsmlDsSessionInfoKey); + User::LeaveIfError( rep->Set(EDSSessionProfileId, aProfileId) ); + User::LeaveIfError( rep->Set(EDSSessionProfileName, KNullDesC) ); + User::LeaveIfError( rep->Set(EDSSessionServerId, aServerId) ); + CleanupStack::PopAndDestroy(rep); + iCalendarCenrepUsed = ETrue; + } + +void CSconSyncHandler::ClearCalendarCenrepL() + { + if ( iCalendarCenrepUsed ) + { + LOGGER_WRITE("Calendar sync, clear cenrep values"); + + CRepository* rep = CRepository::NewLC(KNsmlDsSessionInfoKey); + rep->Set(EDSSessionProfileId, KErrNotFound); + rep->Set(EDSSessionProfileName, KNullDesC); + rep->Set(EDSSessionServerId, KNullDesC); + CleanupStack::PopAndDestroy(rep); + iCalendarCenrepUsed = EFalse; + } + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -106,6 +106,7 @@ User::LeaveIfError( iWindow->Construct(iRootWindow, reinterpret_cast(&iRootWindow) + 1) ); TRect temp(0,0,320,240); // dummy parameter + iVideoUtil = CVideoPlayerUtility::NewL(*this, EMdaPriorityNormal, EMdaPriorityPreferenceNone, iWsSession, *iScreen, *iWindow, temp, temp); iTimeOut = CSconTimeOut::NewL( *this ); diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlgenerator.cpp --- a/connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlgenerator.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlgenerator.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -97,9 +97,7 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::SetCallback ( MWBXMLConMLCallback* aCallback ) { - LOGGER_ENTERFN( "CSConConMLGenerator::SetCallbacks()" ); iCallback = aCallback; - LOGGER_LEAVEFN( "CSConConMLGenerator::SetCallbacks()" ); } // ----------------------------------------------------------------------------- @@ -129,7 +127,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::StartElementL( TWBXMLTag aTag ) { - LOGGER_ENTERFN( "CSConConMLGenerator::StartElementL()" ); if( iCmdStack->Top() != 0 ) { AddElementL(iCmdStack->Top()->BeginElementL( @@ -150,7 +147,6 @@ User::Leave(KWBXMLParserErrorInvalidTag); } } - LOGGER_LEAVEFN( "CSConConMLGenerator::StartElementL()" ); } // ----------------------------------------------------------------------------- @@ -158,7 +154,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AddElementL( CXMLElement* aElement ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AddElement()" ); if( aElement ) { iCmdStack->PushL(aElement); @@ -167,7 +162,6 @@ iCleanupStack->PushL(aElement); } } - LOGGER_LEAVEFN( "CSConConMLGenerator::AddElement()" ); } // ----------------------------------------------------------------------------- @@ -175,7 +169,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::CharactersL( const TDesC8& aBuffer ) { - LOGGER_ENTERFN( "CSConConMLGenerator::CharactersL()" ); if( iCmdStack->Top() != 0 ) { iCmdStack->Top()->SetDataL(aBuffer); @@ -185,7 +178,6 @@ LOGGER_WRITE( "CSConConMLGenerator::CharactersL() : Leave KWBXMLParserErrorInvalidTag" ); User::Leave(KWBXMLParserErrorInvalidTag); } - LOGGER_LEAVEFN( "CSConConMLGenerator::CharactersL()" ); } // ----------------------------------------------------------------------------- @@ -193,7 +185,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::EndElementL( TWBXMLTag aTag ) { - LOGGER_ENTERFN( "CSConConMLGenerator::EndElementL()" ); if( iCmdStack->Top() != 0 ) { CXMLElement::TAction action = iCmdStack->Top()->EndElementL( @@ -211,7 +202,6 @@ } } } - LOGGER_LEAVEFN( "CSConConMLGenerator::EndElementL()" ); } // ----------------------------------------------------------------------------- @@ -219,7 +209,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::WriteMUint32L( TUint32 aValue ) { - LOGGER_ENTERFN( "CSConConMLGenerator::WriteMUint32L()" ); TUint8 temp[5]; TInt i(4); @@ -235,7 +224,6 @@ { iWBXMLWorkspace->WriteL(temp[++i]); } - LOGGER_LEAVEFN( "CSConConMLGenerator::WriteMUint32L()" ); } // ----------------------------------------------------------------------------- @@ -243,12 +231,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::WriteOpaqueDataL( const TDesC8& aData ) { - LOGGER_ENTERFN( "CSConConMLGenerator::WriteOpaqueDataL()" ); iWBXMLWorkspace->WriteL( OPAQUE ); WriteMUint32L( aData.Size() ); iWBXMLWorkspace->WriteL( aData ); iXMLWorkspace->WriteL( aData ); - LOGGER_LEAVEFN( "CSConConMLGenerator::WriteOpaqueDataL()" ); } // ----------------------------------------------------------------------------- @@ -256,12 +242,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::WriteInlineStringL( const TDesC8& aData ) { - LOGGER_ENTERFN( "CSConConMLGenerator::WriteInlineStringL()" ); iWBXMLWorkspace->WriteL( STR_I ); iWBXMLWorkspace->WriteL( aData ); iWBXMLWorkspace->WriteL( 0 ); iXMLWorkspace->WriteL( aData ); - LOGGER_LEAVEFN( "CSConConMLGenerator::WriteInlineStringL()" ); } // ----------------------------------------------------------------------------- @@ -269,12 +253,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::IndentL() { - LOGGER_ENTERFN( "CSConConMLGenerator::IndentL()" ); for( TInt i = 0; i < iElemStack.Count() + iInitialIndentLevel; i++ ) { iXMLWorkspace->WriteL(KXMLIndent()); } - LOGGER_LEAVEFN( "CSConConMLGenerator::IndentL()" ); } // ----------------------------------------------------------------------------- @@ -282,7 +264,6 @@ // ----------------------------------------------------------------------------- TPtrC8 CSConConMLGenerator::TranslateElement( TUint8 aElement ) { - LOGGER_ENTERFN( "CSConConMLGenerator::TranslateElement()" ); TPtrC8 buf( KConMLElements ); while( aElement-- ) { @@ -300,7 +281,6 @@ { buf.Set(buf.Left(pos)); } - LOGGER_LEAVEFN( "CSConConMLGenerator::TranslateElement()" ); return buf; } @@ -335,7 +315,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendConMLL( ConML_ConMLPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendConMLL()" ); BeginDocumentL(KSConConMLVersion, KSConConMLPublicId, KSConConMLUTF8); BeginElementL(EConML, ETrue); AppendExecuteL( aContent->execute ); @@ -343,7 +322,6 @@ AppendCancelL( aContent->cancel ); AppendStatusL( aContent->status ); EndElementL(); // EConML - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendConMLL()" ); } // ----------------------------------------------------------------------------- @@ -351,7 +329,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendExecuteL( ConML_ExecutePtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendExecuteL()" ); if ( aContent ) { BeginElementL( EConMLExecute, ETrue ); @@ -375,7 +352,6 @@ } EndElementL(); // EConMLExecute } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendExecuteL()" ); } // ----------------------------------------------------------------------------- @@ -383,7 +359,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendSupplyDataL( ConML_SupplyDataPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendSupplyDataL()" ); if ( aContent ) { BeginElementL( EConMLSupplyData, ETrue ); @@ -391,14 +366,12 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLSupplyData } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSupplyDataL()" ); } // ----------------------------------------------------------------------------- // AppendInstallL // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendInstallL( ConML_InstallPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendInstallL()" ); if ( aContent) { BeginElementL( EConMLInstall, ETrue ); @@ -417,7 +390,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLInstall } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendInstallL()" ); } // ----------------------------------------------------------------------------- @@ -425,7 +397,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendCancelL ( ConML_CancelPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendCancelL()" ); if ( aContent ) { BeginElementL( EConMLCancel, ETrue ); @@ -433,7 +404,6 @@ AppendPCDataL( EConMLAll, aContent->all); EndElementL(); // EConMLCancel } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendCancelL()" ); } // ----------------------------------------------------------------------------- @@ -441,7 +411,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendStatusL ( ConML_StatusPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendStatusL()" ); if ( aContent ) { if ( aContent->task ) @@ -455,7 +424,6 @@ BeginElementL( EConMLStatus ); } } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendStatusL()" ); } // ----------------------------------------------------------------------------- @@ -463,7 +431,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendGetStatusL( ConML_GetStatusPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendGetStatusL()" ); if ( aContent ) { BeginElementL( EConMLGetStatus, ETrue ); @@ -474,7 +441,6 @@ } EndElementL(); // EConMLGetStatus } - LOGGER_ENTERFN( "CSConConMLGenerator::AppendGetStatusL()" ); } // ----------------------------------------------------------------------------- @@ -495,7 +461,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendTaskL( ConML_TaskPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendTaskL()" ); if ( aContent ) { BeginElementL( EConMLTask, ETrue ); @@ -515,7 +480,6 @@ AppendGetMetadataL( aContent->getMetadata ); EndElementL(); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendTaskL()" ); } // ----------------------------------------------------------------------------- @@ -523,12 +487,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendTaskListL( ConML_TaskListPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendTaskListL()" ); for ( ConML_TaskListPtr_t p = aContent; p && p->data; p=p->next ) { AppendTaskL( p->data ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendTaskListL()" ); } // ----------------------------------------------------------------------------- @@ -537,7 +499,6 @@ void CSConConMLGenerator::AppendListInstalledAppsL ( ConML_ListInstalledAppsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendListInstalledAppsL()" ); if ( aContent ) { BeginElementL( EConMLListInstalledApps, ETrue ); @@ -549,7 +510,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLListInstalledApps } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendListInstalledAppsL()" ); } // ----------------------------------------------------------------------------- @@ -558,7 +518,6 @@ void CSConConMLGenerator::AppendListDataOwnersL ( ConML_ListDataOwnersPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendListDataOwnersL()" ); if ( aContent ) { if ( aContent->results ) @@ -572,7 +531,6 @@ BeginElementL( EConMLListDataOwners ); } } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendListDataOwnersL()" ); } // ----------------------------------------------------------------------------- @@ -580,7 +538,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendBUROptionsL( ConML_BUROptionsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendBUROptionsL()" ); if ( aContent ) { BeginElementL( EConMLBUROptions, ETrue ); @@ -602,7 +559,6 @@ } EndElementL(); // EConMLBUROptions } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendBUROptionsL()" ); } // ----------------------------------------------------------------------------- @@ -610,7 +566,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendSetBURModeL( ConML_SetBURModePtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendSetBURModeL()" ); if ( aContent ) { BeginElementL( EConMLSetBURMode, ETrue ); @@ -620,7 +575,6 @@ AppendResultsL( aContent->results ); EndElementL(); //EConMLSetBURMode } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSetBURModeL()" ); } // ----------------------------------------------------------------------------- @@ -628,7 +582,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendUnInstallL( ConML_UnInstallPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendUnInstallL()" ); if ( aContent ) { BeginElementL( EConMLUnInstall, ETrue ); @@ -637,7 +590,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLUnInstall } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendUnInstallL()" ); } // ----------------------------------------------------------------------------- @@ -645,7 +597,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendGetDataSizeL( ConML_GetDataSizePtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendGetDataSizeL()" ); if ( aContent ) { BeginElementL( EConMLGetDataSize, ETrue ); @@ -653,7 +604,6 @@ AppendResultsL( aContent->results ); EndElementL(); //EConMLGetDataSize } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendGetDataSizeL()" ); } // ----------------------------------------------------------------------------- @@ -661,7 +611,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendRequestDataL( ConML_RequestDataPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendRequestDataL()" ); if ( aContent ) { BeginElementL( EConMLRequestData, ETrue ); @@ -669,7 +618,6 @@ AppendResultsL( aContent->results ); EndElementL();//EConMLRequestData } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendRequestDataL()" ); } // ----------------------------------------------------------------------------- @@ -678,7 +626,6 @@ void CSConConMLGenerator::AppendUpdateDeviceInfoL( ConML_UpdateDeviceInfoPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendUpdateDeviceInfoL()" ); if ( aContent ) { BeginElementL(EConMLUpdateDeviceInfo, ETrue); @@ -686,7 +633,6 @@ AppendResultsL( aContent->results ); EndElementL();// EConMLUpdateDeviceInfo } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendUpdateDeviceInfoL()" ); } // ----------------------------------------------------------------------------- @@ -695,7 +641,6 @@ void CSConConMLGenerator::AppendListPublicFilesL( ConML_ListPublicFilesPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendListPublicFilesL()" ); if ( aContent ) { BeginElementL( EConMLListPublicFiles, ETrue ); @@ -703,7 +648,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLListPublicFiles } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendListPublicFilesL()" ); } // ----------------------------------------------------------------------------- @@ -711,7 +655,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendApplicationL( ConML_ApplicationPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendApplicationL()" ); if ( aContent ) { BeginElementL(EConMLApplication, ETrue ); @@ -719,7 +662,6 @@ AppendPCDataL( EConMLUID, aContent->uid ); EndElementL(); //EConMLApplication } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendApplicationL()" ); } // ----------------------------------------------------------------------------- @@ -728,12 +670,10 @@ void CSConConMLGenerator::AppendApplicationListL( ConML_ApplicationListPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendApplicationListL()" ); for ( ConML_ApplicationListPtr_t p = aContent; p && p->data; p = p->next ) { AppendApplicationL( p->data ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendApplicationListL()" ); } // ----------------------------------------------------------------------------- @@ -742,14 +682,12 @@ void CSConConMLGenerator::AppendApplicationsL( ConML_ApplicationsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendApplicationsL()" ); if ( aContent ) { BeginElementL( EConMLApplications, ETrue ); AppendApplicationListL( aContent->application ); EndElementL(); // EConMLApplications } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendApplicationsL()" ); } // ----------------------------------------------------------------------------- @@ -757,7 +695,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendParamL( ConML_ParamPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendParamL()" ); if ( aContent ) { BeginElementL( EConMLParam, ETrue ); @@ -765,7 +702,6 @@ AppendPCDataL( EConMLValue, aContent->value ); EndElementL(); // EConMLParam } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendParamL()" ); } // ----------------------------------------------------------------------------- @@ -773,12 +709,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendParamListL( ConML_ParamListPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendParamListL()" ); for ( ConML_ParamListPtr_t p = aContent; p && p->data; p = p->next ) { AppendParamL( p-> data ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendParamListL()" ); } // ----------------------------------------------------------------------------- @@ -786,14 +720,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendInstParamsL( ConML_InstParamsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendInstParamsLionsL()" ); if ( aContent ) { BeginElementL( EConMLInstParams, ETrue ); AppendParamListL( aContent->param ); EndElementL(); //EConMLInstParams } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendInstParamsL()" ); } // ----------------------------------------------------------------------------- @@ -801,14 +733,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendProgressL( ConML_ProgressPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendProgressL()" ); if ( aContent ) { BeginElementL( EConMLProgress, ETrue ); AppendPCDataL( EConMLValue, aContent->value ); EndElementL(); // EconMLProgress } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendProgressL()" ); } // ----------------------------------------------------------------------------- @@ -816,7 +746,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendResultsL( ConML_ResultsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendResultsL()" ); if ( aContent ) { BeginElementL( EConMLResults, ETrue ); @@ -840,7 +769,6 @@ AppendFilesL( aContent->files ); EndElementL(); //EConMLResults } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendResultsL()" ); } // ----------------------------------------------------------------------------- @@ -848,14 +776,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendDriveL( ConML_DrivePtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDriveL()" ); if ( aContent ) { BeginElementL( EConMLDrive, ETrue ); AppendPCDataL( EConMLName, aContent->name ); EndElementL(); //EConMLDrive } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendDriveL()" ); } // ----------------------------------------------------------------------------- @@ -863,12 +789,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendDriveListL( ConML_DriveListPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDriveListL()" ); for ( ConML_DriveListPtr_t p = aContent; p && p->data; p=p->next ) { AppendDriveL( p->data ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendDriveListL()" ); } // ----------------------------------------------------------------------------- @@ -876,14 +800,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendDrivesL( ConML_DrivesPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDrivesL()" ); if ( aContent ) { BeginElementL( EConMLDrives, ETrue ); AppendDriveListL( aContent->drive ); EndElementL(); // EConMLDrives } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendDrivesL()" ); } // ----------------------------------------------------------------------------- @@ -891,14 +813,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendDataOwnersL( ConML_DataOwnersPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDataOwnersL()" ); if ( aContent ) { BeginElementL( EConMLDataOwners, ETrue ); AppendSIDListL( aContent->sid ); EndElementL(); //EConMLDataOwners } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendDataOwnersL()" ); } // ----------------------------------------------------------------------------- @@ -907,7 +827,6 @@ void CSConConMLGenerator::AppendGetDataOwnerStatusL ( ConML_GetDataOwnerStatusPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDataOwnerStatusL()" ); if ( aContent) { BeginElementL( EConMLGetDataOwnerStatus, ETrue ); @@ -915,7 +834,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EconMLGetDataOwnerStatus } - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDataOwnerStatusL()" ); } // ----------------------------------------------------------------------------- @@ -924,7 +842,6 @@ void CSConConMLGenerator::AppendGetMetadataL ( ConML_GetMetadataPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendGetMetadataL()" ); if ( aContent) { BeginElementL( EConMLGetMetadata, ETrue ); @@ -932,7 +849,6 @@ AppendResultsL( aContent->results ); EndElementL(); // EConMLGetMetadata } - LOGGER_ENTERFN( "CSConConMLGenerator::AppendGetMetadataL()" ); } // ----------------------------------------------------------------------------- @@ -953,7 +869,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendSIDL( ConML_SIDPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendSIDL()" ); if ( aContent ) { BeginElementL( EConMLSID, ETrue ); @@ -975,7 +890,6 @@ } EndElementL(); // EconMLSID } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSIDL()" ); } // ----------------------------------------------------------------------------- @@ -983,12 +897,10 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendSIDListL( ConML_SIDListPtr_t aContent ) { - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSIDListL()" ); for ( ConML_SIDListPtr_t p = aContent; p && p->data; p=p->next ) { AppendSIDL( p->data ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSIDListL()" ); } // ----------------------------------------------------------------------------- @@ -996,7 +908,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendDeviceInfoL( ConML_DeviceInfoPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendDeviceInfoL()" ); if ( aContent ) { BeginElementL( EConMLDeviceInfo, ETrue ); @@ -1005,7 +916,6 @@ AppendPCDataL(EConMLMaxObjectSize, aContent->maxObjectSize ); EndElementL(); // EConMLDeviceInfo } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendDeviceInfoL()" ); } // ----------------------------------------------------------------------------- @@ -1013,14 +923,12 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendFilesL( ConML_FilesPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendFilesL()" ); if ( aContent ) { BeginElementL( EConMLFiles, ETrue ); AppendFileListL( aContent->file ); EndElementL(); // EConMLFiles } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendFilesL()" ); } // ----------------------------------------------------------------------------- @@ -1029,7 +937,6 @@ void CSConConMLGenerator::AppendSupportedMethodsL ( ConML_SupportedMethodsPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendSupportedMethodsL()" ); if ( aContent ) { BeginElementL( EConMLSupportedMethods, ETrue ); @@ -1071,7 +978,6 @@ } EndElementL(); // EConMLSupportedMethods } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendSupportedMethodsL()" ); } // ----------------------------------------------------------------------------- @@ -1079,7 +985,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendFileListL( ConML_FileListPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendFileListL()" ); if ( aContent ) { for ( ConML_FileListPtr_t p = aContent; p && p->data; p = p->next ) @@ -1087,7 +992,6 @@ AppendFileL(p->data ); } } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendFileListL()" ); } // ----------------------------------------------------------------------------- @@ -1095,7 +999,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendFileL( ConML_FilePtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendFileL()" ); if ( aContent ) { BeginElementL( EConMLFile, ETrue ); @@ -1105,7 +1008,6 @@ AppendPCDataL( EConMLUserPerm, aContent->userPerm ); EndElementL(); // EConMLFile } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendFileL()" ); } // ----------------------------------------------------------------------------- @@ -1129,8 +1031,7 @@ iWBXMLWorkspace->Rollback(); return KWBXMLGeneratorBufferFull; } - LOGGER_WRITE_1( "CSConConMLGenerator::HandleResult()\ - : returned %d", aResult); + LOGGER_WRITE_1( "CSConConMLGenerator::HandleResult() : returned %d", aResult); return aResult; } @@ -1167,7 +1068,6 @@ void CSConConMLGenerator::BeginElementL( TUint8 aElement, TBool aHasContent, TBool aHasAttributes ) { - LOGGER_ENTERFN( "CSConConMLGenerator::BeginElementL()" ); IndentL(); iXMLWorkspace->WriteL(KXMLTagStart()); iXMLWorkspace->WriteL(TranslateElement(aElement)); @@ -1195,7 +1095,6 @@ iDontNewLine = EFalse; WriteMUint32L(aElement); - LOGGER_LEAVEFN( "CSConConMLGenerator::BeginElementL()" ); } // ----------------------------------------------------------------------------- @@ -1203,7 +1102,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::EndElementL() { - LOGGER_ENTERFN( "CSConConMLGenerator::EndElementL()" ); TUint8 elem = iElemStack[0]; iElemStack.Remove(0); if( !iDontIndent ) @@ -1217,8 +1115,6 @@ iXMLWorkspace->WriteL(KXMLNewLine()); iWBXMLWorkspace->WriteL(END); - - LOGGER_LEAVEFN( "CSConConMLGenerator::EndElementL()" ); } // ----------------------------------------------------------------------------- @@ -1227,7 +1123,6 @@ void CSConConMLGenerator::AddElementL( TUint8 aElement, const TDesC8& aContent, const TWBXMLContentFormat aFormat ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AddElementL()" ); iDontNewLine = ETrue; BeginElementL(aElement, ETrue); if( aFormat == EWBXMLContentFormatOpaque ) @@ -1240,7 +1135,6 @@ } iDontIndent = ETrue; EndElementL(); - LOGGER_LEAVEFN( "CSConConMLGenerator::AddElementL()" ); } // ----------------------------------------------------------------------------- @@ -1248,7 +1142,6 @@ // ----------------------------------------------------------------------------- void CSConConMLGenerator::AppendPCDataL( TUint8 aElement, pcdataPtr_t aContent ) { - LOGGER_ENTERFN( "CSConConMLGenerator::AppendPCDataL()" ); if( !aContent ) { return; @@ -1264,7 +1157,6 @@ { LOGGER_WRITE( "CSConConMLGenerator::AppendPCDataL() : Data type not Opaque - ignoring " ); } - LOGGER_LEAVEFN( "CSConConMLGenerator::AppendPCDataL()" ); } // ----------------------------------------------------------------------------- @@ -1272,8 +1164,6 @@ // ----------------------------------------------------------------------------- TPtrC8 CSConConMLGenerator::WBXMLDocument() { - LOGGER_ENTERFN( "CSConConMLGenerator::WBXMLDocument()" ); - LOGGER_LEAVEFN( "CSConConMLGenerator::WBXMLDocument()" ); return iWBXMLWorkspace->Buffer(); } @@ -1282,7 +1172,5 @@ // ----------------------------------------------------------------------------- TPtrC8 CSConConMLGenerator::XMLDocument() { - LOGGER_ENTERFN( "CSConConMLGenerator::XMLDocument()" ); - LOGGER_LEAVEFN( "CSConConMLGenerator::XMLDocument()" ); return iXMLWorkspace->Buffer(); } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlhandler.cpp --- a/connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlhandler.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlhandler.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -169,8 +169,6 @@ // TPtrC8 CSConConMLHandler::WBXMLDocument() { - LOGGER_ENTERFN( "CSConConMLHandler::WBXMLDocument()" ); - LOGGER_LEAVEFN( "CSConConMLHandler::WBXMLDocument()" ); return iGenerator->WBXMLDocument(); } @@ -181,8 +179,6 @@ // TPtrC8 CSConConMLHandler::XMLDocument() { - LOGGER_ENTERFN( "CSConConMLHandler::XMLDocument()" ); - LOGGER_LEAVEFN( "CSConConMLHandler::XMLDocument()" ); return iGenerator->XMLDocument(); } @@ -318,7 +314,6 @@ // TUint8 CSConConMLHandler::ReadUint8L() { - LOGGER_ENTERFN( "CSConConMLHandler::ReadUint8L()" ); if ( iPos == iParseBuffer->Size()) { User::Leave ( KErrEof ); @@ -330,8 +325,6 @@ iPos+= sizeof(TUint8); value = ptr[0]; CleanupStack::PopAndDestroy(1); //data - LOGGER_WRITE_1( "CSConConMLHandler::ReadUint8L()\ - : returned %d ", value ); return value; } @@ -342,7 +335,6 @@ // TUint32 CSConConMLHandler::ReadMUint32L() { - LOGGER_ENTERFN( "CSConConMLHandler::ReadMUint32L()" ); TUint32 result = 0; TUint8 c; @@ -351,8 +343,6 @@ result = (result << 7) | (c & 0x7f); } while ( c & 0x80 ); - LOGGER_WRITE_1( "CSConConMLHandler::ReadMUint32L()\ - : returned %d ", result ); return result; } @@ -363,7 +353,6 @@ // TPtrC8 CSConConMLHandler::ReadStrIL() { - LOGGER_ENTERFN( "CSConConMLHandler::ReadStrIL()" ); iBuffer->Reset(); RBufWriteStream bws(*iBuffer); TUint8 c; @@ -372,7 +361,6 @@ bws.WriteUint8L(c); } bws.CommitL(); - LOGGER_LEAVEFN( "CSConConMLParser::ReadStrIL()" ); return iBuffer->Ptr(0); } @@ -383,7 +371,6 @@ // void CSConConMLHandler::ReadStringTableL() { - LOGGER_ENTERFN( "CSConConMLHandler::ReadStringTableL()" ); delete iStringTable; iStringTable = NULL; TUint32 strTblLen = ReadMUint32L(); @@ -400,7 +387,6 @@ iParseBuffer->Read(iPos, ptr, strTblLen); iPos+=strTblLen; } - LOGGER_LEAVEFN( "CSConConMLHandler::ReadStringTableL()" ); } // ----------------------------------------------------------------------------- @@ -410,14 +396,12 @@ // TPtrC8 CSConConMLHandler::StringTableString( TUint32 aIndex ) { - LOGGER_ENTERFN( "CSConConMLHandler::StringTableString()" ); TPtrC8 temp(iStringTable->Mid(aIndex)); TInt pos = temp.Find(KWBXMLNull()); if( pos != KErrNotFound ) { temp.Set(temp.Left(pos)); } - LOGGER_LEAVEFN( "CSConConMLHandler::StringTableString()" ); return temp; } @@ -428,7 +412,6 @@ // void CSConConMLHandler::HandleElementL( TUint8 aId ) { - LOGGER_ENTERFN( "CSConConMLHandler::HandleElementL()" ); TUint8 tag(TUint8(aId & 0x3f)); iGenerator->StartElementL( tag ); @@ -441,7 +424,6 @@ { iGenerator->EndElementL(tag); } - LOGGER_LEAVEFN( "CSConConMLHandler::HandleElementL()" ); } // ----------------------------------------------------------------------------- @@ -451,7 +433,6 @@ // TPtrC8 CSConConMLHandler::ReadOpaqueL() { - LOGGER_ENTERFN( "CSConConMLHandler::ReadOpaqueL()" ); iBuffer->Reset(); RBufWriteStream bws(*iBuffer); TUint32 length = ReadMUint32L(); @@ -468,7 +449,6 @@ bws.CommitL(); CleanupStack::PopAndDestroy(1); // data - LOGGER_LEAVEFN( "CSConConMLHandler::ReadOpaqueL()" ); return iBuffer->Ptr(0); } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bld/bld.inf --- a/omads/omadsextensions/adapters/bld/bld.inf Wed Jun 23 18:02:53 2010 +0300 +++ b/omads/omadsextensions/adapters/bld/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 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" @@ -30,3 +30,12 @@ #include "../notes/group/bld.inf" #endif +#include "../contactsgroup/group/bld.inf" + +#include "../mediads/group/bld.inf" + +// #include "../bookmark/group/bld.inf" + +#include "../mms/group/bld.inf" + +#include "../sms/group/bld.inf" \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/102751ba.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/group/102751ba.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,19 @@ + + + Bookmarks + SYNCML-SYNC + 2.0 + + text/x-vbookmark + bookmarks + + + SyncProfile + HostAddress=PC Suite Data Sync + Database=bookmarks + + + Databases + Web Feeds=50000 + + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,30 @@ +/* +* 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: build info file for Bookmark DS Plugin +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +./102751ba.xml Z:/private/101F99F6/capability/102751ba.xml +./bookmarkdsa_stub.sis /epoc32/data/z/system/install/bookmarkdsa_stub.sis +../rom/bookmarkdsa.iby CORE_APP_LAYER_IBY_EXPORT_PATH(bookmarkdsa.iby) +../loc/bookmarkdsa.loc APP_LAYER_LOC_EXPORT_PATH(bookmarkdsa.loc) + +PRJ_MMPFILES +./bookmarkdataprovider.mmp diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/bookmarkdataprovider.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/group/bookmarkdataprovider.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2005-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: Project definition file for project Bookmark DS Plugin +* +*/ + + +#include +#include +#include + +TARGET bookmarkdataprovider.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x102751BA + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE bookmarkdataprovider.cpp +SOURCE bookmarkdatastore.cpp +SOURCE vbookmarkconverter.cpp +SOURCE omadsfolderobject.cpp +SOURCE conversionutil.cpp +SOURCE changefinder.cpp +SOURCE snapshotitem.cpp + +USERINCLUDE ../inc + +APP_LAYER_SYSTEMINCLUDE + +START RESOURCE bookmarkdataprovider.rss +HEADER +TARGET bookmarkdataprovider.rsc +TARGETPATH ECOM_RESOURCE_DIR +END + +START RESOURCE bookmarkdatastore.rss +HEADER +TARGET bookmarkdatastore.rsc +TARGETPATH RESOURCE_FILES_DIR +END + +START RESOURCE bookmarkdsa.rss +HEADER +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END + +DEBUGLIBRARY flogger.lib +LIBRARY euser.lib +LIBRARY estor.lib +LIBRARY ecom.lib +LIBRARY smldataprovider.lib +LIBRARY favouritesengine.lib +LIBRARY bafl.lib +LIBRARY nsmlchangefinder.lib +LIBRARY efsrv.lib +LIBRARY smlstoreformat.lib +LIBRARY SenXml.lib +LIBRARY charconv.lib +LIBRARY sysutil.lib +LIBRARY commonengine.lib // For resource reader +LIBRARY FeedsServerClient.lib +LIBRARY hash.lib \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/bookmarkdsa_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/group/bookmarkdsa_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,33 @@ +; +; Copyright (c) 2009-2010 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: Stub sis file for Bookmark datasync adapter +; + +; Languages +&EN + +; Header +#{"Bookmark DS Plugin"},(0x102751BA),2,0,0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Files to install +""-"z:\resource\bookmarkdsa.rsc" +""-"z:\resource\bookmarkdatastore.rsc" +""-"z:\resource\plugins\bookmarkdataprovider.rsc" +""-"z:\sys\bin\bookmarkdataprovider.dll" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/bookmarkdsa_stub.sis Binary file omads/omadsextensions/adapters/bookmark/group/bookmarkdsa_stub.sis has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/group/createstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/group/createstub.bat Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Batch file for creating needed stub files. +rem + +makesis -s bookmarkdsa_stub.pkg \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/bookmarkdataprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/bookmarkdataprovider.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __BOOKMARKDATAPROVIDER_H__ +#define __BOOKMARKDATAPROVIDER_H__ + +#include +#include + +class CBookmarkDataProvider : public CSmlDataProvider + { +private: + // Default C++ constructor + CBookmarkDataProvider(); + + // 2nd phase of constructor + void ConstructL(); + +public: + + // Two-phased constructor + static CBookmarkDataProvider* NewL(); + + // Destructor + virtual ~CBookmarkDataProvider(); + +protected: + + virtual void DoOnFrameworkEvent( TSmlFrameworkEvent, TInt aParam1, TInt aParam2 ); + + virtual TBool DoSupportsOperation( TUid aOpId ) const; + + virtual const CSmlDataStoreFormat& DoStoreFormatL(); + + virtual CDesCArray* DoListStoresLC(); + + virtual const TDesC& DoDefaultStoreL(); + + virtual CSmlDataStore* DoNewStoreInstanceLC(); + + virtual const RPointerArray& DoSupportedServerFiltersL(); + + virtual void DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& aServerDataStoreFormat, + RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual void DoCheckServerFiltersL( RPointerArray& aFilters, + TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual HBufC* DoGenerateRecordFilterQueryLC( const RPointerArray& aFilters, + TSyncMLFilterMatchType aMatch, TDes& aFilterMimeType, + TSyncMLFilterType& aFilterType, TDesC& aStoreName ); + + virtual void DoGenerateFieldFilterQueryL( const RPointerArray& aFilters, + TDes& aFilterMimeType, RPointerArray& aProperties, TDesC& aStoreName ); + +private: + + CSmlDataStoreFormat* DoOwnStoreFormatL(); + +private: + + CSmlDataStoreFormat* iOwnStoreFormat; + RStringPool iStringPool; + RPointerArray iFilters; + RFs iRFs; + + }; + +#endif // __BOOKMARKDATAPROVIDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/bookmarkdataproviderdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/bookmarkdataproviderdefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __BOOKMARKDATAPROVIDERDEFS_H__ +#define __BOOKMARKDATAPROVIDERDEFS_H__ + + +// ------------------------------------------------------------------------------------------------ +// Databases +// ------------------------------------------------------------------------------------------------ + +// Resource file for CSmlDataStoreFormat + +// The following works with DS plugin added into ROM image +_LIT(KBookmarkStoreFormatRscRom,"z:bookmarkdatastore.rsc"); + +// The following works with DS plugin installed from SIS +_LIT(KBookmarkStoreFormatRsc,"bookmarkdatastore.rsc"); + + +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +// Macros +// ------------------------------------------------------------------------------------------------ +#define SAFEDELETE(x) {if(x) {delete x; x = NULL;}} +#define SAFEDELETEARRAY(x) {if(x) {delete[] x; x = NULL;}} + +#endif // __BOOKMARKDATAPROVIDERDEFS_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/bookmarkdatastore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/bookmarkdatastore.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,205 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __BOOKMARKDATASTORE_H__ +#define __BOOKMARKDATASTORE_H__ + +#include +#include +#include + +#include +#include + +class CNSmlDataItemUidSet; +class CFavouritesItem; +class CBookmarkConversionUtil; +class RFeedsServer; +class CChangeFinder; +class TSnapshotItem; + +class CBookmarkDataStore : public CSmlDataStore, + public MFolderItemObserver, + public MFeedsServerObserver + { +private: + + CBookmarkDataStore(); + ~CBookmarkDataStore(); + +public: + + static CBookmarkDataStore* NewL(); + static CBookmarkDataStore* NewLC(); + void ConstructL(); + + // Transactions (optional) + void DoBeginTransactionL(); + void DoCommitTransactionL(TRequestStatus& aStatus); + void DoRevertTransaction(TRequestStatus& aStatus); + + // Batching (optional) + void DoBeginBatchL(); + void DoCommitBatchL(RArray& aResultArray, TRequestStatus& aStatus); + void DoCancelBatch(); + + // Opens data store asynchronously + void DoOpenL(const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus); + // Cancels current asynchronous request + void DoCancelRequest(); + // Returns the name of open database, empty if OpenL hasn't been called + const TDesC& DoStoreName() const; + // Sets remote server data format + void DoSetRemoteStoreFormatL(const CSmlDataStoreFormat& aServerDataStoreFormat); + // Sets the remote server maximum object size + void DoSetRemoteMaxObjectSize(TInt aServerMaxObjectSize); + // Returns maximum object size, reported by remote server + TInt DoMaxObjectSize() const; + + // Opens item for reading + void DoOpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, TRequestStatus& aStatus); + // Initializes new item to data store + void DoCreateItemL(TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, TRequestStatus& aStatus); + // Initializes replace of item in data store + void DoReplaceItemL(TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool aFieldChange, TRequestStatus& aStatus); + // Reads data from opened item + void DoReadItemL(TDes8& aBuffer); + // Writes data to created or replaced item + void DoWriteItemL(const TDesC8& aData); + // Commits the created or replaced item to database + void DoCommitItemL(TRequestStatus& aStatus); + // Closes the opened item + void DoCloseItem(); + // Moves item in the database + void DoMoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus); + // Deletes item from the database + void DoDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + // Soft deletes item (if supported by plugin adapter), can be equal to DoDeleteItemL + void DoSoftDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + // Deletes all items from the database + void DoDeleteAllItemsL(TRequestStatus& aStatus); + + // Returns, whether data store has history info. EFalse means slow sync + TBool DoHasSyncHistory() const; + // Returns ids of items, which are added after previous synchronization + const MSmlDataItemUidSet& DoAddedItems() const; + // Returns ids of items, which are deleted after previous synchronization + const MSmlDataItemUidSet& DoDeletedItems() const; + // Returns ids of items, which are soft-deleted after previous synchronization + const MSmlDataItemUidSet& DoSoftDeletedItems() const; + // Returns ids of items, which are modified after previous synchronization + const MSmlDataItemUidSet& DoModifiedItems() const; + // Returns ids of items, which are moved after previous synchronization + const MSmlDataItemUidSet& DoMovedItems() const; + // Resets change information of items (makes all items new from DS point of view) + void DoResetChangeInfoL(TRequestStatus& aStatus); + // Commits the changes, that are sent into the remote server + void DoCommitChangeInfoL(TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems); + // Commits the changes, that are sent into the remote server + void DoCommitChangeInfoL(TRequestStatus& aStatus); + +private: // From MFolderItemObserver + void FolderItemRequestCompleted(TInt aStatus, CRequestHandler::TRequestHandlerType); + void FolderItemChanged() {}; +private: // From MFeedsServerObserver + void UpdateAllProgress(TInt, TInt ) {}; + void SettingsChanged( TInt ) {}; +private: // From MConnectionObserver + virtual void NetworkConnectionNeededL(TInt* /*aConnectionPtr*/, TInt& /*aSockSvrHandle*/, + TBool& /*aNewConn*/, TApBearerType& /*aBearerType*/){}; +private: + void DoFolderItemRequestCompletedL( TInt aStatus ); + void CreateRssItemL( TInt aRssParentUid, const TDesC& aName, const TDesC& aUrl, TBool aIsFolder ); + void ReplaceRssItemL( TInt aRssItemUid, const TDesC& aNewName, const TDesC& aNewUrl ); + void RssItemCreatedL(); + void RssItemReplacedL( TBool& aMoveNeeded ); + void RegisterSnapshotL(); + void RegisterToSnapshotL( CArrayFixSeg* aSnapshot, TInt aFolderUid ); + void RegisterRssFeedsToSnapshotL( CArrayFixSeg* aSnapshot, + const CFolderItem& folder ); + void AssignString( TDes8& aDestination, const TDesC8& aSource ); + + // Data store states + enum TState + { + EClosed = 0, + EOpenAndWaiting, + EBookmarkOpen, + EBookmarkCreating, + EBookmarkUpdating, + EBookmarkUpdatedAndMoving, + EBookmarkMoving, + EBookmarkDeleting, + EBookmarkDeletingAll + }; + + TState iCurrentState; + + RFs iRfs; + RFavouritesSession iSession; + RFavouritesDb iDb; + TBool iDataBaseOpened; + + RFeedsServer iFeedsServer; + RFolderItem iRootFolder; + + TRequestStatus* iCallerStatus; + + /** + * Key that is used in sorting snapshot. + */ + const TKeyArrayFix iKey; + + /** + * Change finder, used to determine db modifications. + */ + CChangeFinder* iChangeFinder; + + /** + * Bookmark item converter, used to convert xml and vBookmark data. + */ + CBookmarkConversionUtil* iConverter; + + TInt* iCurrentItem; + TInt iReplaceItem; + TSnapshotItem* iMovedItem; + + CBufFlat* iDataBuffer; + TInt iWriterPosition; + TInt iReaderPosition; + + TBool iHasHistory; + + CNSmlDataItemUidSet* iNewItems; + CNSmlDataItemUidSet* iDeletedItems; + CNSmlDataItemUidSet* iSoftDeletedItems; + CNSmlDataItemUidSet* iUpdatedItems; + CNSmlDataItemUidSet* iMovedItems; + + CFavouritesItem::TType iMimeType; + TInt iParentFolder; + TFileName iNewItemName; + + CFavouritesItem* iItemToBeReplaced; + + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/changefinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/changefinder.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,214 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __CHANGEFINDER_H__ +#define __CHANGEFINDER_H__ + +// INCLUDES +#include +#include "snapshotitem.h" + +// DATATYPES +typedef CArrayFixSeg CSnapshotArray; + +// Granularity used with dynamic array +const TInt KSnapshotGranularity = 32; + +// CLASS DECLARATION + +/** +* @brief CChangeFinder Class +* This is a ChangeFinder class, which can be used to track down changes in the bookmark store. +* It's functionality is equal to CSmlChangeFinder. Because neither of these classes contained virtual +* functionality, the functionality of this class couldn't be inherited from the CSmlChangeFinder +*/ +class CChangeFinder : public CBase + { +public: + + /** + * Class constructor, Creates a new class instance. + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + * @return CChangeFinder*, New ChangeFinder instance. + */ + static CChangeFinder* NewL( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TBool& aHasHistory, + TInt aStreamUid = KNSmlDefaultSnapshotStreamUID ); + + /** + * Class destructor. + */ + ~CChangeFinder(); + + /** + * Close ChangeFinder object, stores snapshot. + */ + void CloseL(); + + /** + * Reset change information, makes all content new from ChangeFinder point of view. + */ + void ResetL(); + + /** + * Find changed items by comparing snapshots. + * + * @param aChangedUids IN: Array for results. + */ + void FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ); + + /** + * Find deleted items by comparing snapshots. + * + * @param aDeletedUids IN: Array for results. + */ + void FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ); + + /** + * Find new items by comparing snapshots. + * + * @param aNewUids IN: Array for results. + */ + void FindNewItemsL(CNSmlDataItemUidSet& aNewUids); + + /** + * Find moved items by comparing snapshots. + * + * @param aMovedUids IN: Array for results. + */ + void FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ); + + /** + * Add item to snapshot, it is no loger reported. + * + * @param aItem IN: item to add. + */ + void ItemAddedL( const TSnapshotItem& aItem ); + + /** + * Delete item from snapshot, it is no loger reported. + * + * @param aItem IN: item to delete. + */ + void ItemDeletedL( const TSnapshotItem& aItem ); + + /** + * Update item to snapshot, it is no loger reported. + * + * @param aItem IN: item to update. + */ + void ItemUpdatedL( const TSnapshotItem& aItem ); + + /** + * Move item within snapshot, it is no loger reported. + * + * @param aItem IN: item to move. + */ + void ItemMovedL( const TSnapshotItem& aItem ); + + /** + * Commit all changes to snapshot, there's nothing to report anymore. + */ + void CommitChangesL(); + + /** + * Commit a set of items to snapshot, these items won't be reported anymore. + * + * @param aUids IN: a set of items to commit. + */ + void CommitChangesL( const MSmlDataItemUidSet& aUids ); + + /** + * Sets new snapshot to compare against. + * + * @param aNewSnapshot IN: a new snapshot. + */ + void SetNewSnapshot( CSnapshotArray* aNewSnapshot ); + + /** + * Retrieves DataStore id number. + * + * @return TInt64, DataStore id. + */ + TInt64 DataStoreUid() const; + + /** + * Sets DataStore id number. + * + * @param aUid IN: a new datastore id. + */ + void SetDataStoreUid( TInt64 aUid ); + +protected: + + /** + * C++ Constructor + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + */ + CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TInt aStreamUid ); + + /** + * 2nd-phase Constructor + * + * @param aHasHistory IN: ETrue, if there was synchronization history. + */ + void ConstructL( TBool& aHasHistory ); + +private: + + /** + * Allows access to streams. + */ + MSmlSyncRelationship& iSyncRelationship; + + /** + * New snapshot to compare against. + */ + CSnapshotArray* iCurrentSnapshot; + + /** + * Current snapshot. + */ + CSnapshotArray* iOldSnapshot; + + /** + * Key that is used in sorting snapshot. + */ + TKeyArrayFix iKey; + + /** + * Stream id number to access sync relationship. + */ + TInt iStreamUid; + + /** + * Data store id number. + */ + TInt64 iDataStoreUid; + }; + +#endif // __CHANGEFINDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/conversionutil.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/conversionutil.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2005-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: Conversion utility +* +*/ + + +#ifndef _CONVERSIONUTIL_H_ +#define _CONVERSIONUTIL_H_ + +#include + +class COMADSFolderObject; +class CVBookmarkConverter; +class CFolderItem; + +class CBookmarkConversionUtil : public CBase +{ +public: + static CBookmarkConversionUtil* NewL(); + static CBookmarkConversionUtil* NewLC(); + + ~CBookmarkConversionUtil(); + + void FavouritesItemToBufferL( const CFavouritesItem& aItem, + CBufFlat& aBuffer ); + + void RssItemToBufferL( const CFolderItem& aItem, + CBufFlat& aBuffer); + + TInt BufferToFavouritesItemL( CFavouritesItem::TType aType, + CBufFlat& aBuffer, CFavouritesItem& aItem ); + +private: + + void ConstructL(); + + COMADSFolderObject* iOmaConverter; + CVBookmarkConverter* iVBookmarkConverter; +}; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/logger.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,123 @@ +/* +* Copyright (c) 2005-2008 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: Logging macros used by DS plug-in adapters +* +*/ + + +#ifndef _LOGGER_H +#define _LOGGER_H + +#ifdef _DEBUG + + // Define this to enable file logging + #define __FLOGGING__ + + #include + #ifdef __FLOGGING__ + #include + #include + #endif + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT( KLogDir, "BMKDS" ); + _LIT( KLogFile, "BookmarkLog.txt" ); + + #define LOGGER_ENTERFN( name ) {TRACE_FUNC_ENTRY;} + #define LOGGER_LEAVEFN( name ) {TRACE_FUNC_EXIT;} + + _LIT(KTracePrefix16, "[BMKDS] "); + _LIT8(KTracePrefix8, "[BMKDS] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE8_1( text,par1 ) {_LIT8( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + #define LOGGER_WRITE_3( text,par1,par2,par3 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2, par3 );} + #define LOGGER_WRITE_IFERR_2( text, err ) {if (err) {_LIT( KTemp, text ); FPrint( KTemp, err );}} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + // Declare the FPrint function + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else + + // No loggings --> reduced code size + + #define LOGGER_ENTERFN( name ) + #define LOGGER_LEAVEFN( name ) + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text, par1 ) + #define LOGGER_WRITE8_1( text,par1 ) + #define LOGGER_WRITE_2( text, par1, par2 ) + #define LOGGER_WRITE_3( text, par1, par2, par3 ) + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + +#endif //_DEBUG + +#endif // __LOGGER_H__ + +// End of file + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/omadsfolderobject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/omadsfolderobject.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2005-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: OMA DS Folder object XML parser +* +*/ + + +#ifndef __OMADSFOLDEROBJECT_H__ +#define __OMADSFOLDEROBJECT_H__ + +#include +#include +#include + + +const TInt KMaxFolderNameLength = KFavouritesMaxName; +const TInt KMaxElementLength = 255; +const TInt KMaxXmlLineLength = 1024; + +class CSenXmlReader; +class CFolderItem; + +class COMADSFolderObject : public CBase, public MSenContentHandlerClient +{ +public: + + static COMADSFolderObject* NewLC(); + static COMADSFolderObject* NewL(); + ~COMADSFolderObject(); + + // Get methods + inline const TDesC& GetName() const {return iName;} + inline const TDateTime& GetCreatedDate() const {return iCreatedDate;} + inline const TDateTime& GetModifiedDate() const {return iModifiedDate;} + + // Set methods + inline void SetName(const TDesC& aName) {iName.Copy(aName);} + inline void SetCreatedDate(const TDateTime& aDateTime) {iCreatedDate = aDateTime;} + inline void SetModifiedDate(const TDateTime& aDateTime) {iModifiedDate = aDateTime;} + + // Import & export + TInt ImportFolderXml(const TDesC8& aData); + TInt ImportFolderXml(RFs& aFs, const TDesC& aFilename); + void ExportFolderXmlL(TDes8& aBuffer); + void ExportFolderXmlL(CBufBase& aBuffer); + void ExportDbItemL(CFavouritesItem& aItem); + void ImportDbItem(const CFavouritesItem& aItem); + void ImportDbItem(const CFolderItem& aItem); + + // MSenContentHandlerClient virtual functionality + TInt StartDocument(); + TInt EndDocument(); + TInt StartElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName, + const RAttributeArray& apAttrs); + TInt EndElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName); + TInt Characters(const TDesC8& aBuf, TInt aStart, TInt aLength); + TInt Error(TInt aErrorCode); + +private: + void ConstructL(); + void ExportL(); + void WriteL(const TDesC &aData); + void WriteEncodedXmlL(const TDesC &aData); + void ReadFolderNameL( TDes& aName, const TInt aResID ); + void Reset(); + TInt ParseDateString(const TDesC8& aString, TDateTime& aDateTime); + +private: + CSenXmlReader* iXmlReader; + TBuf8 iCurrentElement; + TBuf8 iTemp; + TBuf iName; + TDateTime iCreatedDate; + TDateTime iModifiedDate; + TInt iError; + CBufBase* iBuffer; + TInt iWriteBufPosition; + TInt iWriteBufSize; + TDes8* iDesc; +}; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/snapshotitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/snapshotitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,93 @@ +/* +* 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: Private snapshot item header +* +*/ + + +#ifndef __SNAPSHOTITEM_H__ +#define __SNAPSHOTITEM_H__ + +// INCLUDES + +#include +#include + + +// CLASS DECLARATION + +// Defines the maximum length of a hash. +const TInt KMaxHashLength = 20; +typedef TBuf8 THashValue; + +/** +* @brief TSnapshotItem +* This class represents a single item in the ChangeFinder snapshot. +* It's derived from the generic snapshot item and extended +* to contain the hash (name and url) information. +*/ +class TSnapshotItem : public TNSmlSnapshotItem + { +public: + + /** + * Constructor + */ + TSnapshotItem(); + + /** + * Constructor + * + * @param aItemId IN: id of the item. + * @param aParent IN: parent item, 0 as default. + */ + TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent = 0 ); + + /** + * Writes the item to a stream. + * + * @param aStream IN: a reference to a stream, where this item is to be written. + */ + void ExternalizeL( RWriteStream& aStream ) const; + + /** + * Reads item from a stream. + * + * @param aStream IN: a reference to a stream, where this item is read from. + */ + void InternalizeL( RReadStream& aStream ); + + /** + * Creates hash from name and url + * + * @param aName, name to used + * @param aUrl, url to used + * @return none. + */ + void CreateHashL( const TDesC& aName, const TDesC& aUrl ); + + /** + * Reads hash + * + * @return TDesC8& hash. + */ + const TDesC8& Hash() const; + +private: + + THashValue iHash; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/inc/vbookmarkconverter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/inc/vbookmarkconverter.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2005-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: Bookmark object conversion routines +* +*/ + + +#ifndef __VBOOKMARKCONVERTER_H__ +#define __VBOOKMARKCONVERTER_H__ + +#include + +class CFavouritesItem; +class CFolderItem; + +typedef enum + { + ENoEncoding = 0, + EQuotedPrintable + } TBookmarkEncoding; + +class CVBookmarkConverter : public CBase + { +public: + + static CVBookmarkConverter* NewL(); + static CVBookmarkConverter* NewLC(); + ~CVBookmarkConverter(); + + // Get + const TDesC& GetVersion() const; + const TDesC& GetUrl() const; + const TDesC& GetTitle() const; + const TDesC& GetInternetShortcut() const; + + // Set + void SetVersionL( const TDesC& aVersion ); + void SetVersionL( const TDesC8& aVersion ); + + void SetUrlL( const TDesC& aUrl ); + void SetUrlL( const TDesC8& aUrl ); + + void SetTitleL( const TDesC& aTitle ); + void SetTitleL( const TDesC8& aTitle, TBookmarkEncoding aEncoding = ENoEncoding ); + + void SetInternetShortcutL( const TDesC& aInternetShortcut ); + void SetInternetShortcutL( const TDesC8& aInternetShortcut ); + + void ExportDbItemL( CFavouritesItem& aItem ); + void ImportDbItemL( const CFavouritesItem& aItem ); + void ImportDbItemL( const CFolderItem& aItem ); + + + // Export / Import VBookmark info from/to this object + void ExportVBookmarkL( TDes8& aBuffer ); + void ExportVBookmarkL( CBufBase& aBuffer ); + + TInt ImportVBookmarkL( const TDesC8& aBuffer ); + +private: + + CVBookmarkConverter(); + void ConstructL(); + + void WriteMessageLineL( const TDesC8& aMsgLineTag, const TDesC8& aMsgLineData, + const TDesC8& aSeparator ); + + void WriteEnvelopeL(); + + void ExportL(); + + void ResetL(); + + TInt ReadTagAndValue( const TDesC8& aBuffer, TInt& aPosition, + TPtrC8& aTag, TPtrC8& aValue, TPtrC8& aProperties ); + + TInt ReadEnvelopeL( const TDesC8& aBuffer, TInt& aPosition ); + + TInt ReadAssignment( const TDesC8& aBuffer, TInt& aPosition, + TPtrC8& aTag, TPtrC8& aValue ); + + void WriteL( const TDesC8 &aData ); + + void IgnoreSpaces( TPtrC8& aData ); + + TBookmarkEncoding Encoding( TPtrC8& aProperties ); + + HBufC8* DecodeQuotedPrintableLC( const TDesC8& aEncodedData ); + +private: + + HBufC* iVersion; + HBufC* iUrl; + HBufC* iTitle; + HBufC* iInternetShortcut; + CBufBase* iBuffer; + TInt iWriteBufPosition; + TInt iWriteBufSize; + TDes8* iDesc; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/loc/bookmarkdsa.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/loc/bookmarkdsa.loc Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,54 @@ +/* +* 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: Localization strings for project Bookmark DS adapter +* +*/ + + + +// d: Boomark folder "Download applications" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_applications "Download applications" + +// d: Boomark folder "Download images" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_images "Download images" + +// d: Boomark folder "Download tones" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_tones "Download tones" + +// d: Boomark folder "Download videos" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_videos "Download videos" + +// d: Boomark folder "Download skins" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_skins "Download skins" + +// d: Boomark folder "Download music" +// l: None +// r: 5.0 +// +#define qtn_bookmarkdsa_folder_download_music "Download music" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/rom/bookmarkdsa.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/rom/bookmarkdsa.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,28 @@ +/* +* 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: IBY file for Bookmark DS adapter binaries +* +*/ + + +#ifndef __BOOKMARKDSA_IBY__ +#define __BOOKMARKDSA_IBY__ + +ECOM_PLUGIN(bookmarkdataprovider.dll,bookmarkdataprovider.rsc) +data=DATAZ_\RESOURCE_FILES_DIR\bookmarkdatastore.rsc RESOURCE_FILES_DIR\bookmarkdatastore.rsc +data=DATAZ_\RESOURCE_FILES_DIR\bookmarkdsa.rsc RESOURCE_FILES_DIR\bookmarkdsa.rsc +data=DATAZ_\private\101F99F6\capability\102751BA.XML private\101F99F6\capability\102751BA.XML +data=ZSYSTEM\install\bookmarkdsa_stub.sis system\install\bookmarkdsa_stub.sis + +#endif //__BOOKMARKDSA_IBY__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/sis/backup_registration.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/sis/bookmarkdsa.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/sis/bookmarkdsa.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,41 @@ +; +; Copyright (c) 2010 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: Sis file for Bookmark datasync adapter +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Bookmark DS Plugin"},(0x102751BA),2,0,0, TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\bookmarkdsa.rsc" -"c:\resource\bookmarkdsa.rsc" +"\epoc32\data\z\resource\bookmarkdatastore.rsc" -"c:\resource\bookmarkdatastore.rsc" +"\epoc32\data\z\resource\plugins\bookmarkdataprovider.rsc" -"c:\resource\plugins\bookmarkdataprovider.rsc" +"\epoc32\release\armv5\urel\bookmarkdataprovider.dll" -"c:\sys\bin\bookmarkdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\102751ba.xml" -"c:\private\101F99F6\import\102751ba.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FF972\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/sis/bookmarkdsa_debug.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/sis/bookmarkdsa_debug.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +; +; Copyright (c) 2010 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: +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Contacts Group DS Plugin"},(0x101FF972),1,23,0,TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\contactsgrpdatastore.rsc" -"c:\resource\contactsgrpdatastore.rsc" +"\epoc32\data\z\resource\plugins\contactsgrpdataprovider.rsc" -"c:\resource\plugins\contactsgrpdataprovider.rsc" +"\epoc32\release\ARMV5\UDEB\contactsgrpdataprovider.dll" -"c:\sys\bin\contactsgrpdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\101ff972.xml" -"c:\private\101F99F6\import\101ff972.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FF972\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/bookmarkdataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/bookmarkdataprovider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2005-2008 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include + +#include "bookmarkdataprovider.h" +#include "bookmarkdatastore.h" +#include "bookmarkdataproviderdefs.h" +#include "logger.h" + +const TUint KBookmarkDataProviderImplUid = 0x102751BA; + + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::CBookmarkDataProvider +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CBookmarkDataProvider::CBookmarkDataProvider(): iFilters( 1 ) + { + LOGGER_ENTERFN( "CBookmarkDataProvider" ); + LOGGER_LEAVEFN( "CBookmarkDataProvider" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CBookmarkDataProvider::ConstructL() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::ConstructL" ); + + User::LeaveIfError( iRFs.Connect() ); + iStringPool.OpenL(); + + LOGGER_LEAVEFN( "CBookmarkDataProvider::ConstructL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CBookmarkDataProvider* CBookmarkDataProvider::NewL() + { + LOGGER_ENTERFN("CBookmarkDataProvider::NewL"); + CBookmarkDataProvider* self = new ( ELeave ) CBookmarkDataProvider(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + LOGGER_LEAVEFN( "CBookmarkDataProvider::NewL" ); + return self; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::~CBookmarkDataProvider +// Destructor. +// ----------------------------------------------------------------------------- +CBookmarkDataProvider::~CBookmarkDataProvider() + { + LOGGER_ENTERFN( "~CBookmarkDataProvider" ); + + SAFEDELETE( iOwnStoreFormat ); + iStringPool.Close(); + iFilters.Close(); + iRFs.Close(); + + LOGGER_LEAVEFN( "~CBookmarkDataProvider" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoOnFrameworkEvent +// Not used +// ----------------------------------------------------------------------------- +void CBookmarkDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent, TInt /*aParam1*/, TInt /*aParam2*/ ) + { + LOGGER_ENTERFN("CBookmarkDataProvider::DoOnFrameworkEvent()"); + LOGGER_LEAVEFN("CBookmarkDataProvider::DoOnFrameworkEvent()"); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoSupportsOperation +// Checks whether data provider supports specific operation +// ----------------------------------------------------------------------------- +TBool CBookmarkDataProvider::DoSupportsOperation( TUid /*aOpId*/ ) const + { + LOGGER_ENTERFN("CBookmarkDataProvider::DoSupportsOperation()"); + LOGGER_LEAVEFN("CBookmarkDataProvider::DoSupportsOperation()"); + return EFalse; // optional operations are not supported + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +const CSmlDataStoreFormat& CBookmarkDataProvider::DoStoreFormatL() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoStoreFormatL" ); + + if (!iOwnStoreFormat) + { + iOwnStoreFormat = DoOwnStoreFormatL(); + } + + LOGGER_LEAVEFN( "CBookmarkDataProvider::DoStoreFormatL" ); + + return *iOwnStoreFormat; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoListStoresLC +// Returns array fo data stores that can be opened +// ----------------------------------------------------------------------------- +CDesCArray* CBookmarkDataProvider::DoListStoresLC() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoListStoresLC" ); + + CDesCArrayFlat* stores = new ( ELeave ) CDesCArrayFlat( 1 ); + CleanupStack::PushL( stores ); + stores->AppendL( KBrowserBookmarks ); + + LOGGER_LEAVEFN("CBookmarkDataProvider::DoListStoresLC"); + + return stores; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoDefaultStoreL +// Returns the name of the default data store +// ----------------------------------------------------------------------------- +const TDesC& CBookmarkDataProvider::DoDefaultStoreL() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoDefaultStoreL" ); + LOGGER_LEAVEFN( "CBookmarkDataProvider::DoDefaultStoreL" ); + + return KBrowserBookmarks; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoNewStoreInstanceLC +// Creates a new data store object, which can be used for synchronization +// ----------------------------------------------------------------------------- +CSmlDataStore* CBookmarkDataProvider::DoNewStoreInstanceLC() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoNewStoreInstanceLC" ); + + CBookmarkDataStore* newStore = CBookmarkDataStore::NewLC(); + + LOGGER_LEAVEFN( "CBookmarkDataProvider::DoNewStoreInstanceLC" ); + + return newStore; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +const RPointerArray& CBookmarkDataProvider::DoSupportedServerFiltersL() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoSupportedServerFiltersL" ); + LOGGER_LEAVEFN( "CBookmarkDataProvider::DoSupportedServerFiltersL" ); + return iFilters; // empty array + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoCheckSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataProvider::DoCheckSupportedServerFiltersL( + const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoCheckSupportedServerFiltersL" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoCheckServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataProvider::DoCheckServerFiltersL( RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoCheckServerFiltersL" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoGenerateRecordFilterQueryLC +// Filters are not supported +// ----------------------------------------------------------------------------- +HBufC* CBookmarkDataProvider::DoGenerateRecordFilterQueryLC( + const RPointerArray& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, + TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoGenerateRecordFilterQueryLC" ); + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoGenerateFieldFilterQueryL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataProvider::DoGenerateFieldFilterQueryL( + const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, + RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoGenerateFieldFilterQueryL" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataProvider::DoOwnStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CBookmarkDataProvider::DoOwnStoreFormatL() + { + LOGGER_ENTERFN( "CBookmarkDataProvider::DoOwnStoreFormatL" ); + + TParse* parse = new ( ELeave ) TParse(); + CleanupStack::PushL(parse); + TFileName fileName; + RResourceFile resourceFile; + + parse->Set( KBookmarkStoreFormatRscRom, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + LOGGER_WRITE_1( "file: %S", &fileName ); + + TRAPD( error, resourceFile.OpenL( iRFs, fileName ) ); + if ( error ) + { + LOGGER_WRITE_1( "RResourceFile::OpenL leaved with %d - try again", error ); + parse->Set( KBookmarkStoreFormatRsc, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + LOGGER_WRITE_1( "file: %S", &fileName ); + resourceFile.OpenL( iRFs, fileName ); + } + CleanupClosePushL( resourceFile ); + HBufC8* buffer = resourceFile.AllocReadLC( BOOKMARK_DATA_STORE ); + + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + + CleanupStack::Pop( dsFormat ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &resourceFile ); + CleanupStack::PopAndDestroy( parse ); + + LOGGER_LEAVEFN( "CBookmarkDataProvider::DoOwnStoreFormatL" ); + + return dsFormat; + } + +// ----------------------------------------------------------------------------- +// ImplementationTable +// Required by ECom plugin interface, tells the entry point of the library +// ----------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KBookmarkDataProviderImplUid, CBookmarkDataProvider::NewL ) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns the implementation table, required by the ECom plugin interface +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/bookmarkdataprovider.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/bookmarkdataprovider.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2005-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: Resource definitions for Bookmark DS ECOM plug-in +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x102751BA; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x101F4D3A; // Constant for all DS plug ins + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x102751BA; // DS interface implementation UID + version_no = 1; + display_name = "Bookmarks" ; // shown in UI + } + }; + } + }; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/bookmarkdatastore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/bookmarkdatastore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,2117 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include + +#include +#include +#include + +#include "bookmarkdatastore.h" +#include "vbookmarkconverter.h" +#include "omadsfolderobject.h" +#include "bookmarkdataproviderdefs.h" +#include "conversionutil.h" +#include "changefinder.h" +#include "logger.h" + + +_LIT8( KBookmarkFolderMimeType, "application/vnd.omads-folder+xml" ); +_LIT8( KBookmarkFolderMimeVersion, "" ); +_LIT8( KBookmarkItemMimeType, "text/x-vbookmark" ); +_LIT8( KBookmarkItemMimeVersion, "" ); +_LIT( KRSSRootFolderName, "Web Feeds" ); + +const TInt KDefaultBufferSize = 1024; +const TInt KDataBufferNotReady = -1; +const TInt KRssFeedsOffset = 50000; +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::CBookmarkDataStore +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CBookmarkDataStore::CBookmarkDataStore() : + iDataBaseOpened( EFalse ), iFeedsServer(*this), iRootFolder(*this), + iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem, ItemId() ), ECmpTInt ) ), + iHasHistory( EFalse ) + { + LOGGER_ENTERFN( "CBookmarkDataStore" ); + LOGGER_LEAVEFN( "CBookmarkDataStore" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::ConstructL +// Symbian 2nd phase constructor, can leave. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::ConstructL() + { + LOGGER_ENTERFN( "CBookmarkDataStore::ConstructL" ); + + User::LeaveIfError( iRfs.Connect() ); + User::LeaveIfError( iSession.Connect() ); + + iNewItems = new ( ELeave ) CNSmlDataItemUidSet; + iDeletedItems = new ( ELeave ) CNSmlDataItemUidSet; + iSoftDeletedItems = new ( ELeave ) CNSmlDataItemUidSet; + iUpdatedItems = new ( ELeave ) CNSmlDataItemUidSet; + iMovedItems = new ( ELeave ) CNSmlDataItemUidSet; + + LOGGER_LEAVEFN( "CBookmarkDataStore::ConstructL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::~CBookmarkDataStore +// Destructor +// ----------------------------------------------------------------------------- +CBookmarkDataStore::~CBookmarkDataStore() + { + LOGGER_ENTERFN( "~CBookmarkDataStore" ); + + delete iDataBuffer; + delete iNewItems; + delete iDeletedItems; + delete iSoftDeletedItems; + delete iUpdatedItems; + delete iMovedItems; + delete iItemToBeReplaced; + + if ( iChangeFinder ) + { + TRAPD( error, iChangeFinder->CloseL() ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iChangeFinder->CloseL() leaved with %d", error ); + } + } + delete iChangeFinder; + + delete iConverter; + + if ( iDataBaseOpened ) + { + iDb.Close(); + iRootFolder.Close(); + iFeedsServer.Close(); + } + + iSession.Close(); + iRfs.Close(); + LOGGER_LEAVEFN( "~CBookmarkDataStore" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CBookmarkDataStore* CBookmarkDataStore::NewL() + { + LOGGER_ENTERFN( "CBookmarkDataStore::NewL" ); + CBookmarkDataStore* self = CBookmarkDataStore::NewLC(); + CleanupStack::Pop( self ); + LOGGER_LEAVEFN( "CBookmarkDataStore::NewL" ); + return self; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CBookmarkDataStore* CBookmarkDataStore::NewLC() + { + LOGGER_ENTERFN( "CBookmarkDataStore::NewLC" ); + CBookmarkDataStore* self = new ( ELeave ) CBookmarkDataStore(); + CleanupStack::PushL( self ); + self->ConstructL(); + LOGGER_LEAVEFN( "CBookmarkDataStore::NewLC" ); + return self; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoOpenL +// Opens database. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoOpenL( const TDesC& /*aStoreName*/, + MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoOpenL" ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( iDataBaseOpened ) + { + User::RequestComplete( iCallerStatus, KErrInUse ); + LOGGER_WRITE( "CBookmarkDataStore::DoOpenL failed with KErrInUse." ); + return; + } + + // Create ChangeFinder + if ( iChangeFinder ) + { + delete iChangeFinder; + iChangeFinder = NULL; + } + iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory ); + + // Create converter object + if ( iConverter ) + { + delete iConverter; + iConverter = NULL; + } + iConverter = CBookmarkConversionUtil::NewL(); + + + TInt err( KErrNone ); + err = iDb.Open( iSession, KBrowserBookmarks ); + if ( err ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iDb.Open err: %d.", err ); + User::RequestComplete( iCallerStatus, err ); + return; + } + err = iFeedsServer.Connect(); + if ( err ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iFeedsServer.Connect err: %d.", err ); + User::RequestComplete( iCallerStatus, err ); + return; + } + err = iRootFolder.Open( iFeedsServer ); + if ( err ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iRootFolder.Open err: %d.", err ); + User::RequestComplete( iCallerStatus, err ); + return; + } + + iRootFolder.FetchRootFolderItemL(); // calls FolderItemRequestCompleted when completed + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoOpenL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::FolderItemRequestCompleted +// RSS item database request is completed +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::FolderItemRequestCompleted( TInt aStatus, + CRequestHandler::TRequestHandlerType ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::FolderItemRequestCompleted" ); + + TRAPD( err, DoFolderItemRequestCompletedL( aStatus ) ); + + if ( err != KErrNone ) + { + LOGGER_WRITE_1( "DoFolderItemRequestCompletedL leaved with err: %d", err ); + User::RequestComplete( iCallerStatus, err ); + } + + LOGGER_LEAVEFN( "CBookmarkDataStore::FolderItemRequestCompleted" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoFolderItemRequestCompletedL +// RSS item database request is completed +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoFolderItemRequestCompletedL( TInt aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoFolderItemRequestCompletedL" ); + switch ( iCurrentState ) + { + case EClosed : + { + LOGGER_WRITE("Database ready"); + iDataBaseOpened = ETrue; + iCurrentState = EOpenAndWaiting; + RegisterSnapshotL(); + break; + } + + // bookmark is added (Add command) + case EBookmarkCreating : + { + // RSS Item has been created. + LOGGER_WRITE_1("RSS item created, err %d", aStatus); + // Restore state + iCurrentState = EOpenAndWaiting; + if ( aStatus == KErrNone ) + { + RssItemCreatedL(); + } + break; + } + + // bookmark is updated (Replace command) + case EBookmarkUpdating : + { + LOGGER_WRITE("RSS item replaced"); + if ( aStatus == KErrNone ) + { + TBool moveNeeded(EFalse); + RssItemReplacedL( moveNeeded ); + + if ( moveNeeded ) + { + // Moving is still ongoing, don't complete request yet. + return; + } + + LOGGER_WRITE_1("Item ID: %d", *iCurrentItem); + LOGGER_WRITE_1("Parent ID: %d", iParentFolder); + } + // Restore state + iCurrentState = EOpenAndWaiting; + break; + } + + // bookmark is updated and moved (Replace command, 2nd phase) + case EBookmarkUpdatedAndMoving: + { + LOGGER_WRITE_1( "RSS item moved (replaced), err: %d", aStatus ); + if ( aStatus == KErrNone ) + { + // Inform ChangeFinder of updated item + iChangeFinder->ItemUpdatedL( *iMovedItem ); // ownership transferred + iMovedItem = NULL; + LOGGER_WRITE( "ItemReplacedL" ); + } + else + { + delete iMovedItem; + iMovedItem = NULL; + } + // Restore state + iCurrentState = EOpenAndWaiting; + break; + } + + // bookmark is moved (Move command) + case EBookmarkMoving: + { + LOGGER_WRITE_1( "RSS item moved, err: %d", aStatus ); + if ( aStatus == KErrNone ) + { + iChangeFinder->ItemMovedL( *iMovedItem ); // ownership transferred + iMovedItem = NULL; + } + else + { + delete iMovedItem; + iMovedItem = NULL; + } + // Restore state + iCurrentState = EOpenAndWaiting; + break; + } + + case EBookmarkDeleting: + { + LOGGER_WRITE_1( "RSS item removed, err: %d", aStatus ); + if ( aStatus == KErrNone ) + { + // Inform ChangeFinder of the removed item + TSnapshotItem item( iReplaceItem ); + iChangeFinder->ItemDeletedL( item ); + } + // Restore state + iCurrentState = EOpenAndWaiting; + break; + } + case EBookmarkDeletingAll: + { + LOGGER_WRITE_1( "all RSS items removed, err: %d", aStatus ); + break; + } + + default : + LOGGER_WRITE_1( "Invalid state: %d", iCurrentState ); + return; + } + User::RequestComplete( iCallerStatus, aStatus ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoFolderItemRequestCompletedL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::RssItemCreatedL +// Rss item has been created, add item to changefinder +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::RssItemCreatedL() + { + TRACE_FUNC_ENTRY; + if ( !iRootFolder.HasRootFolderItem() ) + { + LOGGER_WRITE( "rss root folder not found" ); + User::Leave( KErrNotFound ); + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* parent = rootFolder.Search( iParentFolder - KRssFeedsOffset ); + if ( !parent ) + { + LOGGER_WRITE( "parent folder not found" ); + User::Leave( KErrNotFound ); + } + LOGGER_WRITE_1("parent->Id(): %d", parent->Id()); + LOGGER_WRITE_1( "Name: %S", &iNewItemName ); + const CFolderItem* addedItem = parent->Search( iNewItemName ); + iNewItemName.Zero(); + if ( addedItem ) + { + LOGGER_WRITE_1("addedItem found, id: %d", addedItem->Id()); + + // Output the uid value of new item + *iCurrentItem = addedItem->Id() + KRssFeedsOffset; + + // Inform ChangeFinder of the added item + TSnapshotItem snapshotItem( *iCurrentItem ); + snapshotItem.SetParentId( iParentFolder ); + snapshotItem.CreateHashL( addedItem->Name(), addedItem->SourceUrl() ); + iChangeFinder->ItemAddedL( snapshotItem ); + LOGGER_WRITE( "ItemAddedL" ); + } + else + { + LOGGER_WRITE( "Added item not found" ); + User::Leave( KErrNotFound ); + } + LOGGER_WRITE_1("Item ID: %d", *iCurrentItem); + LOGGER_WRITE_1("Parent ID: %d", iParentFolder); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::RssItemReplacedL +// Rss item has been replaced, update changefinder +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::RssItemReplacedL( TBool& aMoveNeeded ) + { + TRACE_FUNC_ENTRY; + aMoveNeeded = EFalse; + if ( !iRootFolder.HasRootFolderItem() ) + { + LOGGER_WRITE( "rss root folder not found" ); + User::Leave( KErrNotFound ); + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + LOGGER_WRITE_1( "rootFolder.Search %d", iReplaceItem - KRssFeedsOffset ); + const CFolderItem* modItem = rootFolder.Search( iReplaceItem - KRssFeedsOffset ); + if ( modItem ) + { + LOGGER_WRITE_1("Item found, id: %d", modItem->Id()); + + const CFolderItem* parent = modItem->Parent(); + if ( parent ) + { + TInt currentParent = parent->Id() + KRssFeedsOffset; + if ( iParentFolder != parent->Id() + KRssFeedsOffset ) + { + // move to another folder + const CFolderItem* newParent = rootFolder.Search( + iParentFolder - KRssFeedsOffset ); + if ( !newParent ) + { + // new parent not found + LOGGER_WRITE( "new parent not found" ); + User::Leave( KErrPathNotFound ); + } + else if ( !newParent->IsFolder() ) + { + // not a folder + LOGGER_WRITE( "parent is not a folder" ); + User::Leave( KErrPathNotFound ); + } + else + { + // Output the uid value of new item + *iCurrentItem = modItem->Id() + KRssFeedsOffset; + + iCurrentState = EBookmarkUpdatedAndMoving; + RPointerArray movedItems; + CleanupClosePushL( movedItems ); + movedItems.Append( modItem ); + // FolderItemRequestCompleted is called when ready + iRootFolder.MoveFolderItemsToL( movedItems, *newParent); + CleanupStack::PopAndDestroy( &movedItems ); + aMoveNeeded = ETrue; + + delete iMovedItem; + iMovedItem = NULL; + iMovedItem = new (ELeave) TSnapshotItem( *iCurrentItem , + iParentFolder ); + iMovedItem->CreateHashL( modItem->Name(), modItem->SourceUrl() ); + LOGGER_WRITE( "ItemReplacedL,waiting to move item.." ); + return; + } + + } + } + else + { + //parent not found + LOGGER_WRITE( "rss parent not defined" ); + } + + // Output the uid value of new item + *iCurrentItem = modItem->Id() + KRssFeedsOffset; + + // Inform ChangeFinder of updated item + TSnapshotItem snapshotItem( *iCurrentItem, iParentFolder ); + snapshotItem.CreateHashL( modItem->Name(), modItem->SourceUrl() ); + iChangeFinder->ItemUpdatedL( snapshotItem ); + LOGGER_WRITE( "ItemReplacedL" ); + } + else + { + LOGGER_WRITE_1( "Replaced item %d not found",iReplaceItem - KRssFeedsOffset ); + User::Leave( KErrNotFound ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCancelRequest +// Not supported, does nothing. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCancelRequest() + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCancelRequest" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCancelRequest" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoStoreName +// Returns the name of the DataStore +// ----------------------------------------------------------------------------- +const TDesC& CBookmarkDataStore::DoStoreName() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoStoreName" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoStoreName" ); + + if ( iDataBaseOpened ) + { + return KBrowserBookmarks; + } + else + { + return KNullDesC; + } + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoBeginTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoBeginTransactionL() + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoBeginTransactionL" ); + LOGGER_WRITE( "CBookmarkDataStore::DoBeginTransactionL leaved with KErrNotSupported." ) + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCommitTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCommitTransactionL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitTransactionL" ); + LOGGER_WRITE( "CBookmarkDataStore::DoCommitTransactionL failed with KErrNotSupported." ); + + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitTransactionL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoRevertTransaction +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoRevertTransaction( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoRevertTransaction" ); + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoRevertTransaction" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoBeginBatchL +// Batching is not supported. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoBeginBatchL() + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoBeginBatchL" ); + LOGGER_WRITE( "CBookmarkDataStore::DoBeginBatchL leaved with KErrNotSupported." ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCommitBatchL +// Batching is not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitBatchL" ); + LOGGER_WRITE( "CBookmarkDataStore::DoCommitBatchL failed with KErrNotSupported" ); + + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitBatchL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCancelBatch +// Batching is not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCancelBatch() + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCancelBatch" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCancelBatch" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoSetRemoteStoreFormatL +// Not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoSetRemoteStoreFormatL" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoSetRemoteStoreFormatL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoSetRemoteMaxObjectSize +// Not supported +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoSetRemoteMaxObjectSize" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoSetRemoteMaxObjectSize" ); + } + + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoMaxObjectSize +// Reads the maximum object size from the central repository +// ----------------------------------------------------------------------------- +TInt CBookmarkDataStore::DoMaxObjectSize() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoMaxObjectSize" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoMaxObjectSize" ); + return 0; // no limit + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoOpenItemL +// Opens item in the DataStore, reads it (either completely or partially) +// to the temporary buffer where it can be later read to the remote database. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoOpenItemL( + TSmlDbItemUid aUid, + TBool& aFieldChange, + TInt& aSize, + TSmlDbItemUid& aParent, + TDes8& aMimeType, + TDes8& aMimeVer, + TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoOpenItemL" ); + LOGGER_WRITE_1( "Item: %d", aUid ); + + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + aFieldChange = EFalse; + + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState ); + } + + SAFEDELETE( iDataBuffer ); + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iReaderPosition = 0; + if ( aUid < KRssFeedsOffset ) + { + LOGGER_WRITE( "Handle id as bookmark item " ); + TInt err( KErrNone ); + CFavouritesItem* item = CFavouritesItem::NewLC(); + err = iDb.Get( aUid, *item ); + if (err) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE_1( "RFavouritesDb::Get failed with %d", err ); + CleanupStack::PopAndDestroy( item ); + return; + } + + + + iConverter->FavouritesItemToBufferL( *item, *iDataBuffer ); + aSize = iDataBuffer->Size(); + aParent = item->ParentFolder(); + + // Set mime type according to item type + // The following code handles also the case, where the receiving + // buffer doesn't contain enough space for the type (truncated) + if ( item->Type() == CFavouritesItem::EItem ) + { + LOGGER_WRITE("item type: EItem"); + AssignString( aMimeType, KBookmarkItemMimeType ); + AssignString( aMimeVer, KBookmarkItemMimeVersion ); + } + else + { + LOGGER_WRITE("item type: EFolder"); + AssignString( aMimeType, KBookmarkFolderMimeType ); + AssignString( aMimeVer, KBookmarkFolderMimeVersion ); + } + + CleanupStack::PopAndDestroy( item ); + } + else + { + LOGGER_WRITE( "Handle id as rssFeed item " ); + + TInt rssId = aUid - KRssFeedsOffset; + LOGGER_WRITE_1( "rssId: %d", rssId ); + + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + return; + } + + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* founded = rootFolder.Search( rssId ); + if ( founded ) + { + LOGGER_WRITE( "Item found" ); + const CFolderItem* parent = founded->Parent(); + if ( parent ) + { + LOGGER_WRITE( "parent found" ); + aParent = parent->Id() + KRssFeedsOffset; + } + else + { + LOGGER_WRITE( "no parent (root)" ); + aParent = KErrNotFound;// rootFolder.Id() + KRssFeedsOffset; + } + + if ( !founded->IsFolder() ) + { + LOGGER_WRITE("item type: EItem"); + AssignString( aMimeType, KBookmarkItemMimeType ); + AssignString( aMimeVer, KBookmarkItemMimeVersion ); + } + else + { + LOGGER_WRITE("item type: EFolder"); + AssignString( aMimeType, KBookmarkFolderMimeType ); + AssignString( aMimeVer, KBookmarkFolderMimeVersion ); + } + iConverter->RssItemToBufferL( *founded, *iDataBuffer ); + aSize = iDataBuffer->Size(); + + } + else + { + LOGGER_WRITE( "Item not found" ); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + } + + User::RequestComplete( iCallerStatus, KErrNone ); + iCurrentState = EBookmarkOpen; + +#ifdef _DEBUG + LOGGER_WRITE_1( "aFieldChange: %d", (TInt)aFieldChange ); + LOGGER_WRITE_1( "aSize: %d", aSize ); + LOGGER_WRITE_1( "aParent: %d", aParent ); + TPtr8 bufPtr = iDataBuffer->Ptr(0); + LOGGER_WRITE8_1( "iDataBuffer: %S", &bufPtr); +#endif + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoOpenItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCreateItemL +// Create new item to the message store. +// Return the id number of the newly created item +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCreateItemL( + TSmlDbItemUid& aUid, + TInt aSize, + TSmlDbItemUid aParent, + const TDesC8& aMimeType, + const TDesC8& /*aMimeVer*/, + TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCreateItemL" ); + LOGGER_WRITE_1( "aParent: %d", aParent ); + LOGGER_WRITE8_1( "aMimeType: %S", &aMimeType ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + delete iItemToBeReplaced; + iItemToBeReplaced = NULL; + + // Check MIME type + if ( aMimeType.Compare( KBookmarkFolderMimeType() ) == 0 ) + { + LOGGER_WRITE("item type: EFolder"); + iMimeType = CFavouritesItem::EFolder; + } + else if ( aMimeType.Compare( KBookmarkItemMimeType() ) == 0 ) + { + LOGGER_WRITE("item type: EItem"); + iMimeType = CFavouritesItem::EItem; + } + else + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE( "Unexpected mime type" ); + return; + } + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState ); + } + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." ); + return; + } + + if ( aParent < KRssFeedsOffset ) + { + LOGGER_WRITE( "Handle id as bookmark item" ); + // Ensure that parent folder exists + TBool folderExists( EFalse ); + TInt err = iDb.FolderExists( aParent, folderExists ); + if ( err || !folderExists ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE_1( "iDb.FolderExist returned %d, folder not found", err ); + return; + } + + } + else + { + LOGGER_WRITE( "Handle id as rssFeed item " ); + + TInt rssId = aParent - KRssFeedsOffset; + LOGGER_WRITE_1( "parentRssId: %d", rssId ); + + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + return; + } + + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* founded = rootFolder.Search( rssId ); + TBool folderExists( EFalse ); + if ( founded ) + { + if ( founded->IsFolder() ) + { + folderExists = ETrue; + } + } + if ( !folderExists ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE( "Folder does not exist" ); + return; + } + } + + iCurrentState = EBookmarkCreating; + // Store parent for further use + iParentFolder = aParent; + + SAFEDELETE( iDataBuffer ); + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iWriterPosition = 0; + + iCurrentItem = &aUid; + + + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCreateItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoReplaceItemL +// Begin the replace operation, ensure that the item really exists +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoReplaceItemL( + TSmlDbItemUid aUid, + TInt aSize, + TSmlDbItemUid aParent, + TBool /*aFieldChange*/, + TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoReplaceItemL" ); + LOGGER_WRITE_1("aUid: %d", aUid); + LOGGER_WRITE_1("aParent: %d", aParent); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + delete iItemToBeReplaced; + iItemToBeReplaced = NULL; + + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState ); + } + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." ); + return; + } + + if ( aUid < KRssFeedsOffset ) + { + LOGGER_WRITE( "Bookmark item" ); + iItemToBeReplaced = CFavouritesItem::NewL(); + // Check that item exists + TInt err = iDb.Get( aUid, *iItemToBeReplaced ); + if ( err != KErrNone ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE_1( "iDb.Get failed with %d", err ); + SAFEDELETE(iItemToBeReplaced); + return; + } + + // is parent changed + if ( aParent != iItemToBeReplaced->ParentFolder() ) + { + if ( aParent >= KRssFeedsOffset ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE( "cannot move to RSS items folder" ); + SAFEDELETE(iItemToBeReplaced); + return; + } + // parent is changed, ensure that new parent folder exists + TBool folderExists( EFalse ); + err = iDb.FolderExists( aParent, folderExists ); + if ( err || !folderExists ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE_1( "iDb.FolderExist returned %d, new parent folder not found", err ); + SAFEDELETE(iItemToBeReplaced); + return; + } + } + + + // Store some variables to be used later in commit + iMimeType = iItemToBeReplaced->Type(); + iItemToBeReplaced->SetParentFolder( aParent ); + iParentFolder = aParent; + iReplaceItem = aUid; + } + else + { + LOGGER_WRITE( "RSS item" ); + if ( aParent < KRssFeedsOffset ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE( "cannot move RSS item to normal folder" ); + return; + } + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + return; + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* rssItem = rootFolder.Search( aUid - KRssFeedsOffset ); + if ( !rssItem ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss item not found" ); + return; + } + if ( rssItem->IsFolder() ) + { + iMimeType = CFavouritesItem::EFolder; + } + else + { + iMimeType = CFavouritesItem::EItem; + } + const CFolderItem* parent = rssItem->Parent(); + if ( parent ) + { + TInt currentParent = parent->Id() + KRssFeedsOffset; + + const CFolderItem* newParent = rootFolder.Search( aParent - KRssFeedsOffset ); + if ( !newParent ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE( "new parent not found" ); + return; + } + else if ( !newParent->IsFolder() ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE( "new parent must be folder" ); + return; + } + else + { + iParentFolder = aParent; + } + + } + else + { + iParentFolder = KErrNotFound; + } + iReplaceItem = aUid; + } + + + + SAFEDELETE(iDataBuffer); + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iWriterPosition = 0; + + iCurrentItem = &aUid; + iCurrentState = EBookmarkUpdating; + + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoReplaceItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoReadItemL +// Read specified amount of data from the temporary buffer +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoReadItemL( TDes8& aBuffer ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoReadItemL" ); + + if (iCurrentState != EBookmarkOpen || !iDataBuffer) + { + LOGGER_WRITE_1( "Unexpected state %d", iCurrentState ); + User::Leave( KErrNotReady ); + } + + if (iReaderPosition == KDataBufferNotReady) + { + LOGGER_WRITE( "No data to read" ); + User::Leave( KErrEof ); + } + + // Thiw is how much data there is left in the buffer + TInt left = iDataBuffer->Size() - iReaderPosition; + + if ( left > 0 ) + { + // This is how much there's space in the destination buffer + TInt destSize = aBuffer.MaxSize(); + + // This is how much we can read + TInt toRead = destSize < left ? destSize : left; + + // Read the data from the buffer, then update the position + iDataBuffer->Read( iReaderPosition, aBuffer, toRead ); + iReaderPosition += toRead; + } + else + { + iReaderPosition = KDataBufferNotReady; + LOGGER_WRITE( "No data to read" ); + User::Leave( KErrEof ); + } + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoReadItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoWriteItemL +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoWriteItemL( const TDesC8& aData ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoWriteItemL" ); + + if ( iCurrentState != EBookmarkCreating && iCurrentState != EBookmarkUpdating ) + { + LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState ); + User::Leave( KErrNotReady ); + } + + // Calculate total size + TInt totalSize = aData.Size() + iDataBuffer->Size(); + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, totalSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE("SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull."); + return; + } + + // Add data to buffer + iDataBuffer->InsertL( iWriterPosition, aData ); + iWriterPosition += aData.Size(); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoWriteItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCommitItemL +// Commits item from temporary buffer to the message store +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCommitItemL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitItemL" ); + LOGGER_WRITE_1("iParentFolder: %d", iParentFolder); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EBookmarkCreating && iCurrentState != EBookmarkUpdating ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState ); + return; + } + + if ( iDataBuffer->Size() <= 0 ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + LOGGER_WRITE_1( "Data buffer has no data (%d)", iDataBuffer->Size() ); + return; + } + + + + // If iItemToBeReplaced exist, bookmark item is going to be replaced. + // iItemToBeReplaced contains original bookmark and only some of it's data is replaced. + CFavouritesItem* item(NULL); + if ( iItemToBeReplaced ) + { + // Change object ownership to "item"-object, and push to cleanupStack + item = iItemToBeReplaced; + CleanupStack::PushL( item ); + iItemToBeReplaced = NULL; + } + else + { + // Create new object. + item = CFavouritesItem::NewLC(); + } + + iDataBuffer->Compress(); + TInt err = iConverter->BufferToFavouritesItemL( iMimeType, *iDataBuffer, *item ); + + if ( iParentFolder == KErrNotFound ) + { + if ( item->Name().Compare( KRSSRootFolderName ) == 0 ) + { + LOGGER_WRITE( "Was RSS Rootfolder" ); + // Remove from cleanup stack + CleanupStack::PopAndDestroy( item ); + + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + return; + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + + *iCurrentItem = rootFolder.Id() + KRssFeedsOffset; + + // Inform ChangeFinder of updated item + TSnapshotItem snapshotItem( rootFolder.Id() + KRssFeedsOffset ); + snapshotItem.SetParentId( iParentFolder ); + snapshotItem.CreateHashL( KRSSRootFolderName, KNullDesC ); + iChangeFinder->ItemUpdatedL( snapshotItem ); + + // Destroy buffer + SAFEDELETE( iDataBuffer ); + iWriterPosition = 0; + + // Restore state and signal we're done + LOGGER_WRITE( "Signal KErrNone" ); + iCurrentState = EOpenAndWaiting; + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_WRITE_1("Item ID: %d", *iCurrentItem); + LOGGER_WRITE_1("Parent ID: %d", iParentFolder); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitItemL" ); + return; + } + } + + if ( iParentFolder < KRssFeedsOffset ) + { + // Convert buffer to favourites item + LOGGER_WRITE( "BookmarkItem" ); + + if ( err == KErrNone ) + { + LOGGER_WRITE_1 ( "ParentFolder: %d", iParentFolder ) + // Creating new item + if ( iCurrentState == EBookmarkCreating ) + { +#ifdef _DEBUG + LOGGER_WRITE( "Create new bookmark item" ); + TPtrC namePtr = item->Name(); + LOGGER_WRITE_1( "name: %S", &namePtr ); +#endif + // Set parent folder + item->SetParentFolder( iParentFolder ); + + // Add to database + err = iDb.Add( *item, EFalse ); + LOGGER_WRITE_1("iDb.Add return: %d", err); + if ( err == KErrNone ) + { + // Output the uid value of new item + *iCurrentItem = item->Uid(); + LOGGER_WRITE_1("New item Uid: %d", *iCurrentItem); + // Inform ChangeFinder of the added item + TSnapshotItem snapshotItem( *iCurrentItem ); + snapshotItem.SetParentId( iParentFolder ); + snapshotItem.CreateHashL( item->Name(), item->Url() ); + iChangeFinder->ItemAddedL( snapshotItem ); + } + else + { + LOGGER_WRITE_1( "RFavouritesDb::Add failed: %d", err ); + } + } + // Updating existing item + else + { + LOGGER_WRITE( "Update existing item" ); + item->SetParentFolder(iParentFolder); + err = iDb.Update( *item, iReplaceItem, EFalse ); + if ( err == KErrNone ) + { + // Inform ChangeFinder of updated item + TSnapshotItem snapshotItem( iReplaceItem ); + snapshotItem.SetParentId( iParentFolder ); + snapshotItem.CreateHashL( item->Name(), item->Url() ); + iChangeFinder->ItemUpdatedL( snapshotItem ); + } + else + { + LOGGER_WRITE_1( "RFavouritesDb::Update failed: %d", err ); + } + } + } + else + { + LOGGER_WRITE_1( "Failed to create db item (%d)", err ); + } + + } + else + { + LOGGER_WRITE( "RSS item" ); + err = iConverter->BufferToFavouritesItemL( iMimeType, *iDataBuffer, *item ); + // Destroy buffer + SAFEDELETE( iDataBuffer ); + iWriterPosition = 0; + if ( err == KErrNone ) + { + if ( iCurrentState == EBookmarkCreating ) + { + TBool isFolder = ( iMimeType == CFavouritesItem::EFolder ); + CreateRssItemL( iParentFolder - KRssFeedsOffset, item->Name(), item->Url(), isFolder ); + + CleanupStack::PopAndDestroy( item ); + LOGGER_WRITE( "waiting FolderItemRequestCompleted..." ); + return; + } + else + { + LOGGER_WRITE( "Replace RSS item" ); + ReplaceRssItemL( iReplaceItem - KRssFeedsOffset, item->Name(), item->Url()); + + CleanupStack::PopAndDestroy( item ); + LOGGER_WRITE( "waiting FolderItemRequestCompleted..." ); + return; + } + } + else + { + // Data was corrupted + LOGGER_WRITE_1( " iConverter->BufferToFavouritesItemL err: %d", err ); + err = KErrCorrupt; + } + } + + + // Remove from cleanup stack + CleanupStack::PopAndDestroy( item ); + + // Destroy buffer + SAFEDELETE( iDataBuffer ); + iWriterPosition = 0; + + // Restore state and signal we're done + iCurrentState = EOpenAndWaiting; + User::RequestComplete( iCallerStatus, err ); + + LOGGER_WRITE_1("Item ID: %d", iReplaceItem); + LOGGER_WRITE_1("Parent ID: %d", iParentFolder); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::CreateRssItemL +// Creates new Rss item, FolderItemRequestCompleted is called when done +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::CreateRssItemL( TInt aRssParentUid, const TDesC& aName, const TDesC& aUrl, TBool aIsFolder ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aRssParentUid: %d", aRssParentUid); + LOGGER_WRITE_1("aName: %S", &aName); + + if ( !iRootFolder.HasRootFolderItem() ) + { + LOGGER_WRITE( "rss root folder not found" ); + User::Leave( KErrNotFound ); + } + + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + + // check that parent folder exists + const CFolderItem* parent = rootFolder.Search( aRssParentUid ); + if ( !parent ) + { + LOGGER_WRITE( "parent folder not found" ); + User::Leave( KErrNotFound ); + } + + // check that folder does not already exists + const CFolderItem* existingItem = parent->Search( aName ); + if ( existingItem ) + { + LOGGER_WRITE("Same name already exist, return KErrAlreadyExists"); + User::Leave( KErrAlreadyExists ); + } + + TInt err(KErrNone); + // async func. FolderItemRequestCompleted is called when completed + TRAP( err, iRootFolder.AddFolderItemL( + aName, + aUrl, + aIsFolder, + *parent ) ); + LOGGER_WRITE_1( "iRootFolder.AddFolderItemL err: %d", err ); + + iNewItemName.Copy( aName ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::ReplaceRssItemL +// Replaces rss item, FolderItemRequestCompleted is called when done +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::ReplaceRssItemL( TInt aRssItemUid, const TDesC& aNewName, const TDesC& aNewUrl ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aRssItemUid: %d", aRssItemUid); + LOGGER_WRITE_1("aNewName: %S", &aNewName); + LOGGER_WRITE_1("aNewUrl: %S", &aNewUrl); + + if ( !iRootFolder.HasRootFolderItem() ) + { + LOGGER_WRITE( "rss root folder not found" ); + User::Leave( KErrNotFound ); + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + LOGGER_WRITE_1( "rootFolder.Search %d", aRssItemUid ); + const CFolderItem* rssItem = rootFolder.Search( aRssItemUid ); + if ( !rssItem ) + { + LOGGER_WRITE( "rssItem not found" ); + User::Leave( KErrNotFound ); + } + + // async func. FolderItemRequestCompleted is called when completed + if ( rssItem->IsFolder() ) + { + iRootFolder.ChangeFolderItemL( + *rssItem, + aNewName, + KNullDesC ); + } + else + { + iRootFolder.ChangeFolderItemL( + *rssItem, + aNewName, + aNewUrl ); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCloseItem +// Closes open item in the data store +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCloseItem() + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCloseItem" ); + + // Make sure that we're opened an item + if ( iCurrentState == EBookmarkOpen ) + { + // Reset read buffer + iReaderPosition = KDataBufferNotReady; + SAFEDELETE( iDataBuffer ); + + // Start to wait for the next operation + iCurrentState = EOpenAndWaiting; + } + else + { + LOGGER_WRITE_1( "Invalid state %d.", iCurrentState ); + } + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCloseItem" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoMoveItemL +// Moves item from one bookmark folder to another +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoMoveItemL( TSmlDbItemUid aUid, + TSmlDbItemUid aNewParent, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoMoveItemL" ); + LOGGER_WRITE_1("aUid: %d", aUid); + LOGGER_WRITE_1("new parent: %d", aNewParent); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + TInt err( KErrNone ); + + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "WARNING! Invalid state: %d", iCurrentState ); + } + + if ( aUid < KRssFeedsOffset ) + { + // Bookmark item + LOGGER_WRITE( "Bookmark item" ); + // Ensure that new parent folder exists + TBool folderExists( EFalse ); + err = iDb.FolderExists( aNewParent, folderExists ); + if ( err || !folderExists ) + { + User::RequestComplete( iCallerStatus, KErrPathNotFound ); + LOGGER_WRITE_1( "iDb.FolderExist returned %d, new parent folder not found", err ); + return; + } + + CFavouritesItem* item = CFavouritesItem::NewLC(); + + err = iDb.Get( aUid, *item ); + if ( err == KErrNone ) + { + if ( item->ParentFolder() != aNewParent ) + { + TTime time = item->Modified(); + + // Parent was changed, set new + item->SetParentFolder( aNewParent ); + + // Update, this'll move the item + err = iDb.Update( *item, aUid, ETrue ); + + if ( err == KErrNone ) + { + // Do not change the timestamp, otherwise this will be + // considered to be 'updated' item instead of moved one + err = iDb.SetModified(aUid, time); + if ( err != KErrNone ) + { + LOGGER_WRITE_1( "iDb.SetModified(aUid, time) failed (%d).", err ); + } + + // Inform ChangeFinder of updated item + TSnapshotItem snapshotItem( aUid ); + snapshotItem.SetParentId( iParentFolder ); + snapshotItem.CreateHashL( item->Name(), item->Url() ); + iChangeFinder->ItemMovedL( snapshotItem ); + } + else + { + LOGGER_WRITE_1( "iDb.Update(*item, aUid, ETrue) failed (%d).", err ); + } + } + else + { + LOGGER_WRITE( "Ignoring move (parent was already correct)." ); + } + } + else + { + LOGGER_WRITE_1( "RFavouritesDb::Get failed with %d", err ); + err = KErrNotFound; + } + + CleanupStack::PopAndDestroy( item ); + User::RequestComplete( iCallerStatus, err ); + } + else + { + // RRS item + LOGGER_WRITE( "RSS item" ); + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + return; + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* rssItem = rootFolder.Search( aUid - KRssFeedsOffset ); + if ( !rssItem ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rssItem not found" ); + return; + } + LOGGER_WRITE_1("rssItem->Id(): %d", rssItem->Id()); + if ( !rssItem->Parent() ) + { + // this is "RSS Root" folder, can't move + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "RSS Root folder, can't move" ); + return; + } + const CFolderItem* parent = rootFolder.Search( aNewParent - KRssFeedsOffset ); + if ( !parent ) + { + // new parent not found + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "new parent not found" ); + return; + } + if ( !parent->IsFolder() ) + { + // not a folder + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "parent is not a folder" ); + return; + } + RPointerArray movedItems; + CleanupClosePushL( movedItems ); + movedItems.Append( rssItem ); + // FolderItemRequestCompleted is called when ready + iRootFolder.MoveFolderItemsToL( movedItems, *parent); + CleanupStack::PopAndDestroy( &movedItems ); + + delete iMovedItem; + iMovedItem = NULL; + iMovedItem = new (ELeave) TSnapshotItem( aUid, aNewParent ); + + iCurrentState = EBookmarkMoving; + LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." ); + } + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoMoveItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoDeleteItemL +// Removes item from the message store +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoDeleteItemL" ); + LOGGER_WRITE_1( "aUid: %d", aUid ); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteItemL, Incorrect state: %d", iCurrentState); + } + + TInt error( KErrNone ); + if ( aUid < KRssFeedsOffset ) + { + LOGGER_WRITE( "Delete Bookmark item" ); + // Delete item from db and return the error code + error = iDb.Delete( aUid ); + + if ( error == KErrNone ) + { + // Inform ChangeFinder of the removed item + TSnapshotItem item( aUid ); + iChangeFinder->ItemDeletedL( item ); + } + else + { + LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteItemL, iDb.Delete failed: %d", error); + } + + User::RequestComplete( iCallerStatus, error ); + } + else + { + LOGGER_WRITE( "Delete RSS item" ); + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "rss root folder not found" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" ); + return; + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + const CFolderItem* item = rootFolder.Search( aUid - KRssFeedsOffset ); + if ( !item ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE( "item not found" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" ); + return; + } + + LOGGER_WRITE_1("founded. item->Id(): %d", item->Id()); + if ( !item->Parent() ) + { + LOGGER_WRITE_1( + "Item parent not found, this is root folder. Return error: %d", KErrAccessDenied); + User::RequestComplete( iCallerStatus, KErrAccessDenied ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" ); + return; + } + else + { + LOGGER_WRITE( "parent found" ); + } + + RPointerArray folderItems; + CleanupClosePushL( folderItems ); + error = folderItems.Append( item ); + LOGGER_WRITE_1( "folderItems.Append error: %d", error ); + TRAP( error, iRootFolder.DeleteFolderItemsL( folderItems ) ); + CleanupStack::PopAndDestroy( &folderItems ); + LOGGER_WRITE_1( "Trap error: %d", error ); + + iReplaceItem = aUid; + iCurrentState = EBookmarkDeleting; + LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." ); + } + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoSoftDeleteItemL +// Soft delete isn't supported. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoSoftDeleteItemL(TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoSoftDeleteItemL" ); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + User::RequestComplete(iCallerStatus, KErrNotSupported); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoSoftDeleteItemL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoDeleteAllItemsL +// Deletes all items in the standard folders of bookmark store +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoDeleteAllItemsL" ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if (iCurrentState != EOpenAndWaiting) + { + LOGGER_WRITE_1( "CSmsDataStore::DoDeleteAllItemsL, Incorrect state: %d", iCurrentState ); + } + + // Reset the whole change finder + iChangeFinder->ResetL(); + + // Delete all Bookmark items + LOGGER_WRITE( "Delete Bookmark items" ); + // Loop through all items at root, and delete everything + CFavouritesItemList* list = new ( ELeave ) CFavouritesItemList(); + TInt error = iDb.GetAll( *list, KFavouritesRootUid ); + if ( error == KErrNone ) + { + // Loop through the list and delete all items + TInt count = list->Count(); + LOGGER_WRITE_1("list->Count(): %d", count); + for ( TInt i = 0; i < count; ++i ) + { + CFavouritesItem* item = (*list)[i]; + + // Don't bother try to erase items, which are read only + if ( !item->IsFactoryItem() ) + { + TInt deleted = iDb.Delete( item->Uid() ); + if ( deleted != KErrNone ) + { + // In the case of error, store the error value + error = deleted; + LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteAllItemsL, iDb.Delete failed: %d", error); + } + + LOGGER_WRITE_1("item->Uid(): %d", item->Uid()) + LOGGER_WRITE_1("iDb.Delete ret: %d", error) + + } + else + { + LOGGER_WRITE_1("item->IsFactoryItem(): id: %d", item->Uid()); + } + } + } + else + { + LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteAllItemsL, iDb.GetAll failed: %d", error); + } + delete list; + + // Delete all WebFeeds + LOGGER_WRITE( "Delete RSS items" ); + if ( !iRootFolder.HasRootFolderItem() ) + { + User::RequestComplete( iCallerStatus, error ); + LOGGER_WRITE( "no RSS items" ); + return; + } + const CFolderItem& rootFolder = iRootFolder.RootFolderItem(); + // add subfolders + RPointerArray folderItems; + CleanupClosePushL( folderItems ); + for ( TInt i = 0; i < rootFolder.FolderItemCount(); i++) + { + error = folderItems.Append( rootFolder.FolderItemAt( i ) ); + LOGGER_WRITE_1( "folderItems.Append error: %d", error ); + } + + if ( folderItems.Count() > 0 ) + { + TRAP( error, iRootFolder.DeleteFolderItemsL( folderItems ) ); + + LOGGER_WRITE_1( "Trap error: %d", error ); + + iCurrentState = EBookmarkDeletingAll; + LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." ); + } + else + { + LOGGER_WRITE( "RSS items not found" ); + User::RequestComplete( iCallerStatus, KErrNone ); + } + CleanupStack::PopAndDestroy( &folderItems ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteAllItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoHasSyncHistory +// This method returns ETrue if Data Store has history information. +// Slow-sync will be used if Data Store does not have history information. +// ----------------------------------------------------------------------------- +TBool CBookmarkDataStore::DoHasSyncHistory() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoHasSyncHistory" ); + LOGGER_WRITE_1( "iHasHistory: %d", iHasHistory ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoHasSyncHistory" ); + return iHasHistory; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoAddedItems +// This method returns UIDs of added items. Those items are added after previous +// synchronization with current synchronization relationship. +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CBookmarkDataStore::DoAddedItems() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoAddedItems" ); + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoAddedItems, invalid state %d.", iCurrentState ); + } + + TInt error(KErrNone); + + // Clear new-items array + iNewItems->Reset(); + + // Search for new items + TRAP( error, iChangeFinder->FindNewItemsL( *iNewItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "New item count: %d.", iNewItems->ItemCount() ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoAddedItems" ); + + return *iNewItems; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoDeletedItems +// Returns ids of items, which are deleted after previous synchronization +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CBookmarkDataStore::DoDeletedItems() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoDeletedItemsL" ); + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoDeletedItems, invalid state %d.", iCurrentState ); + } + + TInt error( KErrNone ); + + // Clear deleted-items array + iDeletedItems->Reset(); + + // Search for deleted items + TRAP( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "Deleted item count: %d.", iDeletedItems->ItemCount() ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeletedItemsL" ); + return *iDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoSoftDeletedItems +// Not directly supported, empty list returned +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CBookmarkDataStore::DoSoftDeletedItems() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoSoftDeletedItems" ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoSoftDeletedItems" ); + + // Return empty array as a result + iSoftDeletedItems->Reset(); + return *iSoftDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoModifiedItems +// Finds all modified items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CBookmarkDataStore::DoModifiedItems() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoModifiedItems" ); + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoModifiedItems, invalid state %d.", iCurrentState ); + } + + TInt error( KErrNone ); + + // Clear updated-items array + iUpdatedItems->Reset(); + + // Search for updated items + TRAP( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "Modified item count: %d.", iUpdatedItems->ItemCount() ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoModifiedItems" ); + return *iUpdatedItems; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoMovedItems +// Finds all moved items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CBookmarkDataStore::DoMovedItems() const + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoMovedItems" ); + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoMovedItems, invalid state %d.", iCurrentState ); + } + + TInt error( KErrNone ); + + // Clear moved-items array + iMovedItems->Reset(); + + TRAP( error, iChangeFinder->FindMovedItemsL( *iMovedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoMovedItems, iChangeFinder->FindMovedItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "Moved item count: %d.", iMovedItems->ItemCount() ); + LOGGER_LEAVEFN( "CBookmarkDataStore::DoMovedItems" ); + return *iMovedItems; + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoResetChangeInfoL +// Resets change history in the data store. All content is considered +// new in the data store point of view. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoResetChangeInfoL" ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Reset change info in ChangeFinder + iChangeFinder->ResetL(); + iHasHistory = EFalse; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoResetChangeInfoL" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCommitChangeInfoL +// Commits change info. These items are no longer reported, when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, + const MSmlDataItemUidSet& aItems ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitChangeInfoL(1)" ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Notify ChangeFinder + LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, item count %d.", aItems.ItemCount() ); + iChangeFinder->CommitChangesL( aItems ); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN(" CBookmarkDataStore::DoCommitChangeInfoL(1)" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::DoCommitChangeInfoL +// Commits change info. There is no more nothing to report when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitChangeInfoL(2)" ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitChangeInfoL(2)" ); + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::RegisterSnapshotL +// Sets Changefinder to compare against current bookmark store content +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::RegisterSnapshotL() + { + LOGGER_ENTERFN( "CBookmarkDataStore::RegisterSnapshotL()" ); + + CArrayFixSeg* snapshot = + new ( ELeave ) CArrayFixSeg( KSnapshotGranularity ); + CleanupStack::PushL( snapshot ); + + + RegisterToSnapshotL( snapshot, KFavouritesRootUid ); + + if ( iRootFolder.HasRootFolderItem() ) + { + RegisterRssFeedsToSnapshotL( snapshot, iRootFolder.RootFolderItem() ); + } + + // Set new snapshot to compare against + iChangeFinder->SetNewSnapshot( snapshot ); + + // Changefinder takes ownership of the snapshot + CleanupStack::Pop( snapshot ); + + LOGGER_LEAVEFN( "CBookmarkDataStore::RegisterSnapshotL()" ); + } + + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::RegisterToSnapshotL +// Adds recursively all the bookmark items to the snapshot +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::RegisterToSnapshotL( CArrayFixSeg* aSnapshot, + TInt aFolderUid ) + { + CFavouritesItemList* list = new ( ELeave ) CFavouritesItemList; + CleanupStack::PushL( list ); + TInt error = iDb.GetAll( *list, aFolderUid ); + if ( error == KErrNone ) + { + // Loop through the list. Add folders and items to the snapshot + TInt count = list->Count(); + for ( TInt i = 0; i < count; ++i ) + { + CFavouritesItem* item = (*list)[i]; + // No matter whether it's a folder or item, we'll add it to snapshot + TSnapshotItem snapshotItem( item->Uid() ); + snapshotItem.SetParentId( item->ParentFolder() ); + snapshotItem.CreateHashL( item->Name(), item->Url() ); + TKeyArrayFix key( iKey ); + aSnapshot->InsertIsqL( snapshotItem, key ); + + // Remember to add also childs in case of folder (recurse) + if ( item->Type() == CFavouritesItem::EFolder ) + { + RegisterToSnapshotL( aSnapshot, item->Uid() ); + } + } + } + CleanupStack::PopAndDestroy( list ); //list + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::RegisterRssFeedsToSnapshotL +// Adds recursively all the rssFeed items to the snapshot +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::RegisterRssFeedsToSnapshotL( CArrayFixSeg* aSnapshot, + const CFolderItem& folder ) + { + TSnapshotItem snapshotItem( folder.Id() + KRssFeedsOffset ); + + const CFolderItem* parent = folder.Parent(); + if ( parent ) + { + snapshotItem.SetParentId( parent->Id() + KRssFeedsOffset ); + } + else + { + snapshotItem.SetParentId( KErrNotFound ); + } + snapshotItem.CreateHashL( folder.Name(), folder.SourceUrl() ); + + TKeyArrayFix key( iKey ); + aSnapshot->InsertIsqL( snapshotItem, key ); + + // add subfolders + for ( TInt i = 0; i < folder.FolderItemCount(); i++) + { + RegisterRssFeedsToSnapshotL( aSnapshot, *(folder.FolderItemAt( i ) )); + } + } + +// ----------------------------------------------------------------------------- +// CBookmarkDataStore::AssignString +// Assigns data from one descriptor into another, truncates if too long +// ----------------------------------------------------------------------------- +void CBookmarkDataStore::AssignString( TDes8& aDestination, const TDesC8& aSource ) + { + TInt targetLength = aSource.Length(); + if ( aDestination.MaxLength() < targetLength ) + { + targetLength = aDestination.MaxLength(); + } + + aDestination.Copy( aSource.Ptr(), targetLength ); + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/bookmarkdatastore.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/bookmarkdatastore.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,81 @@ +/* +* Copyright (c) 2005-2008 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 Bookmark DS Plug In Adapter +* +*/ + + +#include +#include + +RESOURCE SML_DATA_STORE_FORMAT BOOKMARK_DATA_STORE + { + version = 1; + display_name = "Bookmarks"; + 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-vBookmark"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + }, + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/vnd.omads-folder+xml"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + } + }; + mime_format_tx_pref = 0; // Preferred index for tx + mime_format_rx_pref = 0; // Preferred index for rx + folder_properties = {}; // No folder properties + filter_capabilities = {}; // No filter capabilities + max_size = 0; // No limit + max_items = 0; // No limit + flags = 0x00000010; // Hierarchical sync supported + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/bookmarkdsa.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/bookmarkdsa.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,46 @@ +/* +* 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: Resource definitions for project Bookmark DS Plugin +* +*/ + + + +// ----------------------------------------------------------------------------- +// RESOURCE IDENTIFIER +// ----------------------------------------------------------------------------- +// +NAME BKDS + +// ----------------------------------------------------------------------------- +// INCLUDE FILES +// ----------------------------------------------------------------------------- +// +#include +#include + +#include + + +RESOURCE RSS_SIGNATURE { } + + +RESOURCE TBUF r_bookmarkdsa_folder_download_applications { buf = qtn_bookmarkdsa_folder_download_applications; } +RESOURCE TBUF r_bookmarkdsa_folder_download_images { buf = qtn_bookmarkdsa_folder_download_images; } +RESOURCE TBUF r_bookmarkdsa_folder_download_tones { buf = qtn_bookmarkdsa_folder_download_tones; } +RESOURCE TBUF r_bookmarkdsa_folder_download_videos { buf = qtn_bookmarkdsa_folder_download_videos; } +RESOURCE TBUF r_bookmarkdsa_folder_download_skins { buf = qtn_bookmarkdsa_folder_download_skins; } +RESOURCE TBUF r_bookmarkdsa_folder_download_music { buf = qtn_bookmarkdsa_folder_download_music; } + +// End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/changefinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/changefinder.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,586 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include "changefinder.h" +#include "logger.h" + +const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version +// ----------------------------------------------------------------------------- +// CChangeFinder::NewL +// Static function to create CChangeFider object(s) +// ----------------------------------------------------------------------------- +CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, + TBool& aHasHistory, TInt aStreamUid ) + { + CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); + CleanupStack::PushL( self ); + self->ConstructL( aHasHistory ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CChangeFinder +// Constructor for the class +// ----------------------------------------------------------------------------- +CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, TInt aStreamUid ) : +iSyncRelationship( aSyncRelationship ), +iKey( aKey ), +iStreamUid( aStreamUid ), +iDataStoreUid( KErrNotFound ) + { + + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::~CChangeFinder +// Destructor for the class, closes the ChangeFinder and writes snapshot to stream +// ----------------------------------------------------------------------------- +CChangeFinder::~CChangeFinder() + { + LOGGER_ENTERFN( "CChangeFinder::~CChangeFinder" ); + delete iOldSnapshot; + delete iCurrentSnapshot; + LOGGER_LEAVEFN( "CChangeFinder::~CChangeFinder" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ConstructL +// 2nd phase constructor for the class, reads snapshot from stream +// ----------------------------------------------------------------------------- +void CChangeFinder::ConstructL( TBool& aHasHistory ) + { + LOGGER_ENTERFN( "CChangeFinder::ConstructL" ); + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + iCurrentSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + LOGGER_WRITE("CChangeFinder::ConstructL, CSnapshotArray:s created"); + TUid uid = {iStreamUid}; + + aHasHistory = iSyncRelationship.IsStreamPresentL( uid ); + + if ( aHasHistory ) + { + LOGGER_WRITE("CChangeFinder::ConstructL, HasHistory"); + // Open stream for reading + RReadStream readStream; + iSyncRelationship.OpenReadStreamLC( readStream, uid ); + + // Read used format version + TUint formatVer = readStream.ReadUint32L(); + if ( formatVer != KSnapshotFormatVersion ) + { + // Wrong version, do not try to import data + LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); + aHasHistory = EFalse; + CleanupStack::PopAndDestroy( &readStream ); + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + return; + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, format is OK"); + } + + // Read item count + TInt count = readStream.ReadUint32L(); + + // Read items + for ( TInt i=0; iInsertIsqL( item, iKey ); + } + iOldSnapshot->Compress(); + + LOGGER_WRITE_1("iOldSnapshot done, iOldSnapshot->Count: %d", iOldSnapshot->Count() ); + CleanupStack::PopAndDestroy( &readStream ); // readStream + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); + } + + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CloseL +// Closes ChangeFinder object and writes snapshot to stream +// ----------------------------------------------------------------------------- +void CChangeFinder::CloseL() + { + LOGGER_ENTERFN( "CChangeFinder::CloseL" ); + + RWriteStream writeStream; + + TUid uid = {iStreamUid}; + + // Open write stream + iSyncRelationship.OpenWriteStreamLC( writeStream, uid ); + + // Write used format version + writeStream.WriteUint32L( KSnapshotFormatVersion ); + + // Write item count + TInt count = iOldSnapshot->Count(); + writeStream.WriteUint32L( count ); + + // Write items + for ( TInt i = 0; i < count; i++ ) + { + const TSnapshotItem& item = iOldSnapshot->At( i ); + item.ExternalizeL( writeStream ); + } + + writeStream.CommitL(); + CleanupStack::PopAndDestroy( &writeStream ); // writeStream + + LOGGER_LEAVEFN( "CChangeFinder::CloseL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ResetL +// Resets synchronization history, all contetn is considered new after this call +// ----------------------------------------------------------------------------- +void CChangeFinder::ResetL() + { + LOGGER_ENTERFN( "CChangeFinder::ResetL" ); + if ( iOldSnapshot ) + { + LOGGER_WRITE("iOldSnapshot->Reset()"); + iOldSnapshot->Reset(); + // Write 'null' data to file, + // this removes change history from the file + CloseL(); + } + LOGGER_LEAVEFN( "CChangeFinder::ResetL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindChangedItemsL +// Compares snapshots, finds changed items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindChangedItemsL" ); + aChangedUids.Reset(); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + LOGGER_WRITE_1( "CChangeFinder::FindChangedItemsL items on iCurrentSnapshot: %d", count ); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // Find this entry from the old snapshot + if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + if ( currentItem.Hash().Compare( oldItem.Hash() ) != 0 ) + { + // add to list + User::LeaveIfError( aChangedUids.AddItem( currentItem.ItemId() ) ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindChangedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindDeletedItemsL +// Compares snapshots, finds deleted items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindDeletedItemsL" ); + aDeletedUids.Reset(); + if ( !iOldSnapshot ) + { + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iOldSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iOldSnapshot->At( i ); + + // If there's no current snapshot, this definately is deleted item + if ( !iCurrentSnapshot ) + { + User::LeaveIfError( aDeletedUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the current snapshot. + else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + User::LeaveIfError( aDeletedUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindNewItemsL +// Compares snapshots, finds new items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindNewItemsL" ); + aNewUids.Reset(); + /*if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindNewItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + }*/ + + TInt index; + TInt count = iCurrentSnapshot->Count(); + LOGGER_WRITE_1( "iCurrentSnapshot->Count(): %d", count ); + LOGGER_WRITE_1( "iOldSnapshot->Count(): %d", iOldSnapshot->Count() ); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // If there's no old snapshot, all items are new + if ( !iOldSnapshot ) + { + User::LeaveIfError( aNewUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "!iOldSnapshot, Item %d was new.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the old snapshot. + else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + User::LeaveIfError( aNewUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindNewItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindMovedItemsL +// Compares snapshots, finds moved items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindMovedItemsL" ); + aMovedUids.Reset(); + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // Find this entry from the old snapshot + if(iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Report only moved items in which only parent id has been changed + if ( oldItem.ParentId() != currentItem.ParentId() + && currentItem.Hash().Compare( oldItem.Hash() ) == 0 ) + { + User::LeaveIfError( aMovedUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was moved.", currentItem.ItemId() ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindMovedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemAddedL +// Adds item to snapshot, this item is no longer considered new +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemAddedL" ); + + // Add this to old snapshot, if there's no old snapshot it must be created + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); + + iOldSnapshot->InsertIsqL( aItem, iKey ); + iOldSnapshot->Compress(); + + LOGGER_LEAVEFN( "CChangeFinder::ItemAddedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemDeletedL +// Removes item to snapshot, this item is no longer considered deleted +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemDeletedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemDeletedL" ); + + LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::ItemDeletedL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + // Delete item from the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->Delete( index ); + } + else // Skip, there wasn't such entry + { + LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemDeletedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemUpdatedL +// Updates item to snapshot, this item is no longer considered changed +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemUpdatedL" ); + + LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->At( index ) = aItem; + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemUpdatedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemMovedL +// Moves item within snapshot, this item is no longer considered moved +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemMovedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemMovedL" ); + + LOGGER_WRITE_1( "Moving item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item's parent in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->At(index) = aItem; + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + } + + LOGGER_LEAVEFN("CChangeFinder::ItemMovedL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL() + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Delete everything from the old snapshot + iOldSnapshot->Reset(); + + // Loop through all the items in current snapshot + TInt count = iCurrentSnapshot->Count(); + + // Copy everything from current to old snapshot + for ( TInt i = 0; i < count; i++ ) + { + // Commit it to the old array. + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( i ), iKey ); + } + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot, affects only a specified group of items +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + // This function commits changes from current snapshot to old snapshot + // But commits only the entries in the parameter array + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + for ( TInt i = 0; i < aUids.ItemCount(); i++ ) + { + TSmlDbItemUid itemId = aUids.ItemAt( i ); + TSnapshotItem temp( itemId ); + TInt indexOld( -1 ); + TInt indexNew( -1 ); + if ( !iOldSnapshot->FindIsq( temp, iKey, indexOld) ) + { + if ( !iCurrentSnapshot->FindIsq(temp, iKey, indexNew) ) + { + // Replace, moved or softdeleted + iOldSnapshot->At( indexOld ) = iCurrentSnapshot->At( indexNew ); + } + else + { + // Delete + iOldSnapshot->Delete( indexOld ); + } + } + else + { + // Add + if ( !iCurrentSnapshot->FindIsq( temp, iKey, indexNew ) ) + { + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( indexNew ), iKey ); + } + } + } + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetNewSnapshot +// Sets new snapshot (to be compared against), ChangeFinder takes ownership +// ----------------------------------------------------------------------------- +void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) + { + LOGGER_ENTERFN( "CChangeFinder::SetNewSnapshot" ); + + // Delete existing snapshot + delete iCurrentSnapshot; + + // Set submitted snapshot as active + iCurrentSnapshot = aNewSnapshot; + LOGGER_LEAVEFN( "CChangeFinder::SetNewSnapshot" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::DataStoreUid +// returns stored data store id number +// ----------------------------------------------------------------------------- +TInt64 CChangeFinder::DataStoreUid() const + { + LOGGER_ENTERFN( "CChangeFinder::DataStoreUid" ); + LOGGER_LEAVEFN( "CChangeFinder::DataStoreUid" ); + return iDataStoreUid; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetDataStoreUid +// Sets data store id number +// ----------------------------------------------------------------------------- +void CChangeFinder::SetDataStoreUid( TInt64 aUid ) + { + LOGGER_ENTERFN( "CChangeFinder::SetDataStoreUid" ); + iDataStoreUid = aUid; + LOGGER_LEAVEFN( "CChangeFinder::SetDataStoreUid" ); + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/conversionutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/conversionutil.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2005-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: Conversion utility +* +*/ + +#include +#include "conversionutil.h" +#include "omadsfolderobject.h" +#include "vbookmarkconverter.h" +#include "logger.h" + + +// ----------------------------------------------------------------------------- +// NewL +// Creates the object +// ----------------------------------------------------------------------------- +CBookmarkConversionUtil* CBookmarkConversionUtil::NewL() + { + CBookmarkConversionUtil* self = CBookmarkConversionUtil::NewLC(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// NewLC +// Creates the object and leaves it into the cleanup stack +// ----------------------------------------------------------------------------- +CBookmarkConversionUtil* CBookmarkConversionUtil::NewLC() + { + CBookmarkConversionUtil* self = new ( ELeave ) CBookmarkConversionUtil(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// ConstructL +// 2nd phase constructor +// ----------------------------------------------------------------------------- +void CBookmarkConversionUtil::ConstructL() + { + // Create OMA DS folder object converter + iOmaConverter = COMADSFolderObject::NewL(); + + // Create vBookmark converter + iVBookmarkConverter = CVBookmarkConverter::NewL(); + } + +// ----------------------------------------------------------------------------- +// ~CBookmarkConversionUtil +// Destroys all allocated resources +// ----------------------------------------------------------------------------- +CBookmarkConversionUtil::~CBookmarkConversionUtil() + { + delete iOmaConverter; + iOmaConverter = NULL; + + delete iVBookmarkConverter; + iVBookmarkConverter = NULL; + } + + + +// ----------------------------------------------------------------------------- +// FavouritesItemToBufferL +// Converts CFavouritesItem to it's binary sync representation +// ----------------------------------------------------------------------------- +void CBookmarkConversionUtil::FavouritesItemToBufferL( + const CFavouritesItem& aItem, CBufFlat& aBuffer) + { + LOGGER_ENTERFN( "CBookmarkConversionUtil::FavouritesItemToBufferL" ); + + if( aItem.Type() == CFavouritesItem::EFolder ) + { + // Set input data + iOmaConverter->ImportDbItem(aItem); + + // Export to buffer + iOmaConverter->ExportFolderXmlL(aBuffer); + } + else if( aItem.Type() == CFavouritesItem::EItem ) + { + // Set input data + iVBookmarkConverter->ImportDbItemL(aItem); + + // Export to buffer + iVBookmarkConverter->ExportVBookmarkL(aBuffer); + } + else + { + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// RssItemToBufferL +// Converts CFolderItem to it's binary sync representation +// ----------------------------------------------------------------------------- +void CBookmarkConversionUtil::RssItemToBufferL( + const CFolderItem& aItem, CBufFlat& aBuffer) + { + LOGGER_ENTERFN( "CBookmarkConversionUtil::RssItemToBufferL" ); + + if( aItem.IsFolder() ) + { + // Set input data + iOmaConverter->ImportDbItem(aItem); + + // Export to buffer + iOmaConverter->ExportFolderXmlL(aBuffer); + } + else + { + // Set input data + iVBookmarkConverter->ImportDbItemL(aItem); + + // Export to buffer + iVBookmarkConverter->ExportVBookmarkL(aBuffer); + } + } + +// ----------------------------------------------------------------------------- +// BufferToFavouritesItemL +// Converts Binary data to CFavouritesItem +// ----------------------------------------------------------------------------- +TInt CBookmarkConversionUtil::BufferToFavouritesItemL(CFavouritesItem::TType aType, + CBufFlat& aBuffer, CFavouritesItem& aItem) + { + LOGGER_ENTERFN( "CBookmarkConversionUtil::BufferToFavouritesItemL" ); + + if ( aType == CFavouritesItem::EFolder ) + { + // Import XML data + TInt error = iOmaConverter->ImportFolderXml( aBuffer.Ptr( 0 ) ); + + // Convert to CFavouritesItem + if ( error == KErrNone ) + { + iOmaConverter->ExportDbItemL( aItem ); + } + + return error; + } + else if ( aType == CFavouritesItem::EItem ) + { + // Import vBookmark data + TInt error = iVBookmarkConverter->ImportVBookmarkL( aBuffer.Ptr( 0 ) ); + + // Convert to CFavouritesItem + if ( error == KErrNone ) + { + iVBookmarkConverter->ExportDbItemL( aItem ); + } + + return error; + } + else + { + return KErrNotSupported; + } + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/omadsfolderobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/omadsfolderobject.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,490 @@ +/* +* Copyright (c) 2005-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: OMA DS Folder object XML parser +* +*/ + +#include +#include +#include // Localized names for folders +#include +#include +#include +#include +#include + +#include "bookmarkdataproviderdefs.h" +#include "omadsfolderobject.h" +#include "logger.h" + +_LIT( KOMADSResourceName, "\\resource\\bookmarkdsa.rsc" ); + +_LIT8(KOMADSFolderElement, "Folder"); +_LIT8(KOMADSNameElement, "name"); +_LIT8(KOMADSCreatedElement, "created"); +_LIT8(KOMADSModifiedElement, "modified"); + +_LIT(KFolderBeginTag, ""); +_LIT(KFolderEndTag, ""); +_LIT(KNameBeginTag, ""); +_LIT(KNameEndTag, ""); +_LIT(KCreatedBeginTag, ""); +_LIT(KCreatedEndTag, ""); +_LIT(KModifiedBeginTag, ""); +_LIT(KModifiedEndTag, ""); +const TInt KDateFormatLength = 15; +_LIT(KDateFormat, "%04d%02d%02dT%02d%02d%02d"); + + +COMADSFolderObject* COMADSFolderObject::NewLC() + { + COMADSFolderObject* pSelf = new (ELeave) COMADSFolderObject; + CleanupStack::PushL(pSelf); + pSelf->ConstructL(); + return pSelf; + } + +COMADSFolderObject* COMADSFolderObject::NewL() + { + COMADSFolderObject* pSelf = COMADSFolderObject::NewLC(); + CleanupStack::Pop( pSelf ); + return pSelf; + } + +COMADSFolderObject::~COMADSFolderObject() + { + delete iXmlReader; + } + +void COMADSFolderObject::ConstructL() + { + iXmlReader = CSenXmlReader::NewL(); + iXmlReader->SetContentHandler(*this); + } + +TInt COMADSFolderObject::ImportFolderXml( RFs& aFs, const TDesC& aFilename ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + + TInt error; + + Reset(); + TRAP( error, iXmlReader->ParseL( aFs, aFilename ) ) + if( error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +TInt COMADSFolderObject::ImportFolderXml( const TDesC8& aData ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + + TInt error; + + Reset(); + + TRAP(error, iXmlReader->ParseL(aData) ); + if(error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +void COMADSFolderObject::ExportFolderXmlL( CBufBase& aBuffer ) + { + iDesc = NULL; + iBuffer = &aBuffer; + iWriteBufPosition = 0; + iWriteBufSize = aBuffer.Size(); + + ExportL(); + } + +void COMADSFolderObject::ExportFolderXmlL( TDes8& aBuffer ) + { + iDesc = &aBuffer; + iBuffer = NULL; + + ExportL(); + } + +void COMADSFolderObject::ExportL() + { + // Folder + WriteL( KFolderBeginTag ); + + // Name + WriteL( KNameBeginTag ); + WriteEncodedXmlL( iName ); + WriteL( KNameEndTag ); + + // Created Date + TBuf tempdate; + tempdate.Format( KDateFormat, iCreatedDate.Year(), iCreatedDate.Month() + 1, + iCreatedDate.Day(), iCreatedDate.Hour(), iCreatedDate.Minute(), iCreatedDate.Second() ); + + WriteL( KCreatedBeginTag ); + WriteL( tempdate ); + WriteL( KCreatedEndTag ); + + // Modified Date + tempdate.Format( KDateFormat, iModifiedDate.Year(), iModifiedDate.Month() + 1, + iModifiedDate.Day(), iModifiedDate.Hour(), iModifiedDate.Minute(), iModifiedDate.Second() ); + + WriteL( KModifiedBeginTag ); + WriteL( tempdate ); + WriteL( KModifiedEndTag ); + + // Folder end + WriteL(KFolderEndTag); + } + +void COMADSFolderObject::WriteL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + iTemp.Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, iTemp ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( iTemp ); + } + } + +void COMADSFolderObject::WriteEncodedXmlL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + HBufC8* xmlData = SenXmlUtils::EncodeHttpCharactersLC( iTemp ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + xmlData->Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, *xmlData ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( *xmlData ); + } + + CleanupStack::PopAndDestroy( xmlData ); + } + +TInt COMADSFolderObject::StartDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::EndDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::StartElement(const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, + const TDesC8& aName, + const RAttributeArray& /*apAttrs*/) + { + LOGGER_ENTERFN( "COMADSFolderObject::StartElement" ); + iCurrentElement.Copy( aName ); + LOGGER_LEAVEFN( "COMADSFolderObject::StartElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::EndElement( const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, const TDesC8& /*aName*/ ) + { + LOGGER_ENTERFN( "COMADSFolderObject::EndElement" ); + iCurrentElement.SetLength(0); + LOGGER_LEAVEFN( "COMADSFolderObject::EndElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::Characters( const TDesC8& aBuf, TInt aStart, TInt aLength ) + { + LOGGER_ENTERFN( "COMADSFolderObject::Characters" ); + + TInt error; + + if( iCurrentElement.Compare( KOMADSFolderElement ) == 0 ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + + else if ( iCurrentElement.Compare( KOMADSNameElement ) == 0 ) + { + CnvUtfConverter converter; + TBuf buf; + error = converter.ConvertToUnicodeFromUtf8( buf, aBuf.Mid( aStart, aLength ) ); + TInt length = buf.Length() + iName.Length(); + + if ( error > 0 ) + { + LOGGER_WRITE_1("Too long name, number of uncorverted bytes: %d", error); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1("ConvertToUnicodeFromUtf8 failed with %d", error); + iError = error; + } + else if ( length > iName.MaxLength() ) + { + LOGGER_WRITE_1("Too long name total: %d", length); + } + else + { + iName.Append( buf ); + } + } + else if ( iCurrentElement.Compare( KOMADSCreatedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iCreatedDate ); + if( error != KErrNone ) + { + iError = error; + } + } + else if ( iCurrentElement.Compare( KOMADSModifiedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iModifiedDate ); + if ( error != KErrNone ) + { + iError = error; + } + } + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + +TInt COMADSFolderObject::ParseDateString(const TDesC8& aString, TDateTime& aDateTime) + { + // Ensure we don't read beyond the buffer limits + if ( aString.Length() < KDateFormatLength ) + { + return KErrArgument; + } + // Extract the fields from the string + TLex8 yearDesc( aString.Mid( 0, 4 ) ); + TLex8 monthDesc( aString.Mid( 4, 2 ) ); + TLex8 dayDesc( aString.Mid( 6, 2 ) ); + // Skip one character here, it's supposed to be 'T' + TLex8 hourDesc( aString.Mid( 9, 2 ) ); + TLex8 minuteDesc( aString.Mid( 11, 2 ) ); + TLex8 secondDesc( aString.Mid( 13, 2 ) ); + + + TInt year, month, day, hour, minute, second; + TInt error; + + // Fetch the values to temporary variables + if ( ( error = yearDesc.Val(year) ) != KErrNone ) + return error; + if ( ( error = monthDesc.Val(month) ) != KErrNone ) + return error; + if ( ( error = dayDesc.Val(day) ) != KErrNone ) + return error; + if ( ( error = hourDesc.Val(hour) ) != KErrNone ) + return error; + if ( ( error = minuteDesc.Val(minute) ) != KErrNone ) + return error; + if ( ( error = secondDesc.Val(second) ) != KErrNone ) + return error; + + // Assign values to datetime object + if ( ( error = aDateTime.SetYear(year) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetMonth((TMonth)(month-1) )) != KErrNone ) + return error; + if ( ( error = aDateTime.SetDay(day) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetHour(hour) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetMinute(minute) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetSecond(second) ) != KErrNone ) + return error; + + return KErrNone; + } + +void COMADSFolderObject::Reset() + { + iError = KErrNone; + iName.SetLength( 0 ); + iCreatedDate.Set( 2005, EJanuary, 1, 0, 0, 0, 0 ); + iModifiedDate.Set( 2005, EJanuary, 1, 0, 0, 0, 0 ); + } + +TInt COMADSFolderObject::Error( TInt aErrorCode ) + { + iError = aErrorCode; + return KErrNone; + } + +void COMADSFolderObject::ExportDbItemL(CFavouritesItem& aItem) + { + aItem.SetNameL(iName); + aItem.SetType(CFavouritesItem::EFolder); + } + +void COMADSFolderObject::ImportDbItem(const CFavouritesItem& aItem) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportDbItem" ); + Reset(); + + TInt resId(KErrNotFound); + switch( aItem.ContextId() ) // Check if the item is a seamless link folder + { + case KFavouritesApplicationContextId: + { + LOGGER_WRITE("DOWNLOAD_APPLICATIONS"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_APPLICATIONS; + LOGGER_WRITE_1( "resId: %d", resId ); + break; + } + case KFavouritesImageContextId: + { + LOGGER_WRITE("DOWNLOAD_IMAGES"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_IMAGES; + break; + } + case KFavouritesAudioContextId: + { + LOGGER_WRITE("DOWNLOAD_TONES"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_TONES; + break; + } + case KFavouritesVideoContextId: + { + LOGGER_WRITE("DOWNLOAD_VIDEOS"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_VIDEOS; + break; + } + case KFavouritesSkinContextId: + { + LOGGER_WRITE("DOWNLOAD_SKINS"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_SKINS; + break; + } + case KFavouritesMusicContextId: + { + LOGGER_WRITE("DOWNLOAD_MUSIC"); + resId = R_BOOKMARKDSA_FOLDER_DOWNLOAD_MUSIC; + break; + } + default: + { + break; // not a seamless link folder. + } + } + + if( resId != KErrNotFound ) + { + LOGGER_WRITE( "before ReadFolderNameL" ); + TRAPD( error, ReadFolderNameL( iName, resId ) ); + LOGGER_WRITE( "after ReadFolderNameL" ); + if ( error ) + { + LOGGER_WRITE_1( "Error reading folder name: %d", error ); + } + } + else + { + LOGGER_WRITE( "before iName = aItem.Name();" ); + iName = aItem.Name(); + } + LOGGER_WRITE( "printing foldername.." ); + LOGGER_WRITE_1( "Foldername: %S", &iName); + LOGGER_LEAVEFN( "COMADSFolderObject::ImportDbItem" ); + } + + +void COMADSFolderObject::ImportDbItem( const CFolderItem& aItem ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportDbItem" ); + Reset(); + if ( aItem.Id() == 0 ) + { + _LIT8( KRSSRootFolderName, "Web Feeds" ); + iName.Copy( KRSSRootFolderName ); + } + else + { + iName = aItem.Name(); + } + + LOGGER_LEAVEFN( "COMADSFolderObject::ImportDbItem" ); + } + + +void COMADSFolderObject::ReadFolderNameL( TDes& aName, const TInt aResID ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ReadFolderNameL" ); + + TFileName resName( KOMADSResourceName ); + + // Resource can be on ROM or on C-drive, if installed from SIS. + TFileName dllName; + Dll::FileName( dllName ); + + LOGGER_WRITE_1("DllFileName: %S", &dllName ); + + TParse parse; + parse.Set( resName, &dllName, 0 ); + resName = parse.FullName(); + + LOGGER_WRITE_1( "resName: %S", &resName ); + + CStringResourceReader* reader = CStringResourceReader::NewLC( resName ); + LOGGER_WRITE_1( "readed resfile: %S", &resName ); + + aName.Copy( reader->ReadResourceString( aResID ) ); + LOGGER_WRITE("Resource Readed ok"); + CleanupStack::PopAndDestroy( reader ); + + LOGGER_LEAVEFN( "COMADSFolderObject::ReadFolderNameL" ); + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/snapshotitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/snapshotitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,94 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + +#include +#include +#include "snapshotitem.h" +#include "logger.h" + + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem() : TNSmlSnapshotItem() + { + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// Constructor, takes item id as a parameter +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent ) +: TNSmlSnapshotItem( aItemId ) + { + SetParentId( aParent ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::ExternalizeL +// Writes the contents of this class and it's base to stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::ExternalizeL( RWriteStream& aStream ) const + { + TNSmlSnapshotItem::ExternalizeL( aStream ); + TPckgBuf nameBuf(iHash); + aStream << nameBuf; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::InternalizeL +// Reads the contents of this class and it's base from stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::InternalizeL( RReadStream& aStream ) + { + TNSmlSnapshotItem::InternalizeL( aStream ); + TPckgBuf nameBuf; + aStream >> nameBuf; + iHash = nameBuf(); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::CreateHashL +// Create hash value from name and url +// ----------------------------------------------------------------------------- + +void TSnapshotItem::CreateHashL( const TDesC& aName , const TDesC& aUrl ) + { + CMessageDigest* hash = CMessageDigestFactory::NewDigestLC( CMessageDigest::EMD5 ); + HBufC8* tempBuf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aName ); + CleanupStack::PushL( tempBuf ); + hash->Update( tempBuf->Des() ); + CleanupStack::PopAndDestroy( tempBuf ); + tempBuf = NULL; + tempBuf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aUrl ); + hash->Update( tempBuf->Des() ); + iHash.Copy( hash->Final() ); + delete tempBuf; + tempBuf = NULL; + CleanupStack::PopAndDestroy( hash ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::Hash +// Gets Hash +// ----------------------------------------------------------------------------- +const TDesC8& TSnapshotItem::Hash() const + { + return iHash; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/bookmark/src/vbookmarkconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/bookmark/src/vbookmarkconverter.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,713 @@ +/* +* Copyright (c) 2005-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: Bookmark object conversion routines +* +*/ + + +// INCLUDES +#include +#include +#include +#include "vbookmarkconverter.h" +#include "logger.h" + +// CONSTANTS +_LIT8(KVBMKBegin, "BEGIN"); +_LIT8(KVBMKEnd, "END"); +_LIT8(KVBMKVbkm, "VBKM"); +_LIT8(KVBMKEnv, "ENV"); +_LIT8(KVBMKVersion, "VERSION"); +_LIT8(KVBMKVer, "1.0"); +_LIT8(KVBMKUrl, "URL"); +_LIT8(KVBMKTitle, "TITLE"); +_LIT8(KVBMKXIrmcUrl, "X-IRMC-URL"); +_LIT8(KVBMKInternetShortcut, "[InternetShortcut]"); +_LIT8(KVBMKPrintable, "QUOTED-PRINTABLE"); +_LIT8(KVBMKLinefeed, "\r\n"); +_LIT8(KVBMKColon, ":"); +_LIT8(KVBMKAssignment, "="); +_LIT8(KVBMKSemicolon, ";"); +_LIT8(KVBMKNone, ""); +_LIT(KEmptyString, ""); +_LIT8(KVBMKCharset, "CHARSET"); +_LIT8(KVBMKUtf8, "UTF-8"); + +// ----------------------------------------------------------------------------- +// CVBookmarkConverter::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CVBookmarkConverter* CVBookmarkConverter::NewL() + { + CVBookmarkConverter* self = CVBookmarkConverter::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVBookmarkConverter::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CVBookmarkConverter* CVBookmarkConverter::NewLC() + { + CVBookmarkConverter* self = new (ELeave) CVBookmarkConverter(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVBookmarkConverter::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CVBookmarkConverter::ConstructL() + { + iVersion = HBufC::NewL(1); + iTitle = HBufC::NewL(1); + iUrl = HBufC::NewL(1); + iInternetShortcut = HBufC::NewL(1); + } + +// ----------------------------------------------------------------------------- +// CVBookmarkConverter::CVBookmarkConverter +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CVBookmarkConverter::CVBookmarkConverter() + { + } + +// ----------------------------------------------------------------------------- +// CVBookmarkConverter::~CVBookmarkConverter +// Destructor. +// ----------------------------------------------------------------------------- +CVBookmarkConverter::~CVBookmarkConverter() + { + delete iVersion; + delete iUrl; + delete iTitle; + delete iInternetShortcut; + } + +const TDesC& CVBookmarkConverter::GetVersion() const + { + return *iVersion; + } + +const TDesC& CVBookmarkConverter::GetUrl() const + { + return *iUrl; + } + +const TDesC& CVBookmarkConverter::GetTitle() const + { + return *iTitle; + } + +const TDesC& CVBookmarkConverter::GetInternetShortcut() const + { + return *iInternetShortcut; + } + +void CVBookmarkConverter::SetVersionL( const TDesC& aVersion ) + { + delete iVersion; + iVersion = NULL; + iVersion = aVersion.AllocL(); + } + +void CVBookmarkConverter::SetVersionL( const TDesC8& aVersion ) + { + delete iVersion; + iVersion = NULL; + iVersion = CnvUtfConverter::ConvertToUnicodeFromUtf8L( aVersion ); + } + +void CVBookmarkConverter::SetUrlL( const TDesC& aUrl ) + { + delete iUrl; + iUrl = NULL; + iUrl = aUrl.AllocL(); + } + +void CVBookmarkConverter::SetUrlL( const TDesC8& aUrl ) + { + delete iUrl; + iUrl = NULL; + iUrl = CnvUtfConverter::ConvertToUnicodeFromUtf8L( aUrl ); + } + +void CVBookmarkConverter::SetTitleL( const TDesC& aTitle ) + { + delete iTitle; + iTitle = NULL; + iTitle = aTitle.AllocL(); + } + +void CVBookmarkConverter::SetTitleL( const TDesC8& aTitle, TBookmarkEncoding aEncoding ) + { + delete iTitle; + iTitle = NULL; + + if ( aEncoding == EQuotedPrintable ) + { + HBufC8* decodedData = DecodeQuotedPrintableLC( aTitle ); + iTitle = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *decodedData ); + CleanupStack::PopAndDestroy( decodedData ); + } + else + { + iTitle = CnvUtfConverter::ConvertToUnicodeFromUtf8L( aTitle ); + } + } + +HBufC8* CVBookmarkConverter::DecodeQuotedPrintableLC( const TDesC8& aEncodedData ) + { + TInt encodedLength = aEncodedData.Length(); + + HBufC8* decodeBuffer = HBufC8::NewLC( encodedLength ); + TPtr8 ptrDecodeBuffer = decodeBuffer->Des(); + + TInt i(0); + while ( i < encodedLength ) + { + TChar nextChar = aEncodedData[i++]; + + if ( nextChar == '=' ) + { + if ( i + 2 > encodedLength ) + { + ptrDecodeBuffer.Append( '=' ); + if ( i + 1 == encodedLength ) + { + ptrDecodeBuffer.Append( aEncodedData[i++] ); + } + } + else + { + TPtrC8 data = aEncodedData.Mid( i, 2 ); + i += 2; + + if ( data.Compare(KVBMKLinefeed) == 0 ) + { + // Do nothing + // '=' at the end of line is soft line break, not to be decoded + } + else + { + TLex8 hexChar( data ); + TUint8 value( 0 ); + + if ( hexChar.Val( value, EHex ) == KErrNone ) + { + ptrDecodeBuffer.Append( TChar( value ) ); + } + else + { + // Decoding failed, put the data at itself + ptrDecodeBuffer.Append( '=' ); + ptrDecodeBuffer.Append( data ); + } + } + } + } + else + { + ptrDecodeBuffer.Append( nextChar ); + } + } + + return decodeBuffer; + } + +void CVBookmarkConverter::SetInternetShortcutL( const TDesC& aInternetShortcut ) + { + delete iInternetShortcut; + iInternetShortcut = NULL; + iInternetShortcut = aInternetShortcut.AllocL(); + } + +void CVBookmarkConverter::SetInternetShortcutL( const TDesC8& aInternetShortcut ) + { + delete iInternetShortcut; + iInternetShortcut = NULL; + iInternetShortcut = CnvUtfConverter::ConvertToUnicodeFromUtf8L( aInternetShortcut ); + } + +void CVBookmarkConverter::ExportDbItemL( CFavouritesItem& aItem ) + { + if ( iTitle->Des().Length() > KFavouritesMaxName ) + { + TPtrC title = iTitle->Des().Left( KFavouritesMaxName ); + aItem.SetNameL( title ); + } + else + { + aItem.SetNameL( *iTitle ); + } + + if ( iUrl->Des().Length() > KFavouritesMaxUrl ) + { + TPtrC url = iUrl->Des().Left( KFavouritesMaxUrl ); + aItem.SetUrlL( url ); + } + else + { + aItem.SetUrlL( *iUrl ); + } + } + +void CVBookmarkConverter::ImportDbItemL( const CFavouritesItem& aItem ) + { + ResetL(); + + if( aItem.Type() != CFavouritesItem::EItem ) + { + User::Leave( KErrNotSupported ); + } + + SetVersionL( KVBMKVer ); + SetUrlL( aItem.Url() ); + SetInternetShortcutL( aItem.Url() ); + SetTitleL( aItem.Name() ); + } + +void CVBookmarkConverter::ImportDbItemL( const CFolderItem& aItem ) + { + ResetL(); + + if( aItem.IsFolder() ) + { + User::Leave( KErrNotSupported ); + } + + SetVersionL( KVBMKVer ); + SetUrlL( aItem.SourceUrl() ); + SetInternetShortcutL( aItem.SourceUrl() ); + SetTitleL( aItem.Name() ); + } + +void CVBookmarkConverter::ExportVBookmarkL( CBufBase& aBuffer ) + { + LOGGER_ENTERFN( "CVBookmarkConverter::ExportVBookmarkL" ); + + iDesc = NULL; + iBuffer = &aBuffer; + iWriteBufPosition = 0; + iWriteBufSize = aBuffer.Size(); + + ExportL(); + iBuffer->ResizeL( iWriteBufPosition ); + + LOGGER_LEAVEFN( "CVBookmarkConverter::ExportVBookmarkL" ); + } + +void CVBookmarkConverter::ExportVBookmarkL( TDes8& aBuffer ) + { + iDesc = &aBuffer; + iBuffer = NULL; + + ExportL(); + } + +void CVBookmarkConverter::ResetL() + { + SetVersionL( KEmptyString ); + SetUrlL( KEmptyString ); + SetTitleL( KEmptyString ); + SetInternetShortcutL( KEmptyString ); + } + +void CVBookmarkConverter::ExportL() + { + LOGGER_ENTERFN( "CVBookmarkConverter::ExportL" ); + + WriteMessageLineL( KVBMKBegin, KVBMKVbkm, KVBMKColon ); // Begin tag + + HBufC8* version = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iVersion ); + CleanupStack::PushL( version ); + WriteMessageLineL( KVBMKVersion, *version, KVBMKColon ); // Version + CleanupStack::PopAndDestroy( version ); + + HBufC8* url = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iUrl ); + CleanupStack::PushL( url ); + // Url + WriteL( KVBMKUrl ); + WriteL( KVBMKSemicolon ); + WriteL( KVBMKCharset ); + WriteL( KVBMKAssignment ); + WriteL( KVBMKUtf8 ); + WriteL( KVBMKColon ); + WriteL( *url ); + WriteL( KVBMKLinefeed ); + CleanupStack::PopAndDestroy( url ); + + HBufC8* title = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iTitle ); + CleanupStack::PushL( title ); + // Title + WriteL( KVBMKTitle ); + WriteL( KVBMKSemicolon ); + WriteL( KVBMKCharset ); + WriteL( KVBMKAssignment ); + WriteL( KVBMKUtf8 ); + WriteL( KVBMKColon ); + WriteL( *title ); + WriteL( KVBMKLinefeed ); + CleanupStack::PopAndDestroy( title ); + + if( iInternetShortcut->Length() > 0 ) + { + WriteEnvelopeL(); + } + + WriteMessageLineL( KVBMKEnd, KVBMKVbkm, KVBMKColon ); // End tag + + LOGGER_LEAVEFN( "CVBookmarkConverter::ExportL" ); + } + +TInt CVBookmarkConverter::ImportVBookmarkL( const TDesC8& aBuffer ) + { + LOGGER_ENTERFN( "CVBookmarkConverter::ImportVBookmarkL" ); + + ResetL(); + + TInt error = KErrNone; + TInt position = 0; + TPtrC8 tag; + TPtrC8 value; + TPtrC8 properties; + error = ReadTagAndValue( aBuffer, position, tag, value, properties ); + if( error != KErrNone ) + { + LOGGER_WRITE_1( "ReadTagAndValue err: %d", error ); + return error; + } + + if ( ( tag != KVBMKBegin ) || ( value != KVBMKVbkm ) ) + { + LOGGER_WRITE( "Invalid tag" ); + return KErrNotFound; + } + + while ( ( error = ReadTagAndValue( aBuffer, position, tag, value, properties ) ) == KErrNone ) + { + // Version + if ( tag == KVBMKVersion ) + { + SetVersionL( value ); + } + + // Url + else if ( tag == KVBMKUrl ) + { + SetUrlL( value ); + } + + // Title + else if ( tag == KVBMKTitle ) + { + TBookmarkEncoding encoding = Encoding( properties ); + SetTitleL( value, encoding ); + } + + // Beginning of envelope + else if ( ( tag == KVBMKBegin ) && ( value == KVBMKEnv ) ) + { + // Read the envelope, quit if error + error = ReadEnvelopeL( aBuffer, position ); + if( error != KErrNone ) + { + return error; + } + } + + // End of Bookmark + else if ( ( tag == KVBMKEnd ) && ( value == KVBMKVbkm ) ) + { + return error; + } + + else + { + // Unknown data, skip + } + } + + LOGGER_LEAVEFN( "CVBookmarkConverter::ImportVBookmarkL" ); + return error; + } + +void CVBookmarkConverter::WriteMessageLineL( const TDesC8& aMsgLineTag, + const TDesC8& aMsgLineData, const TDesC8& aSeparator ) + { + WriteL( aMsgLineTag ); + WriteL( aSeparator ); + WriteL( aMsgLineData ); + WriteL( KVBMKLinefeed ); + } + +TInt CVBookmarkConverter::ReadTagAndValue( const TDesC8& aBuffer, TInt& aPosition, + TPtrC8& aTag, TPtrC8& aValue, TPtrC8& aProperties ) + { + LOGGER_ENTERFN( "CVBookmarkConverter::ReadTagAndValue" ); + + TPtrC8 start = aBuffer.Mid( aPosition ); + TInt delimeter = start.Find( KVBMKColon ); + TInt linefeed = start.Find( KVBMKLinefeed ); + TInt semicolon = start.Find( KVBMKSemicolon ); + + + // Did we find a linefeed? + if ( linefeed == KErrNotFound ) + { + // Check whether file ends without newline + if( aBuffer.Length() <= ( aPosition + start.Length() ) ) + { + // Set linefeed at the end of the file + linefeed = start.Length(); + } + else + { + return KErrNotFound; + } + } + + // Did we find a semicolon? + if ( semicolon != KErrNotFound ) + { + // It must be before the delimeter (property identifiers reside in this block) + if ( semicolon >= delimeter || semicolon < 0 ) + { + semicolon = KErrNotFound; + } + } + + // Did we find the delimeter + if( delimeter == KErrNotFound ) + { + return KErrNotFound; + } + + // Linefeed must reside behind the delimeter + if ( linefeed <= delimeter ) + { + return KErrNotFound; + } + + aTag.Set( start.Left( semicolon != KErrNotFound ? semicolon : delimeter ) ); + IgnoreSpaces( aTag ); + + // Extract value + aValue.Set( start.Mid( delimeter + 1, (linefeed - 1) - delimeter ) ); + IgnoreSpaces( aValue ); + + // Extract properties if found + if ( semicolon != KErrNotFound ) + { + aProperties.Set( start.Mid( semicolon, delimeter - semicolon ) ); + IgnoreSpaces( aProperties ); + } + else + { + aProperties.Set( KVBMKNone() ); + } + + // update position + aPosition += ( linefeed + KVBMKLinefeed().Length() ); + + LOGGER_LEAVEFN( "CVBookmarkConverter::ReadTagAndValue" ); + return KErrNone; + } + +TInt CVBookmarkConverter::ReadEnvelopeL( const TDesC8& aBuffer, TInt& aPosition ) + { + LOGGER_ENTERFN( "CVBookmarkConverter::ReadEnvelopeL" ); + + TInt error = KErrNone; + TPtrC8 tag; + TPtrC8 value; + TPtrC8 properties; + + while ( ( error = ReadTagAndValue( aBuffer, aPosition, tag, value, properties ) ) == KErrNone ) + { + // End of Bookmark + if ( tag == KVBMKXIrmcUrl ) + { + error = ReadAssignment( aBuffer, aPosition, tag, value ); + if ( error != KErrNone ) + { + return error; + } + + if ( tag == KVBMKInternetShortcut ) + { + error = ReadAssignment( aBuffer, aPosition, tag, value ); + if( error != KErrNone ) + { + return error; + } + + if ( tag == KVBMKUrl ) + { + SetInternetShortcutL( value ); + } + else + { + return KErrNotFound; + } + } + else + { + return KErrNotFound; + } + } + + else if ( ( tag == KVBMKEnd ) && ( value == KVBMKEnv ) ) + { + return error; + } + else + { + // Unknown data, skip + } + } + + LOGGER_LEAVEFN( "CVBookmarkConverter::ReadEnvelopeL" ); + return error; + } + +TInt CVBookmarkConverter::ReadAssignment( const TDesC8& aBuffer, + TInt& aPosition, TPtrC8& aTag, TPtrC8& aValue ) + { + LOGGER_ENTERFN( "CVBookmarkConverter::ReadAssignment" ); + + TPtrC8 start = aBuffer.Mid( aPosition ); + TInt assignment = start.Find( KVBMKAssignment ); + TInt linefeed = start.Find( KVBMKLinefeed ); + + // Did we find the delimeter and the linefeed + if ( ( assignment == KErrNotFound) || ( linefeed == KErrNotFound ) ) + { + return KErrNotFound; + } + // Linefeed must reside behind the delimeter + if ( linefeed <= assignment ) + { + return KErrNotFound; + } + // Extract tag + aTag.Set( start.Left( assignment ) ); + IgnoreSpaces( aTag ); + + // Extract value + aValue.Set( start.Mid( assignment + 1, ( linefeed - 1 ) - assignment ) ); + IgnoreSpaces( aValue ); + + // update position + aPosition += ( linefeed + KVBMKLinefeed().Length() ); + + LOGGER_LEAVEFN( "CVBookmarkConverter::ReadAssignment" ); + return KErrNone; + } + +void CVBookmarkConverter::WriteEnvelopeL() + { + WriteMessageLineL( KVBMKBegin, KVBMKEnv, KVBMKColon ); // Begin tag + + // "X-IRMC-URL;QUOTED-PRINTABLE:=" + WriteL( KVBMKXIrmcUrl ); + WriteL( KVBMKSemicolon ); + WriteL( KVBMKPrintable ); + WriteL( KVBMKColon ); + WriteL( KVBMKAssignment ); + WriteL( KVBMKLinefeed ); + + WriteMessageLineL( KVBMKInternetShortcut, KVBMKNone, KVBMKAssignment ); + + HBufC8* internetShortcut = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iInternetShortcut ); + CleanupStack::PushL( internetShortcut ); + WriteMessageLineL( KVBMKUrl, *internetShortcut, KVBMKAssignment ); + CleanupStack::PopAndDestroy( internetShortcut ); + + WriteMessageLineL( KVBMKEnd, KVBMKEnv, KVBMKColon ); // End tag + } + +void CVBookmarkConverter::WriteL( const TDesC8 &aData ) + { + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + aData.Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expandStep = newPosition - iWriteBufSize + 100; + iBuffer->ExpandL( iWriteBufSize, expandStep ); + iWriteBufSize += expandStep; + } + + iBuffer->Write( iWriteBufPosition, aData ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( aData ); + } + } + +void CVBookmarkConverter::IgnoreSpaces( TPtrC8& aData ) + { + TInt last = aData.Length() - 1; + + TInt begin; + for ( begin = 0; begin <= last; begin++ ) + { + if ( !TChar( aData[begin] ).IsSpace() ) + { + break; + } + } + + TInt end; + for ( end = last; end >= 0; end-- ) + { + if ( !TChar( aData[end] ).IsSpace() ) + { + break; + } + } + + TInt length = end - begin + 1; + + if ( ( begin != 0 || end != last ) && length > 0 ) + { + TPtrC8 newData = aData.Mid( begin, length ); + aData.Set( newData ); + } + } + +TBookmarkEncoding CVBookmarkConverter::Encoding( TPtrC8& aProperties ) + { + TBookmarkEncoding encoding = ENoEncoding; + + TInt length = aProperties.Length(); + + if ( aProperties.Length() > 0 ) + { + if ( aProperties.Find( KVBMKPrintable ) > 0 ) + { + encoding = EQuotedPrintable; + } + } + + return encoding; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contacts/src/NSmlContactsDataProvider.cpp --- a/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataProvider.cpp Wed Jun 23 18:02:53 2010 +0300 +++ b/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataProvider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -38,6 +38,13 @@ #include "nsmldsimpluids.h" #include "nsmlchangefinder.h" +#ifndef __WINS__ +// This lowers the unnecessary compiler warning (armv5) to remark. +// "Warning: #174-D: expression has no effect..." is caused by +// DBG_ARGS8 macro in no-debug builds. +#pragma diag_remark 174 +#endif + // ============================ MEMBER FUNCTIONS =============================== // ----------------------------------------------------------------------------- diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/101ff972.xml Binary file omads/omadsextensions/adapters/contactsgroup/group/101ff972.xml has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2008-2010 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: bld file for Contacts Group DS adapter +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +./101ff972.xml Z:/private/101f99f6/capability/101ff972.xml +./contactsgrpdsa_stub.sis /epoc32/data/z/system/install/contactsgrpdsa_stub.sis +../rom/contactsgrpdsa.iby CORE_APP_LAYER_IBY_EXPORT_PATH(contactsgrpdsa.iby) + +PRJ_MMPFILES +./contactsgrpdataprovider.mmp + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdataprovider.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdataprovider.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008-2010 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: Project definition file for project Contacts Group DS adapter +* +*/ + + +#include +#include +#include + +TARGET contactsgrpdataprovider.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x101FF972 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ..\src +SOURCE contactsgrpdataprovider.cpp +SOURCE contactsgrpdatastore.cpp +SOURCE contactsgrpconverter.cpp +SOURCE changefinder.cpp +SOURCE snapshotitem.cpp + +USERINCLUDE ..\inc + +APP_LAYER_SYSTEMINCLUDE + +SOURCEPATH ..\src + +START RESOURCE contactsgrpdataprovider.rss +HEADER +TARGET contactsgrpdataprovider.rsc +TARGETPATH ECOM_RESOURCE_DIR +END + +START RESOURCE contactsgrpdatastore.rss +HEADER +TARGET contactsgrpdatastore.rsc +TARGETPATH RESOURCE_FILES_DIR +END + + +DEBUGLIBRARY flogger.lib +LIBRARY euser.lib +LIBRARY estor.lib +LIBRARY ecom.lib +LIBRARY smldataprovider.lib +LIBRARY bafl.lib +LIBRARY nsmlchangefinder.lib +LIBRARY efsrv.lib +LIBRARY smlstoreformat.lib +LIBRARY SenXml.lib +LIBRARY charconv.lib +LIBRARY sysutil.lib +LIBRARY hash.lib +LIBRARY cntmodel.lib +LIBRARY vcard.lib +LIBRARY versit.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdsa_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdsa_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2010 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: +; +; Languages +&EN + +; Header +#{"Contacts Group DS Plugin"},(0x101FF972),1,23,0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Files to install +""-"z:\resource\contactsgrpdatastore.rsc" +""-"z:\resource\plugins\contactsgrpdataprovider.rsc" +""-"z:\sys\bin\contactsgrpdataprovider.dll" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdsa_stub.sis Binary file omads/omadsextensions/adapters/contactsgroup/group/contactsgrpdsa_stub.sis has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/group/createstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/group/createstub.bat Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Batch file for creating needed stub files. +rem + +makesis -s contactsgrpdsa_stub.pkg \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/changefinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/changefinder.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2008-2010 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: Part of ContactGroup DS adapter +* +*/ + + +#ifndef __CHANGEFINDER_H__ +#define __CHANGEFINDER_H__ + +// INCLUDES +#include +#include "snapshotitem.h" + +// DATATYPES +typedef CArrayFixSeg CSnapshotArray; + +// Granularity used with dynamic array +const TInt KSnapshotGranularity = 32; +// CLASS DECLARATION + +/** +* @brief CChangeFinder Class +* This is a ChangeFinder class, which can be used to track down changes in the contacts group store. +* It's functionality is equal to CSmlChangeFinder. Because neither of these classes contained virtual +* functionality, the functionality of this class couldn't be inherited from the CSmlChangeFinder +*/ +class CChangeFinder : public CBase + { +public: + + /** + * Class constructor, Creates a new class instance. + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + * @return CChangeFinder*, New ChangeFinder instance. + */ + static CChangeFinder* NewL( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TBool& aHasHistory, + TInt aStreamUid = KNSmlDefaultSnapshotStreamUID ); + + /** + * Class destructor. + */ + ~CChangeFinder(); + + /** + * Close ChangeFinder object, stores snapshot. + */ + void CloseL(); + + /** + * Reset change information, makes all content new from ChangeFinder point of view. + */ + void ResetL(); + + /** + * Find changed items by comparing snapshots. + * + * @param aChangedUids IN: Array for results. + */ + void FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ); + + /** + * Find deleteed items by comparing snapshots. + * + * @param aDeletedUids IN: Array for results. + */ + void FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ); + + /** + * Find new items by comparing snapshots. + * + * @param aNewUids IN: Array for results. + */ + void FindNewItemsL(CNSmlDataItemUidSet& aNewUids); + + /** + * Add item to snapshot, it is no loger reported. + * + * @param aItem IN: item to add. + */ + void ItemAddedL( const TSnapshotItem& aItem ); + + /** + * Delete item from snapshot, it is no loger reported. + * + * @param aItem IN: item to delete. + */ + void ItemDeleted( const TSnapshotItem& aItem ); + + /** + * Update item to snapshot, it is no loger reported. + * + * @param aItem IN: item to update. + */ + void ItemUpdatedL( const TSnapshotItem& aItem ); + + /** + * Commit all changes to snapshot, there's nothing to report anymore. + */ + void CommitChangesL(); + + /** + * Commit a set of items to snapshot, these items won't be reported anymore. + * + * @param aUids IN: a set of items to commit. + */ + void CommitChangesL( const MSmlDataItemUidSet& aUids ); + + /** + * Sets new snapshot to compare against. + * + * @param aNewSnapshot IN: a new snapshot. + */ + void SetNewSnapshot( CSnapshotArray* aNewSnapshot ); + +protected: + + /** + * C++ Constructor + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + */ + CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TInt aStreamUid ); + + /** + * 2nd-phase Constructor + * + * @param aHasHistory IN: ETrue, if there was synchronization history. + */ + void ConstructL( TBool& aHasHistory ); + +private: + + /** + * Allows access to streams. + */ + MSmlSyncRelationship& iSyncRelationship; + + /** + * New snapshot to compare against. + */ + CSnapshotArray* iCurrentSnapshot; + + /** + * Current snapshot. + */ + CSnapshotArray* iOldSnapshot; + + /** + * Key that is used in sorting snapshot. + */ + TKeyArrayFix iKey; + + /** + * Stream id number to access sync relationship. + */ + TInt iStreamUid; + + }; + +#endif // __CHANGEFINDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpconverter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpconverter.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 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: Group vCard object conversion routines +* +*/ + + +#ifndef __CONTACTSGRPCONVERTER_H__ +#define __CONTACTSGRPCONVERTER_H__ + +#include + +#include + +class CContactIdArray; + +/* @brief CContactsGrpConverter Class + * This class is used to convert Contact Group items to vCard presentation and vice versa. + */ + +NONSHARABLE_CLASS( CContactsGrpConverter ): public CBase + { +public: + + static CContactsGrpConverter* NewL(); + static CContactsGrpConverter* NewLC(); + ~CContactsGrpConverter(); + + // returns group label + const TDesC& GroupLabel() const; + // returns contact items beloging to group + const CContactIdArray& ItemsContained() const; + + // Import group item + void ImportDbItemL( CContactGroup& aItem ); + + // Export / Import vCard info from/to this object + void ExportVCardL( CBufBase& aBuffer ); + void ExportVCardL( RWriteStream& aWriteStream ); + void ImportVCardL( const TDesC8& aBuffer ); + + // Reset all data + void ResetL(); + +private: + + CContactsGrpConverter(); + void ConstructL(); + + void SetContactItemsL( const TDesC& aValue ); + + void SplitL( const TDesC& aText, const TChar aSeparator, RArray& aArray ); + void TrimAll( TPtrC& aValue ); +private: + HBufC* iGroupLabel; + CContactIdArray* iContactsIdArray; + + }; + +#endif // __CONTACTSGRPCONVERTER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdataprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdataprovider.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2008-2010 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: Part of ContactGroup DS adapter +* +*/ + + +#ifndef __CONTACTSGRPDATAPROVIDER_H__ +#define __CONTACTSGRPDATAPROVIDER_H__ + +#include +#include + +class CContactsGrpDataProvider : public CSmlDataProvider + { +private: + // Default C++ constructor + CContactsGrpDataProvider(); + + // 2nd phase of constructor + void ConstructL(); + +public: + + // Two-phased constructor + static CContactsGrpDataProvider* NewL(); + + // Destructor + virtual ~CContactsGrpDataProvider(); + +protected: + + virtual void DoOnFrameworkEvent( TSmlFrameworkEvent, TInt aParam1, TInt aParam2 ); + + virtual TBool DoSupportsOperation( TUid aOpId ) const; + + virtual const CSmlDataStoreFormat& DoStoreFormatL(); + + virtual CDesCArray* DoListStoresLC(); + + virtual const TDesC& DoDefaultStoreL(); + + virtual CSmlDataStore* DoNewStoreInstanceLC(); + + virtual const RPointerArray& DoSupportedServerFiltersL(); + + virtual void DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& aServerDataStoreFormat, + RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual void DoCheckServerFiltersL( RPointerArray& aFilters, + TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual HBufC* DoGenerateRecordFilterQueryLC( const RPointerArray& aFilters, + TSyncMLFilterMatchType aMatch, TDes& aFilterMimeType, + TSyncMLFilterType& aFilterType, TDesC& aStoreName ); + + virtual void DoGenerateFieldFilterQueryL( const RPointerArray& aFilters, + TDes& aFilterMimeType, RPointerArray& aProperties, TDesC& aStoreName ); + +private: + + CSmlDataStoreFormat* DoOwnStoreFormatL(); + +private: + + CSmlDataStoreFormat* iOwnStoreFormat; + RStringPool iStringPool; + RPointerArray iFilters; + RFs iFs; + + }; + +#endif // __CONTACTSGRPDATAPROVIDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdataproviderdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdataproviderdefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2008 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: Part of ContactGroup DS adapter +* +*/ + + +#ifndef __CONTACTSGRPDATAPROVIDERDEFS_H__ +#define __CONTACTSGRPDATAPROVIDERDEFS_H__ + +#include +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ +_LIT8( KContactsGrpItemMimeType, "text/x-vCard" ); +_LIT8( KContactsGrpItemMimeVersion, "2.1" ); + +_LIT(KContactsGrpStoreName, "Gallery"); + +#endif // __CONTACTSGRPDATAPROVIDERDEFS_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdatastore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/contactsgrpdatastore.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2009-2010 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: Part of ContactGroup DS adapter +* +*/ + + +#ifndef __CONTACTSGRPDATASTORE_H__ +#define __CONTACTSGRPDATASTORE_H__ + +#include +#include +#include + +class CNSmlDataItemUidSet; +class CContactsGrpConverter; +class CChangeFinder; +class TSnapshotItem; +class CContactDatabase; + +class CContactsGrpDataStore : public CSmlDataStore + { +private: + + CContactsGrpDataStore(); + ~CContactsGrpDataStore(); + +public: + + static CContactsGrpDataStore* NewL(); + static CContactsGrpDataStore* NewLC(); + void ConstructL(); + + // Transactions (optional) + void DoBeginTransactionL(); + void DoCommitTransactionL(TRequestStatus& aStatus); + void DoRevertTransaction(TRequestStatus& aStatus); + + // Batching (optional) + void DoBeginBatchL(); + void DoCommitBatchL(RArray& aResultArray, TRequestStatus& aStatus); + void DoCancelBatch(); + + // Opens data store asynchronously + void DoOpenL(const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus); + // Cancels current asynchronous request + void DoCancelRequest(); + // Returns the name of open database, empty if OpenL hasn't been called + const TDesC& DoStoreName() const; + // Sets remote server data format + void DoSetRemoteStoreFormatL(const CSmlDataStoreFormat& aServerDataStoreFormat); + // Sets the remote server maximum object size + void DoSetRemoteMaxObjectSize(TInt aServerMaxObjectSize); + // Returns maximum object size, reported by remote server + TInt DoMaxObjectSize() const; + + // Opens item for reading + void DoOpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, TRequestStatus& aStatus); + // Initializes new item to data store + void DoCreateItemL(TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, TRequestStatus& aStatus); + // Initializes replace of item in data store + void DoReplaceItemL(TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool aFieldChange, TRequestStatus& aStatus); + // Reads data from opened item + void DoReadItemL(TDes8& aBuffer); + // Writes data to created or replaced item + void DoWriteItemL(const TDesC8& aData); + // Commits the created or replaced item to database + void DoCommitItemL(TRequestStatus& aStatus); + // Closes the opened item + void DoCloseItem(); + // Moves item in the database + void DoMoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus); + // Deletes item from the database + void DoDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + // Soft deletes item (if supported by plugin adapter), can be equal to DoDeleteItemL + void DoSoftDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + // Deletes all items from the database + void DoDeleteAllItemsL(TRequestStatus& aStatus); + + // Returns, whether data store has history info. EFalse means slow sync + TBool DoHasSyncHistory() const; + // Returns ids of items, which are added after previous synchronization + const MSmlDataItemUidSet& DoAddedItems() const; + // Returns ids of items, which are deleted after previous synchronization + const MSmlDataItemUidSet& DoDeletedItems() const; + // Returns ids of items, which are soft-deleted after previous synchronization + const MSmlDataItemUidSet& DoSoftDeletedItems() const; + // Returns ids of items, which are modified after previous synchronization + const MSmlDataItemUidSet& DoModifiedItems() const; + // Returns ids of items, which are moved after previous synchronization + const MSmlDataItemUidSet& DoMovedItems() const; + // Resets change information of items (makes all items new from DS point of view) + void DoResetChangeInfoL(TRequestStatus& aStatus); + // Commits the changes, that are sent into the remote server + void DoCommitChangeInfoL(TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems); + // Commits the changes, that are sent into the remote server + void DoCommitChangeInfoL(TRequestStatus& aStatus); + + +private: + TContactItemId CreateNewGroupL( const TDesC& aLabel, + const CContactIdArray& aContactArray/*, const TDesC& aRingtone*/ ); + + void ReplaceGroupL( TContactItemId aGroupId, const TDesC& aLabel, + const CContactIdArray& aContactArray/*, const TDesC& aRingtone*/ ); + + // Create and save snapshot from items on database + void RegisterSnapshotL(); + + void AssignString( TDes8& aDestination, const TDesC8& aSource ); + + // Updates contacts last modified time. + void UpdateContactLastMod( TContactItemId aContactId, const TTime& aLastModified ); + + // Checks does group name already exists. + TBool GroupNameExistsL( const TDesC& aLabel ); + + // Data store states + enum TState + { + EClosed = 0, + EOpenAndWaiting, + EContactGrpOpening, + EContactGrpCreating, + EContactGrpUpdating + }; + + TState iCurrentState; + + RFs iFs; + + CContactDatabase* iContactsDb; + + TRequestStatus* iCallerStatus; + + /** + * Key that is used in sorting snapshot. + */ + const TKeyArrayFix iKey; + + /** + * Change finder, used to determine db modifications. + */ + CChangeFinder* iChangeFinder; + + /** + * VCard item converter + */ + CContactsGrpConverter* iConverter; + + TSmlDbItemUid* iCurrentItem; + TSmlDbItemUid iItemToBeReplaced; + + CBufFlat* iDataBuffer; + TInt iWriterPosition; + TInt iReaderPosition; + + TBool iHasHistory; + + CNSmlDataItemUidSet* iNewItems; + CNSmlDataItemUidSet* iDeletedItems; + CNSmlDataItemUidSet* iUpdatedItems; + CNSmlDataItemUidSet* iEmptyList; + }; + +#endif // __CONTACTSGRPDATASTORE_H__ \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/logger.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2008 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 utility for Contact Groups +* +*/ + + +#ifndef _LOGGER_H +#define _LOGGER_H + +#ifdef _DEBUG + + // Define this to enable file logging + #define __FLOGGING__ + + #include + #ifdef __FLOGGING__ + #include + #include + #endif + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT( KLogDir, "CNTGRP" ); + _LIT( KLogFile, "ContactsGroupLog.txt" ); + + _LIT(KTracePrefix16, "[CNTGRP] "); + _LIT8(KTracePrefix8, "[CNTGRP] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE8_1( text,par1 ) {_LIT8( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + #define LOGGER_WRITE_3( text,par1,par2,par3 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2, par3 );} + #define LOGGER_WRITE_IFERR_2( text, err ) {if (err) {_LIT( KTemp, text ); FPrint( KTemp, err );}} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + // Declare the FPrint function + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else + + // No loggings --> reduced code size + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text, par1 ) + #define LOGGER_WRITE8_1( text,par1 ) + #define LOGGER_WRITE_2( text, par1, par2 ) + #define LOGGER_WRITE_3( text, par1, par2, par3 ) + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + +#endif //_DEBUG + +#endif // SECON_DEBUG_H + +// End of file + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/inc/snapshotitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/inc/snapshotitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2008 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: Private snapshot item header +* +*/ + + +#ifndef __SNAPSHOTITEM_H__ +#define __SNAPSHOTITEM_H__ + +// INCLUDES + +#include +#include + + +// CLASS DECLARATION +class CContactGroup; + +// Defines the maximum length of a hash. +const TInt KMaxHashLength = 20; +typedef TBuf8 THashValue; + +/** +* @brief TSnapshotItem +* This class represents a single item in the ChangeFinder snapshot. +* It's derived from the generic snapshot item and extended +* to contain the hash (name and url) information. +*/ +class TSnapshotItem : public TNSmlSnapshotItem + { +public: + + /** + * Constructor + */ + TSnapshotItem(); + + /** + * Constructor + * + * @param aItemId IN: id of the item. + * @param aParent IN: parent item, 0 as default. + */ + TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent = 0 ); + + /** + * Writes the item to a stream. + * + * @param aStream IN: a reference to a stream, where this item is to be written. + */ + void ExternalizeL( RWriteStream& aStream ) const; + + /** + * Reads item from a stream. + * + * @param aStream IN: a reference to a stream, where this item is read from. + */ + void InternalizeL( RReadStream& aStream ); + + /** + * Creates hash from name and url + * + * @param aName, name to used + * @param aUrl, url to used + * @return none. + */ + void CreateHashL( const TDesC& aName, const TDesC& aUrl ); + void CreateHashL( CContactGroup& aGroup ); + + /** + * Reads hash + * + * @return TDesC8& hash. + */ + const TDesC8& Hash() const; + +private: + + THashValue iHash; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/rom/contactsgrpdsa.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/rom/contactsgrpdsa.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2008-2010 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: iby file for Contacts Group DS adapter +* +*/ + + +#ifndef __CONTACTSGRPDSA_IBY__ +#define __CONTACTSGRPDSA_IBY__ + +ECOM_PLUGIN(contactsgrpdataprovider.dll,contactsgrpdataprovider.rsc) +data=DATAZ_\RESOURCE_FILES_DIR\contactsgrpdatastore.rsc RESOURCE_FILES_DIR\contactsgrpdatastore.rsc +data=DATAZ_\private\101F99F6\capability\101ff972.xml private\101F99F6\capability\101ff972.xml +data=ZSYSTEM\install\contactsgrpdsa_stub.sis system\install\contactsgrpdsa_stub.sis + +#endif //__CONTACTSGRPDSA_IBY__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/sis/backup_registration.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/sis/contactsgrp.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/sis/contactsgrp.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +; +; Copyright (c) 2010 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: PKG file for Contacts Group DS adapter + + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Contacts Group DS Plugin"},(0x101FF972),1,23,0,TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\contactsgrpdatastore.rsc" -"c:\resource\contactsgrpdatastore.rsc" +"\epoc32\data\z\resource\plugins\contactsgrpdataprovider.rsc" -"c:\resource\plugins\contactsgrpdataprovider.rsc" +"\epoc32\release\armv5\urel\contactsgrpdataprovider.dll" -"c:\sys\bin\contactsgrpdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\101ff972.xml" -"c:\private\101F99F6\import\101ff972.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FF972\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/sis/contactsgrp_debug.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/sis/contactsgrp_debug.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +; +; Copyright (c) 2010 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: +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Contacts Group DS Plugin"},(0x101FF972),1,23,0,TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\contactsgrpdatastore.rsc" -"c:\resource\contactsgrpdatastore.rsc" +"\epoc32\data\z\resource\plugins\contactsgrpdataprovider.rsc" -"c:\resource\plugins\contactsgrpdataprovider.rsc" +"\epoc32\release\ARMV5\UDEB\contactsgrpdataprovider.dll" -"c:\sys\bin\contactsgrpdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\101ff972.xml" -"c:\private\101F99F6\import\101ff972.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FF972\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/changefinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/changefinder.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,410 @@ +/* +* Copyright (c) 2008-2010 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: Part of ContactsGroup Plug In Adapter +* +*/ + + +#include "changefinder.h" +#include "logger.h" + +const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version +// ----------------------------------------------------------------------------- +// CChangeFinder::NewL +// Static function to create CChangeFider object(s) +// ----------------------------------------------------------------------------- +CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, + TBool& aHasHistory, TInt aStreamUid ) + { + CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); + CleanupStack::PushL( self ); + self->ConstructL( aHasHistory ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CChangeFinder +// Constructor for the class +// ----------------------------------------------------------------------------- +CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, TInt aStreamUid ) : +iSyncRelationship( aSyncRelationship ), +iKey( aKey ), +iStreamUid( aStreamUid ) + { + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::~CChangeFinder +// Destructor for the class, closes the ChangeFinder and writes snapshot to stream +// ----------------------------------------------------------------------------- +CChangeFinder::~CChangeFinder() + { + TRACE_FUNC_ENTRY; + delete iOldSnapshot; + delete iCurrentSnapshot; + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ConstructL +// 2nd phase constructor for the class, reads snapshot from stream +// ----------------------------------------------------------------------------- +void CChangeFinder::ConstructL( TBool& aHasHistory ) + { + TRACE_FUNC_ENTRY; + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + iCurrentSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + LOGGER_WRITE("CChangeFinder::ConstructL, CSnapshotArray:s created"); + TUid uid = {iStreamUid}; + + aHasHistory = iSyncRelationship.IsStreamPresentL( uid ); + + if ( aHasHistory ) + { + LOGGER_WRITE("CChangeFinder::ConstructL, HasHistory"); + // Open stream for reading + RReadStream readStream; + iSyncRelationship.OpenReadStreamLC( readStream, uid ); + + // Read used format version + TUint formatVer = readStream.ReadUint32L(); + if ( formatVer != KSnapshotFormatVersion ) + { + // Wrong version, do not try to import data + LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); + aHasHistory = EFalse; + CleanupStack::PopAndDestroy( &readStream ); + TRACE_FUNC_EXIT; + return; + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, format is OK"); + } + + // Read item count + TInt count = readStream.ReadUint32L(); + + // Read items + for ( TInt i=0; iInsertIsqL( item, iKey ); + } + iOldSnapshot->Compress(); + + LOGGER_WRITE_1("iOldSnapshot done, iOldSnapshot->Count: %d", iOldSnapshot->Count() ); + CleanupStack::PopAndDestroy( &readStream ); // readStream + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CloseL +// Closes ChangeFinder object and writes snapshot to stream +// ----------------------------------------------------------------------------- +void CChangeFinder::CloseL() + { + TRACE_FUNC_ENTRY; + + RWriteStream writeStream; + + TUid uid = {iStreamUid}; + + // Open write stream + iSyncRelationship.OpenWriteStreamLC( writeStream, uid ); + + // Write used format version + writeStream.WriteUint32L( KSnapshotFormatVersion ); + + // Write item count + TInt count = iOldSnapshot->Count(); + writeStream.WriteUint32L( count ); + + // Write items + for ( TInt i = 0; i < count; i++ ) + { + const TSnapshotItem& item = iOldSnapshot->At( i ); + item.ExternalizeL( writeStream ); + } + + writeStream.CommitL(); + CleanupStack::PopAndDestroy( &writeStream ); // writeStream + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ResetL +// Resets synchronization history, all contetn is considered new after this call +// ----------------------------------------------------------------------------- +void CChangeFinder::ResetL() + { + TRACE_FUNC_ENTRY; + iOldSnapshot->Reset(); + + // Write 'null' data to file, + // this removes change history from the file + CloseL(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindChangedItemsL +// Compares snapshots, finds changed items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) + { + TRACE_FUNC_ENTRY; + aChangedUids.Reset(); + + TInt index; + TInt count = iCurrentSnapshot->Count(); + LOGGER_WRITE_1( "CChangeFinder::FindChangedItemsL items on iCurrentSnapshot: %d", count ); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // Find this entry from the old snapshot + if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + if ( currentItem.Hash().Compare( oldItem.Hash() ) != 0 ) + { + // add to list + User::LeaveIfError( aChangedUids.AddItem( currentItem.ItemId() ) ); + } + } + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindDeletedItemsL +// Compares snapshots, finds deleted items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) + { + TRACE_FUNC_ENTRY; + aDeletedUids.Reset(); + + TInt index; + TInt count = iOldSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iOldSnapshot->At( i ); + + // If there's no current snapshot, this definately is deleted item + if ( !iCurrentSnapshot ) + { + User::LeaveIfError( aDeletedUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the current snapshot. + else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + User::LeaveIfError( aDeletedUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindNewItemsL +// Compares snapshots, finds new items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) + { + TRACE_FUNC_ENTRY; + aNewUids.Reset(); + + TInt index; + TInt count = iCurrentSnapshot->Count(); + LOGGER_WRITE_1( "iCurrentSnapshot->Count(): %d", count ); + LOGGER_WRITE_1( "iOldSnapshot->Count(): %d", iOldSnapshot->Count() ); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // If there's no old snapshot, all items are new + if ( !iOldSnapshot ) + { + User::LeaveIfError( aNewUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "!iOldSnapshot, Item %d was new.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the old snapshot. + else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + User::LeaveIfError( aNewUids.AddItem( currentItem.ItemId() ) ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemAddedL +// Adds item to snapshot, this item is no longer considered new +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); + + iOldSnapshot->InsertIsqL( aItem, iKey ); + iOldSnapshot->Compress(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemDeleted +// Removes item from snapshot, this item is no longer considered deleted +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemDeleted( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); + + // Delete item from the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->Delete( index ); + } + else // Skip, there wasn't such entry + { + LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemUpdatedL +// Updates item to snapshot, this item is no longer considered changed +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); + + // Update item in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->At( index ) = aItem; + } + else + { + // There was no such item. Let's add it + ItemAddedL( aItem ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL() + { + TRACE_FUNC_ENTRY; + + // Delete everything from the old snapshot + iOldSnapshot->Reset(); + + // Loop through all the items in current snapshot + TInt count = iCurrentSnapshot->Count(); + + // Copy everything from current to old snapshot + for ( TInt i = 0; i < count; i++ ) + { + // Commit it to the old array. + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( i ), iKey ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot, affects only a specified group of items +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) + { + TRACE_FUNC_ENTRY; + + // This function commits changes from current snapshot to old snapshot + // But commits only the entries in the parameter array + + for ( TInt i = 0; i < aUids.ItemCount(); i++ ) + { + TSmlDbItemUid itemId = aUids.ItemAt( i ); + TSnapshotItem temp( itemId ); + TInt indexOld( -1 ); + TInt indexNew( -1 ); + if ( !iOldSnapshot->FindIsq( temp, iKey, indexOld) ) + { + if ( !iCurrentSnapshot->FindIsq(temp, iKey, indexNew) ) + { + // Replace, moved or softdeleted + iOldSnapshot->At( indexOld ) = iCurrentSnapshot->At( indexNew ); + } + else + { + // Delete + iOldSnapshot->Delete( indexOld ); + } + } + else + { + // Add + if ( !iCurrentSnapshot->FindIsq( temp, iKey, indexNew ) ) + { + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( indexNew ), iKey ); + } + } + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetNewSnapshot +// Sets new snapshot (to be compared against), ChangeFinder takes ownership +// ----------------------------------------------------------------------------- +void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) + { + TRACE_FUNC; + + // Delete existing snapshot + delete iCurrentSnapshot; + + // Set submitted snapshot as active + iCurrentSnapshot = aNewSnapshot; + TRACE_FUNC_EXIT; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/contactsgrpconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/contactsgrpconverter.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,400 @@ +/* +* Copyright (c) 2008-2010 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: Contacts Group object conversion routines +* +*/ + + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include + +#include "contactsgrpconverter.h" +#include "logger.h" + +// CONSTANTS +/* +vCard format example: +BEGIN:VCARD +VERSION:2.1 +FN:GroupName +X-CNTGRP:4;14;54 +END:VCARD +*/ + +// Group label property +_LIT8(KCntGrpFN, "FN"); +// Group contacts propetry +_LIT8(KCntGrpXCntGrp, "X-CNTGRP"); + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CContactsGrpConverter* CContactsGrpConverter::NewL() + { + CContactsGrpConverter* self = CContactsGrpConverter::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CContactsGrpConverter* CContactsGrpConverter::NewLC() + { + TRACE_FUNC_ENTRY; + CContactsGrpConverter* self = new (ELeave) CContactsGrpConverter(); + CleanupStack::PushL( self ); + self->ConstructL(); + TRACE_FUNC_EXIT; + return self; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::CContactsGrpConverter +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CContactsGrpConverter::CContactsGrpConverter() + { + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ConstructL() + { + ResetL(); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::~CContactsGrpConverter +// Destructor. +// ----------------------------------------------------------------------------- +CContactsGrpConverter::~CContactsGrpConverter() + { + TRACE_FUNC_ENTRY; + delete iContactsIdArray; + delete iGroupLabel; + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::GroupLabel +// returns group label +// ----------------------------------------------------------------------------- +const TDesC& CContactsGrpConverter::GroupLabel() const + { + return *iGroupLabel; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ItemsContained +// returns contact items belonging to this group +// ----------------------------------------------------------------------------- +const CContactIdArray& CContactsGrpConverter::ItemsContained() const + { + return *iContactsIdArray; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ImportDbItemL +// Imports group item +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ImportDbItemL( CContactGroup& aItem ) + { + TRACE_FUNC_ENTRY; + if ( aItem.Type() != KUidContactGroup ) + { + User::Leave( KErrNotSupported ); + } + ResetL(); + + if ( aItem.HasItemLabelField() ) + { + TPtrC label = aItem.GetGroupLabelL(); + delete iGroupLabel; + iGroupLabel = NULL; + iGroupLabel = label.AllocL(); + } + else + { + delete iGroupLabel; + iGroupLabel = NULL; + iGroupLabel = KNullDesC().AllocL(); + } + + // this is NULL, if no items + CContactIdArray* tempIdArray = aItem.ItemsContainedLC(); + if ( tempIdArray ) + { + delete iContactsIdArray; + iContactsIdArray = tempIdArray; + CleanupStack::Pop( tempIdArray ); + } + + LOGGER_WRITE_1("GroupName: %S", iGroupLabel); + if ( iContactsIdArray ) + { + LOGGER_WRITE_1("contacts count: %d", iContactsIdArray->Count() ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ExportVCardL +// Export contact group as vCard +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ExportVCardL( CBufBase& aBuffer ) + { + TRACE_FUNC_ENTRY; + RBufWriteStream stream( aBuffer, 0); + CleanupClosePushL( stream ); + ExportVCardL( stream ); + CleanupStack::PopAndDestroy( &stream ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ExportL +// Exports contact group as to vCard +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ExportVCardL( RWriteStream& aWriteStream ) + { + TRACE_FUNC_ENTRY; + CParserVCard* vCardParser = CParserVCard::NewL(); + CleanupStack::PushL( vCardParser ); + + // add group name + CParserPropertyValue* FNvalue = CParserPropertyValueHBufC::NewL( *iGroupLabel ); + // Associate the property params and property value with the FN property + CParserProperty* FNproperty=CParserProperty::NewL( *FNvalue, KCntGrpFN, NULL ); + // Finally add the FN property to the vCard using the parser object. + vCardParser->AddPropertyL( FNproperty ); + + // add group contacts + const TInt KDefaultGranularity = 5; + CDesCArrayFlat* flatArray = new (ELeave) CDesCArrayFlat(KDefaultGranularity); + CleanupStack::PushL( flatArray ); + TInt count = iContactsIdArray->Count(); + const TInt KMaxIdLength = 10; + TBuf idnum; + for ( TInt i=0; iAppendL( idnum ); + } + CParserPropertyValueCDesCArray* grPropertyValueArray = + new (ELeave) CParserPropertyValueCDesCArray( flatArray ); + CleanupStack::Pop( flatArray ); + + CParserProperty* grProperty = + CParserProperty::NewL( *grPropertyValueArray, KCntGrpXCntGrp, NULL ); + vCardParser->AddPropertyL( grProperty ); + + // Set default sharacterset + vCardParser->SetDefaultCharSet( Versit::EUTF8CharSet ); + + vCardParser->ExternalizeL( aWriteStream ); + + CleanupStack::PopAndDestroy( vCardParser ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ImportVCardL +// Import vCard item +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ImportVCardL( const TDesC8& aBuffer ) + { + TRACE_FUNC_ENTRY; + ResetL(); + CParserVCard* vCardParser = CParserVCard::NewL(); + vCardParser->SetDefaultCharSet( Versit::EUTF8CharSet ); + CleanupStack::PushL( vCardParser ); + + RDesReadStream stream( aBuffer ); + vCardParser->InternalizeL( stream ); // To import a vCard. + stream.Close(); // Close the file stream once the import is done. + + CArrayPtr* properties = vCardParser->ArrayOfProperties( EFalse ); + LOGGER_WRITE_1("properties count: %d", properties->Count()); + for (TInt i=0; iCount(); i++) + { + const CParserProperty* property = properties->At(i); + // FN + if ( property->Name() == KCntGrpFN ) + { + LOGGER_WRITE("group name found"); + delete iGroupLabel; + iGroupLabel = NULL; + CParserPropertyValue* pvalue = property->Value(); + TPtrC val = (static_cast (pvalue))->Value(); + iGroupLabel = val.AllocL(); + LOGGER_WRITE_1("iGroupLabel: %S", iGroupLabel); + } + // X-CNTGRP + else if ( property->Name() == KCntGrpXCntGrp ) + { + LOGGER_WRITE("group contacts found"); + CParserPropertyValue* pvalue = property->Value(); + TPtrC val = (static_cast (pvalue))->Value(); + SetContactItemsL( val ); + } + else + { + // skip other properties + } + } + CleanupStack::PopAndDestroy( vCardParser ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::ResetL +// Reset all data +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::ResetL() + { + delete iGroupLabel; + iGroupLabel = NULL; + iGroupLabel = KNullDesC().AllocL(); + if ( iContactsIdArray ) + { + iContactsIdArray->Reset(); + } + else + { + iContactsIdArray = CContactIdArray::NewL(); + } + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::SetContactItemsL +// Parses contact items from aValue +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::SetContactItemsL( const TDesC& aValue ) + { + TRACE_FUNC_ENTRY; + const TInt KDefaultGranularity = 5; + RArray arr(KDefaultGranularity); + CleanupClosePushL( arr ); + const TChar separator(';'); + SplitL( aValue, separator, arr ); + if ( iContactsIdArray ) + { + iContactsIdArray->Reset(); + } + else + { + iContactsIdArray = CContactIdArray::NewL(); + } + for (TInt i=0; iReset(); + User::Leave( KErrCorrupt ); + } + LOGGER_WRITE_1("add: %d", id); + iContactsIdArray->AddL( id ); + } + CleanupStack::PopAndDestroy( &arr ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::SplitL +// Function splits string (eg "name1, name2, name3") into substrings. +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::SplitL(const TDesC& aText, const TChar aSeparator, + RArray& aArray) + { + TRACE_FUNC_ENTRY; + TPtrC ptr; + ptr.Set(aText); + + for (;;) + { + TInt pos=ptr.Locate(aSeparator); + if (pos==KErrNotFound) + { + TrimAll( ptr ); + if ( ptr.Length() > 0 ) + { + aArray.AppendL(ptr); + } + break; + } + + TPtrC subStr=ptr.Left(pos); // get pos characters starting from position 0 + TrimAll( subStr ); + if ( subStr.Length() > 0 ) + { + aArray.AppendL(subStr); + } + + if ( !(ptr.Length()>pos+1) ) + { + break; + } + + ptr.Set( ptr.Mid(pos+1) ); // get all characters starting from position pos+1 + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpConverter::TrimAll +// Trims all whitespaces from beginning and end of string +// ----------------------------------------------------------------------------- +void CContactsGrpConverter::TrimAll( TPtrC& aValue ) + { + TRACE_FUNC_ENTRY; + TInt valueStart(0); + while ( valueStart < aValue.Length() + && (aValue[valueStart] == ' ' + || aValue[valueStart] == '\r' + || aValue[valueStart] == '\n') ) + { + valueStart++; + } + TInt valueEnd(aValue.Length()-1); + while ( valueEnd > 0 + && (aValue[valueEnd] == ' ' + || aValue[valueEnd] == '\r' + || aValue[valueEnd] == '\n') ) + { + valueEnd--; + } + valueEnd++; + aValue.Set( aValue.Mid(valueStart, valueEnd - valueStart)); + TRACE_FUNC_EXIT; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdataprovider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2008-2010 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: Part ContactsGroup Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include + +#include "contactsgrpdataprovider.h" +#include "contactsgrpdatastore.h" +#include "contactsgrpdataproviderdefs.h" +#include "logger.h" + +const TUint KContactsGrpDataProviderImplUid = 0x101FF972; + +// Resource file for CSmlDataStoreFormat + +// The following works with DS plugin added into ROM image +_LIT(KContactsGrpStoreFormatRscRom,"z:contactsgrpdatastore.rsc"); + +// The following works with DS plugin installed from SIS +_LIT(KContactsGrpStoreFormatRsc,"contactsgrpdatastore.rsc"); + + + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::CContactsGrpDataProvider +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CContactsGrpDataProvider::CContactsGrpDataProvider(): iFilters( 1 ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CContactsGrpDataProvider::ConstructL() + { + TRACE_FUNC_ENTRY; + + User::LeaveIfError( iFs.Connect() ); + iStringPool.OpenL(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CContactsGrpDataProvider* CContactsGrpDataProvider::NewL() + { + TRACE_FUNC_ENTRY; + CContactsGrpDataProvider* self = new ( ELeave ) CContactsGrpDataProvider(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT; + return self; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::~CContactsGrpDataProvider +// Destructor. +// ----------------------------------------------------------------------------- +CContactsGrpDataProvider::~CContactsGrpDataProvider() + { + TRACE_FUNC_ENTRY; + delete iOwnStoreFormat; + iStringPool.Close(); + iFilters.Close(); + iFs.Close(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoOnFrameworkEvent +// Not used +// ----------------------------------------------------------------------------- +void CContactsGrpDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent, TInt /*aParam1*/, TInt /*aParam2*/ ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoSupportsOperation +// Checks whether data provider supports specific operation +// ----------------------------------------------------------------------------- +TBool CContactsGrpDataProvider::DoSupportsOperation( TUid /*aOpId*/ ) const + { + TRACE_FUNC; + return EFalse; // optional operations are not supported + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +const CSmlDataStoreFormat& CContactsGrpDataProvider::DoStoreFormatL() + { + TRACE_FUNC_ENTRY; + + if (!iOwnStoreFormat) + { + iOwnStoreFormat = DoOwnStoreFormatL(); + } + + TRACE_FUNC_EXIT; + + return *iOwnStoreFormat; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoListStoresLC +// Returns array fo data stores that can be opened +// ----------------------------------------------------------------------------- +CDesCArray* CContactsGrpDataProvider::DoListStoresLC() + { + TRACE_FUNC_ENTRY; + + CDesCArrayFlat* stores = new ( ELeave ) CDesCArrayFlat( 1 ); + CleanupStack::PushL( stores ); + + stores->AppendL( KContactsGrpStoreName ); + + TRACE_FUNC_EXIT; + + return stores; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoDefaultStoreL +// Returns the name of the default data store +// ----------------------------------------------------------------------------- +const TDesC& CContactsGrpDataProvider::DoDefaultStoreL() + { + TRACE_FUNC; + return KContactsGrpStoreName; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoNewStoreInstanceLC +// Creates a new data store object, which can be used for synchronization +// ----------------------------------------------------------------------------- +CSmlDataStore* CContactsGrpDataProvider::DoNewStoreInstanceLC() + { + TRACE_FUNC_ENTRY; + CContactsGrpDataStore* newStore = CContactsGrpDataStore::NewLC(); + TRACE_FUNC_EXIT; + return newStore; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +const RPointerArray& CContactsGrpDataProvider::DoSupportedServerFiltersL() + { + TRACE_FUNC; + return iFilters; // empty array + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoCheckSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataProvider::DoCheckSupportedServerFiltersL( + const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoCheckServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataProvider::DoCheckServerFiltersL( RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoGenerateRecordFilterQueryLC +// Filters are not supported +// ----------------------------------------------------------------------------- +HBufC* CContactsGrpDataProvider::DoGenerateRecordFilterQueryLC( + const RPointerArray& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, + TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoGenerateFieldFilterQueryL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataProvider::DoGenerateFieldFilterQueryL( + const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, + RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataProvider::DoOwnStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CContactsGrpDataProvider::DoOwnStoreFormatL() + { + TRACE_FUNC_ENTRY; + + TParse* parse = new ( ELeave ) TParse(); + CleanupStack::PushL(parse); + TFileName fileName; + RResourceFile resourceFile; + + parse->Set( KContactsGrpStoreFormatRsc, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iFs, fileName ); + LOGGER_WRITE_1( "file: %S", &fileName ); + + TRAPD( error, resourceFile.OpenL( iFs, fileName ) ); + if ( error ) + { + LOGGER_WRITE_1( "RResourceFile::OpenL leaved with %d - try again", error ); + parse->Set( KContactsGrpStoreFormatRscRom, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iFs, fileName ); + LOGGER_WRITE_1( "file: %S", &fileName ); + resourceFile.OpenL( iFs, fileName ); + } + CleanupClosePushL( resourceFile ); + HBufC8* buffer = resourceFile.AllocReadLC( CONTACTSGROUP_DATA_STORE ); + + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + + CleanupStack::Pop( dsFormat ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &resourceFile ); + CleanupStack::PopAndDestroy( parse ); + + TRACE_FUNC_EXIT; + + return dsFormat; + } + +// ----------------------------------------------------------------------------- +// ImplementationTable +// Required by ECom plugin interface, tells the entry point of the library +// ----------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KContactsGrpDataProviderImplUid, CContactsGrpDataProvider::NewL ) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns the implementation table, required by the ECom plugin interface +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdataprovider.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdataprovider.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2008 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 definitions for ContactsGroup DS ECOM plug-in +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x101FF972; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x101F4D3A; // Constant for all DS plug ins + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x101FF972; // DS interface implementation UID + version_no = 1; + display_name = "Contacts Group" ; // shown in UI + } + }; + } + }; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdatastore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdatastore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1268 @@ +/* +* Copyright (c) 2009-2010 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include + +#include "contactsgrpdatastore.h" +#include "contactsgrpconverter.h" +#include "changefinder.h" +#include "contactsgrpdataproviderdefs.h" +#include "logger.h" + +const TInt KDefaultBufferSize = 1024; +const TInt KDataBufferNotReady = -1; +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::CContactsGrpDataStore +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CContactsGrpDataStore::CContactsGrpDataStore() : + iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem, ItemId() ), ECmpTInt ) ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::ConstructL +// Symbian 2nd phase constructor, can leave. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::ConstructL() + { + TRACE_FUNC_ENTRY; + + User::LeaveIfError( iFs.Connect() ); + + iNewItems = new ( ELeave ) CNSmlDataItemUidSet; + iDeletedItems = new ( ELeave ) CNSmlDataItemUidSet; + iUpdatedItems = new ( ELeave ) CNSmlDataItemUidSet; + iEmptyList = new ( ELeave ) CNSmlDataItemUidSet; + + iConverter = CContactsGrpConverter::NewL(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::~CContactsGrpDataStore +// Destructor +// ----------------------------------------------------------------------------- +CContactsGrpDataStore::~CContactsGrpDataStore() + { + TRACE_FUNC_ENTRY; + + delete iDataBuffer; + delete iNewItems; + delete iDeletedItems; + delete iUpdatedItems; + delete iEmptyList; + + if ( iChangeFinder ) + { + TRAPD( error, iChangeFinder->CloseL() ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iChangeFinder->CloseL() leaved with %d", error ); + } + } + delete iChangeFinder; + + delete iConverter; + + delete iContactsDb; + + iFs.Close(); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CContactsGrpDataStore* CContactsGrpDataStore::NewL() + { + TRACE_FUNC_ENTRY; + CContactsGrpDataStore* self = CContactsGrpDataStore::NewLC(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT; + return self; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CContactsGrpDataStore* CContactsGrpDataStore::NewLC() + { + TRACE_FUNC_ENTRY; + CContactsGrpDataStore* self = new ( ELeave ) CContactsGrpDataStore(); + CleanupStack::PushL( self ); + self->ConstructL(); + TRACE_FUNC_EXIT; + return self; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoOpenL +// Opens database. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoOpenL( const TDesC& /*aStoreName*/, + MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( iContactsDb ) + { + // already opened + User::RequestComplete( iCallerStatus, KErrInUse ); + LOGGER_WRITE( "CContactsGrpDataStore::DoOpenL failed with KErrInUse." ); + return; + } + + // Create ChangeFinder + if ( iChangeFinder ) + { + delete iChangeFinder; + iChangeFinder = NULL; + } + iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory ); + + iContactsDb = CContactDatabase::OpenL(); + + RegisterSnapshotL(); + + User::RequestComplete( iCallerStatus, KErrNone ); + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCancelRequest +// Not supported, does nothing. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCancelRequest() + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoStoreName +// Returns the name of the DataStore +// ----------------------------------------------------------------------------- +const TDesC& CContactsGrpDataStore::DoStoreName() const + { + TRACE_FUNC; + + if ( iContactsDb ) + { + return KContactsGrpStoreName; + } + else + { + return KNullDesC; + } + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoBeginTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoBeginTransactionL() + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCommitTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCommitTransactionL( TRequestStatus& aStatus ) + { + TRACE_FUNC; + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoRevertTransaction +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoRevertTransaction( TRequestStatus& aStatus ) + { + TRACE_FUNC; + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoBeginBatchL +// Batching is not supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoBeginBatchL() + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCommitBatchL +// Batching is not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& aStatus ) + { + TRACE_FUNC; + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCancelBatch +// Batching is not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCancelBatch() + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoSetRemoteStoreFormatL +// Not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoSetRemoteMaxObjectSize +// Not supported +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ ) + { + TRACE_FUNC; + } + + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoMaxObjectSize +// Reads the maximum object size from the central repository +// ----------------------------------------------------------------------------- +TInt CContactsGrpDataStore::DoMaxObjectSize() const + { + TRACE_FUNC; + return 0; // no limit + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoOpenItemL +// Opens item in the DataStore, reads it (either completely or partially) +// to the temporary buffer where it can be later read to the remote database. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoOpenItemL( + TSmlDbItemUid aUid, + TBool& aFieldChange, + TInt& aSize, + TSmlDbItemUid& aParent, + TDes8& aMimeType, + TDes8& aMimeVer, + TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "aUid: %d", aUid ); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + aFieldChange = EFalse; + aParent = KErrNotFound; + + delete iDataBuffer; + iDataBuffer = NULL; + + if ( !iContactsDb ) + { + User::Leave( KErrNotReady ); + } + + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iReaderPosition = 0; + + CContactItem* item = iContactsDb->ReadContactLC( aUid ); + if ( item->Type() != KUidContactGroup ) + { + CleanupStack::PopAndDestroy( item ); + User::Leave( KErrNotFound ); + } + + iConverter->ImportDbItemL( *static_cast(item) ); + + CleanupStack::PopAndDestroy( item ); + + iConverter->ExportVCardL( *iDataBuffer ); + iConverter->ResetL(); + aSize = iDataBuffer->Size(); + + // Set mime type to correct one + AssignString( aMimeType, KContactsGrpItemMimeType ); + AssignString( aMimeVer, KContactsGrpItemMimeVersion ); + + User::RequestComplete( iCallerStatus, KErrNone ); + iCurrentState = EContactGrpOpening; + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCreateItemL +// Create new item to the message store. +// Return the id number of the newly created item +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCreateItemL( + TSmlDbItemUid& aUid, + TInt aSize, + TSmlDbItemUid /*aParent*/, + const TDesC8& /*aMimeType*/, + const TDesC8& /*aMimeVer*/, + TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState ); + } + + if ( !iContactsDb ) + { + LOGGER_WRITE( "iContactsDb not ready" ); + User::Leave( KErrNotReady ); + } + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, aSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." ); + return; + } + + // item uid is updated when groups is saved to db. + iCurrentItem = &aUid; + // Save current operation-state so we know what operation + // is needed to do on DoCommitItemL + iCurrentState = EContactGrpCreating; + + delete iDataBuffer; + iDataBuffer = NULL; + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iWriterPosition = 0; + + User::RequestComplete( iCallerStatus, KErrNone ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoReplaceItemL +// Begin the replace operation, ensure that the item really exists +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoReplaceItemL( + TSmlDbItemUid aUid, + TInt aSize, + TSmlDbItemUid /*aParent*/, + TBool /*aFieldChange*/, + TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aUid: %d", aUid); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( !iContactsDb ) + { + LOGGER_WRITE( "iContactsDb not ready" ); + User::Leave( KErrNotReady ); + } + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, aSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." ); + return; + } + + // check that item exist and is Group-type + CContactItem* item = iContactsDb->ReadContactLC( aUid ); + if ( item->Type() != KUidContactGroup ) + { + CleanupStack::PopAndDestroy( item ); + User::Leave( KErrNotFound ); + } + CleanupStack::PopAndDestroy( item ); + + // init databuffer + delete iDataBuffer; + iDataBuffer = NULL; + iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); + iWriterPosition = 0; + + // Save current item, so we know what item needs to be replaced + iItemToBeReplaced = aUid; + // Save current operation-state so we know what operation + // is needed to do on DoCommitItemL + iCurrentState = EContactGrpUpdating; + + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoReadItemL +// Read specified amount of data from the temporary buffer +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoReadItemL( TDes8& aBuffer ) + { + TRACE_FUNC_ENTRY; + + if ( iCurrentState != EContactGrpOpening || !iDataBuffer ) + { + LOGGER_WRITE_1( "Unexpected state %d", iCurrentState ); + User::Leave( KErrNotReady ); + } + + if ( iReaderPosition == KDataBufferNotReady ) + { + LOGGER_WRITE( "No data to read" ); + User::Leave( KErrEof ); + } + + // Thiw is how much data there is left in the buffer + TInt left = iDataBuffer->Size() - iReaderPosition; + + if ( left > 0 ) + { + // This is how much there's space in the destination buffer + TInt destSize = aBuffer.MaxSize(); + + // This is how much we can read + TInt toRead = destSize < left ? destSize : left; + + // Read the data from the buffer, then update the position + iDataBuffer->Read( iReaderPosition, aBuffer, toRead ); + iReaderPosition += toRead; + } + else + { + iReaderPosition = KDataBufferNotReady; + LOGGER_WRITE( "No data to read" ); + User::Leave( KErrEof ); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoWriteItemL +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoWriteItemL( const TDesC8& aData ) + { + TRACE_FUNC_ENTRY; + + if ( iCurrentState != EContactGrpCreating && iCurrentState != EContactGrpUpdating ) + { + LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState ); + User::Leave( KErrNotReady ); + } + + // Calculate total size + TInt totalSize = aData.Size() + iDataBuffer->Size(); + + // Ensure that we've got enough disk space for the item + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, totalSize, EDriveC ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE("SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull."); + return; + } + + // Add data to buffer + iDataBuffer->InsertL( iWriterPosition, aData ); + iWriterPosition += aData.Size(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCommitItemL +// Commits item from temporary buffer to the message store +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCommitItemL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EContactGrpCreating && iCurrentState != EContactGrpUpdating ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState ); + return; + } + + if ( iDataBuffer->Size() <= 0 ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + LOGGER_WRITE_1( "Data buffer has no data (%d)", iDataBuffer->Size() ); + return; + } + + if ( !iContactsDb ) + { + LOGGER_WRITE( "iContactsDb not ready" ); + User::Leave( KErrNotReady ); + } + + iDataBuffer->Compress(); + iConverter->ImportVCardL( iDataBuffer->Ptr(0) ); + + const CContactIdArray& contactArr = iConverter->ItemsContained(); + + if ( iCurrentState == EContactGrpCreating ) + { + *iCurrentItem = CreateNewGroupL( iConverter->GroupLabel(), contactArr ); + } + else + { + ReplaceGroupL( iItemToBeReplaced, iConverter->GroupLabel(), contactArr); + } + iConverter->ResetL(); + + // Destroy buffer + delete iDataBuffer; + iDataBuffer = NULL; + iWriterPosition = 0; + + // Restore state and signal we're done + iCurrentState = EOpenAndWaiting; + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::CreateNewGroupL +// Creates new groupd to db. +// ----------------------------------------------------------------------------- +TContactItemId CContactsGrpDataStore::CreateNewGroupL( const TDesC& aLabel, + const CContactIdArray& aContactArray ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aLabel: %S", &aLabel ); + + // Check for duplicates + if ( GroupNameExistsL( aLabel ) ) + { + LOGGER_WRITE("Duplicate group name found, leave KErrAlreadyExists"); + User::Leave( KErrAlreadyExists ); + } + + CContactGroup* group = + static_cast + (iContactsDb->CreateContactGroupLC( aLabel )); + + // Create new contact group + + TContactItemId groupId = group->Id(); + LOGGER_WRITE_1("new group id: %d", groupId); + + TBool partiallyUpdated(EFalse); + TTime lastMod; + lastMod.UniversalTime(); + TInt err(KErrNone); + for ( TInt i=0; iAddContactToGroupL( aContactArray[i], groupId )); + if ( err ) + { + LOGGER_WRITE_2("Warning: AddContactToGroupL, contact: %d, err: %d", aContactArray[i], err); + partiallyUpdated = ETrue; + } + else + { + // If succesfully added, update contact timestamp so contact sync sees those + // contacts as changed ones. + UpdateContactLastMod( aContactArray[i], lastMod ); + } + } + + CleanupStack::PopAndDestroy( group ); + group = NULL; + + // if item was only partially updated, do not register to snapshot + // --> on next sync item is marked as updated + if ( !partiallyUpdated ) + { + // reload group + group = static_cast + (iContactsDb->ReadContactLC( groupId )); + // Inform ChangeFinder of new item + TSnapshotItem snapshotItem( groupId ); + snapshotItem.CreateHashL( *group ); + iChangeFinder->ItemAddedL( snapshotItem ); + + CleanupStack::PopAndDestroy( group ); + } + + + + TRACE_FUNC_EXIT; + return groupId; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::ReplaceGroupL +// Replaces existing group on db +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::ReplaceGroupL( TContactItemId aGroupId, const TDesC& aLabel, + const CContactIdArray& aContactArray ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aGroupId: %d", aGroupId); + LOGGER_WRITE_1("aLabel: %S", &aLabel); + TBool partiallyUpdated(EFalse); + // check that item exist and is Group-type + // The LX suffix means that the lock record of the contact item is left on the cleanup stack. + CContactItem* item = iContactsDb->OpenContactLX( aGroupId ); + CleanupStack::PushL( item ); + if ( item->Type() != KUidContactGroup ) + { + LOGGER_WRITE("Type was not KUidContactGroup, leaving KErrNotFound"); + User::Leave( KErrNotFound ); + } + + // cast item to CContactGroup type + CContactGroup* groupItem = static_cast(item); + TContactItemId groupId = groupItem->Id(); + + TBool labelUpdated(EFalse); + // Check is group label changed + if ( groupItem->HasItemLabelField() ) + { + TPtrC dbLabel = groupItem->GetGroupLabelL(); + if ( aLabel.Compare( dbLabel ) != 0 ) + { + // didn't match, update label. + // Check that new name does not already exist + if ( GroupNameExistsL( aLabel ) ) + { + LOGGER_WRITE("Name already exists, leave KErrAlreadyExists"); + User::Leave( KErrAlreadyExists ); + } + LOGGER_WRITE("Update label" ); + groupItem->SetGroupLabelL( aLabel ); + iContactsDb->CommitContactL( *item ); + labelUpdated = ETrue; + } + } + TTime lastMod; + lastMod.UniversalTime(); + // Update joined contacts + TInt err(KErrNone); + // add new items to current group + for ( TInt i=0; iContainsItem( newItem ); + if ( !founded ) + { + // item does not exist on current group, add it. + LOGGER_WRITE_1("Add contact: %d", newItem) + TRAP( err, iContactsDb->AddContactToGroupL( newItem, groupId )); + if ( err ) + { + LOGGER_WRITE_2("Warning: Could not add contact: %d, err: %d", newItem, err); + partiallyUpdated = ETrue; + } + else + { + // Update contact timestamp + UpdateContactLastMod( newItem, lastMod ); + } + } + else + { + LOGGER_WRITE_1("contact( %d ) already exist on group, no need to update", newItem) + } + } + + // remove all missing items from group + CContactIdArray* oldIdArr = groupItem->ItemsContainedLC(); + if ( oldIdArr ) + { + for ( TInt i=0; iCount(); i++ ) + { + TContactItemId oldItem = (*oldIdArr)[i]; + TInt err = aContactArray.Find( oldItem ); + if ( err == KErrNotFound ) + { + LOGGER_WRITE_1("Remove contact: %d", oldItem ); + // old item was not found from new item list, remove it. + TRAP( err, iContactsDb->RemoveContactFromGroupL(oldItem, groupId)); + if ( err ) + { + LOGGER_WRITE_2("Warning: Could not remove contact: %d, err: ",oldItem, err ); + partiallyUpdated = ETrue; + } + else + { + UpdateContactLastMod( oldItem, lastMod ); + } + } + // Update all contacts in group if label is changed + else if ( labelUpdated ) + { + UpdateContactLastMod( oldItem, lastMod ); + } + } + } + CleanupStack::PopAndDestroy( oldIdArr ); + CleanupStack::PopAndDestroy( 2 ); // item, lock object + + // if item was only partially updated, do not register to snapshot + // --> on next sync item is marked as updated + if ( !partiallyUpdated ) + { + // reload group + groupItem = NULL; + groupItem = static_cast + (iContactsDb->ReadContactLC( groupId )); + // Inform ChangeFinder of updated item + TSnapshotItem snapshotItem( groupId ); + snapshotItem.CreateHashL( *groupItem ); + iChangeFinder->ItemUpdatedL( snapshotItem ); + + CleanupStack::PopAndDestroy( groupItem ); + } + + TRACE_FUNC_EXIT; + } +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCloseItem +// Closes open item in the data store +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCloseItem() + { + TRACE_FUNC_ENTRY; + // Reset read buffer + iReaderPosition = KDataBufferNotReady; + delete iDataBuffer; + iDataBuffer = NULL; + + // Make sure that we're opened an item + if ( iCurrentState != EContactGrpOpening ) + { + LOGGER_WRITE_1( "WARNING: Invalid state %d.", iCurrentState ); + } + // Start to wait for the next operation + iCurrentState = EOpenAndWaiting; + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoMoveItemL +// Not supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoMoveItemL( TSmlDbItemUid /*aUid*/, + TSmlDbItemUid /*aNewParent*/, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Restore state and signal we're done + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoDeleteItemL +// Removes item from the message store +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "aUid: %d", aUid ); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CContactsGrpDataStore::DoDeleteItemL, Incorrect state: %d", iCurrentState); + } + + if ( !iContactsDb ) + { + LOGGER_WRITE( "iContactsDb not ready" ); + User::Leave( KErrNotReady ); + } + + // check that item type is ContactGroup + CContactItem* item = iContactsDb->ReadContactLC( aUid ); + if ( item->Type() != KUidContactGroup ) + { + LOGGER_WRITE("Item was not ContactGroup"); + CleanupStack::PopAndDestroy( item ); + User::Leave( KErrNotFound ); + } + + // Update all contacts in group + CContactGroup* groupItem = static_cast(item); + CContactIdArray* contactArr = groupItem->ItemsContainedLC(); + if ( contactArr ) + { + TTime lastMod; + lastMod.UniversalTime(); + for ( TInt i=0; iCount(); i++ ) + { + TContactItemId contactId = (*contactArr)[i]; + UpdateContactLastMod( contactId, lastMod ); + } + } + CleanupStack::PopAndDestroy( contactArr ); + CleanupStack::PopAndDestroy( item ); + + // delete group + iContactsDb->DeleteContactL( aUid ); + + TSnapshotItem snapshotItem( aUid ); + iChangeFinder->ItemDeleted( snapshotItem ); + + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoSoftDeleteItemL +// Soft delete isn't supported. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoSoftDeleteItemL(TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus) + { + TRACE_FUNC_ENTRY; + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + User::RequestComplete(iCallerStatus, KErrNotSupported); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoDeleteAllItemsL +// Deletes all items in the standard folders of bookmark store +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( !iContactsDb ) + { + LOGGER_WRITE( "iContactsDb is not opened, Leaving KErrNotReady"); + User::Leave( KErrNotReady ); + } + + CContactIdArray* groups = iContactsDb->GetGroupIdListL(); + if ( groups ) + { + CleanupStack::PushL( groups ); + TTime lastMod; + lastMod.UniversalTime(); + + // update all contacts in all groups + for ( TInt i=0; iCount(); i++ ) + { + // check that item type is ContactGroup + CContactItem* item = iContactsDb->ReadContactLC( (*groups)[i] ); + + // Update all contacts in group + CContactGroup* groupItem = static_cast(item); + CContactIdArray* contactArr = groupItem->ItemsContainedLC(); + if ( contactArr ) + { + for ( TInt i=0; iCount(); i++ ) + { + TContactItemId contactId = (*contactArr)[i]; + UpdateContactLastMod( contactId, lastMod ); + } + } + CleanupStack::PopAndDestroy( contactArr ); + CleanupStack::PopAndDestroy( item ); + } + + // delete all groups + iContactsDb->DeleteContactsL( *groups ); + CleanupStack::PopAndDestroy( groups ); + } + + // Reset the whole change finder + iChangeFinder->ResetL(); + + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoHasSyncHistory +// This method returns ETrue if Data Store has history information. +// Slow-sync will be used if Data Store does not have history information. +// ----------------------------------------------------------------------------- +TBool CContactsGrpDataStore::DoHasSyncHistory() const + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "iHasHistory: %d", iHasHistory ); + TRACE_FUNC_EXIT; + return iHasHistory; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoAddedItems +// This method returns UIDs of added items. Those items are added after previous +// synchronization with current synchronization relationship. +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CContactsGrpDataStore::DoAddedItems() const + { + TRACE_FUNC_ENTRY; + + // Clear new-items array + iNewItems->Reset(); + if ( !iChangeFinder ) + { + LOGGER_WRITE( "WARNING: Not ready, returns empty item list" ); + return *iNewItems; + } + + // Search for new items + TRAPD( error, iChangeFinder->FindNewItemsL( *iNewItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "New item count: %d.", iNewItems->ItemCount() ); + TRACE_FUNC_EXIT; + + return *iNewItems; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoDeletedItems +// Returns ids of items, which are deleted after previous synchronization +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CContactsGrpDataStore::DoDeletedItems() const + { + TRACE_FUNC_ENTRY; + + // Clear deleted-items array + iDeletedItems->Reset(); + if ( !iChangeFinder ) + { + LOGGER_WRITE( "WARNING: Not ready, returns empty item list" ); + return *iDeletedItems; + } + + // Search for deleted items + TRAPD( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "Deleted item count: %d.", iDeletedItems->ItemCount() ); + TRACE_FUNC_EXIT; + return *iDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoSoftDeletedItems +// Not directly supported, empty list returned +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CContactsGrpDataStore::DoSoftDeletedItems() const + { + TRACE_FUNC; + // Return empty array as a result + return *iEmptyList; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoModifiedItems +// Finds all modified items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CContactsGrpDataStore::DoModifiedItems() const + { + TRACE_FUNC_ENTRY; + + // Clear updated-items array + iUpdatedItems->Reset(); + if ( !iChangeFinder ) + { + LOGGER_WRITE( "WARNING: Not ready, returns empty item list" ); + return *iUpdatedItems; + } + + // Search for updated items + TRAPD( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error ); + } + + LOGGER_WRITE_1( "Modified item count: %d.", iUpdatedItems->ItemCount() ); + TRACE_FUNC_EXIT; + return *iUpdatedItems; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoMovedItems +// Finds all moved items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CContactsGrpDataStore::DoMovedItems() const + { + TRACE_FUNC; + // Moved items are not supported + // Return empty array as a result + return *iEmptyList; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoResetChangeInfoL +// Resets change history in the data store. All content is considered +// new in the data store point of view. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Reset change info in ChangeFinder + iChangeFinder->ResetL(); + iHasHistory = EFalse; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCommitChangeInfoL +// Commits change info. These items are no longer reported, when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, + const MSmlDataItemUidSet& aItems ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Notify ChangeFinder + LOGGER_WRITE_1( "CContactsGrpDataStore::DoCommitChangeInfoL, item count %d.", aItems.ItemCount() ); + iChangeFinder->CommitChangesL( aItems ); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::DoCommitChangeInfoL +// Commits change info. There is no more nothing to report when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CContactsGrpDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState ); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::RegisterSnapshotL +// Sets Changefinder to compare against current message store content +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::RegisterSnapshotL() + { + TRACE_FUNC_ENTRY; + + CArrayFixSeg* snapshot = + new ( ELeave ) CArrayFixSeg( KSnapshotGranularity ); + CleanupStack::PushL( snapshot ); + + // Add everything to snapshot + + // GetGroupIdListL returns NULL if there are no groups in the database. + CContactIdArray* groups = iContactsDb->GetGroupIdListL(); + if ( groups ) + { + TKeyArrayFix key( iKey ); + CleanupStack::PushL( groups ); + for ( TInt i=0; iCount(); i++ ) + { + CContactItem* item = iContactsDb->ReadContactLC((*groups)[i]); + CContactGroup* groupItem = static_cast(item); + + LOGGER_WRITE_1( "Add group to snatshot, group id: %d",groupItem->Id() ); + + TSnapshotItem snapshotItem( groupItem->Id() ); + snapshotItem.CreateHashL( *groupItem ); + + snapshot->InsertIsqL( snapshotItem, key ); + + CleanupStack::PopAndDestroy( item ); + } + CleanupStack::PopAndDestroy( groups ); + } + + // Set new snapshot to compare against + iChangeFinder->SetNewSnapshot( snapshot ); + + // Changefinder takes ownership of the snapshot + CleanupStack::Pop( snapshot ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::AssignString +// Assigns data from one descriptor into another, truncates if too long +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::AssignString( TDes8& aDestination, const TDesC8& aSource ) + { + TInt targetLength = aSource.Length(); + if ( aDestination.MaxLength() < targetLength ) + { + targetLength = aDestination.MaxLength(); + } + + aDestination.Copy( aSource.Ptr(), targetLength ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::UpdateContactLastMod +// Updates contact item last modified time. Contact sync will see item as changed one. +// ----------------------------------------------------------------------------- +void CContactsGrpDataStore::UpdateContactLastMod( TContactItemId aContactId, + const TTime& aLastModified ) + { + // Ignore errors. + // Cannot update timestamp if contact is already open. However modified time + // is most likely still updated by UI. + TRAP_IGNORE( + // OpenContactLX() places the edit lock on the cleanup stack + CContactItem* contact = iContactsDb->OpenContactLX( aContactId ); + CleanupStack::PushL( contact ); + contact->SetLastModified( aLastModified ); + iContactsDb->CommitContactL( *contact ); + CleanupStack::PopAndDestroy( contact ); + CleanupStack::PopAndDestroy( 1 ); // lock object + ); + } + +// ----------------------------------------------------------------------------- +// CContactsGrpDataStore::GroupNameExistsL +// Checks does group name already exists. +// ----------------------------------------------------------------------------- +TBool CContactsGrpDataStore::GroupNameExistsL( const TDesC& aLabel ) + { + TBool duplicateFound( EFalse ); + // GetGroupIdListL returns NULL if there are no groups in the database. + CContactIdArray* groups = iContactsDb->GetGroupIdListL(); + if ( groups ) + { + CleanupStack::PushL( groups ); + for ( TInt i=0; iCount() && !duplicateFound; i++ ) + { + CContactItem* item = iContactsDb->ReadContactLC((*groups)[i]); + CContactGroup* groupItem = static_cast(item); + + if ( groupItem->HasItemLabelField() ) + { + TPtrC label = groupItem->GetGroupLabelL(); + if ( aLabel.Compare( label ) == 0 ) + { + duplicateFound = ETrue; + } + } + CleanupStack::PopAndDestroy( item ); + } + CleanupStack::PopAndDestroy( groups ); + } + + return duplicateFound; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdatastore.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/contactsgrpdatastore.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008-2010 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 ContactsGroup DS Plug In Adapter +* +*/ + + +#include +#include + +RESOURCE SML_DATA_STORE_FORMAT CONTACTSGROUP_DATA_STORE + { + version = 1; + display_name = "Gallery"; + 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-vCard"; + mime_ver = "2.1"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + } + }; + mime_format_tx_pref = 0; // Preferred index for tx + mime_format_rx_pref = 0; // Preferred index for rx + folder_properties = {}; // No folder properties + filter_capabilities = {}; // No filter capabilities + max_size = 0; // No limit + max_items = 0; // No limit + flags = 0x00000010; // Hierarchical sync supported + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/contactsgroup/src/snapshotitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/contactsgroup/src/snapshotitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2010 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + +#include +#include +#include + +#include "snapshotitem.h" +#include "logger.h" + + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem() : TNSmlSnapshotItem() + { + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// Constructor, takes item id as a parameter +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent ) +: TNSmlSnapshotItem( aItemId ) + { + SetParentId( aParent ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::ExternalizeL +// Writes the contents of this class and it's base to stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::ExternalizeL( RWriteStream& aStream ) const + { + TNSmlSnapshotItem::ExternalizeL( aStream ); + TPckgBuf nameBuf(iHash); + aStream << nameBuf; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::InternalizeL +// Reads the contents of this class and it's base from stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::InternalizeL( RReadStream& aStream ) + { + TNSmlSnapshotItem::InternalizeL( aStream ); + TPckgBuf nameBuf; + aStream >> nameBuf; + iHash = nameBuf(); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::CreateHashL +// Create hash value from group content +// ----------------------------------------------------------------------------- +void TSnapshotItem::CreateHashL( CContactGroup& aGroup ) + { + CMessageDigest* hash = CMessageDigestFactory::NewDigestLC( CMessageDigest::EMD5 ); + + if ( aGroup.HasItemLabelField() ) + { + TPtrC label = aGroup.GetGroupLabelL(); + HBufC8* tempBuf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( label ); + CleanupStack::PushL( tempBuf ); + hash->Update( tempBuf->Des() ); + CleanupStack::PopAndDestroy( tempBuf ); + } + + // Create text field from items on group + CContactIdArray* contactsIdArray = aGroup.ItemsContainedLC(); + const TInt idBufferMaxSize( 400 ); + HBufC8* tempIdBuf = HBufC8::NewLC( idBufferMaxSize ); + TPtr8 tempId = tempIdBuf->Des(); + const TInt KMaxNumLength(5); + if ( contactsIdArray ) // this is NULL if there are no objects + { + tempId.AppendNum( contactsIdArray->Count(), EHex ); + for (TInt i=0; i< contactsIdArray->Count(); i++ ) + { + if ( tempId.Length()+KMaxNumLength > tempId.MaxLength() ) + { + // buffer is almost full, don't add any new items + LOGGER_WRITE("buffer full"); + break; + } + // add item id + tempId.AppendNum( (*contactsIdArray)[i] , EHex ); + } + } + else + { + tempId.AppendNum( 0 ); + } + // update hash + hash->Update( tempId ); + + iHash.Copy( hash->Final() ); + + CleanupStack::PopAndDestroy( tempIdBuf ); + CleanupStack::PopAndDestroy( contactsIdArray ); + CleanupStack::PopAndDestroy( hash ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::Hash +// Gets Hash +// ----------------------------------------------------------------------------- +const TDesC8& TSnapshotItem::Hash() const + { + return iHash; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/2001a9a1.xml Binary file omads/omadsextensions/adapters/mediads/group/2001a9a1.xml has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009-2010 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: bld file for Media DS adapter +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +./2001a9a1.xml Z:/private/101f99f6/capability/2001a9a1.xml +./mediads_stub.sis /epoc32/data/z/system/install/mediads_stub.sis +../rom/mediads.iby CORE_APP_LAYER_IBY_EXPORT_PATH(mediads.iby) + +PRJ_MMPFILES +./mediads.mmp diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/createstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/group/createstub.bat Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Batch file for creating needed stub files. +rem + +makesis -s mediads_stub.pkg \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/mediads.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/group/mediads.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2009-2010 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: Project definition file for project Media DS adapter +* +*/ + + +#include +#include +#include + +TARGET mediadsprovider.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x2001A9A1 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE snapshotitem.cpp +SOURCE changefinder.cpp +SOURCE mediadsprovider.cpp +SOURCE mediadsstore.cpp +SOURCE mediamanager.cpp +SOURCE playlistitem.cpp +SOURCE songitem.cpp +SOURCE omadsfolderobject.cpp +SOURCE cmdemanager.cpp + +USERINCLUDE ../inc + +APP_LAYER_SYSTEMINCLUDE + + +START RESOURCE mediadsprovider.rss +HEADER +TARGET mediadsprovider.rsc +TARGETPATH ECOM_RESOURCE_DIR +END + +START RESOURCE mediadsstore.rss +HEADER +TARGET mediadsstore.rsc +TARGETPATH RESOURCE_FILES_DIR +END + +DEBUGLIBRARY flogger.lib +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY smldataprovider.lib +LIBRARY smlstoreformat.lib +LIBRARY bafl.lib +LIBRARY nsmlchangefinder.lib +LIBRARY mpxcollectionhelper.lib +LIBRARY mpxcommon.lib +LIBRARY charconv.lib +LIBRARY hash.lib +LIBRARY mpxharvesterutility.lib +LIBRARY mpxcollectionutility.lib +LIBRARY mpxcollectionmediator.lib +LIBRARY fbscli.lib +LIBRARY metadatautility.lib +LIBRARY platformenv.lib +LIBRARY mdccommon.lib +LIBRARY mdeclient.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/mediads_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/group/mediads_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,32 @@ +; +; Copyright (c) 2010 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: +; + +; Languages +&EN + +; Header +#{"Media DS Plugin"},(0x2001A9A1),1,20,0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Files to install +""-"z:\resource\mediadsstore.rsc" +""-"z:\resource\plugins\mediadsprovider.rsc" +""-"z:\sys\bin\mediadsprovider.dll" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/group/mediads_stub.sis Binary file omads/omadsextensions/adapters/mediads/group/mediads_stub.sis has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/changefinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/changefinder.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,202 @@ +/* +* 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: CChangeFinder class header +* +*/ + + + +#ifndef __CHANGEFINDER_H__ +#define __CHANGEFINDER_H__ + +// INCLUDES +#include +#include +#include "snapshotitem.h" + +// DATATYPES +typedef CArrayFixSeg CSnapshotArray; + +// Granularity used with dynamic array +const TInt KSnapshotGranularity = 32; + +// CLASS DECLARATION + +/** + * @brief CChangeFinder Class + * This is a ChangeFinder class, which can be used to track down changes in the media store. + * It's functionality is equal to CSmlChangeFinder. Because neither of these classes contained virtual + * functionality, the functionality of this class couldn't be inherited from the CSmlChangeFinder + */ +class CChangeFinder : public CBase + { +public: + + /** + * Class constructor, Creates a new class instance. + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + * @return CChangeFinder*, New ChangeFinder instance. + */ + static CChangeFinder* NewL( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TBool& aHasHistory, + TInt aStreamUid = KNSmlDefaultSnapshotStreamUID ); + + /** + * Class destructor. + */ + ~CChangeFinder(); + + /** + * Close ChangeFinder object, stores snapshot. + */ + void CloseL(); + + /** + * Reset change information, makes all content new from ChangeFinder point of view. + */ + void ResetL(); + + /** + * Find changed items by comparing snapshots. + * + * @param aChangedUids IN: Array for results. + */ + void FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ); + + /** + * Find deleteed items by comparing snapshots. + * + * @param aDeletedUids IN: Array for results. + */ + void FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ); + + /** + * Find new items by comparing snapshots. + * + * @param aNewUids IN: Array for results. + */ + void FindNewItemsL(CNSmlDataItemUidSet& aNewUids); + + /** + * Add item to snapshot, it is no loger reported. + * + * @param aItem IN: item to add. + */ + void ItemAddedL( const TSnapshotItem& aItem ); + + /** + * Delete item from snapshot, it is no loger reported. + * + * @param aItem IN: item to delete. + */ + void ItemDeletedL( const TSnapshotItem& aItem ); + + /** + * Update item to snapshot, it is no loger reported. + * + * @param aItem IN: item to update. + */ + void ItemUpdatedL( const TSnapshotItem& aItem ); + + /** + * Commit all changes to snapshot, there's nothing to report anymore. + */ + void CommitChangesL(); + + /** + * Commit a set of items to snapshot, these items won't be reported anymore. + * + * @param aUids IN: a set of items to commit. + */ + void CommitChangesL( const MSmlDataItemUidSet& aUids ); + + /** + * Sets new snapshot to compare against. + * + * @param aNewSnapshot IN: a new snapshot. + */ + void SetNewSnapshot( CSnapshotArray* aNewSnapshot ); + + /** + * Retrieves DataStore id number. + * + * @return TInt64, DataStore id. + */ + TInt64 DataStoreUid() const; + + /** + * Sets DataStore id number. + * + * @param aUid IN: a new datastore id. + */ + void SetDataStoreUid( TInt64 aUid ); + +private: + + /** + * C++ Constructor + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + */ + CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TInt aStreamUid ); + + /** + * 2nd-phase Constructor + * + * @param aHasHistory IN: ETrue, if there was synchronization history. + */ + void ConstructL( TBool& aHasHistory ); + +private: + + /** + * Allows access to streams. + */ + MSmlSyncRelationship& iSyncRelationship; + + /** + * New snapshot to compare against. + */ + CSnapshotArray* iCurrentSnapshot; + + /** + * Current snapshot. + */ + CSnapshotArray* iOldSnapshot; + + /** + * Key that is used in sorting snapshot. + */ + TKeyArrayFix iKey; + + /** + * Stream id number to access sync relationship. + */ + TInt iStreamUid; + + /** + * Data store id number. + */ + TInt64 iDataStoreUid; + }; + +#endif // __CHANGEFINDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/cmdemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/cmdemanager.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,159 @@ +/* +* 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: CMdEManager declaration +* +*/ + + +#ifndef CMDEMANAGER_H +#define CMDEMANAGER_H + +#include +#include +#include + +#include "playlistitem.h" + +class MMdEManagerObserver + { +public: + virtual void AlbumsReaded( TInt aError ) = 0; + virtual void AlbumReplaced( TInt aError ) = 0; + }; + +class CMdEManager : public CBase, + MMdESessionObserver, + MMdEQueryObserver + { +public: + // Cancel and destroy + ~CMdEManager(); + + // Two-phased constructor. + static CMdEManager* NewL( MMdEManagerObserver& aObserver ); + +public: + + /** + * Start enumerating albums. Calls MMdEManagerObserver::AlbumsReaded when ready. + * This needs to be called before any other operations. + */ + void GetAlbumsL(); + + + RPointerArray& AlbumsArray(){ return iAlbums; }; + const CPlaylistItem& AlbumL( TInt aAlbumId ) const; + + void CreateAlbumL( CPlaylistItem& aAlbum ); + void ReplaceAlbumL( TInt aAlbumId, CPlaylistItem& aAlbum ); + void DeleteAlbumL( TInt aAlbumId ); + + /** + * Cancels any outstanding request if any. + */ + void Cancel(); + +private: + void StartProcessingAlbumsL(); + void ProcessNextAlbumL(); + void FindItemsOnAlbumL( TItemId aAlbumObjectId ); + +private: // from MMdESessionObserver + /** + * Called to notify the observer that opening the session has been + * completed and, if the opening succeeded, the session is ready for use. + * + * @param aSession session + * @param aError KErrNone, if opening the session succeeded; + * or one of the system-wide error codes, if opening the + * session failed + */ + void HandleSessionOpened(CMdESession& aSession, TInt aError); + + /** + * Called to notify the observer about errors, which are not a direct + * consequence of the operations initiated by the client but caused by + * some external source (e.g., other clients). The error cannot be + * recovered and all on-going operations initiated by the client have been + * aborted. Any attempts to continue using the session will cause a panic. + * The client should close the session immediately and try to open a new + * session, if it needs to continue using the metadata engine. + * + * @param aSession session + * @param aError one of the system-wide error codes + */ + void HandleSessionError(CMdESession& aSession, TInt aError); + +private: // from MMdEQueryObserver + /** + * Called to notify the observer that new results have been received + * in the query. + * + * @param aQuery Query instance that received new results. + * @param aFirstNewItemIndex Index of the first new item that was added + * to the result item array. + * @param aNewItemCount Number of items added to the result item + * array. + */ + void HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount); + + + + /** + * Called to notify the observer that the query has been completed, + * or that an error has occured. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError); +private: + + CMdEManager( MMdEManagerObserver& aObserver ); + + void ConstructL(); + + void HandleAlbumQueryCompletedL( CMdEObjectQuery& aQuery ); + void HandleObjectQueryCompletedL( CMdEObjectQuery& aQuery ); + void HandleRelationQueryCompletedL( CMdERelationQuery& aQuery ); + +private: + enum TCMdEManagerState + { + EUninitialized, // Uninitialized / initialization is ongoing + EWaitingToEnumerateAlbums, // Initializing and starting collecting albums info + EEnumeratingAlbums, // Album enumeration is ongoing + EReplacingAlbum, // Replacing album (searching removed relation id:s) + EIdle // Ready for next operation + }; + +private: + MMdEManagerObserver& iObserver; + TCMdEManagerState iState; + + CMdESession* iMde; + CMdEObjectQuery* iAlbumQuery; + CMdEObjectQuery* iObjectQuery; + CMdERelationQuery* iContainmentQuery; + + RPointerArray iAlbumsInProgress; + RPointerArray iAlbums; + + }; + +#endif // CMDEMANAGER_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/logger.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,124 @@ +/* +* 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: Logging macros used by Media DS Plugin +* +*/ + + +#ifndef __LOGGER_H__ +#define __LOGGER_H__ + +#ifdef _DEBUG + #ifdef __WINS__ + // File logging for WINS + #define __FLOGGING__ + #else + #define __FLOGGING__ // enable to log file on target HW + #endif //__WINS__ + + #include + #ifdef __FLOGGING__ + #include + #include + #endif + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT( KLogDir, "MediaDS" ); + _LIT( KLogFile, "MediaDS.txt" ); + + _LIT(KTracePrefix16, "[MediaDs] "); + _LIT8(KTracePrefix8, "[MediaDs] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncReturnFormat8, "%S : End, return: %d"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + /** + * logging macros, for public use + */ + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE8_1( text,par1 ) {_LIT8( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + #define LOGGER_WRITE_3( text,par1,par2,par3 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2, par3 );} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + #define TRACE_FUNC_RET( number ) {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncReturnFormat8, &ptr8, number);} + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + // Declare the FPrint function + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else // no _DEBUG defined + + // No loggings --> reduced code size + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text, par1 ) + #define LOGGER_WRITE8_1( text, par1 ) + #define LOGGER_WRITE_2( text, par1, par2 ) + #define LOGGER_WRITE_3( text, par1, par2, par3 ) + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + #define TRACE_FUNC_RET( number ) + +#endif // _DEBUG + +#endif // __LOGGER_H__ + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/mediadsprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/mediadsprovider.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,124 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#ifndef __MEDIADSPROVIDER_H__ +#define __MEDIADSPROVIDER_H__ + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CMediaDsDataStore; +class CSmlDataStoreFormat; + +/** + * This class is derived from ECom Data Provider plugin-interface (CSmlDataProvider). + * + */ +class CMediaDataProvider : public CSmlDataProvider + { + +public: + + /** + * Constructor. + * + * @return CMediaDataProvider*, a new CMediaDataProvider instance. + */ + static CMediaDataProvider* NewL(); + + /** + * Destructor. + */ + virtual ~CMediaDataProvider(); + + +protected: // Inherited from CSmlDataProvider + + virtual void DoOnFrameworkEvent( TSmlFrameworkEvent, TInt aParam1, TInt aParam2 ); + + virtual TBool DoSupportsOperation( TUid aOpId ) const; + + virtual const CSmlDataStoreFormat& DoStoreFormatL(); + + virtual CDesCArray* DoListStoresLC(); + + virtual const TDesC& DoDefaultStoreL(); + + virtual CSmlDataStore* DoNewStoreInstanceLC(); + + virtual void DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& aServerDataStoreFormat, + RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual void DoCheckServerFiltersL( RPointerArray& aFilters, + TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual const RPointerArray& DoSupportedServerFiltersL(); + + virtual TBool DoSupportsUserSelectableMatchType() const; + + virtual HBufC* DoGenerateRecordFilterQueryLC( const RPointerArray& aFilters, + TSyncMLFilterMatchType aMatch, TDes& aFilterMimeType, + TSyncMLFilterType& aFilterType, TDesC& aStoreName ); + + virtual void DoGenerateFieldFilterQueryL( const RPointerArray& aFilters, + TDes& aFilterMimeType, RPointerArray& aProperties, TDesC& aStoreName ); + +private: + + /** + * C++ Constructor. + */ + CMediaDataProvider(); + + /** + * 2nd-phase Constructor. + */ + void ConstructL(); + + /** + * Creates new DataStore format. + */ + CSmlDataStoreFormat* DoOwnStoreFormatL(); + +private: + + /** + * String pool, used in store format creation. + */ + RStringPool iStringPool; + + /** + * Data store format. + */ + CSmlDataStoreFormat* iOwnStoreFormat; + + /** + * Supported filters (none supported at the moment). + */ + RPointerArray iFilters; + + /** + * File system handle. + */ + RFs iFs; + + }; + +#endif // __MEDIADSPROVIDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/mediadsproviderdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/mediadsproviderdefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,49 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __MEDIADSPROVIDERDEFS_H__ +#define __MEDIADSPROVIDERDEFS_H__ + +#include +#include + +// Database name + +_LIT( KMediaDsDbName, "mediads" ); // Default db +_LIT( KMediaDsRefreshDbName, "mediadsrefresh" ); // Used to refresh db, before opening + +// Resource file for CSmlDataStoreFormat in SIS installation +_LIT(KMediaDsStoreFormatRsc,"mediadsstore.rsc"); + +// max foldername +const TInt KMaxFolderNameLength = 50; + +// Implementation uid +const TUint KMediaDataProviderImplUid = 0x2001A9A1; + +// Folders +_LIT( KAllSongs, "All songs" ); +_LIT( KPlaylists, "Playlists" ); +_LIT( KAlbums, "Albums" ); +const TInt KAllSongsFolderId( 1 ); +const TInt KPlaylistsFolderId( 2 ); +const TInt KAlbumsFolderId( 3 ); + +const TInt KLastFolderId( KAlbumsFolderId ); + +#endif // __MEDIADSPROVIDERDEFS_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/mediadsstore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/mediadsstore.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,258 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#ifndef __MEDIADATASTORE_H__ +#define __MEDIADATASTORE_H__ + +// INCLUDES +#include +#include + +#include "mediadsproviderdefs.h" +#include "changefinder.h" +#include "mediamanager.h" +#include "cmdemanager.h" + +// FORWARD DECLARATIONS +class CNSmlDataItemUidSet; +class MMPXHarvesterUtility; +class MMPXCollectionUtility; +class CMPXCollectionMediator; + + +/** +* @brief This class is derived from ECom Data Store plugin-interface (CSmlDataStore). +* It performs the actual synchronization commands, which are received from +* the DS engine. +*/ +class CMediaDsDataStore : public CSmlDataStore, + public MMediaManagerObserver, + public MMdEManagerObserver + { +public: + + /** + * Constructor + * + * @return CMediaDsDataStore* instance. + */ + static CMediaDsDataStore* NewLC( RFs& aFs ); + + /** + * Destructor + */ + virtual ~CMediaDsDataStore(); + +protected: + + // Virtual functionality from CSmlDataStore, for comments see the CSmlDataStore header file + virtual void DoOpenL(const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus); + virtual void DoCancelRequest(); + virtual const TDesC& DoStoreName() const; + virtual void DoBeginTransactionL(); + virtual void DoCommitTransactionL(TRequestStatus& aStatus); + virtual void DoRevertTransaction(TRequestStatus& aStatus); + virtual void DoBeginBatchL(); + virtual void DoCommitBatchL(RArray& aResultArray, TRequestStatus& aStatus); + virtual void DoCancelBatch(); + virtual void DoSetRemoteStoreFormatL(const CSmlDataStoreFormat& aServerDataStoreFormat); + virtual void DoSetRemoteMaxObjectSize(TInt aServerMaxObjectSize); + virtual TInt DoMaxObjectSize() const; + virtual void DoOpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, TRequestStatus& aStatus); + virtual void DoCreateItemL(TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, TRequestStatus& aStatus); + virtual void DoReplaceItemL(TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool aFieldChange, TRequestStatus& aStatus); + virtual void DoReadItemL(TDes8& aBuffer); + virtual void DoWriteItemL(const TDesC8& aData); + virtual void DoCommitItemL(TRequestStatus& aStatus); + virtual void DoCloseItem(); + virtual void DoMoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus); + virtual void DoDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + virtual void DoSoftDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + virtual void DoDeleteAllItemsL(TRequestStatus& aStatus); + virtual TBool DoHasSyncHistory() const; + virtual const MSmlDataItemUidSet& DoAddedItems() const; + virtual const MSmlDataItemUidSet& DoDeletedItems() const; + virtual const MSmlDataItemUidSet& DoSoftDeletedItems() const; + virtual const MSmlDataItemUidSet& DoModifiedItems() const; + virtual const MSmlDataItemUidSet& DoMovedItems() const; + virtual void DoResetChangeInfoL(TRequestStatus& aStatus); + virtual void DoCommitChangeInfoL(TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems); + virtual void DoCommitChangeInfoL(TRequestStatus& aStatus); + +protected: // from MMPXCollectionObserver + void HandleCollectionMessage(CMPXMessage* aMsg, TInt /*aErr*/) ; + void HandleOpenL(const CMPXMedia& aEntries, + TInt aIndex,TBool aComplete,TInt aError); + void HandleOpenL(const CMPXCollectionPlaylist& aPlaylist,TInt aError); + void HandleCommandComplete(CMPXCommand* /*aCommandResult*/, + TInt /*aError*/); + void HandleCollectionMediaL(const CMPXMedia& aMedia, + TInt aError); + // from MMediaManagerObserver + void RegisterAllPlayListsCompleted( TInt aError ); + void RegisterAllSongsCompleted( TInt aError ); + +protected: // from MMdEManagerObserver + void AlbumsReaded( TInt aError ); + void AlbumReplaced( TInt aError ); + +private: + + /** + * C++ Constructor. + */ + CMediaDsDataStore( RFs& aFs ); + + /** + * 2nd-phase Constructor. + * + * @param aMsvSession IN: a session handle to message store + */ + void ConstructL(); + + /** + * Registers snapshot to ChangeFinder. + */ + void RegisterSnapshotL(); + + void RegisterFoldersL( CSnapshotArray& aItemArray ); + + void FinalizeOpenStore(); + + inline TInt MapSyncIdToAlbumId( TSmlDbItemUid aSyncId ); + inline TSmlDbItemUid MapAlbumIdToSyncId( TInt aAlbumId ); + +private: // Data members + + + enum TState + { + EClosed = 0, + EOpening, + EOpenAndWaiting, + EReplace, + ECreatePlaylist + }; + + /** + * The state of the plugin. + */ + TState iCurrentState; + + /** + * A flag indicating the existence of synchronization history. + */ + TBool iHasHistory; + + /** + * Key that is used in sorting snapshot. + */ + const TKeyArrayFix iKey; + + /** + * Change finder, used to determine db modifications. + */ + CChangeFinder* iChangeFinder; + + /** + * The location for temporary data + */ + CBufFlat* iDataBuffer; + + /** + * Current read position at the data chunk from MMS engine + */ + TInt iReadPosition; + + /** + * Indicates wheter this was only status update + */ + TInt iWrittenDataLength; + + /** + * Stores the currently active message id. + */ + TSmlDbItemUid iCurrentId; + + /** + * Pointer to the variable, receiving the created Uid. + */ + TSmlDbItemUid* iCreatedUid; + + /** + * Stores the parent id of currently active message. + */ + TSmlDbItemUid iParentId; + + /** + * Used to get asynchronous return values. + */ + TRequestStatus* iCallerStatus; + + /** + * Used to store new items. + */ + CNSmlDataItemUidSet* iNewItems; + + /** + * Used to store deleted items. + */ + CNSmlDataItemUidSet* iDeletedItems; + + /** + * Used to store updated items. + */ + CNSmlDataItemUidSet* iUpdatedItems; + + /** + * Used to store moved items. + */ + CNSmlDataItemUidSet* iMovedItems; + + /** + * Used to store soft-deleted items (not supported). + */ + CNSmlDataItemUidSet* iSoftDeletedItems; + + /** + * Used to manage playlists and songs. + */ + CMediaManager* iMediaManager; + TBool iMediaManagerReady; + + /** + * Used to manage photo albums. + */ + CMdEManager* iMdEManager; + TBool iMdEManagerReady; + + TInt iError; + + CMD5* iHasher; + + RFs& iFs; + + CSnapshotArray* iSnapshot; + TSnapshotItem iItemInReplacement; + }; + +#endif // __MEDIADATASTORE_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/mediamanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/mediamanager.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2009-2010 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#ifndef _CMEDIAMANAGER_H +#define _CMEDIAMANAGER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "changefinder.h" +#include "songitem.h" + +class CMPXMedia; +class MMPXCollectionHelper; + +class MMediaManagerObserver : public MMPXCollectionObserver + { +public: + virtual void RegisterAllPlayListsCompleted( TInt aError ) = 0; + virtual void RegisterAllSongsCompleted( TInt aError ) = 0; + }; + +/** + * @brief This class manages playlist's on media library. Also songs metadata can be queried. + * + */ +class CMediaManager : public CActive, private MMPXCollectionHelperObserver + { +public: + + static CMediaManager* NewL( RFs& aFs, MMediaManagerObserver* aObserver, TKeyArrayFix aKey, CMD5& aHasher ); + + ~CMediaManager(); + + /** + * Starts scanning music library. + * Calls MMPXCollectionObserver::HandleCollectionMessage when completed. + */ + void ScanL(); + + /** + * Cancel scan + */ + void CancelScanL(); + + /** + * Set current snapshot. + * @param aSnapshot + */ + void SetSnapshot( CSnapshotArray* aSnapshot ){iSnapshotArray=aSnapshot;}; + + /** + * Starts registering all playlists. + * Snapshot must be set before calling this. + * Calls MMediaManagerObserver::RegisterAllPlayListsCompleted when ready + * @return KErrNone if operation succesfully started. + */ + TInt RegisterAllPlayLists(); + + /** + * Starts registering all songs. + * Snapshot must be set before calling this. + * Calls MMediaManagerObserver::RegisterAllSongsCompleted when ready + * @return KErrNone if operation succesfully started. + */ + TInt RegisterAllSongs(); + + /** + * Gets CPlaylistItem + * @param aPlaylistId playlist id to get. + * @param aPlaylist returned playlist. + */ + void GetPlayListL( TInt aPlaylistId, CPlaylistItem& aPlaylist ); + + /** + * Gets CSongItem + * @param aSongId song id to get. + * @param aSongItem returned song. + */ + void GetSongL( TInt aSongId, CSongItem& aSongItem ); + + /** + * Creates new playlist to music library + * @param aNewUid returns new playlist id, if succesfully added. + * @param aPlaylist playlist to be added. Uri is updated to aPlaylist. + */ + void CreateNewPlaylistL( TInt& aNewUid, CPlaylistItem& aPlaylist ); + + /** + * Replaces existing playlist in music library + * @param aPlaylistId playlist id to be replaced. Uri is read to aPlaylist. + * @param aPlaylist new content. + */ + void ReplacePlaylistL( TInt aPlaylistId, CPlaylistItem& aPlaylist ); + + /** + * Deletes playlist from music library + * @param aPlaylistId playlist id to be deleted. + */ + void DeletePlaylistL( TInt aPlaylistId ); + +private: // From MMPXCollectionHelperObserver + void HandleAddFileCompleteL( TInt aErr ); + +private: + CMediaManager( RFs& aFs, MMediaManagerObserver* aObserver, TKeyArrayFix aKey, CMD5& aHasher ); + + void ConstructL(); + + void RegisterPlaylistL( const CMPXMedia& aMedia ); + + void RegisterSongL( const CMPXMedia& aMedia ); + + CMPXMedia* FetchPlaylistContentL( TInt aId ); + + CMPXMedia* FindPlaylistL( TInt aUid ); + + void AddPlaylistL( CMPXMedia* aMedia ); + + void ReadSongAttributesL( const CMPXMedia& aMedia, CSongItem& aSongItem, TBool aReadFileDetails ); + + CMPXMedia* CreatePlaylistMediaL( const CPlaylistItem& aPlaylist ); + + CMPXMediaArray* CreateMediaArrayLC( const CPlaylistItem& aPlaylist ); + + void ReadPlaylistCountL(); + void ReadPlaylistItemsL(); + + void ReadSongCountL(); + void ReadSongItemsL(); +private: // from CActive + + void DoCancel(); + void RunL(); + TInt RunError( TInt aError ); + +private: + + enum TState + { + EIdle = 0, + EReadingPlaylistCount, + EEnumeratingPlaylists, + EReadingSongCount, + EEnumeratingSongs + }; + TState iCurrentState; + + CMPXMedia* iFoundedMedia; + TInt iReadedItems; + TInt iItemsFound; + CSnapshotArray* iSnapshotArray; // not owned + + MMediaManagerObserver* iObserver; + const TKeyArrayFix iKey; + MMPXCollectionHelper* iCollectionHelper; + + CMD5& iHasher; + + MMPXHarvesterUtility* iHarvester; + CMPXCollectionMediator* iMediator; + MMPXCollectionUtility* iCollection; + RFs& iFs; + + bool iWaitOngoing; + CActiveSchedulerWait iWait; + }; + + +#endif // _CMEDIAMANAGER_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/omadsfolderobject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/omadsfolderobject.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,57 @@ +/* +* 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: COMADSFolderObject class implementation +* +*/ + + + +#ifndef __OMADSFOLDEROBJECT_H__ +#define __OMADSFOLDEROBJECT_H__ + +#include + +const TInt KMaxElementLength = 255; +const TInt KMaxXmlLineLength = 1024; + +class COMADSFolderObject : public CBase + { +public: + + static COMADSFolderObject* NewLC(); + ~COMADSFolderObject(); + + // Set methods + inline void SetName( const TDesC& aName ) {iName.Copy(aName);}; + inline void SetCreatedDate( const TDateTime& aDateTime ) {iCreatedDate = aDateTime;}; + inline void SetModifiedDate( const TDateTime& aDateTime ) {iModifiedDate = aDateTime;}; + + void ExportFolderXmlL( CBufBase& aBuffer ); + +private: + void ExportL(); + void WriteL( const TDesC &aData ); + +private: + + TBuf8 iTemp; + TPath iName; + TDateTime iCreatedDate; + TDateTime iModifiedDate; + CBufBase* iBuffer; // Not owned + TInt iWriteBufPosition; + TInt iWriteBufSize; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/playlistitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/playlistitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,65 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef PLAYLISTITEM_H_ +#define PLAYLISTITEM_H_ + +#include +#include +#include + +class CPlaylistItem : public CBase + { +public: + static CPlaylistItem* NewLC(); + ~CPlaylistItem(); + + void SetId( TInt aId ); + TInt Id() const; + + void SetTitleL( const TDesC& aTitle ); + const TDesC& Title() const; + + void SetUrlL( const TDesC& aUrl ); + const TDesC& Url() const; + + void AddItemL( const TDesC& aSongUri ); + TInt ItemCount() const; + TPtrC16 ItemAt( TInt aIndex ) const; + TInt FindItem( const TDesC16& aPtr, TInt& aPos, TKeyCmpText aTextComparisonType=ECmpFolded ) const; + + void ExportL( RBufWriteStream& aStream ) const; + void ImportL( const TDesC& aBuffer ); + +private: + CPlaylistItem(); + void ConstructL(); + +private: + + TInt ReadNextLine( const TDesC& aBuffer, TPtrC& aLine ); + +private: + TInt iId; + HBufC* iTitle; + HBufC* iUrl; + + CDesCArrayFlat* iDescArray; + }; + +#endif /* PLAYLISTITEM_H_ */ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/sconmetadatafielddefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/sconmetadatafielddefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,131 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef _SCONMETADATAFIELDDEFS_H_ +#define _SCONMETADATAFIELDDEFS_H_ + +// Content type header +const TUint8 KSconMetadataHeaderAudio( 0x01 ); +const TUint8 KSconMetadataHeaderExif ( 0x02 ); +const TUint8 KSconMetadataHeaderVideo( 0x03 ); + +const TUint8 KSconMetadataHeaderVersion ( 0x03 ); // format version = 3 + +// fields for audio +const TUint8 KSconAudioID3Version ( 0x01 ); +const TUint8 KSconAudioTitle ( 0x02 ); +const TUint8 KSconAudioArtist ( 0x03 ); +const TUint8 KSconAudioAlbum ( 0x04 ); +const TUint8 KSconAudioYear ( 0x05 ); +const TUint8 KSconAudioComment ( 0x06 ); +const TUint8 KSconAudioAlbumTrack ( 0x07 ); +const TUint8 KSconAudioGenre ( 0x08 ); +const TUint8 KSconAudioComposer ( 0x09 ); +const TUint8 KSconAudioCopyright ( 0x0a ); +const TUint8 KSconAudioOriginalArtist( 0x0b ); +const TUint8 KSconAudioUrl ( 0x0c ); +const TUint8 KSconAudioUserUrl ( 0x0d ); +const TUint8 KSconAudioJpeg ( 0x0e ); +const TUint8 KSconAudioVendor ( 0x0f ); +const TUint8 KSconAudioRating ( 0x10 ); +const TUint8 KSconAudioUniqueFileIdentifier( 0x11 ); +const TUint8 KSconAudioDuration ( 0x12 ); +const TUint8 KSconAudioDate ( 0x13 ); +const TUint8 KSconAudioMimeType ( 0x14 ); +const TUint8 KSconAudioFilename ( 0x15 ); +const TUint8 KSconAudioFileSize ( 0x16 ); + +// fields for exif +const TUint8 KSconExifThumbnail ( 0x01 ); +const TUint8 KSconExifDescription ( 0x02 ); +const TUint8 KSconExifMake ( 0x03 ); +const TUint8 KSconExifModel ( 0x04 ); +const TUint8 KSconExifDateTime ( 0x05 ); +const TUint8 KSconExifSoftware ( 0x06 ); +const TUint8 KSconExifCopyright ( 0x07 ); +const TUint8 KSconExifOrientation ( 0x08 ); +const TUint8 KSconExifXResolution1 ( 0x09 ); +const TUint8 KSconExifXResolution2 ( 0x0a ); +const TUint8 KSconExifYResolution1 ( 0x0b ); +const TUint8 KSconExifYResolution2 ( 0x0c ); +const TUint8 KSconExifResolutionUnit ( 0x0d ); +const TUint8 KSconExifYCbCrPositioning ( 0x0e ); +const TUint8 KSconExifIsoSpeedRatings ( 0x0f ); +const TUint8 KSconExifDateTimeOriginal ( 0x10 ); +const TUint8 KSconExifDateTimeDigitized ( 0x11 ); +const TUint8 KSconExifMakerNote ( 0x12 ); +const TUint8 KSconExifUserComment ( 0x13 ); +const TUint8 KSconExifRelatedSoundFile ( 0x14 ); +const TUint8 KSconExifExposureTime1 ( 0x15 ); +const TUint8 KSconExifExposureTime2 ( 0x16 ); +const TUint8 KSconExifComponentsConfiguration ( 0x17 ); +const TUint8 KSconExifFlash ( 0x18 ); +const TUint8 KSconExifColorSpace ( 0x19 ); +const TUint8 KSconExifPixelXDimension ( 0x1a ); +const TUint8 KSconExifPixelYDimension ( 0x1b ); +const TUint8 KSconExifExposureMode ( 0x1c ); +const TUint8 KSconExifWhiteBalance ( 0x1d ); +const TUint8 KSconExifSceneCaptureType ( 0x1e ); +const TUint8 KSconExifExposureProgram ( 0x1f ); +const TUint8 KSconExifApertureValue1 ( 0x20 ); +const TUint8 KSconExifApertureValue2 ( 0x21 ); +const TUint8 KSconExifExposureBiasValue1 ( 0x22 ); +const TUint8 KSconExifExposureBiasValue2 ( 0x23 ); +const TUint8 KSconExifMeteringMode ( 0x24 ); +const TUint8 KSconExifLightSource ( 0x25 ); +const TUint8 KSconExifFileSource ( 0x26 ); +const TUint8 KSconExifDigitalZoomRatio1 ( 0x27 ); +const TUint8 KSconExifDigitalZoomRatio2 ( 0x28 ); +const TUint8 KSconExifContrast ( 0x29 ); +const TUint8 KSconExifSaturation ( 0x2a ); +const TUint8 KSconExifSharpness ( 0x2b ); +const TUint8 KSconExifExifVersion ( 0x2c ); +const TUint8 KSconExifFlashPixVersion ( 0x2d ); +const TUint8 KSconExifThumbXResolution1 ( 0x2e ); +const TUint8 KSconExifThumbXResolution2 ( 0x2f ); +const TUint8 KSconExifThumbYResolution1 ( 0x30 ); +const TUint8 KSconExifThumbYResolution2 ( 0x31 ); +const TUint8 KSconExifThumbResolutionUnit ( 0x32 ); +const TUint8 KSconExifThumbCompression ( 0x33 ); +const TUint8 KSconExifThumbJpegInterchangeFormat ( 0x34 ); +const TUint8 KSconExifThumbJpegInterchangeFormatLength ( 0x35 ); +const TUint8 KSconExifShutterSpeedValue1 ( 0x36 ); +const TUint8 KSconExifShutterSpeedValue2 ( 0x37 ); +const TUint8 KSconExifBrightnessValue1 ( 0x38 ); +const TUint8 KSconExifBrightnessValue2 ( 0x39 ); +const TUint8 KSconExifCustomRendered ( 0x3a ); +const TUint8 KSconExifGainControl ( 0x3b ); +const TUint8 KSconExifGpsVersion ( 0x3c ); +const TUint8 KSconExifGPSLatitude ( 0x3d ); +const TUint8 KSconExifGPSLongitude ( 0x3e ); +const TUint8 KSconExifGPSAltitude ( 0x3f ); +const TUint8 KSconExifBitDepth ( 0x40 ); + +// fields for video +const TUint8 KSconVideoFormat ( 0x01 ); +const TUint8 KSconVideoFrameRate ( 0x02 ); +const TUint8 KSconVideoFrameSizeWidth ( 0x03 ); +const TUint8 KSconVideoFrameSizeHeight ( 0x04 ); +const TUint8 KSconVideoVideoBitRate ( 0x05 ); +const TUint8 KSconVideoAudioBitRate ( 0x06 ); +const TUint8 KSconVideoDuration ( 0x07 ); +const TUint8 KSconVideoThumbnail ( 0x08 ); +const TUint8 KSconVideoAudioStreamMimetype ( 0x09 ); +const TUint8 KSconVideoVideoStreamMimetype ( 0x0a ); + +#endif // _SCONMETADATAFIELDDEFS_H_ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/snapshotitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/snapshotitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,133 @@ +/* +* 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: Private snapshot item header +* +*/ + + +#ifndef __SNAPSHOTITEM_H__ +#define __SNAPSHOTITEM_H__ + +// INCLUDES +#include +#include +#include "mediadsproviderdefs.h" +#include "songitem.h" +#include "playlistitem.h" + +typedef TBuf TFolderName; + +// CLASS DECLARATION + +/** + * @brief TSnapshotItem + * This class represents a single item in the ChangeFinder snapshot. + * + */ + +// Defines the maximum length of a hash. +const TInt KMaxHashLength = 16; +typedef TBuf8 THashValue; + +class TSnapshotItem + { +public: + + /** + * Constructor + */ + TSnapshotItem(); + + /** + * Constructor + * + * @param aItemId IN: id of the item. + * @param aParent IN: parent item, 0 as default. + * @param aUnread IN: read/unread information, the default is read. + */ + TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent = 0 ); + + /** + * Writes the item to a stream. + * + * @param aStream IN: a reference to a stream, where this item is to be written. + */ + void ExternalizeL( RWriteStream& aStream ) const; + + /** + * Reads item from a stream. + * + * @param aStream IN: a reference to a stream, where this item is read from. + */ + void InternalizeL( RReadStream& aStream ); + + /** + * Getter for item UID value. + * @return const TSmlDbItemUid& item UID. + */ + const TSmlDbItemUid& ItemId() const; + + /** + * Setter for item UID value. + * @param aItemId item UID. + */ + void SetItemId( const TSmlDbItemUid& aItemId ); + + /** + * Getter for parent UID value. + * @return const TSmlDbItemUid& parent UID. + */ + const TSmlDbItemUid& ParentId() const; + + /** + * Setter for parent UID value. + * @param aParentId parent UID. + */ + void SetParentId( const TSmlDbItemUid& aParentId ); + + /** + * Generate hash value from foldername + * @param aFolderName foldername + * @param CMD5& aHasher MD5 hasher + */ + void SetItemHash( const TDesC& aFolderName, CMD5& aHasher ); + + /** + * Generate hash value from aSongItem content + * @param aSongItem song item + * @param CMD5& aHasher MD5 hasher + */ + void SetItemHash( const CSongItem& aSongItem, CMD5& aHasher ); + + /** + * Generate hash value from aPlaylist content + * @param aPlaylist aPlaylist + * @param CMD5& aHasher MD5 hasher + */ + void SetItemHash( const CPlaylistItem& aPlaylist, CMD5& aHasher ); + + /** + * Getter for generated hash value. + * @return const TDesC8& hash value + */ + const TDesC8& Hash() const; + +private: + TSmlDbItemUid iItemId; + TSmlDbItemUid iParentId; + THashValue iHash; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/inc/songitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/inc/songitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,115 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#ifndef TSONGITEM_H_ +#define TSONGITEM_H_ + +#include +#include + + +class CSongItem : public CBase + { +public: + + static CSongItem* NewLC(); + ~CSongItem(); + + void SetId( TInt aId ); + TInt Id() const; + + void SetUriL( const TDesC& aUri ); + const TDesC& Uri() const; + + void SetTitleL( const TDesC& aTitle ); + const TDesC& Title() const; + + void SetMimeTypeL( const TDesC& aMimeType ); + const TDesC& MimeType() const; + + void SetDuration( TInt aDuration ); + TInt Duration() const; + + void SetArtistL( const TDesC& aArtist ); + const TDesC& Artist() const; + + void SetAlbumL( const TDesC& aAlbum ); + const TDesC& Album() const; + + void SetYear( TInt aYear ); + TInt Year() const; + + void SetAlbumTrack( TInt aId ); + TInt AlbumTrack() const; + + void SetGenreL( const TDesC& aGenre ); + const TDesC& Genre() const; + + void SetCommentL( const TDesC& aComment ); + const TDesC& Comment() const; + + void SetComposerL( const TDesC& aComposer ); + const TDesC& Composer() const; + + void SetRating( TInt aRating ); + TInt Rating() const; + + void SetModifiedTime( TTime& aTime ); + const TTime& ModifiedTime() const; + + void SetFileSize( TInt32 aSize ); + TInt32 FileSize() const; + + /** + * Export item. + * @param aStream stream where to export. + */ + void ExportL( RWriteStream& aStream ); + +private: + CSongItem(); + void ConstructL(); + + inline void WriteUnicodeL( RWriteStream& aStream, const TDesC& aData, const TUint8 aFieldId ); + + inline void WriteDataFieldL( RWriteStream& aStream, const TDesC8& aData, const TUint8 aFieldId ); + + inline void WriteUInt16FieldL( RWriteStream& aStream, TUint16 aData, const TUint8 aFieldId ); + + inline void WriteUInt32FieldL( RWriteStream& aStream, TUint32 aData, const TUint8 aFieldId ); + +private: + TInt iId; + HBufC* iUri; + HBufC* iTitle; + HBufC* iMimeType; + TInt iDuration; + HBufC* iArtist; + HBufC* iAlbum; + TInt iYear; + TInt iAlbumTrack; + HBufC* iGenre; + HBufC* iComment; + HBufC* iComposer; + TInt iRating; + TTime iModifiedTime; + TInt iSize; + }; + +#endif /* TSONGITEM_H_ */ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/rom/mediads.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/rom/mediads.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009-2010 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: IBY file for Media DS plugin +* +*/ + + +#ifndef __MEDIADS_IBY__ +#define __MEDIADS_IBY__ + +ECOM_PLUGIN(mediadsprovider.dll,mediadsprovider.rsc) +data=DATAZ_\RESOURCE_FILES_DIR\mediadsstore.rsc RESOURCE_FILES_DIR\mediadsstore.rsc +data=DATAZ_\private\101F99F6\capability\2001A9A1.XML private\101F99F6\capability\2001A9A1.XML + +data=ZSYSTEM\install\mediads_stub.sis system\install\mediads_stub.sis + +#endif //__MEDIADS_IBY__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/sis/backup_registration.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/sis/mediads.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/sis/mediads.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,42 @@ +; +; Copyright (c) 2010 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: PKG file for Media DS adapter +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Media DS Plugin"},(0x2001A9A1),1,20,0,TYPE=SA, RU +; + +; S60 v5.2 +[0x20022E6D ], 0, 0, 0, {"Series60ProductID"} + + +"\epoc32\data\z\resource\mediadsstore.rsc" -"c:\resource\mediadsstore.rsc" +"\epoc32\data\z\resource\plugins\mediadsprovider.rsc" -"c:\resource\plugins\mediadsprovider.rsc" +"\epoc32\release\ARMV5\UREL\mediadsprovider.dll" -"c:\sys\bin\mediadsprovider.dll" +"\epoc32\data\Z\private\101F99F6\capability\2001a9a1.xml" -"c:\private\101F99F6\import\2001a9a1.xml" + +"backup_registration.xml" -"c:\private\10202D56\import\packages\2001A9A1\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/sis/mediads_debug.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/sis/mediads_debug.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,42 @@ +; +; Copyright (c) 2010 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: PKG file for Media DS adapter (debug) +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"Media DS Plugin"},(0x2001A9A1),1,20,0,TYPE=SA, RU +; + +; S60 v5.2 +[0x20022E6D ], 0, 0, 0, {"Series60ProductID"} + + +"\epoc32\data\z\resource\mediadsstore.rsc" -"c:\resource\mediadsstore.rsc" +"\epoc32\data\z\resource\plugins\mediadsprovider.rsc" -"c:\resource\plugins\mediadsprovider.rsc" +"\epoc32\release\ARMV5\UDEB\mediadsprovider.dll" -"c:\sys\bin\mediadsprovider.dll" +"\epoc32\data\Z\private\101F99F6\capability\2001a9a1.xml" -"c:\private\101F99F6\import\2001a9a1.xml" + +"backup_registration.xml" -"c:\private\10202D56\import\packages\2001A9A1\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/changefinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/changefinder.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,537 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include "changefinder.h" +#include "logger.h" + +const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version + +// ----------------------------------------------------------------------------- +// CChangeFinder::NewL +// Static function to create CChangeFider object(s) +// ----------------------------------------------------------------------------- +CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, + TBool& aHasHistory, TInt aStreamUid ) + { + CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); + CleanupStack::PushL( self ); + self->ConstructL( aHasHistory ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CChangeFinder +// Constructor for the class +// ----------------------------------------------------------------------------- +CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, TInt aStreamUid ) : +iSyncRelationship( aSyncRelationship ), +iKey(aKey), +iStreamUid( aStreamUid ), +iDataStoreUid( KErrNotFound ) + { + + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::~CChangeFinder +// Destructor for the class, closes the ChangeFinder and writes snapshot to stream +// ----------------------------------------------------------------------------- +CChangeFinder::~CChangeFinder() + { + TRACE_FUNC_ENTRY; + TInt error; + TRAP( error, CloseL() ); + if ( error != KErrNone ) + { + LOGGER_WRITE( "CChangeFinder::~CChangeFinder, CloseL failed." ); + } + + delete iCurrentSnapshot; + iCurrentSnapshot = NULL; + delete iOldSnapshot; + iOldSnapshot = NULL; + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ConstructL +// 2nd phase constructor for the class, reads snapshot from stream +// ----------------------------------------------------------------------------- +void CChangeFinder::ConstructL( TBool& aHasHistory ) + { + TRACE_FUNC_ENTRY; + + TUid streamId; + streamId.iUid = iStreamUid; + + aHasHistory = iSyncRelationship.IsStreamPresentL(streamId); + + if ( aHasHistory ) + { + LOGGER_WRITE("CChangeFinder::ConstructL, history exists."); + RReadStream readStream; + iSyncRelationship.OpenReadStreamLC(readStream, streamId); + + // Read the index, first create snapshot array + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + + // Read used format version + TUint formatVer = readStream.ReadUint32L(); + if ( formatVer != KSnapshotFormatVersion ) + { + // Wrong version, do not try to import data + LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); + aHasHistory = EFalse; + CleanupStack::PopAndDestroy( &readStream ); + TRACE_FUNC_EXIT; + return; + } + + // Read item count + TInt count = readStream.ReadUint32L(); + // Read items + for ( TInt i=0; iInsertIsqL( item, iKey ); + } + + CleanupStack::PopAndDestroy( &readStream ); + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CloseL +// Closes ChangeFinder object and writes snapshot to stream +// ----------------------------------------------------------------------------- +void CChangeFinder::CloseL() + { + TRACE_FUNC_ENTRY; + + // Write to stream + RWriteStream writeStream; + + TUid streamId; + streamId.iUid = iStreamUid; + + // Open write stream + iSyncRelationship.OpenWriteStreamLC( writeStream, streamId ); + + // Write used format version + writeStream.WriteUint32L( KSnapshotFormatVersion ); + + // Write item count + TInt count(0); + if ( iOldSnapshot ) + { + count = iOldSnapshot->Count(); + } + writeStream.WriteUint32L(count); + + // Write items + for (TInt i=0; iAt( i ); + item.ExternalizeL( writeStream ); + } + + writeStream.CommitL(); + CleanupStack::PopAndDestroy( &writeStream ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ResetL +// Resets synchronization history, all contetn is considered new after this call +// ----------------------------------------------------------------------------- +void CChangeFinder::ResetL() + { + TRACE_FUNC_ENTRY; + + // Delete old change information + if ( iOldSnapshot ) + { + LOGGER_WRITE("iOldSnapshot->Reset()"); + iOldSnapshot->Reset(); + } + + // Write 'null' data to file, + // this removes change history from the file + CloseL(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindChangedItemsL +// Compares snapshots, finds changed items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) + { + TRACE_FUNC_ENTRY; + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + LOGGER_WRITE_1( "CChangeFinder::FindChangedItemsL count: %d", count ); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + // Find this entry from the old snapshot + if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + // Compare hash to see whether this was changed + if ( oldItem.Hash().Compare( currentItem.Hash() ) != 0 + || oldItem.ParentId() != currentItem.ParentId() ) + { + aChangedUids.AddItem( currentItem.ItemId() ); + //LOGGER_WRITE_1( "Item %d was changed.", currentItem.ItemId() ); + } + } + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindDeletedItemsL +// Compares snapshots, finds deleted items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) + { + TRACE_FUNC_ENTRY; + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindDeletedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iOldSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iOldSnapshot->At( i ); + + // If there's no current snapshot, this definately is deleted item + if ( !iCurrentSnapshot ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + //LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the current snapshot. + else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + //LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindNewItemsL +// Compares snapshots, finds new items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) + { + TRACE_FUNC_ENTRY; + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindNewItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // If there's no old snapshot, all items are new + if ( !iOldSnapshot ) + { + aNewUids.AddItem( currentItem.ItemId() ); + //LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the old snapshot. + else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aNewUids.AddItem( currentItem.ItemId() ); + //LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + } + + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemAddedL +// Adds item to snapshot, this item is no longer considered new +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + + // Add this to old snapshot, if there's no old snapshot it must be created + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); + + TRAPD( error, iOldSnapshot->InsertIsqL( aItem, iKey ) ); + if ( error == KErrAlreadyExists ) + { + // It was already committed, no actions required + LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists" ); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); + User::Leave( error ); + } + iOldSnapshot->Compress(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemDeletedL +// Removes item to snapshot, this item is no longer considered deleted +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemDeletedL( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + + LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::ItemDeleted leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + // Delete item from the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->Delete( index ); + } + else // Skip, there wasn't such entry + { + LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); + } + iOldSnapshot->Compress(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemUpdatedL +// Updates item to snapshot, this item is no longer considered changed +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) + { + TRACE_FUNC_ENTRY; + + LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + oldItem = aItem; + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + + } + iOldSnapshot->Compress(); + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL() + { + TRACE_FUNC_ENTRY; + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Delete everything from the old snapshot + iOldSnapshot->Reset(); + + // Loop through all the items in current snapshot + TInt count = iCurrentSnapshot->Count(); + + // Copy everything from current to old snapshot + for ( TInt i = 0; i < count; i++ ) + { + // Commit it to the old array. + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( i ), iKey ); + } + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot, affects only a specified group of items +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) + { + TRACE_FUNC_ENTRY; + + + // This function commits changes from current snapshot to old snapshot + // But commits only the entries in the parameter array + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + for ( TInt i = 0; i < aUids.ItemCount(); i++ ) + { + TSmlDbItemUid itemId = aUids.ItemAt( i ); + TSnapshotItem temp( itemId ); + TInt indexOld( -1 ); + TInt indexNew( -1 ); + TInt err = iOldSnapshot->FindIsq( temp, iKey, indexOld); + if ( !err ) + { + // founded from old snapshot + if ( !iCurrentSnapshot->FindIsq(temp, iKey, indexNew) ) + { + // Replace + iOldSnapshot->At( indexOld ) = iCurrentSnapshot->At( indexNew ); + } + else + { + // not found from current snapshot, delete from old also. + iOldSnapshot->Delete( indexOld ); + } + } + else + { + // not found from old snapshot, add it. + if ( !iCurrentSnapshot->FindIsq( temp, iKey, indexNew ) ) + { + iOldSnapshot->InsertIsqL( iCurrentSnapshot->At( indexNew ), iKey ); + } + } + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetNewSnapshot +// Sets new snapshot (to be compared against), ChangeFinder takes ownership +// ----------------------------------------------------------------------------- +void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) + { + TRACE_FUNC_ENTRY; + + // Delete existing snapshot + delete iCurrentSnapshot; + + // Set submitted snapshot as active + iCurrentSnapshot = aNewSnapshot; + iCurrentSnapshot->Compress(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::DataStoreUid +// returns stored data store id number +// ----------------------------------------------------------------------------- +TInt64 CChangeFinder::DataStoreUid() const + { + TRACE_FUNC; + return iDataStoreUid; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetDataStoreUid +// Sets data store id number +// ----------------------------------------------------------------------------- +void CChangeFinder::SetDataStoreUid( TInt64 aUid ) + { + TRACE_FUNC; + iDataStoreUid = aUid; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/cmdemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/cmdemanager.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,741 @@ +/* +* 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: CMdEManager implementation +* +*/ + + +#include "cmdemanager.h" +#include + +#include + +#include "logger.h" + +// Warning: #940-D: missing return statement at end of non-void function +#pragma diag_remark 940 + +CMdEManager::CMdEManager( MMdEManagerObserver& aObserver ) : + iObserver(aObserver) + { + } + + +CMdEManager* CMdEManager::NewL( MMdEManagerObserver& aObserver ) + { + CMdEManager* self = new (ELeave) CMdEManager( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +void CMdEManager::ConstructL() + { + TRACE_FUNC; + iMde = CMdESession::NewL( *this ); + } + + +CMdEManager::~CMdEManager() + { + TRACE_FUNC; + Cancel(); // Cancel any request, if outstanding + delete iAlbumQuery; + delete iObjectQuery; + delete iContainmentQuery; + delete iMde; + + iAlbumsInProgress.ResetAndDestroy(); + iAlbums.ResetAndDestroy(); + } + +void CMdEManager::GetAlbumsL() + { + TRACE_FUNC_ENTRY; + iAlbumsInProgress.ResetAndDestroy(); + iAlbums.ResetAndDestroy(); + if ( !iMde ) + { + LOGGER_WRITE("Session was not ready!"); + iState = EUninitialized; + iMde = CMdESession::NewL( *this ); + } + + if ( iState == EUninitialized) + { + LOGGER_WRITE("Starting processing albums after session is ready"); + iState = EWaitingToEnumerateAlbums; + } + else if ( iState == EIdle ) + { + StartProcessingAlbumsL(); + } + else + { + LOGGER_WRITE_1("Wrong state: %d", iState); + User::Leave( KErrGeneral ); + } + + TRACE_FUNC_EXIT; + } + +const CPlaylistItem& CMdEManager::AlbumL( TInt aAlbumId ) const + { + for ( TInt i=0; iId() == aAlbumId ) + { + LOGGER_WRITE("Album found"); + return *iAlbums[i]; + } + } + LOGGER_WRITE_1("CMdEManager::AlbumL - aAlbumId %d does not exist - Leaving KErrNotFound", aAlbumId); + User::Leave( KErrNotFound ); + } + +void CMdEManager::CreateAlbumL( CPlaylistItem& aAlbum ) + { + TRACE_FUNC_ENTRY; + if ( !iMde || iState != EIdle ) + { + LOGGER_WRITE("Not ready!"); + User::Leave( KErrNotReady ); + } + CMdENamespaceDef& defaultNamespaceDef = iMde->GetDefaultNamespaceDefL(); + CMdEObjectDef& albumObjDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Album::KAlbumObject ); + + CMdEPropertyDef& titlePropDef = albumObjDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + + // Validate album name + TInt albumLength = aAlbum.Title().Length(); + if ( albumLength < titlePropDef.MinTextLengthL() || + albumLength > titlePropDef.MaxTextLengthL() ) + { + LOGGER_WRITE("Album length is not on valid range!"); + User::Leave( KErrBadName ); + } + + CMdEObject* albumObject = iMde->NewObjectLC( albumObjDef, KNullDesC ); + + CMdEPropertyDef& sizePropDef = albumObjDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty ); + albumObject->AddUint32PropertyL(sizePropDef, 0); + CMdEPropertyDef& creationDatePropDef = albumObjDef.GetPropertyDefL( MdeConstants::Object::KCreationDateProperty ); + CMdEPropertyDef& lastModifiedDatePropDef = albumObjDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty ); + + TTime timeDate; + timeDate.UniversalTime(); + + albumObject->AddTimePropertyL( creationDatePropDef, timeDate ); + albumObject->AddTimePropertyL( lastModifiedDatePropDef, timeDate ); + + CMdEPropertyDef& typePropDef = albumObjDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty ); + albumObject->AddTextPropertyL( typePropDef,MdeConstants::Album::KAlbumItemType ); + + albumObject->AddTextPropertyL( titlePropDef, aAlbum.Title() ); + TItemId newAlbumId = iMde->AddObjectL( *albumObject ); + + CleanupStack::PopAndDestroy( albumObject ); + + if ( newAlbumId == KNoId ) + { + LOGGER_WRITE("Adding album failed!"); + User::Leave( KErrGeneral ); + } + LOGGER_WRITE_1("New almbum created, id: %d", newAlbumId); + + CMdERelationDef& relationDef = defaultNamespaceDef.GetRelationDefL( MdeConstants::Relations::KContains ); + TMdEObject mediaObject; + RPointerArray relations; + CleanupResetAndDestroyPushL( relations); + for ( TInt i=0; iCheckObjectL( mediaObject, aAlbum.ItemAt(i) )); + LOGGER_WRITE_1("url: %S", &aAlbum.ItemAt(i)); + LOGGER_WRITE_1("CheckObjectL err: %d", err); + if ( !err ) + { + LOGGER_WRITE_1("object def: %S", &mediaObject.DefL().Name()); + if ( mediaObject.DefL().Name().Compare( MdeConstants::Image::KImageObject ) == 0 + || mediaObject.DefL().Name().Compare( MdeConstants::Video::KVideoObject ) == 0 ) + { + CMdERelation* relation = iMde->NewRelationL( relationDef, newAlbumId, mediaObject.Id() ); + relations.AppendL( relation ); + } + else + { + LOGGER_WRITE("type not supported"); + } + } + } + + if ( relations.Count() > 0 ) + { + TInt err = iMde->AddItemsL( relations ); + LOGGER_WRITE_1("AddItemsL first err: %d", err); + } + + CleanupStack::PopAndDestroy( &relations ); + + aAlbum.SetId( newAlbumId ); + + TRACE_FUNC_EXIT; + } + +void CMdEManager::ReplaceAlbumL( TInt aAlbumId, CPlaylistItem& aAlbum ) + { + TRACE_FUNC_ENTRY; + if ( !iMde || iState != EIdle ) + { + LOGGER_WRITE("Not ready!"); + User::Leave( KErrNotReady ); + } + // get old album from local cache and check do we need to change album title + const CPlaylistItem& oldAlbum = AlbumL( aAlbumId ); + CMdENamespaceDef& defaultNamespaceDef = iMde->GetDefaultNamespaceDefL(); + if ( oldAlbum.Title().Compare( aAlbum.Title() ) != 0 ) + { + // Title changed, open item from MdE and update it + + CMdEObjectDef& albumObjDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Album::KAlbumObject ); + + CMdEPropertyDef& titlePropDef = albumObjDef.GetPropertyDefL( + MdeConstants::Object::KTitleProperty ); + + // Validate album name + TInt albumLength = aAlbum.Title().Length(); + if ( albumLength < titlePropDef.MinTextLengthL() || + albumLength > titlePropDef.MaxTextLengthL() ) + { + LOGGER_WRITE("Album length is not on valid range!"); + User::Leave( KErrBadName ); + } + + CMdEObject* albumObject = iMde->OpenObjectL( aAlbumId, albumObjDef ); + + CMdEProperty* titleProp = NULL; + TInt index = albumObject->Property( titlePropDef, titleProp ); + if ( index == KErrNotFound ) + { + LOGGER_WRITE("Cannot find title property"); + User::Leave( KErrCorrupt ); + } + + LOGGER_WRITE("Change title property"); + titleProp->SetTextValueL( aAlbum.Title() ); + + CMdEPropertyDef& lastModDatePropDef = albumObjDef.GetPropertyDefL( + MdeConstants::Object::KLastModifiedDateProperty ); + CMdEProperty* lastModDateProp = NULL; + index = albumObject->Property( lastModDatePropDef, lastModDateProp ); + + if ( index == KErrNotFound ) + { + LOGGER_WRITE("Cannot find lastModDateProp property"); + User::Leave( KErrCorrupt ); + } + + TTime now; + now.UniversalTime(); + lastModDateProp->SetTimeValueL( now ); + + iMde->CommitObjectL( *albumObject ); + } + + // Update album and content relations + // Search added relations + CMdERelationDef& containsRelationDef = defaultNamespaceDef.GetRelationDefL( MdeConstants::Relations::KContains ); + TMdEObject mediaObject; + RPointerArray addedRelations; + CleanupResetAndDestroyPushL( addedRelations); + for ( TInt i=0; i< aAlbum.ItemCount(); i++) + { + TInt index(KErrNotFound); + TInt foundRes = oldAlbum.FindItem( aAlbum.ItemAt(i) ,index ); + if ( foundRes != 0 ) + { + // Item not found for old album -> Added relation + // Find object by uri + TRAPD( err, iMde->CheckObjectL( mediaObject, aAlbum.ItemAt(i) )); + LOGGER_WRITE_1("url: %S", &aAlbum.ItemAt(i)); + LOGGER_WRITE_1("CheckObjectL err: %d", err); + if ( !err ) + { + LOGGER_WRITE_1("object def: %S", &mediaObject.DefL().Name()); + if ( mediaObject.DefL().Name().Compare( MdeConstants::Image::KImageObject ) == 0 + || mediaObject.DefL().Name().Compare( MdeConstants::Video::KVideoObject ) == 0 ) + { + CMdERelation* relation = iMde->NewRelationL( containsRelationDef, aAlbumId, mediaObject.Id() ); + addedRelations.AppendL( relation ); + } + else + { + LOGGER_WRITE("type not supported"); + } + } + + } + } + if ( addedRelations.Count() > 0 ) + { + TInt err = iMde->AddItemsL( addedRelations ); + LOGGER_WRITE_1("AddItemsL first err: %d", err); + } + + CleanupStack::PopAndDestroy( &addedRelations ); + + // search removed relations + if ( iContainmentQuery ) + { + delete iContainmentQuery; + iContainmentQuery = NULL; + } + iContainmentQuery = iMde->NewRelationQueryL( defaultNamespaceDef, this ); + + CMdELogicCondition& rootCondition = iContainmentQuery->Conditions(); + CMdERelationCondition& relationCondition = + rootCondition.AddRelationConditionL(containsRelationDef, + ERelationConditionSideLeft); // "AND" + + CMdELogicCondition& leftCondition = relationCondition.LeftL(); + CMdELogicCondition& rightCondition = relationCondition.RightL(); + + leftCondition.AddObjectConditionL( aAlbumId ); + + CMdELogicCondition& objectDefLogicCond = + rightCondition.AddLogicConditionL( ELogicConditionOperatorOr); + + TBool removingRelationsNeeded( EFalse ); + for ( TInt i=0; i< oldAlbum.ItemCount(); i++) + { + TInt index(KErrNotFound); + TInt foundRes = aAlbum.FindItem( oldAlbum.ItemAt(i) ,index ); + if ( foundRes != 0 ) + { + removingRelationsNeeded = ETrue; + // Item not found from new album -> Removed relation (add uri to search condition) + LOGGER_WRITE_1("relation to be removed, uri: %S", &oldAlbum.ItemAt(i) ); + objectDefLogicCond.AddObjectConditionL( EObjectConditionCompareUri, oldAlbum.ItemAt(i) ); + } + } + + if ( removingRelationsNeeded ) + { + // find all removed relation ID:s. HandleRelationQueryCompleted will be called when ready. + iContainmentQuery->SetResultMode( EQueryResultModeId ); + iContainmentQuery->FindL(); + iState = EReplacingAlbum; + } + else + { + // All done + iState = EIdle; + iObserver.AlbumReplaced( KErrNone ); + } + + TRACE_FUNC_EXIT; + } + +void CMdEManager::DeleteAlbumL( TInt aAlbumId ) + { + TRACE_FUNC_ENTRY; + if ( !iMde || iState != EIdle ) + { + LOGGER_WRITE("Not ready!"); + User::Leave( KErrNotReady ); + } + + CMdENamespaceDef& defaultNamespaceDef = iMde->GetDefaultNamespaceDefL(); + CMdEObjectDef& albumObjDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Album::KAlbumObject ); + + CMdEObject* albumObject = iMde->GetObjectL( aAlbumId, albumObjDef ); + + CMdEPropertyDef& typePropDef = albumObjDef.GetPropertyDefL( + MdeConstants::Album::KTypeProperty ); + + CMdEProperty* typeProp = NULL; + TInt index = albumObject->Property( typePropDef, typeProp ); + if ( index != KErrNotFound ) + { + TUint16 typeVal = typeProp->Uint16ValueL(); + if ( typeVal == MdeConstants::Album::EAlbumSystemFavourite ) + { + LOGGER_WRITE("Item type is EAlbumSystemFavourite, deletion not allowed!"); + User::Leave( KErrPermissionDenied ); + } + } + + TItemId removedId(KNoId); + removedId = iMde->RemoveObjectL( aAlbumId ); + if ( removedId == KNoId ) + { + LOGGER_WRITE("Deletion failed!"); + User::Leave( KErrNotFound ); + } + + TRACE_FUNC_EXIT; + } + +void CMdEManager::StartProcessingAlbumsL() + { + TRACE_FUNC_ENTRY; + CMdENamespaceDef& defaultNamespaceDef = iMde->GetDefaultNamespaceDefL(); + CMdEObjectDef& albumObjDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Album::KAlbumObject ); + if ( iAlbumQuery ) + { + delete iAlbumQuery; + iAlbumQuery = NULL; + } + // query objects with object definition "Album" + iAlbumQuery = iMde->NewObjectQueryL( defaultNamespaceDef, albumObjDef, this ); + + // Add order + CMdEObjectDef& objdef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Object::KBaseObject ); + CMdEPropertyDef& propDef = objdef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + TMdEOrderRule rule( propDef, ETrue ); + iAlbumQuery->AppendOrderRuleL( rule ); + + iAlbumQuery->FindL(); + + iState = EEnumeratingAlbums; + + TRACE_FUNC_EXIT; + } + + +void CMdEManager::FindItemsOnAlbumL( TItemId aAlbumObjectId ) + { + TRACE_FUNC_ENTRY; + if ( !iMde ) + { + LOGGER_WRITE("Session was not ready!"); + User::Leave( KErrNotReady ); + } + CMdENamespaceDef& defaultNamespaceDef = iMde->GetDefaultNamespaceDefL(); + CMdEObjectDef& objDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Object::KBaseObject ); + + CMdEPropertyDef& titlePropDef = objDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + + if ( iObjectQuery ) + { + delete iObjectQuery; + iObjectQuery = NULL; + } + iObjectQuery = iMde->NewObjectQueryL( defaultNamespaceDef, objDef, this ); + + // get only "Title" property + iObjectQuery->AddPropertyFilterL( &titlePropDef ); + + CMdEObjectDef& objdef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Object::KBaseObject ); + CMdEPropertyDef& propDef = objdef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + + CMdELogicCondition& rootCond = iObjectQuery->Conditions(); + + CMdERelationDef& containsRelDef = defaultNamespaceDef.GetRelationDefL( + MdeConstants::Relations::KContains ); + + // query right side objects from relations + CMdERelationCondition& relCond = rootCond.AddRelationConditionL( + containsRelDef, ERelationConditionSideRight ); + + // left side object of relation must be defined album object + CMdELogicCondition& leftRelCond = relCond.LeftL(); + leftRelCond.AddObjectConditionL( aAlbumObjectId ); + + iObjectQuery->FindL(); + + TRACE_FUNC_EXIT; + } + +/** + * Called to notify the observer that opening the session has been + * completed and, if the opening succeeded, the session is ready for use. + * + * @param aSession session + * @param aError KErrNone, if opening the session succeeded; + * or one of the system-wide error codes, if opening the + * session failed + */ +void CMdEManager::HandleSessionOpened(CMdESession& /*aSession*/, TInt aError) + { + TRACE_FUNC_ENTRY; + if ( !aError ) + { + LOGGER_WRITE("Session opened"); + if ( iState == EWaitingToEnumerateAlbums ) + { + iState = EIdle; + TRAPD(err, StartProcessingAlbumsL()); + if ( err ) + { + iObserver.AlbumsReaded( err ); + } + } + else + { + iState = EIdle; + } + } + else + { + LOGGER_WRITE_1("Error happened on opening session, aError: %d", aError); + if ( iState == EWaitingToEnumerateAlbums ) + { + iObserver.AlbumsReaded( aError ); + } + iState = EUninitialized; + delete iMde; + iMde = NULL; + } + TRACE_FUNC_EXIT; + } + +/** + * Called to notify the observer about errors, which are not a direct + * consequence of the operations initiated by the client but caused by + * some external source (e.g., other clients). The error cannot be + * recovered and all on-going operations initiated by the client have been + * aborted. Any attempts to continue using the session will cause a panic. + * The client should close the session immediately and try to open a new + * session, if it needs to continue using the metadata engine. + * + * @param aSession session + * @param aError one of the system-wide error codes + */ +void CMdEManager::HandleSessionError(CMdESession& /*aSession*/, TInt aError) + { + // Something went wrong. Handle the error and delete the old session. + LOGGER_WRITE_1("CMdEManager::HandleSessionError - aError: %d", aError) + iState = EUninitialized; + delete iMde; + iMde = NULL; + } + +/** + * Called to notify the observer that new results have been received + * in the query. + * + * @param aQuery Query instance that received new results. + * @param aFirstNewItemIndex Index of the first new item that was added + * to the result item array. + * @param aNewItemCount Number of items added to the result item + * array. + */ +void CMdEManager::HandleQueryNewResults(CMdEQuery& /*aQuery*/, + TInt /*aFirstNewItemIndex*/, + TInt /*aNewItemCount*/) + { + } + +void CMdEManager::ProcessNextAlbumL() + { + TRACE_FUNC_ENTRY; + if ( iAlbumsInProgress.Count() == 0 ) + { + LOGGER_WRITE("All ready"); + // all ready + return; + } + + FindItemsOnAlbumL( iAlbumsInProgress[0]->Id() ); + + TRACE_FUNC_EXIT; + } + + +/** + * Called to notify the observer that the query has been completed, + * or that an error has occured. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ +void CMdEManager::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError) + { + TRACE_FUNC_ENTRY; + TInt err( aError ); + + if ( iState == EEnumeratingAlbums ) + { + CMdEObjectQuery& query = (CMdEObjectQuery&)aQuery; + if ( !err && &aQuery == iAlbumQuery ) + { + LOGGER_WRITE("Album query"); + TRAP( err, HandleAlbumQueryCompletedL( query )); + } + else if ( !err && &aQuery == iObjectQuery ) + { + LOGGER_WRITE("Object query"); + TRAP( err, HandleObjectQueryCompletedL( query )); + } + else + { + LOGGER_WRITE("unknown query or error happened"); + } + + if ( err ) + { + LOGGER_WRITE_1("Error happened: %d", err); + iState = EIdle; + iAlbumsInProgress.ResetAndDestroy(); + iAlbums.ResetAndDestroy(); + iObserver.AlbumsReaded( err ); + } + } + else if ( iState == EReplacingAlbum ) + { + if ( !err && &aQuery == iContainmentQuery ) + { + LOGGER_WRITE("relation query"); + CMdERelationQuery& query = (CMdERelationQuery&)aQuery; + TRAP( err, HandleRelationQueryCompletedL( query )); + } + + iState = EIdle; + iObserver.AlbumReplaced( err ); + + } + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CMdEManager::HandleAlbumQueryCompletedL +// Callback function for find all albums. Save albums to iAlbumsInProgress array +// and start collecting objects on each album. +// ----------------------------------------------------------------------------- +void CMdEManager::HandleAlbumQueryCompletedL( CMdEObjectQuery& aQuery ) + { + TRACE_FUNC_ENTRY; + // clear old items + iAlbumsInProgress.ResetAndDestroy(); + iAlbums.ResetAndDestroy(); + + for ( TInt i = 0; i < aQuery.Count(); i++ ) + { + CPlaylistItem* albumItem = CPlaylistItem::NewLC(); + CMdEObject& object = aQuery.Result(i); + LOGGER_WRITE_1("Id: %d", object.Id()); + albumItem->SetId( object.Id() ); + + CMdEPropertyDef& titlePropDef = object.Def().GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + + CMdEProperty* titleProp = NULL; + TInt index = object.Property( titlePropDef, titleProp ); + if ( index != KErrNotFound ) + { + const TDesC& title = titleProp->TextValueL(); + LOGGER_WRITE_1("Title: %S", &title); + albumItem->SetTitleL( title ); + } + else + { + // not found, might be default album + albumItem->SetTitleL( object.Uri() ); + } + + LOGGER_WRITE(""); + iAlbumsInProgress.AppendL( albumItem ); + CleanupStack::Pop( albumItem ); + } + + if ( aQuery.Count() > 0 ) + { + // Start processing albums + ProcessNextAlbumL(); + } + else + { + // no albums + iObserver.AlbumsReaded( KErrNone ); + } + TRACE_FUNC_EXIT; + } + +void CMdEManager::HandleObjectQueryCompletedL( CMdEObjectQuery& aQuery ) + { + if ( !iAlbumsInProgress.Count() ) + { + LOGGER_WRITE("Error! No items on iAlbumsInProgress"); + User::Leave( KErrGeneral ); + } + for ( TInt i = 0; i < aQuery.Count(); i++ ) + { + CMdEObject& object = aQuery.Result(i); + iAlbumsInProgress[0]->AddItemL( object.Uri() ); + } + iAlbums.AppendL( iAlbumsInProgress[0] ); + iAlbumsInProgress.Remove( 0 ); + if ( iAlbumsInProgress.Count() > 0) + { + ProcessNextAlbumL(); + } + else + { + // all albums processed + iState = EIdle; + iObserver.AlbumsReaded( KErrNone ); + } + } + +void CMdEManager::HandleRelationQueryCompletedL( CMdERelationQuery& aQuery ) + { + TRACE_FUNC_ENTRY; + const RArray& res = aQuery.ResultIds(); + LOGGER_WRITE_1("founded relations count: %d", res.Count()) + for (TInt i=0; i removed; + CMdENamespaceDef& defaultNameSpace = iMde->GetDefaultNamespaceDefL(); + iMde->RemoveRelationsL( aQuery.ResultIds(),removed, &defaultNameSpace); + LOGGER_WRITE_1("Removed relations count: %d", removed.Count()) + for (TInt i=0; iCancel()"); + iAlbumQuery->Cancel(); + } + if ( iObjectQuery ) + { + LOGGER_WRITE("iObjectQuery->Cancel()"); + iObjectQuery->Cancel(); + } + if ( iContainmentQuery ) + { + LOGGER_WRITE("iContainmentQuery->Cancel()"); + iContainmentQuery->Cancel(); + } + TRACE_FUNC_EXIT; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/mediadsprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/mediadsprovider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,305 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include + +#include +#include +#include "mediadsprovider.h" +#include "mediadsproviderdefs.h" +#include "mediadsstore.h" +#include +#include "logger.h" + + + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::CMediaDataProvider +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CMediaDataProvider::CMediaDataProvider() : + iOwnStoreFormat(NULL), + iFilters(1) + { + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CMediaDataProvider::ConstructL() + { + TRACE_FUNC_ENTRY; + + iStringPool.OpenL(); + User::LeaveIfError( iFs.Connect() ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CMediaDataProvider* CMediaDataProvider::NewL() + { + TRACE_FUNC_ENTRY; + + CMediaDataProvider* self = new (ELeave) CMediaDataProvider; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + TRACE_FUNC_EXIT; + return self; + } + + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::~CMediaDataProvider +// Destructor. +// ----------------------------------------------------------------------------- +CMediaDataProvider::~CMediaDataProvider() + { + TRACE_FUNC_ENTRY; + + delete iOwnStoreFormat; + iStringPool.Close(); + + iFilters.ResetAndDestroy(); + iFilters.Close(); + + iFs.Close(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoOnFrameworkEvent +// Not used +// ----------------------------------------------------------------------------- +void CMediaDataProvider::DoOnFrameworkEvent(TSmlFrameworkEvent, TInt /*aParam1*/, TInt /*aParam2*/) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoSupportsOperation +// Checks whether data provider supports specific operation +// ----------------------------------------------------------------------------- +TBool CMediaDataProvider::DoSupportsOperation(TUid /*aOpId*/) const + { + TRACE_FUNC; + + // Optional operations are not supported + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +const CSmlDataStoreFormat& CMediaDataProvider::DoStoreFormatL() + { + TRACE_FUNC_ENTRY; + + if ( !iOwnStoreFormat ) + { + iOwnStoreFormat = DoOwnStoreFormatL(); + } + + TRACE_FUNC_EXIT; + + return *iOwnStoreFormat; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoListStoresLC +// Returns array fo data stores, not implemented because only single data store +// is supported +// ----------------------------------------------------------------------------- +CDesCArray* CMediaDataProvider::DoListStoresLC() + { + TRACE_FUNC_ENTRY; + + CDesCArrayFlat* stores = new (ELeave) CDesCArrayFlat(1); + CleanupStack::PushL( stores ); + stores->AppendL( KMediaDsDbName ); + stores->AppendL( KMediaDsRefreshDbName ); + + TRACE_FUNC_EXIT; + + return stores; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoDefaultStoreL +// Returns the name of the default data store +// ----------------------------------------------------------------------------- +const TDesC& CMediaDataProvider::DoDefaultStoreL() + { + TRACE_FUNC; + return KMediaDsDbName; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoNewStoreInstanceLC +// Creates a new data store object, which can be used for synchronization +// ----------------------------------------------------------------------------- +CSmlDataStore* CMediaDataProvider::DoNewStoreInstanceLC() + { + TRACE_FUNC_ENTRY; + CMediaDsDataStore* newStore = CMediaDsDataStore::NewLC( iFs ); + TRACE_FUNC_EXIT; + return newStore; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoCheckSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMediaDataProvider::DoCheckSupportedServerFiltersL( + const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoCheckServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMediaDataProvider::DoCheckServerFiltersL( + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +const RPointerArray& CMediaDataProvider::DoSupportedServerFiltersL() + { + TRACE_FUNC; + return iFilters; // empty array + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoSupportsUserSelectableMatchType +// Not supported +// ----------------------------------------------------------------------------- +TBool CMediaDataProvider::DoSupportsUserSelectableMatchType() const + { + TRACE_FUNC; + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoGenerateRecordFilterQueryLC +// Filters are not supported +// ----------------------------------------------------------------------------- +HBufC* CMediaDataProvider::DoGenerateRecordFilterQueryLC( + const RPointerArray& /*aFilters*/, + TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, + TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoGenerateFieldFilterQueryL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMediaDataProvider::DoGenerateFieldFilterQueryL( + const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, + RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDataProvider::DoOwnStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CMediaDataProvider::DoOwnStoreFormatL() + { + TRACE_FUNC_ENTRY; + + TParse* parse = new ( ELeave ) TParse(); + CleanupStack::PushL(parse); + TFileName fileName; + RResourceFile resourceFile; + + parse->Set( KMediaDsStoreFormatRsc, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + LOGGER_WRITE_1("filename: %S", &fileName); + BaflUtils::NearestLanguageFile( iFs, fileName ); + + resourceFile.OpenL( iFs, fileName ); + CleanupClosePushL( resourceFile ); + + HBufC8* buffer = resourceFile.AllocReadLC( MEDIADS_DATA_STORE ); + + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + + CleanupStack::Pop( dsFormat ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &resourceFile ); + CleanupStack::PopAndDestroy( parse ); + + TRACE_FUNC_EXIT; + + return dsFormat; + } + + +// ----------------------------------------------------------------------------- +// ImplementationTable +// Required by ECom plugin interface, tells the entry point of the library +// ----------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KMediaDataProviderImplUid, CMediaDataProvider::NewL) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns the implementation table, required by the ECom plugin interface +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/mediadsprovider.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/mediadsprovider.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +/* +* 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: Resource definitions for Media DS ECOM plug-in +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x2001A9A1; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x101F4D3A; // Constant for all DS plug ins + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x2001A9A1; // DS interface implementation UID + version_no = 1; + display_name = "Media"; // shown in UI + } + }; + } + }; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/mediadsstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/mediadsstore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1210 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include "mediadsstore.h" +#include +#include + +#include "mediadsproviderdefs.h" +#include "mediamanager.h" +#include "cmdemanager.h" +#include "playlistitem.h" +#include "omadsfolderobject.h" +#include "snapshotitem.h" +#include "logger.h" + +_LIT8( KFolderMimeType, "application/vnd.omads-folder+xml" ); +_LIT8( KFolderMimeVersion, "1.2" ); + +_LIT8( KPlaylistMimeType, "audio/x-mpegurl"); +_LIT8( KPlaylistMimeVersion, "1.0"); + +_LIT8( KSongMimeType, "application/x-song"); +_LIT8( KSongMimeVersion, "1.0"); + + +const TInt KDataBufferSize = 1024; + +const TInt KAlbumsOffSet = 0x0000f000; + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::CMediaDsDataStore +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CMediaDsDataStore::CMediaDsDataStore( RFs& aFs): + iKey(TKeyArrayFix(_FOFF(TSnapshotItem, ItemId()), ECmpTInt)), + iFs( aFs ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::ConstructL +// Symbian 2nd phase constructor, can leave. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::ConstructL() + { + TRACE_FUNC_ENTRY; + + // Item UID sets, used to transfer change info + iNewItems = new (ELeave) CNSmlDataItemUidSet; + iDeletedItems = new (ELeave) CNSmlDataItemUidSet; + iUpdatedItems = new (ELeave) CNSmlDataItemUidSet; + iMovedItems = new (ELeave) CNSmlDataItemUidSet; + iSoftDeletedItems = new (ELeave) CNSmlDataItemUidSet; + + iHasher = CMD5::NewL(); + + iMediaManager = CMediaManager::NewL( iFs, this, iKey, *iHasher ); + + iMdEManager = CMdEManager::NewL( *this ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CMediaDsDataStore* CMediaDsDataStore::NewLC( RFs& aFs) + { + TRACE_FUNC_ENTRY; + CMediaDsDataStore* self = new (ELeave) CMediaDsDataStore( aFs ); + CleanupStack::PushL( self ); + self->ConstructL(); + TRACE_FUNC_EXIT; + return self; + } + + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::~CMediaDsDataStore +// Destructor +// ----------------------------------------------------------------------------- +CMediaDsDataStore::~CMediaDsDataStore() + { + TRACE_FUNC_ENTRY; + + delete iDataBuffer; + + delete iChangeFinder; + + delete iNewItems; + delete iDeletedItems; + delete iUpdatedItems; + delete iMovedItems; + delete iSoftDeletedItems; + + delete iMediaManager; + LOGGER_WRITE("iMediaManager deleted"); + + delete iMdEManager; + LOGGER_WRITE("iMdEManager deleted"); + + delete iHasher; + LOGGER_WRITE("iHasher deleted"); + // normally iSnapshot is NULL, but if error has occured we need to delete it. + delete iSnapshot; + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoOpenL +// Opens database. This operation is performed SYNCHRONOUSLY +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoOpenL( const TDesC& aStoreName, + MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( iCurrentState != EClosed ) + { + User::RequestComplete( iCallerStatus, KErrInUse ); + LOGGER_WRITE("CMmsDataStore::DoOpenL failed with KErrInUse."); + return; + } + + // Create ChangeFinder object + if ( iChangeFinder ) + { + delete iChangeFinder; + iChangeFinder = NULL; + } + iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory, KMediaDataProviderImplUid ); + + if ( aStoreName.CompareF( KMediaDsRefreshDbName ) == 0 ) + { + LOGGER_WRITE("Refresh library and open database"); + // just kick off scanner, don't wait ready status + // Async. func. HandleCollectionMessage is called when ready + iMediaManager->ScanL(); + + } + else if ( aStoreName.CompareF( KMediaDsDbName ) == 0 ) + { + LOGGER_WRITE("Open database"); + + if ( !iHasHistory ) + { + LOGGER_WRITE("No history, scan library"); + // just kick off scanner, don't wait ready status + // Async. func. HandleCollectionMessage is called when ready + iMediaManager->ScanL(); + } + + } + else + { + LOGGER_WRITE("Unknown database"); + User::Leave( KErrNotSupported ); + } + + // Set current snapshot, this will be compared against the old one + RegisterSnapshotL(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCancelRequest +// Not supported, does nothing. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCancelRequest() + { + TRACE_FUNC_ENTRY; + if ( iCurrentState == EOpening ) + { + LOGGER_WRITE("Cancel Open command"); + iMediaManager->Cancel(); + iMdEManager->Cancel(); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoStoreName +// Returns the name of the DataStore +// ----------------------------------------------------------------------------- +const TDesC& CMediaDsDataStore::DoStoreName() const + { + TRACE_FUNC; + return KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoBeginTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoBeginTransactionL() + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCommitTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCommitTransactionL( TRequestStatus& /*aStatus*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoRevertTransaction +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoRevertTransaction( TRequestStatus& aStatus ) + { + TRACE_FUNC; + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoBeginBatchL +// Batching is not supported. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoBeginBatchL() + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCommitBatchL +// Batching is not supported +// ----------------------------------------------------------------------------- +// +void CMediaDsDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& /*aStatus*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCancelBatch +// Batching is not supported +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCancelBatch() + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoSetRemoteStoreFormatL +// Not supported +// ----------------------------------------------------------------------------- +// +void CMediaDsDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoSetRemoteMaxObjectSize +// Not supported +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoMaxObjectSize +// Reads the maximum MMS Message size from the central repository +// ----------------------------------------------------------------------------- +TInt CMediaDsDataStore::DoMaxObjectSize() const + { + TRACE_FUNC; + return 0; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoOpenItemL +// Opens item in the DataStore, reads it (either completely or partially) +// to the temporary buffer where it can be later read to the remote database. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoOpenItemL( TSmlDbItemUid aUid, TBool& /*aFieldChange*/, + TInt& aSize, TSmlDbItemUid& aParent, TDes8& aMimeType, + TDes8& aMimeVer, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + LOGGER_WRITE_1( "Opening item %d.", aUid ); + + // Store these for later use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + iReadPosition=0; + + // Check that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "CMediaDsDataStore::DoOpenItemL, invalid state %d.", iCurrentState ); + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + if ( !iDataBuffer ) + { + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + } + iDataBuffer->Reset(); + + + if ( aUid <= KLastFolderId ) + { + COMADSFolderObject* folderObject = COMADSFolderObject::NewLC(); + + switch ( aUid ) + { + case KAllSongsFolderId: + folderObject->SetName( KAllSongs ); + break; + case KPlaylistsFolderId: + folderObject->SetName( KPlaylists ); + break; + case KAlbumsFolderId: + folderObject->SetName( KAlbums ); + break; + default: + User::Leave( KErrNotFound ); + break; + } + folderObject->ExportFolderXmlL( *iDataBuffer ); + CleanupStack::PopAndDestroy( folderObject ); + aMimeType.Copy( KFolderMimeType ); + aMimeVer.Copy( KFolderMimeVersion ); + aParent = KErrNotFound; + } + else + { + CSongItem* song = CSongItem::NewLC(); + LOGGER_WRITE("Try to read song"); + TRAPD( err, iMediaManager->GetSongL( aUid, *song )); + if ( !err ) + { + RBufWriteStream stream( *iDataBuffer ); + CleanupClosePushL( stream ); + song->ExportL( stream ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( song ); + + aMimeType.Copy( KSongMimeType ); + aMimeVer.Copy( KSongMimeVersion ); + aParent = KAllSongsFolderId; + } + else // could not read song, maybe it is playlist + { + CleanupStack::PopAndDestroy( song ); + CPlaylistItem* playList = CPlaylistItem::NewLC(); + LOGGER_WRITE("Try to read playlist"); + TRAP(err, iMediaManager->GetPlayListL( aUid, *playList )); + if ( !err ) + { + RBufWriteStream stream( *iDataBuffer ); + CleanupClosePushL( stream ); + + playList->ExportL( stream ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( playList ); + + aMimeType.Copy( KPlaylistMimeType ); + aMimeVer.Copy( KPlaylistMimeVersion ); + aParent = KPlaylistsFolderId; + } + else + { + CleanupStack::PopAndDestroy( playList ); + LOGGER_WRITE("Try to read album"); + // Could not read song, maybe it's a Album + const CPlaylistItem& album = iMdEManager->AlbumL( MapSyncIdToAlbumId(aUid) ); + RBufWriteStream stream( *iDataBuffer ); + CleanupClosePushL( stream ); + + album.ExportL( stream ); + CleanupStack::PopAndDestroy( &stream ); + + aMimeType.Copy( KPlaylistMimeType ); + aMimeVer.Copy( KPlaylistMimeVersion ); + aParent = KAlbumsFolderId; + } + } + + } + + aSize = iDataBuffer->Size(); + + LOGGER_WRITE_1("aSize: %d", aSize); + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCreateItemL +// Create new item to the message store. +// Return the id number of the newly created item +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& /*aMimeVer*/, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "Parent folder: %d.", aParent ); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1( "Invalid state %d.", iCurrentState ); + } + + iWrittenDataLength = 0; + iCreatedUid = &aUid; + LOGGER_WRITE8_1( "aMimeType: %S", &aMimeType ); + + if ( aMimeType.Compare( KPlaylistMimeType() ) == 0 ) + { + LOGGER_WRITE("Add Playlist"); + iCurrentState = ECreatePlaylist; + } + else if ( aMimeType.Compare( KSongMimeType() ) == 0 ) + { + LOGGER_WRITE("Add Song not supported"); + User::Leave( KErrNotSupported ); + } + else + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE("Bad MIME type"); + return; + } + + if ( iDataBuffer ) + { + iDataBuffer->ResizeL( aSize ); + } + else + { + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iDataBuffer->ResizeL( aSize ); + } + LOGGER_WRITE_1("iDataBuffer->Size: %d", iDataBuffer->Size()); + + LOGGER_WRITE_1("aSize: %d", aSize); + iParentId = aParent; + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoReplaceItemL +// Begin the replace operation, ensure that the item really exists +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool /*aFieldChange*/, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("Replacing item %d.", aUid); + LOGGER_WRITE_1("Parent folder: %d.", aParent); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("Invalid state %d.", iCurrentState); + } + + iCurrentState = EReplace; + + iParentId = aParent; + iCurrentId = aUid; + + if ( iDataBuffer ) + { + iDataBuffer->ResizeL( aSize ); + } + else + { + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iDataBuffer->ResizeL( aSize ); + } + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoReadItemL +// Read specified amount of data from the temporary buffer +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoReadItemL( TDes8& aBuffer ) + { + TRACE_FUNC_ENTRY; + // Thiw is how much data there is left in the buffer + TInt left = iDataBuffer->Size() - iReadPosition; + + if ( left > 0 ) + { + // This is how much there's space in the destination buffer + TInt destSize = aBuffer.MaxSize(); + + // This is how much we can read + TInt toRead = destSize < left ? destSize : left; + + // Read the data from the buffer, then update the position + iDataBuffer->Read( iReadPosition, aBuffer, toRead ); + iReadPosition += toRead; + } + else + { + LOGGER_WRITE( "No data to read" ); + User::Leave( KErrEof ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoWriteItemL +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoWriteItemL( const TDesC8& aData ) + { + TRACE_FUNC_ENTRY; + + iDataBuffer->Write( iWrittenDataLength, aData ); + iWrittenDataLength += aData.Size(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCommitItemL +// Commits item from temporary buffer to the message store +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCommitItemL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + // Store some variables + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + iDataBuffer->Compress(); + + // Read the playlist item + CPlaylistItem* newItem = CPlaylistItem::NewLC(); + + const TUint8* ptr8 = iDataBuffer->Ptr(0).Ptr(); + const TUint16* ptr16 = reinterpret_cast( ptr8 ); + TPtrC dataPtr; + dataPtr.Set( ptr16, iDataBuffer->Size()/2 ); + newItem->ImportL( dataPtr ); + + iDataBuffer->Reset(); + +#ifdef _DEBUG + LOGGER_WRITE_1("Name: %S", &newItem->Title()); + LOGGER_WRITE_1("Items count: %d", newItem->ItemCount()); + for ( TInt i=0; iItemCount(); i++ ) + { + TPtrC16 ptr = newItem->ItemAt(i); + LOGGER_WRITE_1("item: %S", &ptr); + } +#endif + + + TInt error(KErrNone); + if ( iCurrentState == ECreatePlaylist ) + { + if ( iParentId == KPlaylistsFolderId ) + { + iMediaManager->CreateNewPlaylistL( *iCreatedUid, *newItem ); + } + else if ( iParentId == KAlbumsFolderId ) + { + iMdEManager->CreateAlbumL( *newItem ); + *iCreatedUid = MapAlbumIdToSyncId( newItem->Id() ); + } + else + { + LOGGER_WRITE("Not supported"); + User::Leave( KErrNotSupported); + } + + // Inform ChangeFinder of the added item + TSnapshotItem snapshotItem( *iCreatedUid ); + snapshotItem.SetParentId( iParentId ); + snapshotItem.SetItemHash( *newItem, *iHasher ); + iChangeFinder->ItemAddedL( snapshotItem ); + + } + else if ( iCurrentState == EReplace ) + { + if ( iParentId == KPlaylistsFolderId ) + { + iMediaManager->ReplacePlaylistL( iCurrentId, *newItem ); + } + else if ( iParentId == KAlbumsFolderId ) + { + iItemInReplacement.SetItemId( iCurrentId ); + iItemInReplacement.SetParentId( iParentId ); + iItemInReplacement.SetItemHash( *newItem, *iHasher ); + // Async function, calls AlbumReplaced when completed + iMdEManager->ReplaceAlbumL( MapSyncIdToAlbumId(iCurrentId), *newItem ); + + CleanupStack::PopAndDestroy( newItem ); + return; + } + else + { + LOGGER_WRITE("Not supported"); + User::Leave( KErrNotSupported); + } + + // Inform ChangeFinder of the replaced item + TSnapshotItem snapshotItem( iCurrentId ); + snapshotItem.SetParentId( iParentId ); + snapshotItem.SetItemHash( *newItem, *iHasher ); + iChangeFinder->ItemUpdatedL( snapshotItem ); + } + else + { + LOGGER_WRITE_1("Wrong state: %d", iCurrentState); + User::Leave( KErrNotSupported ); + } + CleanupStack::PopAndDestroy( newItem ); + + + + LOGGER_WRITE_1("error: %d", error); + // We'll be waiting for next event, signal we're done + iCurrentState = EOpenAndWaiting; + User::RequestComplete( iCallerStatus, error ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCloseItem +// Closes open item in the data store +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCloseItem() + { + TRACE_FUNC_ENTRY; + if ( iDataBuffer ) + { + iDataBuffer->Reset(); + } + iCurrentState = EOpenAndWaiting; + iReadPosition = 0; + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoMoveItemL +// Moves item from one folder to another in the message store +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoMoveItemL( TSmlDbItemUid /*aUid*/, + TSmlDbItemUid /*aNewParent*/, TRequestStatus& /*aStatus*/ ) + { + TRACE_FUNC; + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoDeleteItemL +// Removes item from the message store +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("Deleting item %d.", aUid); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + TInt error(KErrNone); + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeleteItemL, invalid state %d.", iCurrentState); + } + + TRAP( error, iMediaManager->DeletePlaylistL( aUid ) ); + if ( error ) + { + error = KErrNone; + iMdEManager->DeleteAlbumL( MapSyncIdToAlbumId( aUid ) ); + } + + if ( !error ) + { + // Inform ChangeFinder of the deleted item + TSnapshotItem snapshotItem( aUid ); + iChangeFinder->ItemDeletedL( snapshotItem ); + } + + LOGGER_WRITE_1("complete error: %d", error); + // Signal we're done + User::RequestComplete( iCallerStatus, error ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoSoftDeleteItemL +// Soft delete isn't supported. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoDeleteAllItemsL +// Deletes all items in the standard folders of message store +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoHasSyncHistory +// This method returns ETrue if Data Store has history information. +// Slow-sync will be used if Data Store does not have history information. +// ----------------------------------------------------------------------------- +TBool CMediaDsDataStore::DoHasSyncHistory() const + { + TRACE_FUNC_RET( (TInt)iHasHistory ); + + // iHasHistory is initialized in DoOpenL method + return iHasHistory; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoAddedItems +// This method returns UIDs of added items. Those items are added after previous +// synchronization with current synchronization relationship. +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMediaDsDataStore::DoAddedItems() const + { + TRACE_FUNC; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear new-items array + iNewItems->Reset(); + + // Set current snapshot, this will be compared against the old one + // Search for new items + TRAP( error, iChangeFinder->FindNewItemsL(*iNewItems) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("New item count: %d.", iNewItems->ItemCount()); + + return *iNewItems; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoDeletedItems +// +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMediaDsDataStore::DoDeletedItems() const + { + TRACE_FUNC; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear deleted-items array + iDeletedItems->Reset(); + + // Search for deleted items + TRAP( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("Deleted item count: %d.", iDeletedItems->ItemCount()); + return *iDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoSoftDeletedItems +// Not directly supported, equals to "hard" delete +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMediaDsDataStore::DoSoftDeletedItems() const + { + TRACE_FUNC; + + iSoftDeletedItems->Reset(); + return *iSoftDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoModifiedItems +// Finds all modified items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMediaDsDataStore::DoModifiedItems() const + { + TRACE_FUNC; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear updated-items array + iUpdatedItems->Reset(); + + // Search for updated items + TRAP( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("Modified item count: %d.", iUpdatedItems->ItemCount()); + return *iUpdatedItems; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoMovedItems +// Finds all moved items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMediaDsDataStore::DoMovedItems() const + { + TRACE_FUNC; + // return empty array + return *iMovedItems; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoResetChangeInfoL +// Resets change history in the data store. All content is considered +// new in the data store point of view. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState); + } + + // Reset change info in ChangeFinder + iChangeFinder->ResetL(); + iHasHistory = EFalse; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCommitChangeInfoL +// Commits change info. These items are no longer reported, when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems ) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(aItems); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::DoCommitChangeInfoL +// Commits change info. There is no more nothing to report when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::DoCommitChangeInfoL(TRequestStatus& aStatus) + { + TRACE_FUNC_ENTRY; + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + TRACE_FUNC_EXIT; + } + + +void CMediaDsDataStore::HandleCollectionMessage(CMPXMessage* /*aMsg*/, TInt /*aErr*/) + { + TRACE_FUNC; + } + +void CMediaDsDataStore::HandleOpenL(const CMPXMedia& /*aEntries*/, + TInt /*aIndex*/,TBool /*aComplete*/,TInt /*aError*/) + { + TRACE_FUNC; + } + +void CMediaDsDataStore::HandleOpenL(const CMPXCollectionPlaylist& /*aPlaylist*/, + TInt /*aError*/) + { + TRACE_FUNC; + } + +void CMediaDsDataStore::HandleCommandComplete(CMPXCommand* /*aCommandResult*/, + TInt /*aError*/) + { + TRACE_FUNC; + } + +void CMediaDsDataStore::HandleCollectionMediaL(const CMPXMedia& /*aMedia*/, + TInt /*aError*/) + { + TRACE_FUNC; + } + +void CMediaDsDataStore::AlbumsReaded( TInt aError ) + { + TRACE_FUNC_ENTRY; + iMdEManagerReady = ETrue; + LOGGER_WRITE_1("aError: %d", aError ); + + if ( aError ) + { + iError = aError; + } + + FinalizeOpenStore(); + + TRACE_FUNC_EXIT; + } + +void CMediaDsDataStore::AlbumReplaced( TInt aError ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aError: %d", aError); + if ( !aError ) + { + // Inform ChangeFinder of the replaced item + iChangeFinder->ItemUpdatedL( iItemInReplacement ); + } + + iCurrentState = EOpenAndWaiting; + User::RequestComplete( iCallerStatus, aError ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::RegisterSnapshotL +// Sets Changefinder to compare against current message store content +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::RegisterSnapshotL() + { + TRACE_FUNC_ENTRY; + if ( iSnapshot ) + { + delete iSnapshot; + iSnapshot = NULL; + } + iSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + RegisterFoldersL( *iSnapshot ); + iMediaManager->SetSnapshot( iSnapshot ); + + iCurrentState = EOpening; + TInt err = iMediaManager->RegisterAllPlayLists(); + if ( err ) + { + LOGGER_WRITE_1("Could not start, err: %d", err); + iCurrentState = EClosed; + User::RequestComplete( iCallerStatus, err ); + } + else + { + iMdEManager->GetAlbumsL(); + } + + + TRACE_FUNC_EXIT; + } + +void CMediaDsDataStore::RegisterAllPlayListsCompleted( TInt aError ) + { + TRACE_FUNC_ENTRY; + if ( !aError ) + { + TInt err = iMediaManager->RegisterAllSongs(); + if ( err ) + { + LOGGER_WRITE_1("Could not start, err: %d", err); + iMediaManagerReady = ETrue; + iError = err; + } + } + else + { + // Error happened or cancelled. + iMediaManagerReady = ETrue; + iError = aError; + } + + FinalizeOpenStore(); + TRACE_FUNC_EXIT; + } + +void CMediaDsDataStore::RegisterAllSongsCompleted( TInt aError ) + { + TRACE_FUNC_ENTRY; + iMediaManagerReady = ETrue; + if ( aError ) + { + // Error happened or cancelled, save error code + iError = aError; + } + + FinalizeOpenStore(); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CMediaDsDataStore::RegisterFoldersL +// +// ----------------------------------------------------------------------------- +void CMediaDsDataStore::RegisterFoldersL( CSnapshotArray& aItemArray ) + { + TRACE_FUNC_ENTRY; + + TKeyArrayFix key( iKey ); + TSnapshotItem folder; + folder.SetItemId( KAllSongsFolderId ); + folder.SetItemHash( KAllSongs, *iHasher ); + aItemArray.InsertIsqL( folder, key ); + + folder.SetItemId( KPlaylistsFolderId ); + folder.SetItemHash( KPlaylists, *iHasher ); + aItemArray.InsertIsqL( folder, key ); + + folder.SetItemId( KAlbumsFolderId ); + folder.SetItemHash( KAlbums, *iHasher ); + aItemArray.InsertIsqL( folder, key ); + TRACE_FUNC_EXIT; + } + +void CMediaDsDataStore::FinalizeOpenStore() + { + TRACE_FUNC_ENTRY; + // Signal client if all ready + if ( iMediaManagerReady && iMdEManagerReady ) + { + if ( !iError ) + { + RPointerArray albums = iMdEManager->AlbumsArray(); + TKeyArrayFix key( iKey ); + LOGGER_WRITE("Album snapshots:") + for (TInt i=0; iId() ) ); + playlistItem.SetItemHash( *albums[i], *iHasher ); + playlistItem.SetParentId( KAlbumsFolderId ); + TRAP(iError, iSnapshot->InsertIsqL( playlistItem, key )); + if ( iError ) + { + LOGGER_WRITE_1("iSnapshot->InsertIsqL err: %d", iError); + iError = KErrGeneral; + } + } + + if ( !iError ) + { + // Set new snapshot to compare against + iChangeFinder->SetNewSnapshot(iSnapshot); + + // Changefinder takes ownership of the snapshot + iSnapshot = NULL; + iCurrentState = EOpenAndWaiting; + } + } + + if ( iError ) + { + iCurrentState = EClosed; + } + + LOGGER_WRITE_1("Signal client with %d", iError); + User::RequestComplete( iCallerStatus, iError ); + } + TRACE_FUNC_EXIT; + } + +inline TInt CMediaDsDataStore::MapSyncIdToAlbumId( TSmlDbItemUid aSyncId ) + { + return aSyncId - KAlbumsOffSet; + } + +inline TSmlDbItemUid CMediaDsDataStore::MapAlbumIdToSyncId( TInt aAlbumId ) + { + return KAlbumsOffSet + aAlbumId; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/mediadsstore.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/mediadsstore.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,105 @@ +/* +* 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: Resource data for Media DS adapter +* +*/ + + +#include +#include + +RESOURCE SML_DATA_STORE_FORMAT MEDIADS_DATA_STORE + { + version = 1; + display_name = "Media"; + sync_types = KSmlSyncType_TwoWay + KSmlSyncType_OneWayFromSvr + KSmlSyncType_OneWayFromClnt + + KSmlSyncType_SlowSync + KSmlSyncType_RefreshFromSvr + KSmlSyncType_RefreshFromClnt; + + mime_format= + { + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/vnd.omads-folder+xml"; + mime_ver = "1.2"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + }, + SML_MIME_FORMAT + { + version = 1; + mime_type = "audio/x-mpegurl"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + }, + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/x-song"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + } + }; + mime_format_tx_pref = 0; // Preferred index for tx + mime_format_rx_pref = 0; // Preferred index for rx + folder_properties = {}; // No folder properties + filter_capabilities = {}; // No filter capabilities + max_size = 0; // No limit + max_items = 0; // No limit + flags = 0x00000010; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/mediamanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/mediamanager.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1254 @@ +/* +* Copyright (c) 2009-2010 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: CMediaManager class implementation +* +*/ + + + +#include "mediamanager.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include // for EMPXPlaylistTypeM3U +#include +#include +#include +#include +#include +#include +#include + +#include "mediadsproviderdefs.h" +#include "playlistitem.h" +#include "logger.h" + + +const TUid KMpxLocalCollectionUid = { 0x101FFC3A }; + +_LIT( KPlaylistPath, "playlists\\" ); +_LIT( KMPXVirtualPlaylistExt, ".vir" ); + +// Maximum amount of song items to be enumerated on one RunL. +const TInt iMaxSongItemsToEnumerate(100); +// Maximum amount of playlist items to be enumerated on one RunL. +const TInt iMaxPlaylistItemsToEnumerate(15); + + +CMediaManager::CMediaManager( RFs& aFs, MMediaManagerObserver* aObserver, + TKeyArrayFix aKey, CMD5& aHasher ) +: CActive( EPriorityStandard ), +iObserver( aObserver ), +iKey( aKey ), +iHasher( aHasher ), +iFs( aFs ) + { + TRACE_FUNC; + CActiveScheduler::Add(this); + } + + +void CMediaManager::ConstructL() + { + TRACE_FUNC_ENTRY; + iHarvester = CMPXHarvesterFactory::NewL(); + LOGGER_WRITE("1"); + iCollection = MMPXCollectionUtility::NewL( iObserver ); + LOGGER_WRITE("2"); + iMediator = CMPXCollectionMediator::NewL( iCollection->Collection() ); + LOGGER_WRITE("3"); + iCollectionHelper = CMPXCollectionHelperFactory::NewCollectionCachedHelperL(); + + TRACE_FUNC_EXIT; + } + + +CMediaManager* CMediaManager::NewL( RFs& aFs, MMediaManagerObserver* aObserver, TKeyArrayFix aKey, CMD5& aHasher ) + { + CMediaManager* self = new( ELeave ) CMediaManager( aFs, aObserver, aKey, aHasher ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMediaManager::~CMediaManager() + { + TRACE_FUNC_ENTRY; + Cancel(); + delete iFoundedMedia; + if ( iCollectionHelper ) + { + iCollectionHelper->Close(); + iCollectionHelper = NULL; + } + + delete iMediator; + + if ( iCollection ) + { + iCollection->Close(); + iCollection = NULL; + } + + if ( iHarvester ) + { + // For some unknown reason this may sometimes leave with error code -38 + TRAP_IGNORE( iHarvester->Close() ); + iHarvester = NULL; + } + + TRACE_FUNC_EXIT; + } + +void CMediaManager::ScanL() + { + TRACE_FUNC_ENTRY; + iHarvester->ScanL(); + TRACE_FUNC_EXIT; + } + +void CMediaManager::CancelScanL() + { + TRACE_FUNC_ENTRY; + iHarvester->CancelScanL(); + TRACE_FUNC_EXIT; + } + +// -------------------------------------------------------------------------- +// Starts registering all playlists. Calls RegisterAllPlayListsCompleted when ready +// -------------------------------------------------------------------------- +// +TInt CMediaManager::RegisterAllPlayLists() + { + TRACE_FUNC_ENTRY; + if ( iCurrentState != EIdle || !iSnapshotArray) + { + LOGGER_WRITE("Not Idle or iSnapshotArray is NULL"); + return KErrNotReady; + } + iCurrentState = EReadingPlaylistCount; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + TRACE_FUNC_EXIT; + return KErrNone; + } + +// -------------------------------------------------------------------------- +// Starts registering all song items. Calls RegisterAllSongsCompleted when ready +// -------------------------------------------------------------------------- +// +TInt CMediaManager::RegisterAllSongs() + { + TRACE_FUNC_ENTRY; + if ( iCurrentState != EIdle || !iSnapshotArray) + { + LOGGER_WRITE("Not Idle or iSnapshotArray is NULL"); + return KErrNotReady; + } + iCurrentState = EReadingSongCount; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + TRACE_FUNC_EXIT; + return KErrNone; + } + +// -------------------------------------------------------------------------- +// Registers playlist. +// -------------------------------------------------------------------------- +// +void CMediaManager::RegisterPlaylistL( const CMPXMedia& aMedia ) + { + TRACE_FUNC_ENTRY; + if ( !iSnapshotArray ) + { + User::Leave( KErrGeneral ); + } + + if ( !aMedia.IsSupported(KMPXMediaGeneralId) ) + { + LOGGER_WRITE("KMPXMediaGeneralId not supported"); + User::Leave(KErrNotSupported); + } + + // Extract the playlist id from the found object + TUint32 playlistId = *aMedia.Value(KMPXMediaGeneralId); + LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId); + + if ( !aMedia.IsSupported( KMPXMediaGeneralTitle ) ) + { + LOGGER_WRITE("KMPXMediaGeneralTitle not supported"); + User::Leave(KErrNotSupported); + } + + CPlaylistItem* playlist = CPlaylistItem::NewLC(); + // find the media object that contains a list of songs in the playlist + + RArray contentIDs; + CleanupClosePushL( contentIDs ); + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PopAndDestroy( &contentIDs ); + CleanupStack::PushL(searchMedia); + + searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup); + searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong); + searchMedia->SetTObjectValueL(KMPXMediaGeneralId, playlistId); + + RArray songAttributes; + CleanupClosePushL(songAttributes); + songAttributes.AppendL(KMPXMediaGeneralId); + songAttributes.AppendL(KMPXMediaGeneralUri); + + CMPXMedia* foundMedia = iCollectionHelper->FindAllL(*searchMedia, + songAttributes.Array()); + CleanupStack::PopAndDestroy(&songAttributes); + CleanupStack::PopAndDestroy(searchMedia); + + CleanupStack::PushL(foundMedia); + + + if ( !foundMedia->IsSupported(KMPXMediaArrayCount) ) + { + User::Leave(KErrNotSupported); + } + + // Number of references + TInt numOfRefs = *foundMedia->Value(KMPXMediaArrayCount); + if ( numOfRefs ) + { + if (!foundMedia->IsSupported(KMPXMediaArrayContents)) + { + User::Leave(KErrNotSupported); + } + + const CMPXMediaArray* refArray = + foundMedia->Value(KMPXMediaArrayContents); + + // Import the references + for (TInt i=0;iIsSupported(KMPXMediaGeneralUri) ) + { + const TDesC& uri = refMedia->ValueText(KMPXMediaGeneralUri); + playlist->AddItemL( uri ); + } + + } + } + + TSnapshotItem playlistItem(playlistId); + + const TDesC& title = aMedia.ValueText( KMPXMediaGeneralTitle ); + playlist->SetTitleL( title ); + + const TDesC& uri = aMedia.ValueText( KMPXMediaGeneralUri ); + playlist->SetUrlL( uri ); + + playlistItem.SetItemHash( *playlist, iHasher ); + + playlistItem.SetParentId( KPlaylistsFolderId ); + TKeyArrayFix key( iKey ); + iSnapshotArray->InsertIsqL( playlistItem, key ); + + CleanupStack::PopAndDestroy( foundMedia ); + CleanupStack::PopAndDestroy( playlist ); + + TRACE_FUNC_EXIT; + } + +// -------------------------------------------------------------------------- +// Populates CPlaylistItem +// -------------------------------------------------------------------------- +// +void CMediaManager::GetPlayListL( TInt aPlaylistId, CPlaylistItem& aList ) + { + TRACE_FUNC_ENTRY; + + LOGGER_WRITE_1("aPlaylistId: %d", aPlaylistId); + + CMPXMedia* playlistItem = FindPlaylistL( aPlaylistId ); + CleanupStack::PushL( playlistItem ); + if ( !playlistItem->IsSupported(KMPXMediaGeneralId) ) + { + LOGGER_WRITE("KMPXMediaGeneralId not supported"); + User::Leave(KErrNotSupported); + } + + // Extract the playlist id from the found object + TUint32 playlistId = *playlistItem->Value(KMPXMediaGeneralId); + LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId); + aList.SetId( playlistId ); + + if ( !playlistItem->IsSupported(KMPXMediaGeneralTitle) ) + { + LOGGER_WRITE("KMPXMediaGeneralTitle not supported"); + User::Leave( KErrNotSupported ); + } + else + { + const TDesC& title = playlistItem->ValueText(KMPXMediaGeneralTitle); + LOGGER_WRITE_1("KMPXMediaGeneralTitle: %S", &title); + aList.SetTitleL( title ); + } + + if ( playlistItem->IsSupported( KMPXMediaGeneralUri ) ) + { + const TDesC& uri = playlistItem->ValueText( KMPXMediaGeneralUri ); + aList.SetUrlL( uri ); + } + + CleanupStack::PopAndDestroy( playlistItem ); + + CMPXMedia* playlist = FetchPlaylistContentL( aPlaylistId ); + CleanupStack::PushL( playlist ); + + if ( !playlist->IsSupported(KMPXMediaArrayCount) ) + { + User::Leave(KErrNotSupported); + } + + // Number of references + TInt numOfRefs = *playlist->Value(KMPXMediaArrayCount); + LOGGER_WRITE_1("numOfRefs: %d", numOfRefs); + if ( numOfRefs ) + { + if (!playlist->IsSupported(KMPXMediaArrayContents)) + { + User::Leave(KErrNotSupported); + } + + const CMPXMediaArray* refArray = + playlist->Value(KMPXMediaArrayContents); + + // Import the references + for (TInt i=0;iIsSupported(KMPXMediaGeneralUri) ) + { + aList.AddItemL( refMedia->ValueText(KMPXMediaGeneralUri) ); + } + } + } + + CleanupStack::PopAndDestroy( playlist ); + + TRACE_FUNC_EXIT; + } + +// -------------------------------------------------------------------------- +// Fetch a playlist content +// -------------------------------------------------------------------------- +// +CMPXMedia* CMediaManager::FetchPlaylistContentL( TInt aId ) + { + TRACE_FUNC_ENTRY; + TMPXItemId id(aId); + + CMPXMedia* criteria = CMPXMedia::NewL(); + CleanupStack::PushL( criteria ); + criteria->SetTObjectValueL( + KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid ); + criteria->SetTObjectValueL( + KMPXMediaGeneralType, EMPXGroup ); + + // set search keys + criteria->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXSong ); + criteria->SetTObjectValueL( + KMPXMediaGeneralId, id ); + + // define attributes fetched + RArray songAttributes; + CleanupClosePushL(songAttributes); + songAttributes.AppendL(KMPXMediaGeneralId); + songAttributes.AppendL(KMPXMediaGeneralUri); + + // now find + CMPXMedia* result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() ); + CleanupStack::PopAndDestroy( &songAttributes ); + CleanupStack::PopAndDestroy( criteria ); + + TRACE_FUNC_EXIT; + return result; + } + + + // -------------------------------------------------------------------------- + // Find a playlist + // -------------------------------------------------------------------------- + // + CMPXMedia* CMediaManager::FindPlaylistL( TInt aUid ) + { + TRACE_FUNC_ENTRY; + CMPXMedia* criteria = CMPXMedia::NewL(); + CleanupStack::PushL( criteria ); + + criteria->SetTObjectValueL( + KMPXMediaGeneralType, EMPXItem ); + criteria->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXPlaylist ); + criteria->SetTObjectValueL( + KMPXMediaGeneralId, aUid ); + + // define attributes fetched + RArray playlistAttributes; + CleanupClosePushL(playlistAttributes); + playlistAttributes.AppendL(KMPXMediaGeneralId); + playlistAttributes.AppendL(KMPXMediaGeneralCollectionId); //test + playlistAttributes.AppendL(KMPXMediaGeneralTitle); + playlistAttributes.AppendL(KMPXMediaGeneralUri); + + // now find + CMPXMedia* foundList = 0; + foundList = iCollectionHelper->FindAllL( *criteria , playlistAttributes.Array() ); + CleanupStack::PopAndDestroy( &playlistAttributes ); + CleanupStack::PopAndDestroy( criteria ); + + CleanupStack::PushL( foundList ); + + if ( !foundList->IsSupported(KMPXMediaArrayCount) ) + { + LOGGER_WRITE("KMPXMediaArrayCount not supported"); + User::Leave( KErrNotSupported ); + } + + TInt foundItemCount = *foundList->Value(KMPXMediaArrayCount); + + CMPXMedia* playlist(NULL); + if ( foundItemCount ) + { + if ( !foundList->IsSupported(KMPXMediaArrayContents) ) + { + LOGGER_WRITE("KMPXMediaArrayContents not supported"); + User::Leave(KErrNotSupported); + } + + const CMPXMediaArray* foundArray = foundList->Value(KMPXMediaArrayContents); + + // get the first founded item + playlist = CMPXMedia::NewL(*(*foundArray)[0]); + } + else + { + User::Leave( KErrGeneral ); + } + + CleanupStack::PopAndDestroy( foundList ); + + TRACE_FUNC_EXIT; + return playlist; + } + +void CMediaManager::GetSongL( TInt aSongId, CSongItem& aSongItem ) + { + TRACE_FUNC_ENTRY; + TMPXItemId id(aSongId); + + RArray contentIDs; + CleanupClosePushL( contentIDs ); + contentIDs.AppendL( KMPXMediaIdMusic ); + contentIDs.AppendL( KMPXMediaIdGeneral ); + + CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PopAndDestroy( &contentIDs ); + CleanupStack::PushL(criteria); + + // set search keys + criteria->SetTObjectValueL( + KMPXMediaGeneralType, EMPXItem ); + criteria->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXSong ); + criteria->SetTObjectValueL( + KMPXMediaGeneralId, id ); + + // define attributes fetched + RArray songAttributes; + CleanupClosePushL(songAttributes); + + songAttributes.AppendL( KMPXMediaGeneralType ); + songAttributes.AppendL( KMPXMediaGeneralCategory ); + songAttributes.AppendL( KMPXMediaGeneralUri ); + songAttributes.AppendL( KMPXMediaGeneralId ); + songAttributes.AppendL( KMPXMediaGeneralTitle ); + songAttributes.AppendL( KMPXMediaGeneralMimeType ); + songAttributes.AppendL( KMPXMediaGeneralDuration ); + songAttributes.AppendL( KMPXMediaGeneralComment ); + + songAttributes.AppendL( KMPXMediaMusicArtist ); + songAttributes.AppendL( KMPXMediaMusicAlbum ); + songAttributes.AppendL( KMPXMediaMusicYear ); + songAttributes.AppendL( KMPXMediaMusicAlbumTrack ); + songAttributes.AppendL( KMPXMediaMusicGenre ); + songAttributes.AppendL( KMPXMediaMusicComposer ); + + // now find + CMPXMedia* result = 0; + TRAPD(err, result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() )); + CleanupStack::PopAndDestroy( &songAttributes ); + CleanupStack::PopAndDestroy( criteria ); + + if ( err ) + { + LOGGER_WRITE_1("FindAllL err: %d", err); + User::Leave( err ); + } + + CleanupStack::PushL( result ); + + if ( !result->IsSupported(KMPXMediaArrayCount) ) + { + LOGGER_WRITE("KMPXMediaArrayCount not supported"); + User::Leave(KErrNotSupported); + } + + if ( !result->IsSupported( KMPXMediaArrayContents ) ) + { + User::Leave(KErrNotSupported); + } + + const CMPXMediaArray* songsArray = + result->Value(KMPXMediaArrayContents); + if ( songsArray->Count() == 0 ) + { + User::Leave( KErrNotFound ); + } + const CMPXMedia* songMedia = (*songsArray)[0]; + + ReadSongAttributesL( *songMedia, aSongItem, ETrue ); + + CleanupStack::PopAndDestroy( result ); + + TRACE_FUNC_EXIT; + } + +CMPXMedia* CMediaManager::CreatePlaylistMediaL( const CPlaylistItem& aPlaylist ) + { + TRACE_FUNC_ENTRY; + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* playlist = CMPXMedia::NewL( contentIDs.Array() ); + CleanupStack::PushL( playlist ); + contentIDs.Close(); + // add playlist info into the playlist media + playlist->SetTObjectValueL( + KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid ); + + // set playlist title + playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() ); + + // set type + playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + + // set category + playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); + + + TFileName playlistfile; + + TInt drive; + User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive) ); + TUint driveStatus( 0 ); + TInt err = DriveInfo::GetDriveStatus( iFs, drive, driveStatus ); + if ( !err && (driveStatus & DriveInfo::EDrivePresent) ) + { + User::LeaveIfError( PathInfo::GetRootPath( playlistfile, drive ) ); + LOGGER_WRITE_1("mmc playlistfile: %S", &playlistfile); + } + else + { + playlistfile = PathInfo::PhoneMemoryRootPath(); + LOGGER_WRITE_1("phone playlistfile: %S", &playlistfile); + } + + playlistfile.Append( KPlaylistPath ); + + // set location drive + TDriveUnit driveUnit( playlistfile ); + TPtrC driveName = driveUnit.Name(); + playlist->SetTextValueL( KMPXMediaGeneralDrive, driveName ); + + + TTime time; + time.HomeTime(); + playlistfile.AppendNum(time.Int64()); + playlistfile.Append(KMPXVirtualPlaylistExt); + + LOGGER_WRITE_1("playlistfile: %S", &playlistfile); + playlist->SetTextValueL( + KMPXMediaGeneralUri, playlistfile ); + + // set DbFlags to indicate that this is a virtual playlist + playlist->SetTObjectValueL(KMPXMediaGeneralFlags, + KMPXMediaGeneralFlagsSetOrUnsetBit | KMPXMediaGeneralFlagsIsVirtual); + + // create songs + CMPXMediaArray* medias = CreateMediaArrayLC( aPlaylist ); + // set medias + playlist->SetCObjectValueL( KMPXMediaArrayContents, medias ); + /// set media count + playlist->SetTObjectValueL( KMPXMediaArrayCount, medias->Count() ); + + CleanupStack::PopAndDestroy(medias); + CleanupStack::Pop(playlist); + + + TRACE_FUNC_EXIT; + return playlist; + } + +CMPXMediaArray* CMediaManager::CreateMediaArrayLC( const CPlaylistItem& aList ) + { + CMPXMediaArray* medias = CMPXMediaArray::NewL(); + CleanupStack::PushL( medias ); + // + // create entries + // + TInt itemCount = aList.ItemCount(); + for ( TInt i=0; iAddL( ptrUri, this ); + iWaitOngoing = ETrue; + LOGGER_WRITE("iWait.Start"); + iWait.Start(); + LOGGER_WRITE("continue.."); + + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + contentIDs.AppendL(KMPXMediaIdAudio); + contentIDs.AppendL(KMPXMediaIdMusic); + contentIDs.AppendL(KMPXMediaIdMTP); + + CMPXMedia* entry = CMPXMedia::NewL( contentIDs.Array() ); + CleanupStack::PushL( entry ); + contentIDs.Close(); + + entry->SetTObjectValueL( + KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid ); + + entry->SetTObjectValueL( + KMPXMediaGeneralType, EMPXItem ); + + entry->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXSong ); + + + entry->SetTextValueL( KMPXMediaGeneralUri, ptrUri ); + + // set location drive + TDriveUnit driveUnit( ptrUri ); + TPtrC driveName = driveUnit.Name(); + entry->SetTextValueL( KMPXMediaGeneralDrive, driveName ); + + medias->AppendL(entry); + CleanupStack::Pop(entry); + } + return medias; + } + +void CMediaManager::CreateNewPlaylistL( TInt& aNewUid, CPlaylistItem& aList ) + { + TRACE_FUNC_ENTRY; + + CMPXMedia* playlist = CreatePlaylistMediaL( aList ); + CleanupStack::PushL( playlist ); + iMediator->AddItemL( playlist ); + + if ( !playlist->IsSupported(KMPXMediaGeneralId) ) + { + LOGGER_WRITE("KMPXMediaGeneralId not supported"); + User::Leave( KErrNotSupported ); + } + else + { + // Extract the playlist id from the found object + TUint32 playlistId = *playlist->Value(KMPXMediaGeneralId); + LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId); + aNewUid = playlistId; + + if ( !playlist->IsSupported( KMPXMediaGeneralUri ) ) + { + // get url + const TDesC& uri = playlist->ValueText( KMPXMediaGeneralUri ); + aList.SetUrlL( uri ); + } + } + + CleanupStack::PopAndDestroy(playlist); + + TRACE_FUNC_EXIT; + } + +void CMediaManager::ReplacePlaylistL( TInt aPlaylistId, CPlaylistItem& aPlaylist ) + { + TRACE_FUNC_ENTRY; + CMPXMedia* playlist = CMPXMedia::NewL(); + CleanupStack::PushL( playlist ); + + // add playlist info into the playlist media + playlist->SetTObjectValueL( + KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid ); + + // set type + playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + + // set category + playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); + + + + // find playlist uri + CMPXMedia* oldPlaylist = FindPlaylistL( aPlaylistId ); + CleanupStack::PushL( oldPlaylist ); + if ( !oldPlaylist->IsSupported(KMPXMediaGeneralUri) ) + { + User::Leave( KErrNotSupported ); + } + const TDesC& uri = oldPlaylist->ValueText( KMPXMediaGeneralUri ); + LOGGER_WRITE_1("uri: %S", &uri); + + playlist->SetTextValueL( + KMPXMediaGeneralUri, uri ); + + aPlaylist.SetUrlL( uri ); + + const TDesC& title = oldPlaylist->ValueText( KMPXMediaGeneralTitle ); + if ( title.Compare( aPlaylist.Title() ) != 0 ) + { + LOGGER_WRITE_1("title changed old: %S", &title); + LOGGER_WRITE_1("new title: %S", &aPlaylist.Title()); + // set playlist title + playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() ); + + // update title first + iMediator->SetItemL( playlist ); + } + + + CleanupStack::PopAndDestroy( oldPlaylist ); + + // update songs + CMPXMediaArray* songArray = CreateMediaArrayLC( aPlaylist ); + // set medias + playlist->SetCObjectValueL( KMPXMediaArrayContents, songArray ); + /// set media count + playlist->SetTObjectValueL( KMPXMediaArrayCount, songArray->Count() ); + + iMediator->SetItemL( playlist ); + + CleanupStack::PopAndDestroy( songArray ); + CleanupStack::PopAndDestroy( playlist ); + + TRACE_FUNC_EXIT; + } + + +void CMediaManager::DeletePlaylistL( TInt aPlaylistId ) + { + TRACE_FUNC_ENTRY; + + CMPXMedia* playlist = FindPlaylistL( aPlaylistId ); + CleanupStack::PushL( playlist ); + iCollection->Collection().RemoveL( *playlist ); + CleanupStack::PopAndDestroy( playlist ); + + TRACE_FUNC_EXIT; + } + +void CMediaManager::HandleAddFileCompleteL( TInt aErr ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aErr: %d", aErr); + if ( iWaitOngoing ) + { + LOGGER_WRITE("AsyncStop"); + iWaitOngoing = EFalse; + iWait.AsyncStop(); + } + TRACE_FUNC_EXIT; + } + +void CMediaManager::ReadSongAttributesL( const CMPXMedia& aMedia, CSongItem& aSongItem, + TBool aReadFileDetails ) + { + if ( !aMedia.IsSupported(KMPXMediaGeneralUri) ) + { + LOGGER_WRITE("KMPXMediaGeneralUri not supported"); + User::Leave(KErrNotSupported); + } + + if ( !aMedia.IsSupported(KMPXMediaGeneralId) ) + { + LOGGER_WRITE("KMPXMediaGeneralId not supported"); + User::Leave(KErrNotSupported); + } + + aSongItem.SetId( *aMedia.Value(KMPXMediaGeneralId) ); + + const TDesC& uri = aMedia.ValueText(KMPXMediaGeneralUri); + aSongItem.SetUriL( uri ); + + if ( aMedia.IsSupported(KMPXMediaGeneralTitle) ) + { + aSongItem.SetTitleL( aMedia.ValueText(KMPXMediaGeneralTitle) ); + } + + if ( aMedia.IsSupported(KMPXMediaGeneralMimeType) ) + { + aSongItem.SetMimeTypeL( aMedia.ValueText(KMPXMediaGeneralMimeType) ); + } + + if ( aMedia.IsSupported(KMPXMediaGeneralDuration) ) + { + aSongItem.SetDuration( aMedia.ValueTObjectL(KMPXMediaGeneralDuration) ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicArtist) ) + { + aSongItem.SetArtistL( aMedia.ValueText(KMPXMediaMusicArtist) ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicAlbum) ) + { + aSongItem.SetAlbumL( aMedia.ValueText(KMPXMediaMusicAlbum) ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicYear) ) + { + TInt64 year = aMedia.ValueTObjectL( KMPXMediaMusicYear ); + TTime yearTime( year); + aSongItem.SetYear( yearTime.DateTime().Year() ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicAlbumTrack) ) + { + aSongItem.SetAlbumTrack( *aMedia.Value(KMPXMediaMusicAlbumTrack) ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicGenre) ) + { + const TDesC& genre = aMedia.ValueText(KMPXMediaMusicGenre); + aSongItem.SetGenreL( genre ); + } + + if ( aMedia.IsSupported(KMPXMediaMusicComposer) ) + { + aSongItem.SetComposerL( aMedia.ValueText(KMPXMediaMusicComposer) ); + } + + if ( aMedia.IsSupported(KMPXMediaGeneralComment) ) + { + aSongItem.SetCommentL( aMedia.ValueText(KMPXMediaGeneralComment) ); + } + + // Reading file timestamp and size is slow, read only if needed + if ( aReadFileDetails ) + { + TEntry fileEntry; + TInt err = iFs.Entry(uri,fileEntry); + if ( !err ) + { + aSongItem.SetModifiedTime( fileEntry.iModified ); + aSongItem.SetFileSize( fileEntry.iSize ); + } + } + + } + + +void CMediaManager::DoCancel() + { + TRACE_FUNC_ENTRY; + + delete iFoundedMedia; + iFoundedMedia = NULL; + iReadedItems = 0; + iItemsFound = 0; + TState state = iCurrentState; + iCurrentState = EIdle; + + switch (state) + { + case EReadingPlaylistCount: + case EEnumeratingPlaylists: + iObserver->RegisterAllPlayListsCompleted( KErrCancel ); + break; + + case EReadingSongCount: + case EEnumeratingSongs: + iObserver->RegisterAllSongsCompleted( KErrCancel ); + break; + default: + break; + } + + LOGGER_WRITE("signal cancel"); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrCancel ); + + TRACE_FUNC_EXIT; + } + +void CMediaManager::RunL() + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("iStatus.Int(): %d", iStatus.Int()) + TRequestStatus* status = &iStatus; + switch (iCurrentState) + { + case EReadingPlaylistCount: + //if ( !iCancel ) + // { + ReadPlaylistCountL(); + iReadedItems=0; + // next state + iCurrentState = EEnumeratingPlaylists; + SetActive(); + User::RequestComplete( status, KErrNone ); + /* } + else + { + LOGGER_WRITE("cancel"); + iCancel = EFalse; + delete iFoundedMedia; iFoundedMedia = NULL; + iReadedItems = 0; + iItemsFound = 0; + iCurrentState = EIdle; + iObserver->RegisterAllPlayListsCompleted( KErrCancel ); + }*/ + break; + + case EEnumeratingPlaylists: + //if ( !iCancel ) + // { + ReadPlaylistItemsL(); + if ( iReadedItems == iItemsFound ) + { + // all items readed + delete iFoundedMedia; + iFoundedMedia = NULL; + // next state + iCurrentState = EIdle; + iObserver->RegisterAllPlayListsCompleted( KErrNone ); + } + else + { + // not ready yet, continue same operation + SetActive(); + User::RequestComplete( status, KErrNone ); + } + /* } + else + { + // cancel + LOGGER_WRITE("cancel"); + iCancel = EFalse; + delete iFoundedMedia; iFoundedMedia = NULL; + iReadedItems = 0; + iItemsFound = 0; + iCurrentState = EIdle; + iObserver->RegisterAllPlayListsCompleted( KErrCancel ); + }*/ + break; + + case EReadingSongCount: + //if ( !iCancel ) + // { + ReadSongCountL(); + iReadedItems=0; + // next state + iCurrentState = EEnumeratingSongs; + SetActive(); + User::RequestComplete( status, KErrNone ); + /* } + else + { + LOGGER_WRITE("cancel"); + iCancel = EFalse; + delete iFoundedMedia; iFoundedMedia = NULL; + iReadedItems = 0; + iItemsFound = 0; + iCurrentState = EIdle; + iObserver->RegisterAllSongsCompleted( KErrCancel ); + }*/ + break; + + case EEnumeratingSongs: +// if ( !iCancel ) + // { + ReadSongItemsL(); + if ( iReadedItems == iItemsFound ) + { + // all items readed + delete iFoundedMedia; + iFoundedMedia = NULL; + // next state + iCurrentState = EIdle; + iObserver->RegisterAllSongsCompleted( KErrNone ); + } + else + { + // not ready yet, continue same operation + SetActive(); + User::RequestComplete( status, KErrNone ); + } + /* } + else + { + LOGGER_WRITE("cancel"); + iCancel = EFalse; + delete iFoundedMedia; iFoundedMedia = NULL; + iReadedItems = 0; + iItemsFound = 0; + iCurrentState = EIdle; + iObserver->RegisterAllSongsCompleted( KErrCancel ); + }*/ + break; + default: + break; + } + TRACE_FUNC_EXIT; + } + + +TInt CMediaManager::RunError( TInt aError ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1("aError: %d", aError) + switch (iCurrentState) + { + case EReadingPlaylistCount: + case EEnumeratingPlaylists: + iObserver->RegisterAllPlayListsCompleted( aError ); + break; + case EReadingSongCount: + case EEnumeratingSongs: + iObserver->RegisterAllSongsCompleted( aError ); + break; + default: + LOGGER_WRITE("Unknown state!"); + break; + } + + TRACE_FUNC_EXIT; + return KErrNone; + } + +void CMediaManager::ReadPlaylistCountL() + { + TRACE_FUNC_ENTRY; + // Find all playlist files in the playlist DB + RArray contentIDs; + CleanupClosePushL( contentIDs ); + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PopAndDestroy( &contentIDs ); + CleanupStack::PushL(searchMedia); + + searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXPlaylist); + + RArray playlistAttributes; + CleanupClosePushL(playlistAttributes); + playlistAttributes.AppendL( KMPXMediaGeneralId ); + playlistAttributes.AppendL( KMPXMediaGeneralTitle ); + playlistAttributes.AppendL( KMPXMediaGeneralUri ); + + LOGGER_WRITE("find all"); + delete iFoundedMedia; iFoundedMedia=NULL; + iFoundedMedia = iCollectionHelper->FindAllL(*searchMedia, playlistAttributes.Array()); + CleanupStack::PopAndDestroy(&playlistAttributes); + CleanupStack::PopAndDestroy(searchMedia); + + if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) ) + { + delete iFoundedMedia; iFoundedMedia=NULL; + User::Leave( KErrNotSupported ); + } + + iItemsFound = *iFoundedMedia->Value(KMPXMediaArrayCount); + + LOGGER_WRITE_1("playlists: %d", iItemsFound); + + if ( iItemsFound ) + { + if ( !iFoundedMedia->IsSupported(KMPXMediaArrayContents) ) + { + delete iFoundedMedia; iFoundedMedia=NULL; + iItemsFound = 0; + User::Leave(KErrNotSupported); + } + } + + TRACE_FUNC_EXIT; + } + +void CMediaManager::ReadPlaylistItemsL() + { + TRACE_FUNC_ENTRY; + TInt start = iReadedItems; + TInt end = start+iMaxPlaylistItemsToEnumerate; + if ( end >iItemsFound ) + { + end = iItemsFound; + } + + const CMPXMediaArray* foundArray = iFoundedMedia->Value(KMPXMediaArrayContents); + + for (TInt i = start; i < end; i++) + { + LOGGER_WRITE_1("read playlistItem: %d", i); + CMPXMedia* playlistMedia = CMPXMedia::NewL(*(*foundArray)[i]); + CleanupStack::PushL( playlistMedia ); + + // Append playlist to item array + RegisterPlaylistL( *playlistMedia ); + + CleanupStack::PopAndDestroy( playlistMedia ); + iReadedItems++; + } + + TRACE_FUNC_EXIT; + } + + + +void CMediaManager::ReadSongCountL() + { + TRACE_FUNC_ENTRY; + + RArray contentIDs; + CleanupClosePushL( contentIDs ); + contentIDs.AppendL( KMPXMediaIdGeneral ); + contentIDs.AppendL( KMPXMediaIdMusic ); + + CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PopAndDestroy( &contentIDs ); + CleanupStack::PushL(criteria); + + criteria->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + criteria->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); + + // define attributes fetched + RArray songAttributes; + CleanupClosePushL(songAttributes); + + songAttributes.AppendL( KMPXMediaGeneralType ); + songAttributes.AppendL( KMPXMediaGeneralCategory ); + songAttributes.AppendL( KMPXMediaGeneralUri ); + songAttributes.AppendL( KMPXMediaGeneralId ); + songAttributes.AppendL( KMPXMediaGeneralTitle ); + songAttributes.AppendL( KMPXMediaGeneralMimeType ); + songAttributes.AppendL( KMPXMediaGeneralDuration ); + songAttributes.AppendL( KMPXMediaGeneralComment ); + + songAttributes.AppendL( KMPXMediaMusicArtist ); + songAttributes.AppendL( KMPXMediaMusicAlbum ); + songAttributes.AppendL( KMPXMediaMusicYear ); + songAttributes.AppendL( KMPXMediaMusicAlbumTrack ); + songAttributes.AppendL( KMPXMediaMusicGenre ); + songAttributes.AppendL( KMPXMediaMusicComposer ); + + delete iFoundedMedia; + iFoundedMedia = NULL; + // now find + LOGGER_WRITE("FindAllL"); + iFoundedMedia = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() ); + + LOGGER_WRITE("FindAllL ok"); + CleanupStack::PopAndDestroy( &songAttributes ); + CleanupStack::PopAndDestroy( criteria ); + + + if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) ) + { + LOGGER_WRITE("KMPXMediaArrayCount not supported"); + delete iFoundedMedia; + iFoundedMedia = NULL; + iItemsFound = 0; + User::Leave(KErrNotSupported); + } + + // Number of references + iItemsFound = *iFoundedMedia->Value(KMPXMediaArrayCount); + LOGGER_WRITE_1("songs: %d", iItemsFound); + if ( iItemsFound ) + { + if (!iFoundedMedia->IsSupported(KMPXMediaArrayContents)) + { + delete iFoundedMedia; + iFoundedMedia = NULL; + iItemsFound = 0; + User::Leave(KErrNotSupported); + } + } + + TRACE_FUNC_EXIT; + } + +void CMediaManager::ReadSongItemsL() + { + TRACE_FUNC_ENTRY; + + TInt start = iReadedItems; + TInt end = start+iMaxSongItemsToEnumerate; + if ( end >iItemsFound ) + { + end = iItemsFound; + } + + const CMPXMediaArray* foundArray = iFoundedMedia->Value(KMPXMediaArrayContents); + + TKeyArrayFix key( iKey ); + // Import the references + for (TInt i = start; i < end; i++) + { + //LOGGER_WRITE_1("read songitem: %d",i); + const CMPXMedia* refMedia = (*foundArray)[i]; + + CSongItem* song = CSongItem::NewLC(); + + ReadSongAttributesL( *refMedia, *song, EFalse ); + TSnapshotItem snapshotItem( song->Id(), KAllSongsFolderId ); + snapshotItem.SetItemHash( *song, iHasher ); + + iSnapshotArray->InsertIsqL( snapshotItem, key ); + + CleanupStack::PopAndDestroy( song ); + iReadedItems++; + } + TRACE_FUNC_EXIT; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/omadsfolderobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/omadsfolderobject.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,101 @@ +/* +* 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: COMADSFolderObject class implementation. +* +*/ + + +#include +#include "omadsfolderobject.h" +#include "logger.h" + +_LIT(KFolderBeginTag, ""); +_LIT(KFolderEndTag, ""); +_LIT(KNameBeginTag, ""); +_LIT(KNameEndTag, ""); +_LIT(KCreatedBeginTag, ""); +_LIT(KCreatedEndTag, ""); +_LIT(KModifiedBeginTag, ""); +_LIT(KModifiedEndTag, ""); +_LIT(KDateFormat, "%04d%02d%02dT%02d%02d%02d"); +const TInt KDateFormatLength( 15 ); + + +COMADSFolderObject* COMADSFolderObject::NewLC() + { + COMADSFolderObject* self = new (ELeave) COMADSFolderObject; + CleanupStack::PushL( self ); + return self; + } + +COMADSFolderObject::~COMADSFolderObject() + { + } + +void COMADSFolderObject::ExportFolderXmlL( CBufBase& aBuffer ) + { + iBuffer = &aBuffer; + iWriteBufPosition = 0; + iWriteBufSize = aBuffer.Size(); + + ExportL(); + } + +void COMADSFolderObject::ExportL() + { + // Folder + WriteL( KFolderBeginTag ); + + // Name + WriteL( KNameBeginTag ); + WriteL( iName ); + WriteL( KNameEndTag ); + + // Created Date + TBuf tempdate; + tempdate.Format( KDateFormat, iCreatedDate.Year(), iCreatedDate.Month() + 1, + iCreatedDate.Day(), iCreatedDate.Hour(), iCreatedDate.Minute(), iCreatedDate.Second() ); + + WriteL( KCreatedBeginTag ); + WriteL( tempdate ); + WriteL( KCreatedEndTag ); + + // Modified Date + tempdate.Format( KDateFormat, iModifiedDate.Year(), iModifiedDate.Month() + 1, + iModifiedDate.Day(), iModifiedDate.Hour(), iModifiedDate.Minute(), iModifiedDate.Second() ); + + WriteL( KModifiedBeginTag ); + WriteL( tempdate ); + WriteL( KModifiedEndTag ); + + // Folder end + WriteL(KFolderEndTag); + } + +void COMADSFolderObject::WriteL( const TDesC& aData ) + { + User::LeaveIfError( CnvUtfConverter::ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + TInt newPosition = iWriteBufPosition + iTemp.Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, iTemp ); + iWriteBufPosition = newPosition; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/playlistitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/playlistitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,204 @@ +/* +* 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: CPlaylistItem class implementation +* +*/ + + + +#include "playlistitem.h" + +#include "logger.h" + +_LIT( KLineFeed, "\r\n" ); +_LIT( KUrl, "#EXTURL:" ); +_LIT( KTitle, "#EXTTITLE:" ); + +_LIT( KCommentChar, "#" ); + +const TInt KDefaultGranularity( 5 ); + +CPlaylistItem* CPlaylistItem::NewLC() + { + CPlaylistItem* self = new (ELeave) CPlaylistItem(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CPlaylistItem::~CPlaylistItem() + { + TRACE_FUNC; + delete iTitle; + delete iUrl; + delete iDescArray; + } + +CPlaylistItem::CPlaylistItem() + { + } + +void CPlaylistItem::ConstructL() + { + TRACE_FUNC; + iTitle = KNullDesC().AllocL(); + iUrl = KNullDesC().AllocL(); + iDescArray = new (ELeave) CDesCArrayFlat(KDefaultGranularity); + } + +void CPlaylistItem::SetId( TInt aId ) + { + iId = aId; + } + +TInt CPlaylistItem::Id() const + { + return iId; + } + +void CPlaylistItem::SetTitleL( const TDesC& aTitle ) + { + delete iTitle; + iTitle = NULL; + iTitle = aTitle.AllocL(); + } + +const TDesC& CPlaylistItem::Title() const + { + return *iTitle; + } + +void CPlaylistItem::SetUrlL( const TDesC& aUrl ) + { + delete iUrl; + iUrl = NULL; + iUrl = aUrl.AllocL(); + } + +const TDesC& CPlaylistItem::Url() const + { + return *iUrl; + } + +TInt CPlaylistItem::ItemCount() const + { + return iDescArray->MdcaCount(); + } + +TPtrC16 CPlaylistItem::ItemAt( TInt aIndex ) const + { + return iDescArray->MdcaPoint( aIndex ); + } + +TInt CPlaylistItem::FindItem( const TDesC16& aPtr, TInt& aPos, TKeyCmpText aTextComparisonType ) const + { + return iDescArray->Find( aPtr, aPos, aTextComparisonType ); + } + +void CPlaylistItem::ExportL( RBufWriteStream& aStream ) const + { + TRACE_FUNC_ENTRY; + + aStream.WriteL( KUrl ); + aStream.WriteL( *iUrl, iUrl->Length() ); + aStream.WriteL( KLineFeed ); + + aStream.WriteL( KTitle ); + aStream.WriteL( *iTitle, iTitle->Length() ); + aStream.WriteL( KLineFeed ); + + TInt count = iDescArray->MdcaCount(); + for ( TInt i=0; iMdcaPoint( i ); + aStream.WriteL( ptr16, ptr16.Length() ); + aStream.WriteL( KLineFeed ); + } + + aStream.CommitL(); + TRACE_FUNC_EXIT; + } + +void CPlaylistItem::ImportL( const TDesC& aBuffer ) + { + TRACE_FUNC_ENTRY; + iDescArray->Reset(); + TPtrC tag; + TPtrC data; + TInt currentPos(0); + TInt lineLen(0); + TBool eof(EFalse); + while( !eof ) + { + lineLen = ReadNextLine( aBuffer.Mid(currentPos), data ); + if ( lineLen >= 0) + { + if ( data.FindF( KTitle ) == 0 ) + { + TPtrC title = data.Mid( KTitle().Length() ); + SetTitleL( title ); + } + else if ( data.FindF( KCommentChar ) == 0 ) + { + // ignore comment + } + else if ( data.Length() > 0 ) + { + // must be song url + AddItemL( data ); + } + } + else + { + eof = ETrue; + } + currentPos += lineLen; + if ( currentPos >= aBuffer.Length() ) + { + eof = ETrue; + } + } + TRACE_FUNC_EXIT; + } + +void CPlaylistItem::AddItemL( const TDesC& aSongUri ) + { + //LOGGER_WRITE_1("AddItem: %S", &aSongUri); + TFileName uri(aSongUri); + uri.LowerCase(); + uri.TrimAll(); + iDescArray->InsertIsqAllowDuplicatesL( uri ); + } + +TInt CPlaylistItem::ReadNextLine( const TDesC& aBuffer, TPtrC& aLine ) + { + //TRACE_FUNC_ENTRY; + TInt lineLen = aBuffer.FindF( KLineFeed ); + + if ( lineLen == KErrNotFound ) + { + lineLen = aBuffer.Length(); + if ( lineLen == 0 ) + { + //TRACE_FUNC_RET( lineLen ); + return KErrNotFound; + } + } + + aLine.Set( aBuffer.Mid( 0, lineLen )); + //LOGGER_WRITE_1("aLine: %S", &aLine); + lineLen += 2; + //TRACE_FUNC_RET( lineLen ); + return lineLen; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mediads/src/snapshotitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mediads/src/snapshotitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,200 @@ +/* +* 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#include + +#include "snapshotitem.h" + + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem() + { + SetItemId( 0 ); + SetParentId( 0 ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// Constructor, takes item id as a parameter +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent ) + { + SetItemId( aItemId ); + SetParentId( aParent ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::ExternalizeL +// Writes the contents of this class to stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::ExternalizeL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( iItemId ); + aStream.WriteInt32L( iParentId ); + + TPckgBuf nameBuf(iHash); + + aStream << nameBuf; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::InternalizeL +// Reads the contents of this class from stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::InternalizeL( RReadStream& aStream ) + { + iItemId = aStream.ReadInt32L(); + iParentId = aStream.ReadInt32L(); + + TPckgBuf nameBuf; + aStream >> nameBuf; + iHash = nameBuf(); + } + +const TSmlDbItemUid& TSnapshotItem::ItemId() const + { + return iItemId; + } + +void TSnapshotItem::SetItemId( const TSmlDbItemUid& aItemId ) + { + iItemId = aItemId; + } + + +const TSmlDbItemUid& TSnapshotItem::ParentId() const + { + return iParentId; + } + +void TSnapshotItem::SetParentId( const TSmlDbItemUid& aParentId ) + { + iParentId = aParentId; + } + + +void TSnapshotItem::SetItemHash( const TDesC& aFolderName, CMD5& aHasher ) + { + TPtrC8 narrowFolder; + TInt narrowFolderLen = 0; + + narrowFolderLen = aFolderName.Length()*2; + narrowFolder.Set((TUint8*)aFolderName.Ptr(), narrowFolderLen); + + aHasher.Reset(); + aHasher.Update( narrowFolder ); + + iHash = aHasher.Final(); + + } + +void TSnapshotItem::SetItemHash( const CSongItem& aSongItem, CMD5& aHasher ) + { + TPtrC8 narrowData; + TInt narrowDataLen = 0; + + + aHasher.Reset(); + + narrowDataLen = aSongItem.Uri().Length()*2; + narrowData.Set((TUint8*)aSongItem.Uri().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Title().Length()*2; + narrowData.Set((TUint8*)aSongItem.Title().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.MimeType().Length()*2; + narrowData.Set((TUint8*)aSongItem.MimeType().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Artist().Length()*2; + narrowData.Set((TUint8*)aSongItem.Artist().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Album().Length()*2; + narrowData.Set((TUint8*)aSongItem.Album().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Genre().Length()*2; + narrowData.Set((TUint8*)aSongItem.Genre().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Comment().Length()*2; + narrowData.Set((TUint8*)aSongItem.Comment().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.Composer().Length()*2; + narrowData.Set((TUint8*)aSongItem.Composer().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aSongItem.MimeType().Length()*2; + narrowData.Set((TUint8*)aSongItem.MimeType().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + const TInt KNumberMaxLength(11); + TBuf8 temp; + temp.Num( aSongItem.Year() ); + aHasher.Update( temp ); + + temp.Num( aSongItem.AlbumTrack() ); + aHasher.Update( temp ); + + temp.Num( aSongItem.Rating() ); + aHasher.Update( temp ); + + temp.Num( aSongItem.Duration() ); + aHasher.Update( temp ); + + iHash.Copy( aHasher.Final() ); + + } + +void TSnapshotItem::SetItemHash( const CPlaylistItem& aPlaylist, CMD5& aHasher ) + { + TPtrC8 narrowData; + TInt narrowDataLen = 0; + + aHasher.Reset(); + narrowDataLen = aPlaylist.Title().Length()*2; + narrowData.Set((TUint8*)aPlaylist.Title().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + narrowDataLen = aPlaylist.Url().Length()*2; + narrowData.Set((TUint8*)aPlaylist.Url().Ptr(), narrowDataLen); + aHasher.Update( narrowData ); + + for (TInt i=0; i +#include +#include + +#include "logger.h" +#include "sconmetadatafielddefs.h" + + +CSongItem::CSongItem() + { + } + +CSongItem* CSongItem::NewLC() + { + CSongItem* self = new (ELeave) CSongItem(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +void CSongItem::ConstructL() + { + iUri = KNullDesC().AllocL(); + iTitle = KNullDesC().AllocL(); + iMimeType = KNullDesC().AllocL(); + iArtist = KNullDesC().AllocL(); + iAlbum = KNullDesC().AllocL(); + iGenre = KNullDesC().AllocL(); + iComment = KNullDesC().AllocL(); + iComposer = KNullDesC().AllocL(); + + iDuration = -1; + iYear = -1; + iAlbumTrack = -1; + iRating = -1; + iSize = 0; + } + +CSongItem::~CSongItem() + { + delete iUri; + delete iTitle; + delete iMimeType; + delete iArtist; + delete iAlbum; + delete iGenre; + delete iComment; + delete iComposer; + } + +void CSongItem::SetId( TInt aId ) + { + iId = aId; + } + +TInt CSongItem::Id() const + { + return iId; + } + +void CSongItem::SetUriL( const TDesC& aUri ) + { + delete iUri; + iUri = NULL; + iUri = aUri.AllocL(); + } + +const TDesC& CSongItem::Uri() const + { + return *iUri; + } + +void CSongItem::SetTitleL( const TDesC& aTitle ) + { + delete iTitle; + iTitle = NULL; + iTitle = aTitle.AllocL(); + } + +const TDesC& CSongItem::Title() const + { + return *iTitle; + } + +void CSongItem::SetMimeTypeL( const TDesC& aMimeType ) + { + delete iMimeType; + iMimeType = NULL; + iMimeType = aMimeType.AllocL(); + } + +const TDesC& CSongItem::MimeType() const + { + return *iMimeType; + } + +void CSongItem::SetDuration( TInt aDuration ) + { + iDuration = aDuration; + } + +TInt CSongItem::Duration() const + { + return iDuration; + } + +void CSongItem::SetArtistL( const TDesC& aArtist ) + { + delete iArtist; + iArtist = NULL; + iArtist = aArtist.AllocL(); + } + +const TDesC& CSongItem::Artist() const + { + return *iArtist; + } + +void CSongItem::SetAlbumL( const TDesC& aAlbum ) + { + delete iAlbum; + iAlbum = NULL; + iAlbum = aAlbum.AllocL(); + } + +const TDesC& CSongItem::Album() const + { + return *iAlbum; + } + +void CSongItem::SetYear( TInt aYear ) + { + iYear = aYear; + } + +TInt CSongItem::Year() const + { + return iYear; + } + +void CSongItem::SetAlbumTrack( TInt aAlbumTrack ) + { + iAlbumTrack = aAlbumTrack; + } + +TInt CSongItem::AlbumTrack() const + { + return iAlbumTrack; + } + +void CSongItem::SetGenreL( const TDesC& aGenre ) + { + delete iGenre; + iGenre = NULL; + iGenre = aGenre.AllocL(); + } + +const TDesC& CSongItem::Genre() const + { + return *iGenre; + } + +void CSongItem::SetCommentL( const TDesC& aComment ) + { + delete iComment; + iComment = NULL; + iComment = aComment.AllocL(); + } + +const TDesC& CSongItem::Comment() const + { + return *iComment; + } + +void CSongItem::SetComposerL( const TDesC& aComposer ) + { + delete iComposer; + iComposer = NULL; + iComposer = aComposer.AllocL(); + } + +const TDesC& CSongItem::Composer() const + { + return *iComposer; + } + +void CSongItem::SetRating( TInt aRating ) + { + iRating = aRating; + } + +TInt CSongItem::Rating() const + { + return iRating; + } + +void CSongItem::SetModifiedTime( TTime& aTime ) + { + iModifiedTime = aTime; + } + +const TTime& CSongItem::ModifiedTime() const + { + return iModifiedTime; + } + +void CSongItem::SetFileSize( TInt32 aSize ) + { + iSize = aSize; + } + +TInt32 CSongItem::FileSize() const + { + return iSize; + } + +// ----------------------------------------------------------------------------- +// CSongItem::ExportL +// Exports item as specified in "Metadata format description v3.doc" document. +// ----------------------------------------------------------------------------- +void CSongItem::ExportL( RWriteStream& aStream ) + { + TRACE_FUNC_ENTRY; + + // write object header + + // header id + aStream.WriteUint8L( KSconMetadataHeaderAudio ); + + // header version + aStream.WriteUint8L( KSconMetadataHeaderVersion ); + + WriteUnicodeL( aStream, iTitle->Des(), KSconAudioTitle ); + WriteUnicodeL( aStream, iUri->Des(), KSconAudioFilename ); + + if ( iDuration > -1 ) + { + WriteUInt32FieldL( aStream, iDuration, KSconAudioDuration ); + } + + WriteUnicodeL( aStream, iArtist->Des(), KSconAudioArtist ); + if ( iYear > -1 ) + { + WriteUInt16FieldL( aStream, iYear, KSconAudioYear); + } + if ( iAlbumTrack > -1 ) + { + WriteUInt16FieldL( aStream, iAlbumTrack, KSconAudioAlbumTrack ); + } + WriteUnicodeL( aStream, iAlbum->Des(), KSconAudioAlbum ); + WriteUnicodeL( aStream, iGenre->Des(), KSconAudioGenre ); + WriteUnicodeL( aStream, iComposer->Des(), KSconAudioComposer ); + WriteUnicodeL( aStream, iComment->Des(), KSconAudioComment ); + + if ( iRating > -1 ) + { + WriteUInt16FieldL( aStream, iRating, KSconAudioRating ); + } + WriteUnicodeL( aStream, iMimeType->Des(), KSconAudioMimeType ); + + aStream.WriteUint8L( KSconAudioDate ); + const TUint KDateTimeSize = 7; // Int16 + 5*Int8 = 2 + 5*1 = 7 bytes + aStream.WriteUint32L( KDateTimeSize ); //size + + TDateTime time = iModifiedTime.DateTime(); + aStream.WriteInt16L( time.Year() ); + aStream.WriteInt8L( time.Month()+1 ); // range 1...12 + aStream.WriteInt8L( time.Day()+1 ); + aStream.WriteInt8L( time.Hour() ); + aStream.WriteInt8L( time.Minute() ); + aStream.WriteInt8L( time.Second() ); + + // filesize + WriteUInt32FieldL( aStream, iSize, KSconAudioFileSize ); + + // read album art + CMetaDataUtility* metaDataUtil = CMetaDataUtility::NewL(); + CleanupStack::PushL( metaDataUtil ); + + RArray wantedFields; + CleanupClosePushL(wantedFields); + wantedFields.AppendL(EMetaDataJpeg); + + metaDataUtil->OpenFileL(iUri->Des(), wantedFields); + + const CMetaDataFieldContainer& metaCont = + metaDataUtil->MetaDataFieldsL(); + TPtrC8 data = metaCont.Field8( EMetaDataJpeg ); + if ( data.Length() > 0 ) + { + WriteDataFieldL( aStream, data, KSconAudioJpeg ); + } + + CleanupStack::PopAndDestroy(&wantedFields); + CleanupStack::PopAndDestroy(metaDataUtil); + + aStream.CommitL(); + TRACE_FUNC_EXIT; + } + + +void CSongItem::WriteUnicodeL( RWriteStream& aStream, const TDesC& aData, const TUint8 aFieldId ) + { + aStream.WriteUint8L( aFieldId ); + aStream.WriteUint32L( aData.Size() ); + aStream.WriteL( aData, aData.Length() ); + } + +void CSongItem::WriteDataFieldL( RWriteStream& aStream, const TDesC8& aData, const TUint8 aFieldId ) + { + aStream.WriteUint8L( aFieldId ); + aStream.WriteUint32L( aData.Size() ); + aStream.WriteL( aData, aData.Length() ); + } + +void CSongItem::WriteUInt16FieldL( RWriteStream& aStream, TUint16 aData, const TUint8 aFieldId ) + { + aStream.WriteUint8L( aFieldId ); + const TUint KSizeOfUint16 = 2; // =sizeof(TUint16), hardcoded for performance reasons. + aStream.WriteUint32L( KSizeOfUint16 ); + aStream.WriteUint16L( aData ); + } + +void CSongItem::WriteUInt32FieldL( RWriteStream& aStream, TUint32 aData, const TUint8 aFieldId ) + { + aStream.WriteUint8L( aFieldId ); + const TUint KSizeOfUint32 = 4; // =sizeof(TUint32), hardcoded for performance reasons. + aStream.WriteUint32L( KSizeOfUint32 ); + aStream.WriteUint32L( aData ); + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/101fb0e9.xml Binary file omads/omadsextensions/adapters/mms/group/101fb0e9.xml has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2007-2010 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: build info file for MMS DS adapter +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +./101fb0e9.xml Z:/private/101F99F6/capability/101fb0e9.xml +./mmsdsa_stub.sis /epoc32/data/z/system/install/mmsdsa_stub.sis +../rom/mmsdsa.iby CORE_APP_LAYER_IBY_EXPORT_PATH(mmsdsa.iby) + +PRJ_MMPFILES +./mmsdataprovider.mmp + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/createstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/group/createstub.bat Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Batch file for creating needed stub files. +rem + +makesis -s mmsdsa_stub.pkg \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/mmsdataprovider.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/group/mmsdataprovider.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2006-2010 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: Project definition file for project MMS DS Plugin +* +*/ + + +#include +#include +#include + +TARGET mmsdataprovider.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x101FB0E9 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE snapshotitem.cpp +SOURCE changefinder.cpp +SOURCE mmsdataprovider.cpp +SOURCE mmsdatastore.cpp +SOURCE omadsfolderobject.cpp +SOURCE mmsadaptermsvapi.cpp + +USERINCLUDE ../inc + +APP_LAYER_SYSTEMINCLUDE + +START RESOURCE mmsdataprovider.rss +HEADER +TARGET mmsdataprovider.rsc +TARGETPATH ECOM_RESOURCE_DIR +END + +START RESOURCE mmsdatastore.rss +HEADER +TARGET mmsdatastore.rsc +TARGETPATH RESOURCE_FILES_DIR +END + +DEBUGLIBRARY flogger.lib +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY smldataprovider.lib +LIBRARY smlstoreformat.lib +LIBRARY centralrepository.lib +LIBRARY msgs.lib +LIBRARY bafl.lib +LIBRARY sysutil.lib +LIBRARY mmscodecclient.lib +LIBRARY nsmlchangefinder.lib +LIBRARY SenXml.lib +LIBRARY charconv.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/mmsdsa_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/group/mmsdsa_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,31 @@ +; +; 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: +; +; Languages +&EN + +; Header +#{"MMS DS Plugin"},(0x101FB0E9),1,35,0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Files to install +""-"z:\resource\mmsdatastore.rsc" +""-"z:\resource\mmsdataprovider.rsc" +""-"z:\sys\bin\mmsdataprovider.dll" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/group/mmsdsa_stub.sis Binary file omads/omadsextensions/adapters/mms/group/mmsdsa_stub.sis has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/changefinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/changefinder.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __CHANGEFINDER_H__ +#define __CHANGEFINDER_H__ + +// INCLUDES +#include +#include +#include "snapshotitem.h" + +// DATATYPES +typedef CArrayFixSeg CSnapshotArray; + +// Granularity used with dynamic array +const TInt KSnapshotGranularity = 32; + +// CLASS DECLARATION + +/** +* @brief CChangeFinder Class +* This is a ChangeFinder class, which can be used to track down changes in the message store. +* It's functionality is equal to CSmlChangeFinder, except the functionality is a bit wider +* since this class can also detect "partially updated" items. It means that if only the status +* Bits of the message are changed, it can be detected. It is achieved by using TSnapshotItem +* class, which contain also this information. Because neither of these classes contained virtual +* functionality, the functionality of this class couldn't be inherited from the CSmlChangeFinder +*/ +class CChangeFinder : public CBase + { +public: + + /** + * Class constructor, Creates a new class instance. + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + * @return CChangeFinder*, New ChangeFinder instance. + */ + static CChangeFinder* NewL( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TBool& aHasHistory, + TInt aStreamUid = KNSmlDefaultSnapshotStreamUID ); + + /** + * Class destructor. + */ + ~CChangeFinder(); + + /** + * Close ChangeFinder object, stores snapshot. + */ + void CloseL(); + + /** + * Reset change information, makes all content new from ChangeFinder point of view. + */ + void ResetL(); + + /** + * Find changed items by comparing snapshots. + * + * @param aChangedUids IN: Array for results. + */ + void FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ); + + /** + * Find deleteed items by comparing snapshots. + * + * @param aDeletedUids IN: Array for results. + */ + void FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ); + + /** + * Find new items by comparing snapshots. + * + * @param aNewUids IN: Array for results. + */ + void FindNewItemsL(CNSmlDataItemUidSet& aNewUids); + + /** + * Find moved items by comparing snapshots. + * + * @param aMovedUids IN: Array for results. + */ + void FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ); + + /** + * Add item to snapshot, it is no loger reported. + * + * @param aItem IN: item to add. + */ + void ItemAddedL( const TSnapshotItem& aItem ); + + /** + * Delete item from snapshot, it is no loger reported. + * + * @param aItem IN: item to delete. + */ + void ItemDeletedL( const TSnapshotItem& aItem ); + + /** + * Update item to snapshot, it is no loger reported. + * + * @param aItem IN: item to update. + */ + void ItemUpdatedL( const TSnapshotItem& aItem ); + + /** + * Move item within snapshot, it is no loger reported. + * + * @param aItem IN: item to move. + */ + void ItemMovedL( const TSnapshotItem& aItem ); + + /** + * Commit all changes to snapshot, there's nothing to report anymore. + */ + void CommitChangesL(); + + /** + * Commit a set of items to snapshot, these items won't be reported anymore. + * + * @param aUids IN: a set of items to commit. + */ + void CommitChangesL( const MSmlDataItemUidSet& aUids ); + + /** + * Sets new snapshot to compare against. + * + * @param aNewSnapshot IN: a new snapshot. + */ + void SetNewSnapshot( CSnapshotArray* aNewSnapshot ); + + /** + * Retrieves DataStore id number. + * + * @return TInt64, DataStore id. + */ + TInt64 DataStoreUid() const; + + /** + * Sets DataStore id number. + * + * @param aUid IN: a new datastore id. + */ + void SetDataStoreUid( TInt64 aUid ); + + /** + * Checks whether specific item can be partially updated. + * + * @param aUid IN: item id. + * @return TBool Result, ETrue if the item contains only status change (read<->unread). + */ + TBool UpdatePartialL( TSmlDbItemUid& aUid ); + +protected: + + /** + * C++ Constructor + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + */ + CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TInt aStreamUid ); + + /** + * 2nd-phase Constructor + * + * @param aHasHistory IN: ETrue, if there was synchronization history. + */ + void ConstructL( TBool& aHasHistory ); + +private: + + /** + * Allows access to streams. + */ + MSmlSyncRelationship& iSyncRelationship; + + /** + * New snapshot to compare against. + */ + CSnapshotArray* iCurrentSnapshot; + + /** + * Current snapshot. + */ + CSnapshotArray* iOldSnapshot; + + /** + * Key that is used in sorting snapshot. + */ + TKeyArrayFix iKey; + + /** + * Stream id number to access sync relationship. + */ + TInt iStreamUid; + + /** + * Data store id number. + */ + TInt64 iDataStoreUid; + }; + +#endif // __CHANGEFINDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/logger.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,130 @@ +/* +* Copyright (c) 2005-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: Logging macros used by DS plug-in adapters +* +*/ + + +#ifndef __LOGGER_H__ +#define __LOGGER_H__ + +#ifdef _DEBUG + + // Define this to enable file logging + #define __FLOGGING__ + + #include + #include + #include + #include + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT(KLogDir,"MMS"); + _LIT(KLogFile,"MMSDataproviderLog.txt"); + _LIT( KLogFormat, "[MMSDS] %S"); + + _LIT(KTracePrefix16, "[MMSDS] "); + _LIT8(KTracePrefix8, "[MMSDS] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + /** + * Old logging macros + */ + #ifdef __FLOGGING__ + #define LOG( AAA ) RFileLogger::Write( KLogDir,KLogFile,EFileLoggingModeAppend,AAA ) + #else + #define LOG( AAA ) + #endif + + + // old function loggin macros + #define LOGGER_ENTERFN( name ) {TRACE_FUNC_ENTRY;} + #define LOGGER_LEAVEFN( name ) {TRACE_FUNC_EXIT;} + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #if defined ( __FLOGGING__ ) + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else // no _DEBUG defined + + #define LOG( A ) + + #define LOGGER_ENTERFN( name ) + #define LOGGER_LEAVEFN( name ) + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text,par1 ) + #define LOGGER_WRITE_2( text,par1,par2 ) + + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + + +#endif // _DEBUG + +#endif // __LOGGER_H__ + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/mmsadaptermsvapi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/mmsadaptermsvapi.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,155 @@ +/* +* 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: CMmsAdapterMsvApi header +* +*/ + + +#ifndef MMSADAPTERMSVAPI_H +#define MMSADAPTERMSVAPI_H + +// INCLUDES +#include // TMsvId + +// CONSTANTS +const TInt KMsvMyFoldersEntryIdValue = 0x1008; +const TInt KMsvMyFoldersTemplatesFolderId = 0x1009; + +// FORWARD DECLARATIONS +class CMsvSession; + + +// CLASS DECLARATION + +/** +* Class CMmsAdapterMsvApi +* Internal class that provides access to SMS message store. +*/ +class CMmsAdapterMsvApi : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * + * @param aMsvSession IN: Access to message server + * + */ + static CMmsAdapterMsvApi* NewL(CMsvSession& aMsvSession); + + /** + * Destructor. + */ + virtual ~CMmsAdapterMsvApi(); + + private: // Private constructor functions + + /** + * C++ default constructor. + * C++ default constructor can NOT contain any code, that + * might leave. + * + * @param aMsvSession IN: Access to message server + * + */ + CMmsAdapterMsvApi(CMsvSession& aMsvSession); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // New functions + + + /** + * Delete user folder under My Folders + * + * @param aUid IN: the index to the folder, which will be deleted + * + * @return KErrNone in success. KErrInUse if folder was not deleted because it was not empty. + */ + TInt DeleteUserFolderL( TMsvId aUid ); + + /** + * Valid folder checks if the folder is valid. + * The caller of the function can set, if Outbox folder is valid or not. + * + * @param aFolder folder + * @param aOutboxValid if the MM is outbox is valid folder or not + * + * @return ETrue when the folder is valid. + * @return EFalse when the folder is not valid. + */ + TBool ValidFolderL( TMsvId aFolder , TBool aOutboxValid = ETrue ); + + /** + * Creates new user defined folder + * + * @param aFolder OUT: index of the new folder + * @param aName IN: name of the new folder + * + * @return KErrNone or error + */ + TInt AddUserFolderL( TMsvId& aFolder, const TDesC& aName ); + + /** + * Updates name of user defined folder + * + * @param aFolder IN: index of the folder + * @param aName IN: new name of the folder + * + * @return KErrNone or error + */ + TInt UpdateUserFolderL( TMsvId aFolder, const TDesC& aName ); + + /** + * Searches user folder with given UID + * + * @param aFolder IN: Folder UID + * @param aName OUT: name of found user folder + * @param aDate OUT: time stamp of found user folder + * + * @return Return value indicates whether folder was found or not + */ + TBool FindUserFolderL(TMsvId aFolder, TPtrC& aName, TTime& aDate); + + /** + * Searches user folder with given UID + * + * @param aFolder IN: Folder UID + * + * @return Return value indicates whether folder was found or not + */ + TBool FindUserFolderL(TMsvId aFolder); + + private: // Internal functions + + /** + * Check whether folder with given name exists + * + * @param aName IN: Folder name + * @parem aFolder OUT: Folder UID if matching folder was found. + * + * @return Return value indicates whether folder was found or not + */ + TBool FindUserFolderL(const TDesC& aName, TMsvId& aFolder); + + private: // Data + + CMsvSession& iSession; + + }; + +#endif //SMSADAPTERMSVAPI_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/mmsdataprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/mmsdataprovider.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2005-2010 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __MMSDATAPROVIDER_H__ +#define __MMSDATAPROVIDER_H__ + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CMmsDataStore; +class CSmlDataStoreFormat; + +/** +* @brief This class is derived from ECom Data Provider plugin-interface (CSmlDataProvider). +* It makes it possible to synchronize MMS messages from the device message store. +*/ +class CMmsDataProvider : public CSmlDataProvider, public MMsvSessionObserver + { + +public: + + /** + * Constructor. + * + * @return CMmsDataProvider*, a new CMmsDataProvider instance. + */ + static CMmsDataProvider* NewL(); + + /** + * Destructor. + */ + virtual ~CMmsDataProvider(); + + /** + * Callback from MMsvSessionObserver. + */ + void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 ); + +protected: // Inherited from CSmlDataProvider + + virtual void DoOnFrameworkEvent( TSmlFrameworkEvent, TInt aParam1, TInt aParam2 ); + + virtual TBool DoSupportsOperation( TUid aOpId ) const; + + virtual const CSmlDataStoreFormat& DoStoreFormatL(); + + virtual CDesCArray* DoListStoresLC(); + + virtual const TDesC& DoDefaultStoreL(); + + virtual CSmlDataStore* DoNewStoreInstanceLC(); + + virtual void DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& aServerDataStoreFormat, + RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual void DoCheckServerFiltersL( RPointerArray& aFilters, + TSyncMLFilterChangeInfo& aChangeInfo ); + + virtual const RPointerArray& DoSupportedServerFiltersL(); + + virtual TBool DoSupportsUserSelectableMatchType() const; + + virtual HBufC* DoGenerateRecordFilterQueryLC( const RPointerArray& aFilters, + TSyncMLFilterMatchType aMatch, TDes& aFilterMimeType, + TSyncMLFilterType& aFilterType, TDesC& aStoreName ); + + virtual void DoGenerateFieldFilterQueryL( const RPointerArray& aFilters, + TDes& aFilterMimeType, RPointerArray& aProperties, TDesC& aStoreName ); + +private: + + /** + * C++ Constructor. + */ + CMmsDataProvider(); + + /** + * 2nd-phase Constructor. + */ + void ConstructL(); + + /** + * Creates new DataStore format. + */ + CSmlDataStoreFormat* DoOwnStoreFormatL(); + +private: + + /** + * String pool, used in store format creation. + */ + RStringPool iStringPool; + + /** + * Data store format. + */ + CSmlDataStoreFormat* iOwnStoreFormat; + + /** + * Supported filters (none supported at the moment). + */ + RPointerArray iFilters; + + /** + * File system handle. + */ + RFs iRFs; + + /** + * Message store handle. + */ + CMsvSession* iMsvSession; + + /** + * Reserved pointer for future extension. + */ + TAny* iReserved; + + }; + +#endif // __MMSDATAPROVIDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/mmsdataproviderdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/mmsdataproviderdefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#ifndef __MMSDATAPROVIDERDEFS_H__ +#define __MMSDATAPROVIDERDEFS_H__ + +#include +#include + +// ------------------------------------------------------------------------------------------------ +// Databases +// ------------------------------------------------------------------------------------------------ +// Database name +_LIT( KNSmlDefaultLocalDbName, "MmsSyncLocalDb" ); + +// Resource file for CSmlDataStoreFormat in SIS installation +_LIT(KMmsStoreFormatRsc,"mmsdatastore.rsc"); + +// Must be like below in flash image +_LIT(KMmsStoreFormatRscRom,"z:mmsdatastore.rsc"); + +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ +// max foldername +const TInt KMaxFolderNameLength = 50; + +// Implementation uid +const TUint KMmsDataProviderImplUid = 0x101FB0E9; + +// ------------------------------------------------------------------------------------------------ +// Macros +// ------------------------------------------------------------------------------------------------ +#define SAFEDELETE(x) {if(x) {delete x; x = NULL;}} +#define SAFEDELETEARRAY(x) {if(x) {delete[] x; x = NULL;}} + +#endif // __MMSDATAPROVIDERDEFS_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/mmsdatastore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/mmsdatastore.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,358 @@ +/* +* Copyright (c) 2005-2010 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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#ifndef __MMSDATASTORE_H__ +#define __MMSDATASTORE_H__ + +// INCLUDES +#include "mmsdataproviderdefs.h" +#include "changefinder.h" + + +// FORWARD DECLARATIONS +class CMsvSession; +class CNSmlDataItemUidSet; +class CMmsCodecClient; +class CMmsAdapterMsvApi; +class CMsvOperationActiveSchedulerWait; +class TNSmlSnapshotItem; +class COMADSFolderObject; + +/** +* @brief This class is derived from ECom Data Store plugin-interface (CSmlDataStore). +* It performs the actual synchronization commands, which are received from +* the DS engine. +*/ +class CMmsDataStore : public CSmlDataStore + { +public: + + /** + * Constructor + * + * @return CMmsDataStore*, a new CSmsDataStore instance. + */ + static CMmsDataStore* NewL(CMsvSession &aMsvSession); + + /** + * Destructor + */ + virtual ~CMmsDataStore(); + +protected: + + // Virtual functionality from CSmlDataStore, for comments see the CSmlDataStore header file + virtual void DoOpenL(const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus); + virtual void DoCancelRequest(); + virtual const TDesC& DoStoreName() const; + virtual void DoBeginTransactionL(); + virtual void DoCommitTransactionL(TRequestStatus& aStatus); + virtual void DoRevertTransaction(TRequestStatus& aStatus); + virtual void DoBeginBatchL(); + virtual void DoCommitBatchL(RArray& aResultArray, TRequestStatus& aStatus); + virtual void DoCancelBatch(); + virtual void DoSetRemoteStoreFormatL(const CSmlDataStoreFormat& aServerDataStoreFormat); + virtual void DoSetRemoteMaxObjectSize(TInt aServerMaxObjectSize); + virtual TInt DoMaxObjectSize() const; + virtual void DoOpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, + TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, TRequestStatus& aStatus); + virtual void DoCreateItemL(TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& aMimeVer, TRequestStatus& aStatus); + virtual void DoReplaceItemL(TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool aFieldChange, TRequestStatus& aStatus); + virtual void DoReadItemL(TDes8& aBuffer); + virtual void DoWriteItemL(const TDesC8& aData); + virtual void DoCommitItemL(TRequestStatus& aStatus); + virtual void DoCloseItem(); + virtual void DoMoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus); + virtual void DoDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + virtual void DoSoftDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus); + virtual void DoDeleteAllItemsL(TRequestStatus& aStatus); + virtual TBool DoHasSyncHistory() const; + virtual const MSmlDataItemUidSet& DoAddedItems() const; + virtual const MSmlDataItemUidSet& DoDeletedItems() const; + virtual const MSmlDataItemUidSet& DoSoftDeletedItems() const; + virtual const MSmlDataItemUidSet& DoModifiedItems() const; + virtual const MSmlDataItemUidSet& DoMovedItems() const; + virtual void DoResetChangeInfoL(TRequestStatus& aStatus); + virtual void DoCommitChangeInfoL(TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems); + virtual void DoCommitChangeInfoL(TRequestStatus& aStatus); + +private: + + /** + * C++ Constructor. + */ + CMmsDataStore(); + + /** + * 2nd-phase Constructor. + * + * @param aMsvSession IN: a session handle to message store + */ + void ConstructL(CMsvSession &aMsvSession); + + /** + * Registers snapshot to ChangeFinder. + */ + void RegisterSnapshotL() const; + + /** + * Registers a single folder to snapshot, used by RegisterSnapshotL. + * + * @param aSnapshot IN: a snapshot item array. + * @param aId IN: folder id. + * @return TInt, Not used. + */ + TInt RegisterFolderL(CSnapshotArray* aSnapshot, const TMsvId& aId) const; + + /** + * Deletes all messages in a specified folder + * + * @param aId IN: a folder id, which is to be emptied + * @return TInt, not used. + */ + TInt DeleteAllMessagesInFolderL(TMsvId aId); + + /** + * Checks whether the specified MMS message exists in message store. + * + * @param aId IN: message ID + * @return TBool, ETrue if the item id exists in the message store. Otherwise EFalse. + */ + TBool MmsItemExists(TMsvId aUid); + + /** + * This function resolves the status bits from the message entry + * + * @param aUnread IN: the status bits are determined from this value + * @return TUint8, Status byte. + */ + TUint8 ResolveStatusBits(TBool aUnread); + + /** + * This function reads data of opened message from MMS engine to client buffer. + * Data is retriveved from MMS engine in chunks whose size can be less that + * client buffer size, for effectivity client buffer is allways filled with data. + * Recursive algorith is used for that. + * + * @param aBuffer OUT: client data buffer + * @return TInt, KErrNone or KErrOverflow if all MMS message data has been read. + */ + TInt ReadDataRecursively(TDes8& aBuffer); + + /** + * This function updates MMS message status + * + * @param aId IN: Identifies MMS message in message store + * @param aUnread IN: New status (unread/read) + */ + void UpdateMmsStatusL(TMsvId aId, TBool aUnread); + + /** + * Registers user folder messages to snapshot, used by RegisterSnapshotL. + * + * @param aSnapshot IN: a snapshot item array. + * @return TInt, Not used. + */ + TInt RegisterUserFoldersL(CSnapshotArray* aSnapshot) const; + + /** + * Cleans all user folders from SMS messages + * + * @return KErrNone in case of success + */ + TInt CleanUserFoldersL(); + +private: // Data members + + /** + * @brief Data Store states: + * EMmsClosed: Store is closed. + * EMmsOpenAndWaiting: Store is ready to be used. + * EMmsItemOpen: Item is being read. + * EMmsItemCreating: Item is being created. + * EMmsItemUpdating: Item is being updated. + */ + enum TState + { + EMmsClosed = 0, + EMmsOpenAndWaiting, + EMmsItemOpen, + EMmsItemOpenFieldUpdate, + EMmsItemCreating, + EMmsItemUpdating, + EFolderOpen, + EFolderCreating, + EFolderUpdating + }; + + /** + * A flag indicating the existence of synchronization history. + */ + TBool iHasHistory; + + /** + * Flag indicating, whether database is opened. + */ + TBool iDataBaseOpened; + + /** + * The state of the active object. + */ + TState iCurrentState; + + /** + * Access to streams, used by ChangeFinder. + */ + MSmlSyncRelationship* iContext; + + /** + * Key that is used in sorting snapshot. + */ + const TKeyArrayFix iKey; + + /** + * Change finder, used to determine db modifications. + */ + CChangeFinder* iChangeFinder; + + /** + * Used to access MMS message store + */ + CMmsCodecClient* iCodecClient; + + /** + * Used to access message folders + */ + CMmsAdapterMsvApi* iMsvApi; + + /** + * Waiter object for asynchronous operations + */ + CMsvOperationActiveSchedulerWait* iMsvWait; + + /** + * Message server session handle + */ + CMsvSession* iMsvSession; + + /** + * The location for temporary data + */ + CBufFlat* iDataBuffer; + + /** + * Counter of partial data reading + */ + TInt iReadCounter; + + /** + * To store information whether current MMS message is unread + */ + TBool iUnread; + + /** + * Data chunk used in partial data reading from MMS engine + */ + TPtrC8 iReadDataChunk; + + /** + * Current read position at the data chunk from MMS engine + */ + TInt iReadPosition; + + /** + * Indicates wheter this is the last data chunk from MMS engine + */ + TBool iLastDataChunk; + + /** + * Indicates whether all data related to current message has been read + */ + TBool iReadAllData; + + /** + * Counter of partial data writing + */ + TInt iWriteCounter; + + /** + * Indicates wheter this was only status update + */ + TInt iWrittenDataLength; + + /** + * Stores the currently active message id. + */ + TMsvId iCurrentId; + + /** + * Pointer to the variable, receiving the created Uid. + */ + TSmlDbItemUid* iCreatedUid; + + /** + * Stores the parent id of currently active message. + */ + TMsvId iParentId; + + /** + * Used to get asynchronous return values. + */ + TRequestStatus* iCallerStatus; + + /** + * Used to store new items. + */ + CNSmlDataItemUidSet* iNewItems; + + /** + * Used to store deleted items. + */ + CNSmlDataItemUidSet* iDeletedItems; + + /** + * Used to store updated items. + */ + CNSmlDataItemUidSet* iUpdatedItems; + + /** + * Used to store moved items. + */ + CNSmlDataItemUidSet* iMovedItems; + + /** + * Used to store soft-deleted items (not supported). + */ + CNSmlDataItemUidSet* iSoftDeletedItems; + + /** + * Used to parse OMA DS Folder Objects + */ + COMADSFolderObject* iFolderObjectParser; + + /** + * Reserved pointer for future extension. + */ + TAny* iReserved; + }; + +#endif // __MMSDATASTORE_H__ + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/omadsfolderobject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/omadsfolderobject.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,91 @@ +/* +* Copyright (c) 2005-2010 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: OMA DS Folder object XML parser +* +*/ + + +#ifndef __OMADSFOLDEROBJECT_H__ +#define __OMADSFOLDEROBJECT_H__ + +#include +#include +#include "mmsdataproviderdefs.h" + +const TInt KMaxElementLength = 255; +const TInt KMaxXmlLineLength = 1024; + +class COMADSFolderObject : public CBase, public MSenContentHandlerClient + { +public: + + static COMADSFolderObject* NewLC(); + static COMADSFolderObject* NewL(); + ~COMADSFolderObject(); + + // Get methods + inline const TDesC& GetName() const {return iName;} + inline const TDateTime& GetCreatedDate() const {return iCreatedDate;} + inline const TDateTime& GetModifiedDate() const {return iModifiedDate;} + + // Set methods + inline void SetName(const TDesC& aName) {iName.Copy(aName);} + inline void SetCreatedDate(const TDateTime& aDateTime) {iCreatedDate = aDateTime;} + inline void SetModifiedDate(const TDateTime& aDateTime) {iModifiedDate = aDateTime;} + + // Import & export + TInt ImportFolderXml(const TDesC8& aData); + TInt ImportFolderXml(RFs& aFs, const TDesC& aFilename); + void ExportFolderXmlL(TDes8& aBuffer); + void ExportFolderXmlL(CBufBase& aBuffer); + + // MSenContentHandlerClient virtual functionality + TInt StartDocument(); + TInt EndDocument(); + TInt StartElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName, + const RAttributeArray& apAttrs); + TInt EndElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName); + TInt Characters(const TDesC8& aBuf, TInt aStart, TInt aLength); + TInt Error(TInt aErrorCode); + +private: + + CSenXmlReader* iXmlReader; + void ConstructL(); + TBuf8 iCurrentElement; + TBuf8 iTemp; + + TBuf iName; + TDateTime iCreatedDate; + TDateTime iModifiedDate; + TInt iError; + + void Reset(); + TInt ParseDateString(const TDesC8& aString, TDateTime& aDateTime); + + CBufBase* iBuffer; + TInt iWriteBufPosition; + TInt iWriteBufSize; + TDes8* iDesc; + + void ExportL(); + void WriteL(const TDesC &aData); + void WriteEncodedXmlL(const TDesC &aData); + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/inc/snapshotitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/inc/snapshotitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2005-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: Private snapshot item header +* +*/ + + +#ifndef __SNAPSHOTITEM_H__ +#define __SNAPSHOTITEM_H__ + +// INCLUDES +#include +#include +#include "mmsdataproviderdefs.h" + +typedef TBuf TFolderName; + +// CLASS DECLARATION + +/** +* @brief TSnapshotItem +* This class represents a single item in the ChangeFinder snapshot. +* It's derived from the generic snapshot item and extended +* to contain the read/unread information, which is mandatory when +* partial update of the messages is required. +*/ + +class TSnapshotItem : public TNSmlSnapshotItem + { +public: + + /** + * Constructor + */ + TSnapshotItem(); + + /** + * Constructor + * + * @param aItemId IN: id of the item. + * @param aParent IN: parent item, 0 as default. + * @param aUnread IN: read/unread information, the default is read. + */ + TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent = 0, TBool aUnread = EFalse ); + + /** + * Writes the item to a stream. + * + * @param aStream IN: a reference to a stream, where this item is to be written. + */ + void ExternalizeL( RWriteStream& aStream ) const; + + /** + * Reads item from a stream. + * + * @param aStream IN: a reference to a stream, where this item is read from. + */ + void InternalizeL( RReadStream& aStream ); + + /** + * Sets the read flag + * + * @param aState IN: a new state. + */ + void SetUnread( TBool aState ); + + /** + * Sets the read flag + * + * @return TBool, ETrue if the item is not read and EFalse if it has been read. + */ + TBool Unread() const; + + void SetFolderNameL( const TDesC& aFolderName ); + + const TDesC& FolderName() const; + +private: + + /** + * Read / Unread information + */ + TBool iUnread; + + TFolderName iFolderName; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/rom/mmsdsa.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/rom/mmsdsa.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2007-2010 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: IBY file for MMS DS adapter binaries +* +*/ + + +#ifndef __MMSDSA_IBY__ +#define __MMSDSA_IBY__ + +ECOM_PLUGIN(mmsdataprovider.dll,mmsdataprovider.rsc) +data=DATAZ_\RESOURCE_FILES_DIR\mmsdatastore.rsc RESOURCE_FILES_DIR\mmsdatastore.rsc +data=DATAZ_\private\101F99F6\capability\101fb0e9.xml private\101F99F6\capability\101fb0e9.xml + +data=ZSYSTEM\install\mmsdsa_stub.sis system\install\mmsdsa_stub.sis + +#endif //__MMSDSA_IBY__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/sis/backup_registration.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/sis/mms.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/sis/mms.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,43 @@ +; +; Copyright (c) 2010 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: PKG file for MMS DS adapter + + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"MMS DS Plugin"},(0x101FB0E9),1,35,0,TYPE=SA, RU +; + + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + + +"\epoc32\data\z\resource\mmsdatastore.rsc" -"c:\resource\mmsdatastore.rsc" +"\epoc32\data\z\resource\plugins\mmsdataprovider.rsc" -"c:\resource\plugins\mmsdataprovider.rsc" +"\epoc32\release\ARMV5\UREL\mmsdataprovider.dll" -"c:\sys\bin\mmsdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\101fb0e9.xml" -"c:\private\101F99F6\import\101fb0e9.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FB0E9\backup_registration.xml" \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/sis/mms_debug.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/sis/mms_debug.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,41 @@ +; +; Copyright (c) 2010 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: PKG file for MMS DS adapter + + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"MMS DS Plugin"},(0x101FB0E9),1,35,0,TYPE=SA, RU +; + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\mmsdatastore.rsc" -"c:\resource\mmsdatastore.rsc" +"\epoc32\data\z\resource\plugins\mmsdataprovider.rsc" -"c:\resource\plugins\mmsdataprovider.rsc" +"\epoc32\release\armv5\udeb\mmsdataprovider.dll" -"c:\sys\bin\mmsdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\101fb0e9.xml" -"c:\private\101F99F6\import\101fb0e9.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\101FB0E9\backup_registration.xml" \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/changefinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/changefinder.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,697 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include "changefinder.h" +#include "logger.h" + +const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version + +// ----------------------------------------------------------------------------- +// CChangeFinder::NewL +// Static function to create CChangeFider object(s) +// ----------------------------------------------------------------------------- +CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, + TBool& aHasHistory, TInt aStreamUid ) + { + CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); + CleanupStack::PushL( self ); + self->ConstructL( aHasHistory ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CChangeFinder +// Constructor for the class +// ----------------------------------------------------------------------------- +CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, TInt aStreamUid ) : +iSyncRelationship( aSyncRelationship ), +iKey( aKey ), +iStreamUid( aStreamUid ), +iDataStoreUid( KErrNotFound ) + { + + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::~CChangeFinder +// Destructor for the class, closes the ChangeFinder and writes snapshot to stream +// ----------------------------------------------------------------------------- +CChangeFinder::~CChangeFinder() + { + LOGGER_ENTERFN( "CChangeFinder::~CChangeFinder" ); + TInt error; + TRAP( error, CloseL() ); + if ( error != KErrNone ) + { + LOGGER_WRITE( "CChangeFinder::~CChangeFinder, CloseL failed." ); + } + + delete iCurrentSnapshot; + delete iOldSnapshot; + + LOGGER_LEAVEFN( "CChangeFinder::~CChangeFinder" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ConstructL +// 2nd phase constructor for the class, reads snapshot from stream +// ----------------------------------------------------------------------------- +void CChangeFinder::ConstructL( TBool& aHasHistory ) + { + LOGGER_ENTERFN( "CChangeFinder::ConstructL" ); + + aHasHistory = EFalse; + RReadStream readStream; + + TUid streamId; + streamId.iUid = iStreamUid; + + aHasHistory = iSyncRelationship.IsStreamPresentL(streamId); + + if (aHasHistory) + { + iSyncRelationship.OpenReadStreamLC(readStream, streamId); + + // Read the index, first create snapshot array + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + + // Read used format version + TUint formatVer = readStream.ReadUint32L(); + if ( formatVer != KSnapshotFormatVersion ) + { + // Wrong version, do not try to import data + LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); + aHasHistory = EFalse; + CleanupStack::PopAndDestroy(); // readStream + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + return; + } + + // Read item count + TInt count = readStream.ReadUint32L(); + + // Read items + for ( TInt i=0; iInsertIsqL( item, iKey ); + } + + readStream.Close(); + readStream.Pop(); + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); + } + + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CloseL +// Closes ChangeFinder object and writes snapshot to stream +// ----------------------------------------------------------------------------- +void CChangeFinder::CloseL() + { + LOGGER_ENTERFN( "CChangeFinder::CloseL" ); + + // Write to stream + RWriteStream writeStream; + + TUid streamId; + streamId.iUid = iStreamUid; + + // Open write stream + iSyncRelationship.OpenWriteStreamLC( writeStream, streamId ); + + // Write used format version + writeStream.WriteUint32L( KSnapshotFormatVersion ); + + // Write item count + TInt count(0); + if ( iOldSnapshot ) + { + count = iOldSnapshot->Count(); + } + writeStream.WriteUint32L(count); + + // Write items + for (TInt i=0; iAt( i ); + item.ExternalizeL( writeStream ); + } + + writeStream.CommitL(); + writeStream.Close(); + writeStream.Pop(); + + LOGGER_LEAVEFN( "CChangeFinder::CloseL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ResetL +// Resets synchronization history, all contetn is considered new after this call +// ----------------------------------------------------------------------------- +void CChangeFinder::ResetL() + { + LOGGER_ENTERFN( "CChangeFinder::ResetL" ); + // Delete old change information + if ( iOldSnapshot ) + { + LOGGER_WRITE("iOldSnapshot->Reset()"); + iOldSnapshot->Reset(); + } + + // Write 'null' data to file, + // this removes change history from the file + CloseL(); + + LOGGER_LEAVEFN( "CChangeFinder::ResetL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindChangedItemsL +// Compares snapshots, finds changed items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindChangedItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + // Find this entry from the old snapshot + if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + // Compare times to see whether this was changed or item was read + if ( ( oldItem.LastChangedDate() != currentItem.LastChangedDate() ) + || ( oldItem.Unread() && !currentItem.Unread() ) + || ( !oldItem.Unread() && currentItem.Unread() ) + || ( oldItem.FolderName().Compare( currentItem.FolderName() ) != 0 ) ) + { + aChangedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was changed.", currentItem.ItemId() ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindChangedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindDeletedItemsL +// Compares snapshots, finds deleted items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindDeletedItemsL" ); + + if ( !iOldSnapshot ) + { + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iOldSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iOldSnapshot->At( i ); + + // If there's no current snapshot, this definately is deleted item + if ( !iCurrentSnapshot ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the current snapshot. + else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindNewItemsL +// Compares snapshots, finds new items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindNewItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindNewItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // If there's no old snapshot, all items are new + if ( !iOldSnapshot ) + { + aNewUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the old snapshot. + else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aNewUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindNewItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindMovedItemsL +// Compares snapshots, finds moved items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindMovedItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // Find this entry from the old snapshot + if(iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Report only moved items in which only parent id has been changed + if ( oldItem.ParentId() != currentItem.ParentId() + && oldItem.LastChangedDate() == currentItem.LastChangedDate() + && !(oldItem.Unread() && !currentItem.Unread() ) + && !(!oldItem.Unread() && currentItem.Unread() ) ) + { + aMovedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was moved.", currentItem.ItemId() ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindMovedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemAddedL +// Adds item to snapshot, this item is no longer considered new +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemAddedL" ); + + // Add this to old snapshot, if there's no old snapshot it must be created + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); + + TRAPD( error, iOldSnapshot->InsertIsqL( aItem, iKey ) ); + if ( error == KErrAlreadyExists ) + { + // It was already committed, no actions required + LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists" ); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); + User::Leave( error ); + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemAddedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemDeletedL +// Removes item to snapshot, this item is no longer considered deleted +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemDeletedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemDeleted" ); + + LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::ItemDeleted leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + // Delete item from the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->Delete( index ); + } + else // Skip, there wasn't such entry + { + LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemDeleted" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemUpdatedL +// Updates item to snapshot, this item is no longer considered changed +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemUpdatedL" ); + + LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + oldItem = aItem; + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemUpdatedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemMovedL +// Moves item within snapshot, this item is no longer considered moved +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemMovedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemMovedL" ); + + LOGGER_WRITE_1( "Moving item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item's parent in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + oldItem.SetParentId( aItem.ParentId() ); + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + } + + LOGGER_LEAVEFN("CChangeFinder::ItemMovedL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL() + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Delete everything from the old snapshot + iOldSnapshot->Reset(); + + // Loop through all the items in current snapshot + TInt count = iCurrentSnapshot->Count(); + + // Copy everything from current to old snapshot + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& newItem = iCurrentSnapshot->At( i ); + + // Commit it to the old array. + TRAPD( error, iOldSnapshot->InsertIsqL( newItem, iKey ) ); + if ( error == KErrAlreadyExists ) + { + // It was already committed, this is an internal error of change finder + LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists." ); + User::Leave( error ); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); + User::Leave( error ); + } + } + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot, affects only a specified group of items +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + // This function commits changes from current snapshot to old snapshot + // But commits only the entries in the parameter array + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Use only these uid values + TInt index; + TInt count = aUids.ItemCount(); + + for ( TInt i=0; i < count; i++ ) + { + TSmlDbItemUid uid = aUids.ItemAt( i ); + TSnapshotItem item( uid ); + // Let's see if this uid exists in the current snapshot + if ( iCurrentSnapshot->FindIsq( item, iKey, index ) == KErrNone ) + { + // This is the new item + const TSnapshotItem& newItem = iCurrentSnapshot->At( index ); + + // Let's see if we can find the old one + if ( iOldSnapshot->FindIsq( item, iKey, index ) == KErrNone ) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Copy new item over the old one, this'll commit the change + oldItem = newItem; + } + else // This entry was not found. It means that it is new one + { + // Commit it to the old array. + ItemAddedL( newItem ); + } + } + else + { + // This item was deleted from the current snapshot. + TSnapshotItem toDelete( item ); + ItemDeletedL( toDelete ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetNewSnapshot +// Sets new snapshot (to be compared against), ChangeFinder takes ownership +// ----------------------------------------------------------------------------- +void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) + { + LOGGER_ENTERFN( "CChangeFinder::SetNewSnapshot" ); + + // Delete existing snapshot + delete iCurrentSnapshot; + + // Set submitted snapshot as active + iCurrentSnapshot = aNewSnapshot; + LOGGER_LEAVEFN( "CChangeFinder::SetNewSnapshot" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::DataStoreUid +// returns stored data store id number +// ----------------------------------------------------------------------------- +TInt64 CChangeFinder::DataStoreUid() const + { + LOGGER_ENTERFN( "CChangeFinder::DataStoreUid" ); + LOGGER_LEAVEFN( "CChangeFinder::DataStoreUid" ); + return iDataStoreUid; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetDataStoreUid +// Sets data store id number +// ----------------------------------------------------------------------------- +void CChangeFinder::SetDataStoreUid( TInt64 aUid ) + { + LOGGER_ENTERFN( "CChangeFinder::SetDataStoreUid" ); + iDataStoreUid = aUid; + LOGGER_LEAVEFN( "CChangeFinder::SetDataStoreUid" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::UpdatePartialL +// Returns ETrue if item can be updated partially (only status bits are changed) +// ----------------------------------------------------------------------------- +TBool CChangeFinder::UpdatePartialL( TSmlDbItemUid& aUid ) + { + LOGGER_ENTERFN( "CChangeFinder::UpdatePartialL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::UpdatePartialL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + TInt index; + TSnapshotItem item( aUid ); + // Find from current snapshot, if not found -> deleted + if ( iCurrentSnapshot->FindIsq( item, iKey, index ) != KErrNone ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + // Current item + const TSnapshotItem& currentItem = iCurrentSnapshot->At( index ); + + // Old item, if not found -> added + if ( iOldSnapshot->FindIsq( item, iKey, index ) != KErrNone ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + else + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Status bits must have been changed to allow partial update + if ( oldItem.Unread() == currentItem.Unread() ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + // Date should be same, otherwise 'just' changed item + if ( oldItem.LastChangedDate() == currentItem.LastChangedDate() ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return ETrue; + } + + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/mmsadaptermsvapi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/mmsadaptermsvapi.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,313 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "mmsadaptermsvapi.h" +#include "logger.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::NewL +// ----------------------------------------------------------------------------- +// + CMmsAdapterMsvApi* CMmsAdapterMsvApi::NewL( CMsvSession& aMsvSession ) + { + CMmsAdapterMsvApi* self = new( ELeave ) CMmsAdapterMsvApi( aMsvSession ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::~CMmsAdapterMsvApi() +// ----------------------------------------------------------------------------- +// +CMmsAdapterMsvApi::~CMmsAdapterMsvApi() + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::CMmsAdapterMsvApi +// ----------------------------------------------------------------------------- +// +CMmsAdapterMsvApi::CMmsAdapterMsvApi( CMsvSession& aMsvSession ): + iSession( aMsvSession ) + { + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::ConstructL +// ----------------------------------------------------------------------------- +// +void CMmsAdapterMsvApi::ConstructL() + { + } + + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::DeleteUserFolderL +// ----------------------------------------------------------------------------- +// + TInt CMmsAdapterMsvApi::DeleteUserFolderL( TMsvId aUid ) + { + TRACE_FUNC_ENTRY; + + CMsvEntry* entry = iSession.GetEntryL(aUid); + CleanupStack::PushL(entry); + + TMsvEntry tEntry = entry->Entry(); + TMsvId parent = tEntry.Parent(); + + if ( tEntry.iType != KUidMsvFolderEntry || parent != KMsvMyFoldersEntryIdValue ) + { + LOGGER_WRITE( "Not correct folder" ); + CleanupStack::PopAndDestroy(entry); + LOGGER_LEAVEFN( "MsvApi::DeleteUserFolderL" ); + return KErrNotSupported; + } + + CMsvEntrySelection* children = entry->ChildrenL(); + TInt count = children->Count(); + delete children; + + if ( count > 0 ) + { + LOGGER_WRITE( "Folder not empty" ); + CleanupStack::PopAndDestroy( entry ); + LOGGER_LEAVEFN( "MsvApi::DeleteUserFolderL" ); + return KErrInUse; + } + + tEntry.SetReadOnly( EFalse ); + entry->ChangeL( tEntry ); + + entry->SetEntryL( parent ); + entry->DeleteL( aUid ); + + CleanupStack::PopAndDestroy( entry ); + TRACE_FUNC_EXIT; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::ValidUserFolder +// ----------------------------------------------------------------------------- +// +TBool CMmsAdapterMsvApi::ValidFolderL( TMsvId aFolder, TBool aOutboxValid ) + { + TBool valid(EFalse); + + switch ( aFolder ) + { + case KMsvGlobalInBoxIndexEntryId: + valid = ETrue; + break; + case KMsvDraftEntryId: + valid = ETrue; + break; + case KMsvSentEntryId: + valid = ETrue; + break; + case KMsvGlobalOutBoxIndexEntryId: + if ( aOutboxValid ) + { + valid = ETrue; + } + break; + case KMsvMyFoldersEntryIdValue: + valid = ETrue; + break; + default: + valid = FindUserFolderL( aFolder ); + } + + return valid; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CMmsAdapterMsvApi::FindUserFolderL( TMsvId aFolder, TPtrC& aName, TTime& aDate ) + { + TBool found( EFalse ); + + CMsvEntry* entry = iSession.GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL( entry ); + + CMsvEntrySelection* selection = entry->ChildrenL(); + CleanupStack::PushL( selection ); + + TMsvId serviceId; + TMsvEntry entryT; + + for ( TInt i = 0; i < selection->Count(); i++ ) + { + User::LeaveIfError( iSession.GetEntry( selection->At( i ), serviceId, entryT ) ); + + if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && entryT.Id() == aFolder ) + { + found = ETrue; + aDate = entryT.iDate; + aName.Set( entryT.iDetails ); + break; + } + } + + CleanupStack::PopAndDestroy( selection ); + CleanupStack::PopAndDestroy( entry ); + + return found; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CMmsAdapterMsvApi::FindUserFolderL( TMsvId aFolder ) + { + TPtrC name; + TTime time; + + return FindUserFolderL( aFolder, name, time ); + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CMmsAdapterMsvApi::FindUserFolderL( const TDesC& aName, TMsvId& aFolder ) + { + CMsvEntry* entry = iSession.GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL( entry ); + + CMsvEntrySelection* selection = entry->ChildrenL(); + CleanupStack::PushL( selection ); + + TBool found( EFalse ); + TMsvId serviceId; + TMsvEntry entryT; + + for ( TInt i = 0; i < selection->Count(); i++ ) + { + User::LeaveIfError( iSession.GetEntry( selection->At( i ), serviceId, entryT ) ); + + if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && + aName.Compare(entryT.iDescription) == 0 ) + { + found = ETrue; + aFolder = entryT.Id(); + break; + } + } + + CleanupStack::PopAndDestroy( selection ); + CleanupStack::PopAndDestroy( entry ); + + return found; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::AddUserFolderL +// Creates new user folder +// ----------------------------------------------------------------------------- +TInt CMmsAdapterMsvApi::AddUserFolderL( TMsvId& aFolder, const TDesC& aName ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "aName: %S", &aName ); + + // Make sure that we are not going to add same folder twise + TBool found( EFalse ); + found = FindUserFolderL( aName, aFolder ); + if ( found ) + { + LOGGER_WRITE( "Folder already exists" ); + LOGGER_LEAVEFN( "CMmsAdapterMsvApi::AddUserFolderL" ); + return KErrNone; + } + + CMsvEntry* entry = iSession.GetEntryL(KMsvMyFoldersEntryIdValue); + CleanupStack::PushL( entry ); + + TTime date; + date.UniversalTime(); + + TMsvEntry folderEntry; + folderEntry.iType = KUidMsvFolderEntry; + folderEntry.iMtm = KUidMsvLocalServiceMtm; + folderEntry.iDetails.Set( aName ); + folderEntry.iServiceId = KMsvLocalServiceIndexEntryIdValue; + folderEntry.iSize = sizeof( folderEntry ); + folderEntry.iDate = date; + folderEntry.SetStandardFolder( EFalse ); + folderEntry.SetVisible( ETrue ); + folderEntry.SetComplete( ETrue ); + folderEntry.SetInPreparation( EFalse ); + folderEntry.SetReadOnly( EFalse ); + + entry->CreateL( folderEntry ); + CleanupStack::PopAndDestroy( entry ); + + aFolder = folderEntry.Id(); + + TRACE_FUNC_EXIT; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMmsAdapterMsvApi::UpdateUserFolderL +// Updates user folder (changes name) +// ----------------------------------------------------------------------------- +TInt CMmsAdapterMsvApi::UpdateUserFolderL( TMsvId aFolder, const TDesC& aName ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "aName: %S", &aName ); + + CMsvEntry* entry = iSession.GetEntryL( aFolder ); + CleanupStack::PushL( entry ); + + TMsvEntry tEntry = entry->Entry(); + + if ( tEntry.iType != KUidMsvFolderEntry ) + { + CleanupStack::PopAndDestroy( entry ); + LOGGER_WRITE( "No message folder" ); + TRACE_FUNC_EXIT; + return KErrNotSupported; + } + + tEntry.iDetails.Set( aName ); + tEntry.iDescription.Set( aName ); + + entry->ChangeL( tEntry ); + + CleanupStack::PopAndDestroy( entry ); + + TRACE_FUNC_EXIT; + return KErrNone; + } + +// End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/mmsdataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/mmsdataprovider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,331 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mmsdataprovider.h" +#include "mmsdataproviderdefs.h" +#include "mmsdatastore.h" +#include "logger.h" + + + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::CMmsDataProvider +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CMmsDataProvider::CMmsDataProvider() : + iOwnStoreFormat(NULL), + iFilters(1), + iMsvSession(NULL) + { + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CMmsDataProvider::ConstructL() + { + LOGGER_ENTERFN( "CMmsDataProvider::ConstructL" ); + + iMsvSession = CMsvSession::OpenSyncL( *this ); + iRFs = iMsvSession->FileSession(); + iStringPool.OpenL(); + + LOGGER_LEAVEFN( "CMmsDataProvider::ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CMmsDataProvider* CMmsDataProvider::NewL() + { + LOGGER_ENTERFN("CMmsDataProvider::NewL()"); + + CMmsDataProvider* self = new (ELeave) CMmsDataProvider; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + LOGGER_LEAVEFN("CMmsDataProvider::NewL()"); + return self; + } + + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::~CMmsDataProvider +// Destructor. +// ----------------------------------------------------------------------------- +CMmsDataProvider::~CMmsDataProvider() + { + LOGGER_ENTERFN("CMmsDataProvider::~CMmsDataProvider()"); + + delete iOwnStoreFormat; + delete iMsvSession; + + iStringPool.Close(); + + iFilters.ResetAndDestroy(); + iFilters.Close(); + + LOGGER_LEAVEFN("CMmsDataProvider::~CMmsDataProvider()"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::HandleSessionEventL +// virtual function from MMsvSessionObserver, does nothing +// ----------------------------------------------------------------------------- +void CMmsDataProvider::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, + TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/ ) + { + LOGGER_ENTERFN("CMmsDataProvider::HandleSessionEventL()"); + LOGGER_LEAVEFN("CMmsDataProvider::HandleSessionEventL()"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoOnFrameworkEvent +// Not used +// ----------------------------------------------------------------------------- +void CMmsDataProvider::DoOnFrameworkEvent(TSmlFrameworkEvent, TInt /*aParam1*/, TInt /*aParam2*/) + { + LOGGER_ENTERFN("CMmsDataProvider::DoOnFrameworkEvent()"); + LOGGER_LEAVEFN("CMmsDataProvider::DoOnFrameworkEvent()"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoSupportsOperation +// Checks whether data provider supports specific operation +// ----------------------------------------------------------------------------- +TBool CMmsDataProvider::DoSupportsOperation(TUid /*aOpId*/) const + { + LOGGER_ENTERFN("CMmsDataProvider::DoSupportsOperation()"); + LOGGER_LEAVEFN("CMmsDataProvider::DoSupportsOperation()"); + + // Optional operations are not supported + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +const CSmlDataStoreFormat& CMmsDataProvider::DoStoreFormatL() + { + LOGGER_ENTERFN("CMmsDataProvider::DoStoreFormatL()"); + + if ( !iOwnStoreFormat ) + { + iOwnStoreFormat = DoOwnStoreFormatL(); + } + + LOGGER_LEAVEFN("CMmsDataProvider::DoStoreFormatL()"); + + return *iOwnStoreFormat; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoListStoresLC +// Returns array fo data stores, not implemented because only single data store +// is supported +// ----------------------------------------------------------------------------- +CDesCArray* CMmsDataProvider::DoListStoresLC() + { + LOGGER_ENTERFN("CMmsDataProvider::DoListStoresLC()"); + + CDesCArrayFlat* stores = new (ELeave) CDesCArrayFlat(1); + CleanupStack::PushL( stores ); + stores->AppendL( KNSmlDefaultLocalDbName ); + + LOGGER_LEAVEFN("CMmsDataProvider::DoListStoresLC()"); + + return stores; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoDefaultStoreL +// Returns the name of the default data store +// ----------------------------------------------------------------------------- +const TDesC& CMmsDataProvider::DoDefaultStoreL() + { + LOGGER_ENTERFN("CMmsDataProvider::DoDefaultStoreL()"); + LOGGER_LEAVEFN("CMmsDataProvider::DoDefaultStoreL()"); + return KNSmlDefaultLocalDbName; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoNewStoreInstanceLC +// Creates a new data store object, which can be used for synchronization +// ----------------------------------------------------------------------------- +CSmlDataStore* CMmsDataProvider::DoNewStoreInstanceLC() + { + LOGGER_ENTERFN("CMmsDataProvider::DoNewStoreInstanceLC"); + CMmsDataStore* newStore = CMmsDataStore::NewL( *iMsvSession ); + CleanupStack::PushL(newStore); + LOGGER_LEAVEFN("CMmsDataProvider::DoNewStoreInstanceLC"); + return newStore; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoCheckSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMmsDataProvider::DoCheckSupportedServerFiltersL( + const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + LOGGER_ENTERFN("CMmsDataProvider::DoCheckSupportedServerFiltersL()"); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoCheckServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMmsDataProvider::DoCheckServerFiltersL( + RPointerArray& /*aFilters*/, + TSyncMLFilterChangeInfo& /*aChangeInfo*/) + { + LOGGER_ENTERFN("CMmsDataProvider::DoCheckServerFiltersL()"); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +const RPointerArray& CMmsDataProvider::DoSupportedServerFiltersL() + { + LOGGER_ENTERFN("CMmsDataProvider::DoSupportedServerFiltersL()"); + LOGGER_LEAVEFN("CMmsDataProvider::DoSupportedServerFiltersL()"); + return iFilters; // empty array + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoSupportsUserSelectableMatchType +// Not supported +// ----------------------------------------------------------------------------- +TBool CMmsDataProvider::DoSupportsUserSelectableMatchType() const + { + LOGGER_ENTERFN("CMmsDataProvider::DoSupportsUserSelectableMatchType()"); + LOGGER_LEAVEFN("CMmsDataProvider::DoSupportsUserSelectableMatchType()"); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoGenerateRecordFilterQueryLC +// Filters are not supported +// ----------------------------------------------------------------------------- +HBufC* CMmsDataProvider::DoGenerateRecordFilterQueryLC( + const RPointerArray& /*aFilters*/, + TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, + TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) + { + LOGGER_ENTERFN("CMmsDataProvider::DoGenerateRecordFilterQueryLC()"); + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoGenerateFieldFilterQueryL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CMmsDataProvider::DoGenerateFieldFilterQueryL( + const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, + RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/) + { + LOGGER_ENTERFN("CMmsDataProvider::DoGenerateFieldFilterQueryL()"); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataProvider::DoOwnStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CMmsDataProvider::DoOwnStoreFormatL() + { + LOGGER_ENTERFN("CMmsDataProvider::DoOwnStoreFormatL()"); + + TParse* parse = new ( ELeave ) TParse(); + CleanupStack::PushL(parse); + TFileName fileName; + RResourceFile resourceFile; + + parse->Set( KMmsStoreFormatRscRom, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + + TRAPD( error, resourceFile.OpenL( iRFs, fileName ) ); + if ( error ) + { + LOGGER_WRITE_1( "RResourceFile::OpenL leaved with %d - try again", error ); + parse->Set( KMmsStoreFormatRsc, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + resourceFile.OpenL( iRFs, fileName ); + } + CleanupClosePushL( resourceFile ); + + HBufC8* buffer = resourceFile.AllocReadLC( MMS_DATA_STORE ); + + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + + CleanupStack::Pop( dsFormat ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &resourceFile ); + CleanupStack::PopAndDestroy( parse ); + + LOGGER_LEAVEFN("CMmsDataProvider::DoOwnStoreFormatL()"); + + return dsFormat; + } + + +// ----------------------------------------------------------------------------- +// ImplementationTable +// Required by ECom plugin interface, tells the entry point of the library +// ----------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KMmsDataProviderImplUid, CMmsDataProvider::NewL) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns the implementation table, required by the ECom plugin interface +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/mmsdataprovider.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/mmsdataprovider.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2005-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: Resource definitions for MMS DS ECOM plug-in +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x101FB0E9; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x101F4D3A; // Constant for all DS plug ins + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x101FB0E9; // DS interface implementation UID + version_no = 1; + display_name = "Multimedia messages"; // shown in UI + } + }; + } + }; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/mmsdatastore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/mmsdatastore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1787 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mmsdatastore.h" +#include "omadsfolderobject.h" +#include "mmsadaptermsvapi.h" +#include "mmsdataproviderdefs.h" +#include "logger.h" + +_LIT8( KMmsMimeType, "application/vnd.wap.mms-message" ); +_LIT8( KMmsMimeVersion, "1.2" ); +_LIT8( KFolderMimeType, "application/vnd.omads-folder+xml" ); +_LIT8( KFolderMimeVersion, "1.2" ); + +const TInt KDataBufferSize = 1024; +const TUint KMMS_Flag_Read = 0x01; + +// ----------------------------------------------------------------------------- +// CMmsDataStore::CMmsDataStore +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CMmsDataStore::CMmsDataStore(): + iHasHistory(EFalse), + iDataBaseOpened(EFalse), + iKey(TKeyArrayFix(_FOFF(TSnapshotItem, ItemId()), ECmpTInt)) + { + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::ConstructL +// Symbian 2nd phase constructor, can leave. +// ----------------------------------------------------------------------------- +void CMmsDataStore::ConstructL(CMsvSession &aMsvSession) + { + LOGGER_ENTERFN("CMmsDataStore::ConstructL"); + + iMsvSession = &aMsvSession; + + // Waiter object to be used with CodecClient + iMsvWait = CMsvOperationActiveSchedulerWait::NewLC(); + CleanupStack::Pop( iMsvWait ); + iCodecClient = CMmsCodecClient::NewL( *iMsvSession ); + iMsvApi = CMmsAdapterMsvApi::NewL( *iMsvSession ); + + // Item UID sets, used to transfer change info + iNewItems = new (ELeave) CNSmlDataItemUidSet; + iDeletedItems = new (ELeave) CNSmlDataItemUidSet; + iUpdatedItems = new (ELeave) CNSmlDataItemUidSet; + iMovedItems = new (ELeave) CNSmlDataItemUidSet; + iSoftDeletedItems = new (ELeave) CNSmlDataItemUidSet; + + iFolderObjectParser = COMADSFolderObject::NewL(); + + LOGGER_LEAVEFN("CMmsDataStore::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CMmsDataStore* CMmsDataStore::NewL( CMsvSession &aMsvSession) + { + CMmsDataStore* self = new (ELeave) CMmsDataStore; + + CleanupStack::PushL( self ); + self->ConstructL( aMsvSession ); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CMmsDataStore::~CMmsDataStore +// Destructor +// ----------------------------------------------------------------------------- +CMmsDataStore::~CMmsDataStore() + { + LOGGER_ENTERFN("CMmsDataStore::~CMmsDataStore()"); + + delete iDataBuffer; + + delete iChangeFinder; + delete iFolderObjectParser; + + delete iNewItems; + delete iDeletedItems; + delete iUpdatedItems; + delete iMovedItems; + delete iSoftDeletedItems; + + delete iMsvApi; + delete iCodecClient; + delete iMsvWait; + + LOGGER_LEAVEFN("CMmsDataStore::~CMmsDataStore()"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoOpenL +// Opens database. This operation is performed SYNCHRONOUSLY +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoOpenL( const TDesC& /*aStoreName*/, + MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoOpenL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if ( iDataBaseOpened ) + { + User::RequestComplete( iCallerStatus, KErrInUse ); + LOGGER_WRITE("CMmsDataStore::DoOpenL failed with KErrInUse."); + return; + } + + *iContext = aContext; + + // Create ChangeFinder object + if ( iChangeFinder ) + { + delete iChangeFinder; + iChangeFinder = NULL; + } + iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory, KMmsDataProviderImplUid ); + + // Set current snapshot, this will be compared against the old one + RegisterSnapshotL(); + + iDataBaseOpened = ETrue; + iCurrentState = EMmsOpenAndWaiting; + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoOpenL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCancelRequest +// Not supported, does nothing. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCancelRequest() + { + LOGGER_ENTERFN("CMmsDataStore::DoCancelRequestL"); + LOGGER_LEAVEFN("CMmsDataStore::DoCancelRequestL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoStoreName +// Returns the name of the DataStore +// ----------------------------------------------------------------------------- +const TDesC& CMmsDataStore::DoStoreName() const + { + LOGGER_ENTERFN("CMmsDataStore::DoStoreName"); + + if ( iDataBaseOpened ) + { + LOGGER_LEAVEFN( "CMmsDataStore::DoStoreName" ); + LOGGER_WRITE_1( "Database name: %S", &KNSmlDefaultLocalDbName ); + return KNSmlDefaultLocalDbName; + } + + LOGGER_LEAVEFN( "CMmsDataStore::DoStoreName" ); + return KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoBeginTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoBeginTransactionL() + { + LOGGER_ENTERFN("CMmsDataStore::DoBeginTransactionL"); + LOGGER_WRITE( "CMmsDataStore::DoBeginTransactionL leaved with KErrNotSupported." ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCommitTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCommitTransactionL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CMmsDataStore::DoCommitTransactionL" ); + LOGGER_WRITE( "CMmsDataStore::DoCommitTransactionL failed with KErrNotSupported." ); + + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoRevertTransaction +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoRevertTransaction( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CMmsDataStore::DoRevertTransaction" ); + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_LEAVEFN( "CMmsDataStore::DoRevertTransaction" ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoBeginBatchL +// Batching is not supported. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoBeginBatchL() + { + LOGGER_ENTERFN( "CMmsDataStore::DoBeginBatchL" ); + LOGGER_WRITE( "CMmsDataStore::DoBeginBatchL leaved with KErrNotSupported." ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCommitBatchL +// Batching is not supported +// ----------------------------------------------------------------------------- +// +void CMmsDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CMmsDataStore::DoCommitBatchL" ); + LOGGER_WRITE( "CMmsDataStore::DoCommitBatchL failed with KErrNotSupported" ); + iCallerStatus = &aStatus; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCancelBatch +// Batching is not supported +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCancelBatch() + { + LOGGER_ENTERFN( "CMmsDataStore::DoCancelBatch" ); + LOGGER_LEAVEFN( "CMmsDataStore::DoCancelBatch" ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoSetRemoteStoreFormatL +// Not supported +// ----------------------------------------------------------------------------- +// +void CMmsDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ ) + { + LOGGER_ENTERFN("CMmsDataStore::DoSetRemoteStoreFormatL"); + LOGGER_LEAVEFN("CMmsDataStore::DoSetRemoteStoreFormatL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoSetRemoteMaxObjectSize +// Not supported +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ ) + { + LOGGER_ENTERFN("CMmsDataStore::DoSetRemoteMaxObjectSize"); + LOGGER_LEAVEFN("CMmsDataStore::DoSetRemoteMaxObjectSize"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoMaxObjectSize +// Reads the maximum MMS Message size from the central repository +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::DoMaxObjectSize() const + { + LOGGER_ENTERFN( "CMmsDataStore::DoMaxObjectSize" ); + + CRepository* repository( NULL ); + TInt error( KErrNone ); + TInt maxSendSize( 0 ); + + // Create central repository instance + TRAP( error, repository = CRepository::NewL( KCRUidMmsEngine ) ); + if ( error == KErrNone ) + { + // Obtain the size from the central repository. + // In the case of error we'll set the value to zero ("anything goes"). + error = repository->Get( KMmsEngineMaximumSendSize, maxSendSize ); + if ( error != KErrNone ) + { + maxSendSize = 0; + } + + delete repository; + } + else + { + LOGGER_WRITE_1( "CRepository::NewL leaved with %d", error ); + } + + LOGGER_LEAVEFN( "CMmsDataStore::DoMaxObjectSize" ); + return maxSendSize; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoOpenItemL +// Opens item in the DataStore, reads it (either completely or partially) +// to the temporary buffer where it can be later read to the remote database. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoOpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, + TInt& aSize, TSmlDbItemUid& aParent, TDes8& aMimeType, + TDes8& aMimeVer, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CMmsDataStore::DoOpenItemL" ); + + LOGGER_WRITE_1( "Opening item %d.", aUid ); + + // Store these for later use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1( "CMmsDataStore::DoOpenItemL, invalid state %d.", iCurrentState ); + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + TBool userFolderFound( EFalse ); + TTime timeStamp; + TPtrC folderName; + userFolderFound = iMsvApi->FindUserFolderL( aUid, folderName, timeStamp ); + + if ( userFolderFound ) + { + // Allocate new buffer + SAFEDELETE( iDataBuffer ); + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + + iFolderObjectParser->SetName( folderName ); + iFolderObjectParser->SetCreatedDate( timeStamp.DateTime() ); + iFolderObjectParser->SetModifiedDate( timeStamp.DateTime() ); + iFolderObjectParser->ExportFolderXmlL( *iDataBuffer ); + + iParentId = KMsvMyFoldersEntryIdValue; + + iCurrentState = EFolderOpen; + iReadPosition = 0; + + aSize = iDataBuffer->Size(); + } + else // Open MMS message + { + TInt error( KErrNone ); + + CMsvEntry* entry( NULL ); + TRAP( error, entry = iMsvSession->GetEntryL(aUid) ); + if ( error != KErrNone ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE_1("iMsvSession->GetEntryL failed with %d.", error); + return; + } + + TMsvEntry messageEntry = entry->Entry(); + SAFEDELETE( entry ); + + iCurrentId = aUid; + iParentId = messageEntry.Parent(); + iReadCounter = 0; + + // Check whether we need to send the whole item + if ( iChangeFinder->UpdatePartialL( aUid ) ) + { + LOGGER_WRITE("EMmsItemOpenFieldUpdate"); + aSize = 1; + iCurrentState = EMmsItemOpenFieldUpdate; + } + else + { + // Read the whole item from the message store to the buffer + TUint32 flags( 0 ); + TRAP( error, iCodecClient->InitializeChunkedRetrievingL( + iCurrentId, + iParentId, + flags, + iUnread, + aSize, + iMsvWait->iStatus) ); + + if ( error != KErrNone ) + { + User::RequestComplete( iCallerStatus, error ); + LOGGER_WRITE_1("iCodecClient->InitializeChunkedRetrievingL failed with %d.", error); + return; + } + + // Wait until the message has been processed + iMsvWait->Start(); + + if ( iMsvWait->iStatus != KErrNone ) + { + User::RequestComplete( iCallerStatus, iMsvWait->iStatus.Int() ); + LOGGER_WRITE_1( "iCodecClient->InitializeChunkedRetrievingL failed with %d", + iMsvWait->iStatus.Int() ); + return; + } + LOGGER_WRITE_1("iUnread: %d", (TInt)iUnread); + aSize++; // Status byte will be added also, reserve one additional byte for that. + iCurrentState = EMmsItemOpen; + } + } // Open MMS message + + aParent = iParentId; + + aFieldChange = iCurrentState == EMmsItemOpenFieldUpdate ? ETrue : EFalse; + + if ( iCurrentState == EFolderOpen ) // Message folder + { + TInt targetLength = KFolderMimeType().Length(); + if ( aMimeType.MaxLength() < targetLength ) + { + targetLength = aMimeType.MaxLength(); + } + aMimeType.Copy( KFolderMimeType().Ptr(), targetLength ); + + // Set mime version (do not exceed the allocated buffer) + targetLength = KFolderMimeVersion().Length(); + if ( aMimeVer.MaxLength() < targetLength ) + { + targetLength = aMimeVer.MaxLength(); + } + aMimeVer.Copy( KFolderMimeVersion().Ptr(), targetLength ); + } + else // EMmsMessage + { + TInt targetLength = KMmsMimeType().Length(); + if ( aMimeType.MaxLength() < targetLength ) + { + targetLength = aMimeType.MaxLength(); + } + aMimeType.Copy( KMmsMimeType().Ptr(), targetLength ); + + // Set mime version (do not exceed the allocated buffer) + targetLength = KMmsMimeVersion().Length(); + if ( aMimeVer.MaxLength() < targetLength ) + { + targetLength = aMimeVer.MaxLength(); + } + aMimeVer.Copy( KMmsMimeVersion().Ptr(), targetLength ); + } + + LOGGER_WRITE_1("aSize: %d", aSize); + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoOpenItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCreateItemL +// Create new item to the message store. +// Return the id number of the newly created item +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, + const TDesC8& aMimeType, const TDesC8& /*aMimeVer*/, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN( "CMmsDataStore::DoCreateItemL" ); + LOGGER_WRITE_1( "Parent folder: %d.", aParent ); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1( "Invalid state %d.", iCurrentState ); + } + + TBool createFolder( EFalse ); + LOG( aMimeType ); + if ( aMimeType.Compare( KFolderMimeType() ) == 0 ) + { + createFolder = ETrue; + } + else if ( aMimeType.Compare( KMmsMimeType() ) != 0 ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE("Bad MIME type"); + return; + } + + // Ensure that we've got enough disk space for the item + if ( iCodecClient->DiskSpaceBelowCriticalLevelL( aSize ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE( "Disk full" ); + return; + } + + if( createFolder ) + { + if ( aParent != KMsvMyFoldersEntryIdValue ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE( "Bad parent folder" ); + return; + } + SAFEDELETE( iDataBuffer ); + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iCurrentState = EFolderCreating; + iCreatedUid = &aUid; + iWrittenDataLength = 0; + } + else + { + // There is some problems on chunked data adding, so get all data to internal buffer + iCreatedUid = &aUid; + iCurrentState = EMmsItemCreating; + iWriteCounter = 0; + iWrittenDataLength = 0; + if ( iDataBuffer ) + { + iDataBuffer->ResizeL( aSize ); + } + else + { + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iDataBuffer->ResizeL( aSize ); + } + } + + iParentId = aParent; + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoCreateItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoReplaceItemL +// Begin the replace operation, ensure that the item really exists +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool /*aFieldChange*/, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoReplaceItemL"); + LOGGER_WRITE_1("Replacing item %d.", aUid); + LOGGER_WRITE_1("Parent folder: %d.", aParent); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("Invalid state %d.", iCurrentState); + } + + // Ensure that we've got enough disk space for the item + if ( iCodecClient->DiskSpaceBelowCriticalLevelL( aSize ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + LOGGER_WRITE("Disk full"); + return; + } + + // Find entry + CMsvEntry* entry(NULL); + TRAPD( err, entry = iMsvSession->GetEntryL( aUid ) ); + if ( err != KErrNone ) + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE_1("CMsvSession::GetEntryL failed with %d.", err) + return; + } + + TMsvEntry tEntry = entry->Entry(); + delete entry; + + // Check entry type + TBool updateFolder(EFalse); + if ( tEntry.iType == KUidMsvFolderEntry ) + { + updateFolder = ETrue; + LOGGER_WRITE("Type: folder"); + } + + if ( ( updateFolder && aParent != KMsvMyFoldersEntryIdValue ) + || ( !updateFolder && !iMsvApi->ValidFolderL( aParent ) + || ( aParent != tEntry.Parent() ) ) ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE_1("Bad parent folder, message entry parent is %d", tEntry.Parent()); + return; + } + + // Store these for further use + iParentId = aParent; + iCurrentId = aUid; + + if ( updateFolder ) + { + SAFEDELETE( iDataBuffer ); + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iCurrentState = EFolderUpdating; + iWrittenDataLength = 0; + } + else + { + iCurrentState = EMmsItemUpdating; + iWriteCounter = 0; + iWrittenDataLength = 0; + if ( iDataBuffer ) + { + iDataBuffer->ResizeL( aSize ); + } + else + { + iDataBuffer = CBufFlat::NewL( KDataBufferSize ); + iDataBuffer->ResizeL( aSize ); + } + } + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoReplaceItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoReadItemL +// Read specified amount of data from the temporary buffer +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoReadItemL( TDes8& aBuffer ) + { + LOGGER_ENTERFN("CMmsDataStore::DoReadItemL"); + + if ( iCurrentState == EFolderOpen ) + { + // This is how much we've got left in the buffer + TInt left = iDataBuffer->Size() - iReadPosition; + + // Make sure that there's something to read + if ( left > 0 ) + { + // This is how much there's space in the destination buffer + TInt destSize = aBuffer.MaxSize(); + + // This is how much we can read + TInt toRead = destSize < left ? destSize : left; + + // Read the data from the buffer, then update the position + iDataBuffer->Read( iReadPosition, aBuffer, toRead ); + iReadPosition += toRead; + } + else + { + LOGGER_WRITE("All data read"); + User::Leave( KErrEof ); + } + } + + else if ( iCurrentState == EMmsItemOpenFieldUpdate ) + { + if ( iReadCounter++ == 0 ) + { + TUint8 status = ResolveStatusBits( iUnread ); + LOGGER_WRITE_1("WriteStatusBits: %d", status); + aBuffer.Append( &status, 1 ); + } + else + { + LOGGER_WRITE("Field update done"); + User::Leave( KErrEof ); + } + } + + else if ( iCurrentState == EMmsItemOpen ) + { + if ( iReadCounter++ == 0 ) + { + TUint8 status = ResolveStatusBits( iUnread ); + LOGGER_WRITE_1("WriteStatusBits: %d", status); + aBuffer.Append( &status, 1 ); + iReadPosition = 0; + iLastDataChunk = EFalse; + iReadAllData = EFalse; + } + else if ( iReadAllData ) + { + User::Leave( KErrEof ); + } + + TInt error = ReadDataRecursively( aBuffer ); + if ( error != KErrNone ) + { + User::Leave( error ); + } + } + + else + { + LOGGER_WRITE_1("CMmsDataStore::DoReadItemL: bad state %d", iCurrentState); + User::Leave( KErrNotReady ); + } + + LOGGER_LEAVEFN("CMmsDataStore::DoReadItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoWriteItemL +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoWriteItemL( const TDesC8& aData ) + { + LOGGER_ENTERFN("CMmsDataStore::DoWriteItemL"); + LOGGER_WRITE_1("%d",iWriteCounter); + + TInt dataLength = aData.Length(); + LOGGER_WRITE_1("Data length: %d", dataLength); + + if ( !( dataLength > 0 ) ) // Should never happen... + { + LOGGER_WRITE("Error: no data"); + User::Leave( KErrArgument ); + } + + if ( iCodecClient->DiskSpaceBelowCriticalLevelL( dataLength ) ) + { + LOGGER_WRITE("Error: disk full"); + User::Leave( KErrDiskFull ); + } + + TInt error( KErrNone ); + + if ( iCurrentState == EFolderCreating || iCurrentState == EFolderUpdating ) + { + // Add data to buffer + iDataBuffer->InsertL( iWrittenDataLength, aData ); + iWrittenDataLength += aData.Size(); + } + + else if ( iCurrentState == EMmsItemCreating ) + { + if ( iWriteCounter++ == 0 ) + { + iUnread = aData[0] & KMMS_Flag_Read ? EFalse : ETrue; + if ( dataLength > 1 ) + { + TPtrC8 data = aData.Mid(1); + iDataBuffer->Write( iWrittenDataLength, data ); + iWrittenDataLength += data.Length(); + } + } + else + { + TPtrC8 data = aData.Mid(0); + iDataBuffer->Write( iWrittenDataLength, data ); + iWrittenDataLength += dataLength; + } + } + + else if ( iCurrentState == EMmsItemUpdating ) + { + if ( iWriteCounter++ == 0 ) + { + iUnread = aData[0] & KMMS_Flag_Read ? EFalse : ETrue; + if ( dataLength > 1 ) + { + TPtrC8 data = aData.Mid(1); + iDataBuffer->Write( iWrittenDataLength, data ); + iWrittenDataLength += data.Length(); + } + else // just status update + { + UpdateMmsStatusL( iCurrentId, iUnread ); + LOGGER_WRITE_1("Message status updated, iUnread: %d", iUnread); + } + } + else + { + TPtrC8 data = aData.Mid(0); + iDataBuffer->Write( iWrittenDataLength, data ); + iWrittenDataLength += dataLength; + } + } + + else + { + LOGGER_WRITE_1("Wrong state %d", iCurrentState); + User::Leave( KErrNotReady ); + } + + if ( error != KErrNone ) + { + LOGGER_WRITE_1("iCodecClient->NextDataPart() failed with %d", error); + User::Leave( error ); + } + + LOGGER_LEAVEFN("CMmsDataStore::DoWriteItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCommitItemL +// Commits item from temporary buffer to the message store +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCommitItemL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoCommitItemL"); + + // Store some variables + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + TInt error(KErrNone); + + if ( iCurrentState == EFolderCreating || iCurrentState == EFolderUpdating ) + { + error = iFolderObjectParser->ImportFolderXml( iDataBuffer->Ptr(0) ); + if ( error != KErrNone ) + { + User::RequestComplete( iCallerStatus, error ); + LOGGER_WRITE_1("ImportFolderXml failed with %d", error); + return; + } + + const TDesC& name = iFolderObjectParser->GetName(); + if ( name.Length() <= 0 ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE("Folder name is empty"); + return; + } + + if ( iCurrentState == EFolderCreating ) + { + TMsvId id; + error = iMsvApi->AddUserFolderL( id, name ); + if ( error == KErrNone ) + { + *iCreatedUid = id; + iCurrentId = id; + } + else + { + LOGGER_WRITE_1("iMsvApi->AddFolderL failed with %d", error); + } + } + else + { + error = iMsvApi->UpdateUserFolderL( iCurrentId, name ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("iMsvApi->UpdateFolderL failed with %d", error); + } + } + } + else if ( iCurrentState == EMmsItemCreating ) + { + LOGGER_WRITE("Create MMS item"); + TMsvId newId(0); + TUint32 flags(0); + + error = iCodecClient->CreateNewMessageEntryL( iParentId, newId ); + if ( !error ) + { + iCodecClient->AddMML( *iDataBuffer, iParentId, flags, iUnread, newId, iMsvWait->iStatus ); + // Wait until the message has been processed + iMsvWait->Start(); + error = iMsvWait->iStatus.Int(); + LOGGER_WRITE_1("error: %d", error); + LOGGER_WRITE_1("AddMML newId: %d", newId); + *iCreatedUid = newId; + iCurrentId = newId; + } + } + else if ( iCurrentState == EMmsItemUpdating ) + { + if ( iWrittenDataLength > 0 ) // if no data then just field update + { + TUint32 flags(0); + iCodecClient->ReplaceMML( iCurrentId, *iDataBuffer, flags, iUnread, iMsvWait->iStatus ); + iMsvWait->Start(); + error = iMsvWait->iStatus.Int(); + } + else + { + UpdateMmsStatusL( iCurrentId, iUnread ); + } + } + else + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE_1("Bad state: %d", iCurrentState); + return; + } + + delete iDataBuffer; + iDataBuffer = NULL; + + if ( error == KErrNone ) // Update Change Finder + { + TMsvId service; + TMsvEntry msgEntry; + + // Inform ChangeFinder of added item + TSnapshotItem snapshotItem( iCurrentId, iParentId, iUnread ); + error = iMsvSession->GetEntry( iCurrentId, service, msgEntry ); + + if ( error == KErrNone ) + { + snapshotItem.SetLastChangedDate( msgEntry.iDate ); + if ( iCurrentState == EFolderCreating || iCurrentState == EFolderUpdating ) + { + snapshotItem.SetFolderNameL( msgEntry.iDetails ); + } + + if ( iCurrentState == EFolderCreating || iCurrentState == EMmsItemCreating ) + { + iChangeFinder->ItemAddedL( snapshotItem ); + } + else + { + iChangeFinder->ItemUpdatedL( snapshotItem ); + } + } + else + { + LOGGER_WRITE_1( "CMsvSession::GetEntry failed with %d", error ); + } + } + + // Send message if parent folder is Outbox + if ( iParentId == KMsvGlobalOutBoxIndexEntryId && + iCurrentState == EMmsItemCreating && + error == KErrNone ) + { + LOGGER_WRITE("Sending message..."); + iCodecClient->SendMML( iCurrentId, iMsvWait->iStatus ); + iMsvWait->Start(); + error = iMsvWait->iStatus.Int(); + } + + LOGGER_WRITE_1("error: %d", error); + // We'll be waiting for next event, signal we're done + iCurrentState = EMmsOpenAndWaiting; + User::RequestComplete( iCallerStatus, error ); + + LOGGER_LEAVEFN("CMmsDataStore::DoCommitItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCloseItem +// Closes open item in the data store +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCloseItem() + { + LOGGER_ENTERFN("CMmsDataStore::DoCloseItem"); + SAFEDELETE(iDataBuffer); + if ( iCurrentState == EFolderOpen ) + { + iCurrentState = EMmsOpenAndWaiting; + } + else if ( iCurrentState == EMmsItemOpen ) + { + iCodecClient->ReleaseData(); + iCurrentState = EMmsOpenAndWaiting; + } + else if ( iCurrentState == EMmsItemOpenFieldUpdate ) + { + iCurrentState = EMmsOpenAndWaiting; + } + else + { + LOGGER_WRITE_1("Invalid state %d.", iCurrentState); + } + + LOGGER_LEAVEFN("CMmsDataStore::DoCloseItem"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoMoveItemL +// Moves item from one folder to another in the message store +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoMoveItemL( TSmlDbItemUid aUid, + TSmlDbItemUid aNewParent, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoMoveItemL"); + + LOGGER_WRITE_1("Moving item %d.", aUid); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoMoveItemL, invalid state %d.", iCurrentState); + } + + // Ensure that we have this item in the message store + if ( !MmsItemExists( aUid ) ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE("MMS item not found"); + return; + } + + iCodecClient->MoveMML( aUid, aNewParent, iMsvWait->iStatus ); + iMsvWait->Start(); + + // Inform ChangeFinder of the moved item + TMsvId service; + TMsvEntry msgEntry; + User::LeaveIfError( iMsvSession->GetEntry( aUid, service, msgEntry ) ); + TBool unread = msgEntry.Unread(); + TSnapshotItem snapshotItem( aUid, aNewParent, unread ); + iChangeFinder->ItemMovedL( snapshotItem ); + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoMoveItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoDeleteItemL +// Removes item from the message store +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoDeleteItemL"); + LOGGER_WRITE_1("Deleting item %d.", aUid); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + TInt error(KErrNone); + + // Check that we're in proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeleteItemL, invalid state %d.", iCurrentState); + } + + // Check if this is a user folder + if ( iMsvApi->FindUserFolderL( aUid ) ) + { + LOGGER_WRITE("Folder"); + error = DeleteAllMessagesInFolderL( aUid ); + if ( error != KErrNone ) + { + User::RequestComplete( iCallerStatus, error ); + LOGGER_WRITE_1("Deleting MMS messages in folder failed with %d", error); + return; + } + error = iMsvApi->DeleteUserFolderL(aUid); + if ( error != KErrNone ) + { + // Note: folder is not deleted if contains other message items (like MMS) + // In this case DeleteUserFolderL returns KErrInUse. + LOGGER_WRITE_1("Deleting folder failed with %d", error); + } + } + else if ( MmsItemExists( aUid ) ) + { + // Tell CodecClient to delete this message + error = iCodecClient->DeleteMM( aUid ); + if ( error != KErrNone ) + { + User::RequestComplete( iCallerStatus, error ); + LOGGER_WRITE_1("CMmsCodecClient::DeleteMM failed with %d", error); + return; + } + // Inform ChangeFinder of the removed item + iChangeFinder->ItemDeletedL( aUid ); + } + else + { + User::RequestComplete( iCallerStatus, KErrNotFound ); + LOGGER_WRITE_1("Item %d is not folder or MMS message", aUid); + return; + } + + LOGGER_WRITE_1("complete error: %d", error); + // Signal we're done + User::RequestComplete( iCallerStatus, error ); + LOGGER_LEAVEFN("CMmsDataStore::DoDeleteItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoSoftDeleteItemL +// Soft delete isn't supported. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoSoftDeleteItemL"); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + LOGGER_LEAVEFN("CMmsDataStore::DoSoftDeleteItemL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoDeleteAllItemsL +// Deletes all items in the standard folders of message store +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoDeleteAllItemsL"); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeleteAllItemsL, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + TInt result(KErrNone); + + // Delete all messages in the standard folders (except outbox) + error = DeleteAllMessagesInFolderL( KMsvGlobalInBoxIndexEntryId ); + if ( error != KErrNone ) + { + result = error; + } + + error = DeleteAllMessagesInFolderL( KMsvDraftEntryId ); + if ( error != KErrNone ) + { + result = error; + } + + error = DeleteAllMessagesInFolderL( KMsvSentEntryId ); + if ( error != KErrNone ) + { + result = error; + } + + error = CleanUserFoldersL(); + if ( error != KErrNone ) + { + result = error; + } + + iChangeFinder->ResetL(); + + User::RequestComplete( iCallerStatus, result ); + + LOGGER_LEAVEFN("CMmsDataStore::DoDeleteAllItemsL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DeleteAllMessagesInFolderL +// Deletes all items in the specified folder in message store +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::DeleteAllMessagesInFolderL( TMsvId aId ) + { + LOGGER_ENTERFN("CMmsDataStore::DeleteAllMessagesInFolderL"); + LOGGER_WRITE_1("Folder: %d", aId); + + TInt error(KErrNone); + + // Get the root folder + CMsvEntry* msvEntry = iMsvSession->GetEntryL(aId); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* messages = msvEntry->ChildrenWithTypeL(KUidMsvMessageEntry); + CleanupStack::PopAndDestroy(msvEntry); + CleanupStack::PushL(messages); + + TMsvId service; + TMsvEntry msg; + TMsvId id; + + // We are only interested of the MM content + for ( TInt index=0; index < messages->Count(); index++ ) + { + id = messages->At( index ); + LOGGER_WRITE_1("Message item %d:", id); + + error = iMsvSession->GetEntry( id, service, msg ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("GetEntry failed with %d", error); + break; + } + + if ( msg.iMtm == KUidMsgTypeMultimedia ) + { + error = iCodecClient->DeleteMM( id ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("DeleteMM failed with %d", error); + break; + } + // Update Change Finder + iChangeFinder->ItemDeletedL( id ); + LOGGER_WRITE("MMS message deleted"); + } + } + CleanupStack::PopAndDestroy(messages); + + LOGGER_LEAVEFN("CMmsDataStore::DeleteAllMessagesInFolderL"); + + return error; + } + + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoHasSyncHistory +// This method returns ETrue if Data Store has history information. +// Slow-sync will be used if Data Store does not have history information. +// ----------------------------------------------------------------------------- +TBool CMmsDataStore::DoHasSyncHistory() const + { + LOGGER_ENTERFN("CMmsDataStore::DoHasSyncHistory"); + LOGGER_LEAVEFN("CMmsDataStore::DoHasSyncHistory"); + + // iHasHistory is initialized in DoOpenL method + return iHasHistory; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoAddedItems +// This method returns UIDs of added items. Those items are added after previous +// synchronization with current synchronization relationship. +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMmsDataStore::DoAddedItems() const + { + LOGGER_ENTERFN("CMmsDataStore::DoAddedItems"); + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear new-items array + iNewItems->Reset(); + + // Set current snapshot, this will be compared against the old one + // Search for new items + TRAP( error, iChangeFinder->FindNewItemsL(*iNewItems) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("New item count: %d.", iNewItems->ItemCount()); + LOGGER_LEAVEFN("CMmsDataStore::DoAddedItems"); + + return *iNewItems; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoDeletedItems +// +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMmsDataStore::DoDeletedItems() const + { + LOGGER_ENTERFN("CMmsDataStore::DoDeletedItemsL"); + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear deleted-items array + iDeletedItems->Reset(); + + // Search for deleted items + TRAP( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("Deleted item count: %d.", iDeletedItems->ItemCount()); + LOGGER_LEAVEFN("CMmsDataStore::DoDeletedItemsL"); + return *iDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoSoftDeletedItems +// Not directly supported, equals to "hard" delete +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMmsDataStore::DoSoftDeletedItems() const + { + LOGGER_ENTERFN("CMmsDataStore::DoSoftDeletedItems"); + LOGGER_LEAVEFN("CMmsDataStore::DoSoftDeletedItems"); + + iSoftDeletedItems->Reset(); + return *iSoftDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoModifiedItems +// Finds all modified items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMmsDataStore::DoModifiedItems() const + { + LOGGER_ENTERFN("CMmsDataStore::DoModifiedItems"); + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear updated-items array + iUpdatedItems->Reset(); + + // Search for updated items + TRAP( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("Modified item count: %d.", iUpdatedItems->ItemCount()); + LOGGER_LEAVEFN("CMmsDataStore::DoModifiedItems"); + return *iUpdatedItems; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoMovedItems +// Finds all moved items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CMmsDataStore::DoMovedItems() const + { + LOGGER_ENTERFN("CMmsDataStore::DoMovedItems"); + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoMovedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear moved-items array + iMovedItems->Reset(); + + // Search for moved items + TRAP( error, iChangeFinder->FindMovedItemsL( *iMovedItems ) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CMmsDataStore::DoMovedItems, iChangeFinder->FindMovedItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("Moved item count: %d.", iMovedItems->ItemCount()); + LOGGER_LEAVEFN("CMmsDataStore::DoMovedItems"); + return *iMovedItems; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoResetChangeInfoL +// Resets change history in the data store. All content is considered +// new in the data store point of view. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) + { + LOGGER_ENTERFN("CMmsDataStore::DoResetChangeInfoL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState); + } + + // Reset change info in ChangeFinder + iChangeFinder->ResetL(); + iHasHistory = EFalse; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoResetChangeInfoL"); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCommitChangeInfoL +// Commits change info. These items are no longer reported, when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems ) + { + LOGGER_ENTERFN("CMmsDataStore::DoCommitChangeInfoL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(aItems); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CMmsDataStore::DoCommitChangeInfoL"); + } + + +// ----------------------------------------------------------------------------- +// CMmsDataStore::DoCommitChangeInfoL +// Commits change info. There is no more nothing to report when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CMmsDataStore::DoCommitChangeInfoL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CMmsDataStore::DoCommitChangeInfoL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if ( iCurrentState != EMmsOpenAndWaiting ) + { + LOGGER_WRITE_1("CMmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CMmsDataStore::DoCommitChangeInfoL"); + } + + +// ----------------------------------------------------------------------------- +// CMmsDataStore::RegisterSnapshotL +// Sets Changefinder to compare against current message store content +// ----------------------------------------------------------------------------- +void CMmsDataStore::RegisterSnapshotL() const + { + CSnapshotArray* snapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + CleanupStack::PushL(snapshot); + + // Use only standard folders (except outbox) + RegisterFolderL(snapshot, KMsvGlobalInBoxIndexEntryId); + RegisterFolderL(snapshot, KMsvDraftEntryId); + RegisterFolderL(snapshot, KMsvSentEntryId); + RegisterFolderL(snapshot, KMsvGlobalOutBoxIndexEntryId); + RegisterUserFoldersL(snapshot); + + // Set new snapshot to compare against + iChangeFinder->SetNewSnapshot(snapshot); + + // Changefinder takes ownership of the snapshot + CleanupStack::Pop(snapshot); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::RegisterFolderL +// Adds a single folder into the snapshot array +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::RegisterFolderL(CSnapshotArray* aSnapshot, const TMsvId& aId) const + { + // Get the root folder + CMsvEntry* msvEntry = iMsvSession->GetEntryL(aId); + CleanupStack::PushL( msvEntry ); + + // Find all of it's childs + CMsvEntrySelection* messages = msvEntry->ChildrenWithTypeL( KUidMsvMessageEntry ); + CleanupStack::PopAndDestroy( msvEntry ); + CleanupStack::PushL( messages ); + + TMsvId id; + TMsvEntry msg; + + // We are only interested of the MM content + for ( TInt index=0; indexCount(); index++ ) + { + TInt result = iMsvSession->GetEntry( messages->At( index ), id, msg ); + User::LeaveIfError( result ); + + // We're only interested about the multimedia content + if ( msg.iMtm == KUidMsgTypeMultimedia ) + { + // Create snapshot item + TKeyArrayFix key(iKey); + TSnapshotItem item( (TUint) msg.Id() ); + + item.SetLastChangedDate( msg.iDate ); + item.SetParentId( msg.Parent() ); + item.SetUnread( msg.Unread() ? ETrue : EFalse ); + + // Add to snapshot + aSnapshot->InsertIsqL( item, key ); + } + } + + CleanupStack::PopAndDestroy( messages ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::MmsItemExists +// Returns ETrue if MMS item exists in the message store, otherwise EFalse +// ----------------------------------------------------------------------------- +TBool CMmsDataStore::MmsItemExists( TMsvId aUid ) + { + CMsvEntry* entry(NULL); + + // Try to open this item + TRAPD( error, entry = iMsvSession->GetEntryL( aUid ) ); + if ( error != KErrNone ) + { + return EFalse; + } + + TMsvEntry tEntry = entry->Entry(); + TBool result(EFalse); + + if ( tEntry.iType == KUidMsvMessageEntry && tEntry.iMtm == KUidMsgTypeMultimedia ) + { + result = ETrue; + } + + delete entry; + + return result; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::ResolveStatusBits +// Creates status bit field according to TMsvEntry parameter +// ----------------------------------------------------------------------------- +TUint8 CMmsDataStore::ResolveStatusBits(TBool aUnread) + { + // Reset the status byte, then find the correct flags + TUint8 data(0); + + // Set status according to the Read/Unread information iCurrentEntry + if ( aUnread ) + { + // Status unset + data &= (~KMMS_Flag_Read); + } + else + { + // Status set + data |= KMMS_Flag_Read; + } + + return data; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::ReadDataRecursively +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::ReadDataRecursively( TDes8& aBuffer ) + { + LOGGER_ENTERFN("CMmsDataStore::ReadDataRecursively"); + + TInt error(KErrNone); + + TInt freeBuffer = aBuffer.MaxLength() - aBuffer.Length(); + + if ( freeBuffer == 0 ) + { + LOGGER_WRITE("Destination buffer filled."); + return KErrNone; + } + + if ( iReadPosition == 0 ) + { + if ( iLastDataChunk ) + { + LOGGER_WRITE("All MMS data read"); + iReadAllData = ETrue; + return KErrNone; + } + else + { + error = iCodecClient->GetNextDataPart( iReadDataChunk, iLastDataChunk ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("iCodecClient->GetNextDataPart failed with %d", error); + return error; + } + else + { + LOGGER_WRITE_1("iCodecClient->GetNextDataPart succeeded, length %d", iReadDataChunk.Length()); + } + } + } + + TInt left = iReadDataChunk.Length() - iReadPosition; + + if ( freeBuffer < left ) + { + TPtrC8 data = iReadDataChunk.Mid(iReadPosition, freeBuffer); + aBuffer.Append(data); + iReadPosition += freeBuffer; + return KErrNone; + } + else + { + if ( left > 0 ) + { + TPtrC8 data = iReadDataChunk.Mid(iReadPosition, left); + aBuffer.Append(data); + } + error = iCodecClient->ReleaseData(); + if ( error != KErrNone ) + { + return error; + } + iReadPosition = 0; + return ReadDataRecursively( aBuffer ); + } + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::UpdateMmsStatusL +// Updates MMS message status +// ----------------------------------------------------------------------------- +void CMmsDataStore::UpdateMmsStatusL( TMsvId aId, TBool aUnread ) + { + CMsvEntry* msvEntry = iMsvSession->GetEntryL( aId ); + const TMsvEntry& oldEntry = msvEntry->Entry(); + + TMsvEntry newEntry( oldEntry ); + newEntry.SetUnread( aUnread ); + + CleanupStack::PushL( msvEntry ); + msvEntry->ChangeL( newEntry ); + CleanupStack::PopAndDestroy( msvEntry ); + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::RegisterUserFoldersL +// Adds user folder messages into the snapshot array +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::RegisterUserFoldersL( CSnapshotArray* aSnapshot ) const + { + LOGGER_ENTERFN("CMmsDataStore::RegisterUserFoldersL"); + + // Get the folder + CMsvEntry* msvEntry = iMsvSession->GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* folders = msvEntry->ChildrenWithTypeL( KUidMsvFolderEntry ); + CleanupStack::PopAndDestroy( msvEntry ); + CleanupStack::PushL( folders ); + + for ( TInt index = 0; index < folders->Count(); index++ ) + { + TMsvId folderId = folders->At(index); + + if ( folderId != KMsvMyFoldersTemplatesFolderId ) + { + TMsvId service; + TMsvEntry folderEntry; + TInt result = iMsvSession->GetEntry( folderId, service, folderEntry ); + User::LeaveIfError( result ); + + TKeyArrayFix key(iKey); + TBool unread(EFalse); + TSnapshotItem item( (TUint) folderId, folderEntry.Parent(), unread ); + item.SetLastChangedDate( folderEntry.iDate ); + item.SetFolderNameL( folderEntry.iDetails ); + + aSnapshot->InsertIsqL( item, key ); + + RegisterFolderL( aSnapshot, folderId ); + } + } + + CleanupStack::PopAndDestroy( folders ); + + // Register also MMS messages directly under My Folders + RegisterFolderL( aSnapshot, KMsvMyFoldersEntryIdValue ); + + LOGGER_LEAVEFN("CMmsDataStore::RegisterUserFoldersL"); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMmsDataStore::CleanUserFoldersL +// Cleans all user folders from MMS messages +// ----------------------------------------------------------------------------- +TInt CMmsDataStore::CleanUserFoldersL() + { + LOGGER_ENTERFN("CMmsDataStore::CleanUserFoldersL"); + + // Get the folder + CMsvEntry* msvEntry = iMsvSession->GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* folders = msvEntry->ChildrenWithTypeL( KUidMsvFolderEntry ); + CleanupStack::PopAndDestroy( msvEntry ); + CleanupStack::PushL( folders ); + + TInt error(KErrNone); + TInt result(KErrNone); + + for ( TInt index = 0; index < folders->Count(); index++ ) + { + TMsvId folderId = folders->At(index); + + if ( folderId != KMsvMyFoldersTemplatesFolderId ) + { + error = DeleteAllMessagesInFolderL(folderId); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("Deleting messages in folder failed with %d", error); + result = error; + } + error = iMsvApi->DeleteUserFolderL( folderId ); + if ( error != KErrNone && error != KErrInUse ) + { + // Note: folder is not deleted if contains other message items (like MMS) + // In this case DeleteUserFolderL returns KErrInUse. + LOGGER_WRITE_1("iMsvApi->DeleteUserFolderL failed with %d", error); + result = error; + } + } + } + + CleanupStack::PopAndDestroy( folders ); + + // Delete all messages directly under My Folders + DeleteAllMessagesInFolderL( KMsvMyFoldersEntryIdValue ); + + LOGGER_LEAVEFN("CSmsDataStore::CleanUserFoldersL"); + + return result; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/mmsdatastore.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/mmsdatastore.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,81 @@ +/* +* 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 MmsDataProvider +* +*/ + + +#include "SmlDataFormat.rh" +#include "SmlDataFormat.hrh" + +RESOURCE SML_DATA_STORE_FORMAT MMS_DATA_STORE + { + version = 1; + display_name = "Multimedia messages"; + sync_types = KSmlSyncType_TwoWay + KSmlSyncType_SlowSync; + mime_format= + { + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/vnd.wap.mms-message"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + }, + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/vnd.omads-folder+xml"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + } + }; + mime_format_tx_pref = 0; // Preferred index for tx + mime_format_rx_pref = 0; // Preferred index for rx + folder_properties = {}; // No folder properties + filter_capabilities = {}; // No filter capabilities + max_size = 0; // No limit + max_items = 0; // No limit + flags = 0x00000010; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/omadsfolderobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/omadsfolderobject.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,358 @@ +/* +* Copyright (c) 2005-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: OMA DS Folder object XML parser +* +*/ + + +#include +#include +#include "omadsfolderobject.h" +#include "logger.h" + +_LIT8(KOMADSFolderElement, "Folder"); +_LIT8(KOMADSNameElement, "name"); +_LIT8(KOMADSCreatedElement, "created"); +_LIT8(KOMADSModifiedElement, "modified"); + +_LIT(KFolderBeginTag, ""); +_LIT(KFolderEndTag, ""); +_LIT(KNameBeginTag, ""); +_LIT(KNameEndTag, ""); +_LIT(KCreatedBeginTag, ""); +_LIT(KCreatedEndTag, ""); +_LIT(KModifiedBeginTag, ""); +_LIT(KModifiedEndTag, ""); +_LIT(KDateFormat, "%04d%02d%02dT%02d%02d%02d"); + + +COMADSFolderObject* COMADSFolderObject::NewLC() + { + COMADSFolderObject* pSelf = new (ELeave) COMADSFolderObject; + CleanupStack::PushL( pSelf ); + pSelf->ConstructL(); + return pSelf; + } + +COMADSFolderObject* COMADSFolderObject::NewL() + { + COMADSFolderObject* pSelf = COMADSFolderObject::NewLC(); + CleanupStack::Pop( pSelf ); + return pSelf; + } + +COMADSFolderObject::~COMADSFolderObject() + { + delete iXmlReader; + } + +void COMADSFolderObject::ConstructL() + { + iXmlReader = CSenXmlReader::NewL(); + iXmlReader->SetContentHandler(*this); + } + +TInt COMADSFolderObject::ImportFolderXml( RFs& aFs, const TDesC& aFilename ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + + TInt error; + + Reset(); + TRAP( error, iXmlReader->ParseL( aFs, aFilename ) ) + if( error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +TInt COMADSFolderObject::ImportFolderXml( const TDesC8& aData ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + LOG(aData); + + TInt error; + + Reset(); + + TRAP(error, iXmlReader->ParseL(aData) ); + if(error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +void COMADSFolderObject::ExportFolderXmlL( CBufBase& aBuffer ) + { + iDesc = NULL; + iBuffer = &aBuffer; + iWriteBufPosition = 0; + iWriteBufSize = aBuffer.Size(); + + ExportL(); + } + +void COMADSFolderObject::ExportFolderXmlL( TDes8& aBuffer ) + { + iDesc = &aBuffer; + iBuffer = NULL; + + ExportL(); + } + +void COMADSFolderObject::ExportL() + { + // Folder + WriteL( KFolderBeginTag ); + + // Name + WriteL( KNameBeginTag ); + WriteEncodedXmlL( iName ); + WriteL( KNameEndTag ); + + // Created Date + TBuf<32> tempdate; + tempdate.Format( KDateFormat, iCreatedDate.Year(), iCreatedDate.Month() + 1, + iCreatedDate.Day(), iCreatedDate.Hour(), iCreatedDate.Minute(), iCreatedDate.Second() ); + + WriteL( KCreatedBeginTag ); + WriteL( tempdate ); + WriteL( KCreatedEndTag ); + + // Modified Date + tempdate.Format( KDateFormat, iModifiedDate.Year(), iModifiedDate.Month() + 1, + iModifiedDate.Day(), iModifiedDate.Hour(), iModifiedDate.Minute(), iModifiedDate.Second() ); + + WriteL( KModifiedBeginTag ); + WriteL( tempdate ); + WriteL( KModifiedEndTag ); + + // Folder end + WriteL(KFolderEndTag); + } + +void COMADSFolderObject::WriteL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + iTemp.Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, iTemp ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( iTemp ); + } + } + +void COMADSFolderObject::WriteEncodedXmlL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + HBufC8* xmlData = SenXmlUtils::EncodeHttpCharactersLC( iTemp ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + xmlData->Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, *xmlData ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( *xmlData ); + } + + CleanupStack::PopAndDestroy( xmlData ); + } + +TInt COMADSFolderObject::StartDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::EndDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::StartElement(const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, + const TDesC8& aName, + const RAttributeArray& /*apAttrs*/) + { + LOGGER_ENTERFN( "COMADSFolderObject::StartElement" ); + LOG( aName ); + iCurrentElement.Copy( aName ); + LOGGER_LEAVEFN( "COMADSFolderObject::StartElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::EndElement( const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, const TDesC8& /*aName*/ ) + { + LOGGER_ENTERFN( "COMADSFolderObject::EndElement" ); + iCurrentElement.SetLength(0); + LOGGER_LEAVEFN( "COMADSFolderObject::EndElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::Characters( const TDesC8& aBuf, TInt aStart, TInt aLength ) + { + LOGGER_ENTERFN( "COMADSFolderObject::Characters" ); + LOG(aBuf); + + TInt error; + + if( iCurrentElement.Compare( KOMADSFolderElement ) == 0 ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + + else if ( iCurrentElement.Compare( KOMADSNameElement ) == 0 ) + { + CnvUtfConverter converter; + TBuf buf; + error = converter.ConvertToUnicodeFromUtf8( buf, aBuf.Mid( aStart, aLength ) ); + TInt length = buf.Length() + iName.Length(); + + if ( error > 0 ) + { + LOGGER_WRITE_1("Too long name, number of uncorverted bytes: %d", error); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1("ConvertToUnicodeFromUtf8 failed with %d", error); + iError = error; + } + else if ( length > iName.MaxLength() ) + { + LOGGER_WRITE_1("Too long name total: %d", length); + } + else + { + iName.Append( buf ); + } + } + else if ( iCurrentElement.Compare( KOMADSCreatedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iCreatedDate ); + if( error != KErrNone ) + { + iError = error; + } + } + else if ( iCurrentElement.Compare( KOMADSModifiedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iModifiedDate ); + if ( error != KErrNone ) + { + iError = error; + } + } + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + +TInt COMADSFolderObject::ParseDateString(const TDesC8& aString, TDateTime& aDateTime) + { + // Ensure we don't read beyond the buffer limits + if ( aString.Length() < 15 ) + { + return KErrArgument; + } + // Extract the fields from the string + TLex8 yearDesc( aString.Mid( 0, 4 ) ); + TLex8 monthDesc( aString.Mid( 4, 2 ) ); + TLex8 dayDesc( aString.Mid( 6, 2 ) ); + // Skip one character here, it's supposed to be 'T' + TLex8 hourDesc( aString.Mid( 9, 2 ) ); + TLex8 minuteDesc( aString.Mid( 11, 2 ) ); + TLex8 secondDesc( aString.Mid( 13, 2 ) ); + + + TInt year, month, day, hour, minute, second; + TInt error; + + // Fetch the values to temporary variables + if ( ( error = yearDesc.Val(year) ) != KErrNone ) + return error; + if ( ( error = monthDesc.Val(month) ) != KErrNone ) + return error; + if ( ( error = dayDesc.Val(day) ) != KErrNone ) + return error; + if ( ( error = hourDesc.Val(hour) ) != KErrNone ) + return error; + if ( ( error = minuteDesc.Val(minute) ) != KErrNone ) + return error; + if ( ( error = secondDesc.Val(second) ) != KErrNone ) + return error; + + // Assign values to datetime object + if ( ( error = aDateTime.SetYear(year) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetMonth((TMonth)(month-1) )) != KErrNone ) + return error; + if ( ( error = aDateTime.SetDay(day) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetHour(hour) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetMinute(minute) ) != KErrNone ) + return error; + if ( ( error = aDateTime.SetSecond(second) ) != KErrNone ) + return error; + + return KErrNone; + } + +void COMADSFolderObject::Reset() + { + iError = KErrNone; + iName.SetLength( 0 ); + iCreatedDate.Set( 2005, EJanuary, 1, 0, 0, 0, 0 ); + iModifiedDate.Set( 2005, EJanuary, 1, 0, 0, 0, 0 ); + } + +TInt COMADSFolderObject::Error( TInt aErrorCode ) + { + iError = aErrorCode; + return KErrNone; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/mms/src/snapshotitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/mms/src/snapshotitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include "snapshotitem.h" + + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem() : TNSmlSnapshotItem() + { + iUnread = EFalse; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// Constructor, takes item id as a parameter +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent, TBool aUnread ) +: TNSmlSnapshotItem( aItemId ) + { + SetParentId( aParent ); + iUnread = aUnread; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::ExternalizeL +// Writes the contents of this class and it's base to stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::ExternalizeL( RWriteStream& aStream ) const + { + TNSmlSnapshotItem::ExternalizeL( aStream ); + aStream.WriteInt32L( iUnread ); + TPckgBuf nameBuf(iFolderName); + aStream << nameBuf; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::InternalizeL +// Reads the contents of this class and it's base from stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::InternalizeL( RReadStream& aStream ) + { + TNSmlSnapshotItem::InternalizeL( aStream ); + iUnread = aStream.ReadInt32L(); + TPckgBuf nameBuf; + aStream >> nameBuf; + iFolderName = nameBuf(); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::SetUnread +// Sets unread flag +// ----------------------------------------------------------------------------- +void TSnapshotItem::SetUnread( TBool aState ) + { + iUnread = aState; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::Unread +// Gets unread flag +// ----------------------------------------------------------------------------- +TBool TSnapshotItem::Unread() const + { + return iUnread; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::SetFolderNameL +// Sets folder name +// ----------------------------------------------------------------------------- +void TSnapshotItem::SetFolderNameL( const TDesC& aFolderName ) + { + if ( aFolderName.Length() > KMaxFolderNameLength ) + { + User::Leave( KErrTooBig ); + } + iFolderName.Copy( aFolderName ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::FolderName +// Gets folder name +// ----------------------------------------------------------------------------- +const TDesC& TSnapshotItem::FolderName() const + { + return iFolderName; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/10206b5c.xml Binary file omads/omadsextensions/adapters/sms/group/10206b5c.xml has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/group/bld.inf Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2005-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: Build info file for SMS DS adapter +* +*/ + +#include + +#ifdef __SYNCML_DS_SMS + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +./10206b5c.xml Z:/private/101F99F6/capability/10206b5c.xml +./smsdsa_stub.sis /epoc32/data/z/system/install/smsdsa_stub.sis +../rom/smsdsa.iby CORE_APP_LAYER_IBY_EXPORT_PATH(smsdsa.iby) + +PRJ_MMPFILES +./SmsDataProvider.mmp + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/createstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/group/createstub.bat Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Batch file for creating needed stub files. +rem + +makesis -s smsdsa_stub.pkg \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/smsdataprovider.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/group/smsdataprovider.mmp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2006-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: mmp file for SMS DS Data provider +* +*/ + + +#include +#include +#include + +CAPABILITY CAP_ECOM_PLUGIN +TARGET smsdataprovider.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x10206B5C +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE smsdataprovider.cpp +SOURCE smsdatastore.cpp +SOURCE smsadaptermsvapi.cpp +SOURCE vmessageparser.cpp +SOURCE changefinder.cpp +SOURCE snapshotitem.cpp +SOURCE omadsfolderobject.cpp + +USERINCLUDE ../inc + +APP_LAYER_SYSTEMINCLUDE + + +SOURCEPATH ../src +START RESOURCE smsdataprovider.rss +HEADER +TARGET smsdataprovider.rsc +TARGETPATH ECOM_RESOURCE_DIR +END + +START RESOURCE smsdatastore.rss +HEADER +TARGET smsdatastore.rsc +TARGETPATH RESOURCE_FILES_DIR +END + + +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY gsmu.lib +LIBRARY smcm.lib +LIBRARY smldataprovider.lib +LIBRARY smlstoreformat.lib +LIBRARY centralrepository.lib +LIBRARY msgs.lib +LIBRARY bafl.lib +DEBUGLIBRARY flogger.lib +LIBRARY sysutil.lib +LIBRARY nsmlchangefinder.lib +LIBRARY etext.lib +LIBRARY cntmodel.lib +LIBRARY SenXml.lib +LIBRARY charconv.lib diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/smsdsa_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/group/smsdsa_stub.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2009-2010 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: SMS plugin pkg-stub file +; +; Languages +&EN + +; Header +#{"SMS DS Plugin"},(0x10206B5C),1,14,0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Files to install +""-"z:\resource\smsdatastore.rsc" +""-"z:\resource\plugins\smsdataprovider.rsc" +""-"z:\sys\bin\smsdataprovider.dll" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/group/smsdsa_stub.sis Binary file omads/omadsextensions/adapters/sms/group/smsdsa_stub.sis has changed diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/changefinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/changefinder.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,226 @@ +/* +* 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: Private change finder header +* +*/ + + +#ifndef __CHANGEFINDER_H__ +#define __CHANGEFINDER_H__ + +// INCLUDES +#include +#include +#include "snapshotitem.h" + +// DATATYPES +typedef CArrayFixSeg CSnapshotArray; + +// Granularity used with dynamic array +const TInt KSnapshotGranularity = 32; + +// CLASS DECLARATION + +/** +* @brief CChangeFinder Class +* This is a ChangeFinder class, which can be used to track down changes in the message store. +* It's functionality is equal to CSmlChangeFinder, except the functionality is a bit wider +* since this class can also detect "partially updated" items. It means that if only the status +* Bits of the message are changed, it can be detected. It is achieved by using TSnapshotItem +* class, which contain also this information. Because neither of these classes contained virtual +* functionality, the functionality of this class couldn't be inherited from the CSmlChangeFinder +*/ +class CChangeFinder : public CBase + { +public: + + /** + * Class constructor, Creates a new class instance. + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + * @return CChangeFinder*, New ChangeFinder instance. + */ + static CChangeFinder* NewL( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TBool& aHasHistory, + TInt aStreamUid = KNSmlDefaultSnapshotStreamUID ); + + /** + * Class destructor. + */ + ~CChangeFinder(); + + /** + * Close ChangeFinder object, stores snapshot. + */ + void CloseL(); + + /** + * Reset change information, makes all content new from ChangeFinder point of view. + */ + void ResetL(); + + /** + * Find changed items by comparing snapshots. + * + * @param aChangedUids IN: Array for results. + */ + void FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ); + + /** + * Find deleteed items by comparing snapshots. + * + * @param aDeletedUids IN: Array for results. + */ + void FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ); + + /** + * Find new items by comparing snapshots. + * + * @param aNewUids IN: Array for results. + */ + void FindNewItemsL(CNSmlDataItemUidSet& aNewUids); + + /** + * Find moved items by comparing snapshots. + * + * @param aMovedUids IN: Array for results. + */ + void FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ); + + /** + * Add item to snapshot, it is no loger reported. + * + * @param aItem IN: item to add. + */ + void ItemAddedL( const TSnapshotItem& aItem ); + + /** + * Delete item from snapshot, it is no loger reported. + * + * @param aItem IN: item to delete. + */ + void ItemDeletedL( const TSnapshotItem& aItem ); + + /** + * Update item to snapshot, it is no loger reported. + * + * @param aItem IN: item to update. + */ + void ItemUpdatedL( const TSnapshotItem& aItem ); + + /** + * Move item within snapshot, it is no loger reported. + * + * @param aItem IN: item to move. + */ + void ItemMovedL( const TSnapshotItem& aItem ); + + /** + * Commit all changes to snapshot, there's nothing to report anymore. + */ + void CommitChangesL(); + + /** + * Commit a set of items to snapshot, these items won't be reported anymore. + * + * @param aUids IN: a set of items to commit. + */ + void CommitChangesL( const MSmlDataItemUidSet& aUids ); + + /** + * Sets new snapshot to compare against. + * + * @param aNewSnapshot IN: a new snapshot. + */ + void SetNewSnapshot( CSnapshotArray* aNewSnapshot ); + + /** + * Retrieves DataStore id number. + * + * @return TInt64, DataStore id. + */ + TInt64 DataStoreUid() const; + + /** + * Sets DataStore id number. + * + * @param aUid IN: a new datastore id. + */ + void SetDataStoreUid( TInt64 aUid ); + + /** + * Checks whether specific item can be partially updated. + * + * @param aUid IN: item id. + * @return TBool Result, ETrue if the item contains only status change (read<->unread). + */ + TBool UpdatePartialL( TSmlDbItemUid& aUid ); + +protected: + + /** + * C++ Constructor + * + * @param aSyncRelationship IN: Reference to MSmlSyncRelationship interface. + * @param aKey IN: Key that is used in sorting snapshot. + * @param aStreamUid IN: Snapshot stream UID. + */ + CChangeFinder( MSmlSyncRelationship& aSyncRelationship, + TKeyArrayFix aKey, + TInt aStreamUid ); + + /** + * 2nd-phase Constructor + * + * @param aHasHistory IN: ETrue, if there was synchronization history. + */ + void ConstructL( TBool& aHasHistory ); + +private: + + /** + * Allows access to streams. + */ + MSmlSyncRelationship& iSyncRelationship; + + /** + * New snapshot to compare against. + */ + CSnapshotArray* iCurrentSnapshot; + + /** + * Current snapshot. + */ + CSnapshotArray* iOldSnapshot; + + /** + * Key that is used in sorting snapshot. + */ + TKeyArrayFix iKey; + + /** + * Stream id number to access sync relationship. + */ + TInt iStreamUid; + + /** + * Data store id number. + */ + TInt64 iDataStoreUid; + }; + +#endif // __CHANGEFINDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/logger.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2005-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: Logging macros used by DS plug-in adapters +* +*/ + + +#ifndef __LOGGER_H__ +#define __LOGGER_H__ + +#ifdef _DEBUG + + // Define this to enable file logging + #define __FLOGGING__ + + #include + #include + #include + #include + + NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow + { + public: + void Overflow(TDes16& /*aDes*/) {} + }; + + NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow + { + public: + void Overflow(TDes8& /*aDes*/) {} + }; + + _LIT(KLogDir, "SMS"); + _LIT(KLogFile, "SMSDataproviderLog.txt"); + _LIT( KLogFormat, "[SMSDS] %S"); + + + _LIT(KTracePrefix16, "[SMSDS] "); + _LIT8(KTracePrefix8, "[SMSDS] "); + _LIT8(KFuncEntryFormat8, "%S : Begin"); + _LIT8(KFuncExitFormat8, "%S : End"); + _LIT8(KFuncFormat8, "><%S"); + + const TInt KMaxLogLineLength = 512; + + /** + * Old logging macros + */ + #ifdef __FLOGGING__ + #define LOG( AAA ) RFileLogger::Write( KLogDir,KLogFile,EFileLoggingModeAppend,AAA ) + #else + #define LOG( AAA ) + #endif + #define LOG2( text, par1 ) { FPrint( text, par1 ); } + + + // old function loggin macros + #define LOGGER_ENTERFN( name ) {TRACE_FUNC_ENTRY;} + #define LOGGER_LEAVEFN( name ) {TRACE_FUNC_EXIT;} + + #define LOGGER_WRITE( text ) {_LIT( KTemp, text ); FPrint( KTemp );} + #define LOGGER_WRITE_1( text,par1 ) {_LIT( KTemp, text ); FPrint( KTemp, par1 );} + #define LOGGER_WRITE_2( text,par1,par2 ) {_LIT( KTemp, text ); FPrint( KTemp, par1, par2 );} + + // New function logging macros + #define TRACE_FUNC_ENTRY {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncEntryFormat8, &ptr8);} + #define TRACE_FUNC_EXIT {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncExitFormat8, &ptr8);} + #define TRACE_FUNC {TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); FPrint(KFuncFormat8, &ptr8);} + + + // Declare the FPrint function + inline void FPrint( TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list,aFmt); + #if defined ( __FLOGGING__ ) + RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list ); + #endif + + TBuf16 theFinalString; + theFinalString.Append(KTracePrefix16); + TOverflowTruncate16 overflow; + theFinalString.AppendFormatList(aFmt,list,&overflow); + RDebug::Print(theFinalString); + } + + inline void FPrint(TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + #ifdef __FLOGGING__ + RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list); + #endif + TOverflowTruncate8 overflow; + TBuf8 buf8; + buf8.Append(KTracePrefix8); + buf8.AppendFormatList(aFmt, list, &overflow); + TBuf16 buf16(buf8.Length()); + buf16.Copy(buf8); + TRefByValue tmpFmt(_L("%S")); + RDebug::Print(tmpFmt, &buf16); + } +#else // no _DEBUG defined + + #define LOG( A ) + #define LOG2( A, B ) + + #define LOGGER_ENTERFN( name ) + #define LOGGER_LEAVEFN( name ) + #define LOGGER_WRITE( text ) + #define LOGGER_WRITE_1( text,par1 ) + #define LOGGER_WRITE_2( text,par1,par2 ) + + #define TRACE_FUNC_ENTRY + #define TRACE_FUNC_EXIT + #define TRACE_FUNC + + +#endif // _DEBUG + +#endif // __LOGGER_H__ + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/omadsfolderobject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/omadsfolderobject.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,93 @@ +/* +* Copyright (c) 2005-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: OMA DS Folder object XML parser +* +*/ + + +#ifndef __OMADSFOLDEROBJECT_H__ +#define __OMADSFOLDEROBJECT_H__ + +#include +#include +#include "smsdataproviderdefs.h" + +const TInt KMaxElementLength = 255; +const TInt KMaxXmlLineLength = 1024; + +class COMADSFolderObject : public CBase, public MSenContentHandlerClient + { +public: + + static COMADSFolderObject* NewLC(); + static COMADSFolderObject* NewL(); + ~COMADSFolderObject(); + + // Get methods + inline const TDesC& GetName() const {return iName;} + inline const TDateTime& GetCreatedDate() const {return iCreatedDate;} + inline const TDateTime& GetModifiedDate() const {return iModifiedDate;} + + // Set methods + inline void SetName(const TDesC& aName) {iName.Copy(aName);} + inline void SetCreatedDate(const TDateTime& aDateTime) {iCreatedDate = aDateTime;} + inline void SetModifiedDate(const TDateTime& aDateTime) {iModifiedDate = aDateTime;} + + // Import & export + TInt ImportFolderXml(const TDesC8& aData); + TInt ImportFolderXml(RFs& aFs, const TDesC& aFilename); + void ExportFolderXmlL(TDes8& aBuffer); + void ExportFolderXmlL(CBufBase& aBuffer); + + // MSenContentHandlerClient virtual functionality + TInt StartDocument(); + TInt EndDocument(); + TInt StartElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName, + const RAttributeArray& apAttrs); + TInt EndElement(const TDesC8& aURI, + const TDesC8& aLocalName, + const TDesC8& aName); + TInt Characters(const TDesC8& aBuf, TInt aStart, TInt aLength); + TInt Error(TInt aErrorCode); + +private: + + CSenXmlReader* iXmlReader; + void ConstructL(); + TBuf8 iCurrentElement; + TBuf8 iTemp; + + TBuf iName; + TDateTime iCreatedDate; + TDateTime iModifiedDate; + TInt iError; + + void Reset(); + TInt ParseDateString(const TDesC8& aString, TDateTime& aDateTime); + + CBufBase* iBuffer; + TInt iWriteBufPosition; + TInt iWriteBufSize; + TDes8* iDesc; + + void ExportL(); + void WriteL(const TDesC &aData); + void WriteEncodedXmlL(const TDesC &aData); +}; + + +#endif + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/smsadaptermsvapi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/smsadaptermsvapi.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2005-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: CSmsAdapterMsvApi header +* +*/ + + + +#ifndef SMSADAPTERMSVAPI_H +#define SMSADAPTERMSVAPI_H + +// INCLUDES +#include // CActive +#include // TMsvId +#include // CMsvOperation +#include //CClientMtmRegistry +#include +#include +#include +#include + +// FORWARD DECLARATIONS +class CSmsClientMtm; +class CVMessageParser; +class CContactDatabase; + +// CONSTANTS +const TInt KMsvMyFoldersEntryIdValue = 0x1008; +const TInt KMsvMyFoldersTemplatesFolderId = 0x1009; + +// CLASS DECLARATION + +/** +* Class CSmsAdapterMsvApi +* Internal class that provides access to SMS message store. +*/ +class CSmsAdapterMsvApi : public CBase, public MMsvSessionObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CSmsAdapterMsvApi* NewL(); + + /** + * Destructor. + */ + virtual ~CSmsAdapterMsvApi(); + + private: // Private constructor functions + + /** + * C++ default constructor. + * C++ default constructor can NOT contain any code, that + * might leave. + */ + CSmsAdapterMsvApi(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // New functions + + /** + * Add a SMS message. The given SMS message is stored to the target folder. + * + * @param aSm IN: Contains SMS message in decoded format + * @param aFolder IN: The folder in which the SM will be stored + * @param aSmId OUT: The index created for the added SM. + */ + void AddSML( + CVMessageParser& aSm, + TMsvId aFolder, + TMsvId& aSmId ); + + /** + * Replace existing SMS message + * + * @param aSmId IN: the index to the replaceable SM + * @param aSm IN: Contains data of the new SM + */ + void ReplaceSML ( + TMsvId aSmId, + CVMessageParser& aSm ); + + /** + * Delete a SMS message. + * + * @param aSmId IN: the index to the SM, which will be deleted + */ + void DeleteSML( TMsvId aSmId ); + + /** + * Delete a SMS message. + * + * @param aUid IN: the index to the SM, which will be deleted + * + * @return KErrNone in success. KErrInUse if folder was not deleted because it was not empty. + */ + TInt CSmsAdapterMsvApi::DeleteUserFolderL( TMsvId aUid ); + + /** + * Retriveve SMS message from the message store. + * + * @param aSmId IN: Index to the SM, which will be retrieved + * @param aParent OUT: Index of parent folder + * @param aSm OUT: The SM data is stored into this object. + * @param aUnread OUT: Whether the SM is unread or not + */ + void RetrieveSML( + TMsvId aSmId, + TMsvId& aParent, + CVMessageParser& aSM, + TBool& aUnread ); + + /** + * Sends the specified SM. + * + * @param aSmId IN: Index to the SM, which will be sent. + */ + void SendSML( TMsvId aSmId ); + + /** + * This function can be used when client needs direct access to CMsvSession. + * @return ponter to opened message server session. + */ + CMsvSession* MsvSessionL(); + + /** + * Empties folder from SMS messages. + * + * @param aFolderId IN: TMsvId of the folder + */ + void CleanFolderL( TMsvId aFolderId); + + /** + * Empties user folders under My Folders from SMS messages + */ + void CSmsAdapterMsvApi::CleanUserFoldersL(); + + /** + * Empties folder from SMS messages and returns list of deleted messages + * Caller is responsible of deleting returned list. + * + * @param aFolderId IN: TMsvId of the folder + * + * @return List of identifiers of deleted messages + */ + CMsvEntrySelection* CleanFolderGetMsvIdsL(TMsvId aFolderId); + + /** + * Checks whether disk space is below critical level. + * + * @param aDataSize Size of data to be added to disk. + */ + TBool DiskSpaceBelowCriticalLevelL( TInt aDataSize ); + + /** + * Updates SM status in inbox + * + * @param aSmId IN: the index to the SM + * @param aSm IN: Contains status of the new SM + */ + void UpdateSMStatusL( TMsvId aSmId, CVMessageParser& aSm ); + + /** + * Moves SM to another folder + * + * @param aSmId IN: the index to the SM + * @param aParentId IN: Contains the target folder + */ + void MoveSML( TMsvId aSmId, TMsvId aParentId ); + + /** + * Valid folder checks if the folder is valid. + * The caller of the function can set, if Outbox folder is valid or not. + * + * @param aFolder folder + * @param aOutboxValid if the MM is outbox is valid folder or not + * + * @return ETrue when the folder is valid. + * @return EFalse when the folder is not valid. + */ + TBool ValidFolderL( TMsvId aFolder , TBool aOutboxValid = ETrue ); + + /** + * Creates new user defined folder + * + * @param aFolder OUT: index of the new folder + * @param aName IN: name of the new folder + * + * @return KErrNone or error + */ + TInt AddUserFolderL( TMsvId& aFolder, const TDesC& aName ); + + /** + * Updates name of user defined folder + * + * @param aFolder IN: index of the folder + * @param aName IN: new name of the folder + * + * @return KErrNone or error + */ + TInt UpdateUserFolderL( TMsvId aFolder, const TDesC& aName ); + + /** + * Searches user folder with given UID + * + * @param aFolder IN: Folder UID + * @param aFound OUT: name of found user folder + * @param aDate OUT: time stamp of found user folder + * + * @return Return value indicates whether folder was found or not + */ + TBool FindUserFolderL(TMsvId aFolder, TPtrC& aName, TTime& aDate); + + /** + * Searches user folder with given UID + * + * @param aFolder IN: Folder UID + * + * @return Return value indicates whether folder was found or not + */ + TBool FindUserFolderL(TMsvId aFolder); + + protected: // Functions from base classes + + /** + * From MMsvSessionObserver. Message server event handler function. + * + * @param aEvent the caller of the method sets the value. + * @param aArg1 depends on the aEvent value + * @param aArg2 depends on the aEvent value + * @param aArg3 depends on the aEvent value + * + */ + virtual void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 ); + + private: // Internal functions + + /** + * Updates existing SMS message with given values. + * Used internally by AddSML and ReplaceSML + * + * @param aSmId IN: the index to the SM + * @param aSm IN: contains data of the SM + * @param aNewSm IN: indicates whether this SM is a new one + */ + void DoUpdateSML( TMsvId aSmId, CVMessageParser& aSm, TBool aNewSm ); + + /** + * Check whether folder with given name exists + * + * @param aName IN: Folder name + * @parem aFolder OUT: Folder UID if matching folder was found. + * + * @return ETrue or EFalse + */ + TBool FindUserFolderL(const TDesC& aName, TMsvId& aFolder); + + /** + * Test whether given character needs unicode coding when constructing + * a SMS message. + * 7-bit coding is used if there are no unicoder characters in the message. + * + * @param aValue IN: Given character value + * + * @return ETrue if unicode coding is needed, EFalse otherwise + */ + TBool IsUnicode( const TUint16 aValue ); + + /** + * Convert given home time to universal time. + * + * @param aTime IN: Home time + * + * @return Universal time + */ + TTime UniversalTimeFromHomeTime( TTime aTime ); + + /** + * Convert given universal time to home time. + * + * @param aTime IN: Universal time + * + * @return Home time + */ + TTime HomeTimeFromUniversalTime( TTime aTime ); + + /** + * Find contact name from address book for given number + * + * @param aTime IN: Phone number + * @param aName OUT: Contact name, empty if suitable contact not found + */ + void FetchNameFromContactsL(const TDesC& aNumber, TDes& aName); + + + private: // Data + + CMsvSession* iSession; + CClientMtmRegistry* iMtmReg; + CSmsClientMtm* iMtm; + + RFs iFs; + TInt iMessageDrive; + + CContactDatabase* iContactsDb; + + }; + +#endif //SMSADAPTERMSVAPI_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/smsdataprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/smsdataprovider.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,123 @@ +/* +* 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: CSmsDataProvider header +* +*/ + + +#ifndef __SMSDATAPROVIDER_H__ +#define __SMSDATAPROVIDER_H__ + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CSmsDataStore; +class CSmlDataStoreFormat; + +// CLASS DECLARATION + +/** +* Class CSmsDataProvider +* Data Provider class of SMS DS Plug In Adapter implementation. +* Inherited from generic CSmlDataProvider class. +*/ +class CSmsDataProvider : public CSmlDataProvider, public MMsvSessionObserver + { +public: + + /** + * Constructor. + * + * @return CSmsDataProvider*, a new CSmsDataProvider instance. + */ + static CSmsDataProvider* NewL(); + + /** + * Destructor. + */ + virtual ~CSmsDataProvider(); + + /** + * Callback from MMsvSessionObserver. + */ + void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 ); + +protected: // Inherited from CSmlDataProvider + + virtual void DoOnFrameworkEvent( TSmlFrameworkEvent, TInt aParam1, TInt aParam2 ); + virtual TBool DoSupportsOperation( TUid aOpId ) const; + virtual const CSmlDataStoreFormat& DoStoreFormatL(); + virtual CDesCArray* DoListStoresLC(); + virtual const TDesC& DoDefaultStoreL(); + virtual CSmlDataStore* DoNewStoreInstanceLC(); + virtual void DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& aServerDataStoreFormat, RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + virtual void DoCheckServerFiltersL( RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo ); + virtual const RPointerArray& DoSupportedServerFiltersL(); + virtual TBool DoSupportsUserSelectableMatchType() const; + virtual HBufC* DoGenerateRecordFilterQueryLC( const RPointerArray& aFilters, TSyncMLFilterMatchType aMatch, TDes& aFilterMimeType, TSyncMLFilterType& aFilterType, TDesC& aStoreName ); + virtual void DoGenerateFieldFilterQueryL( const RPointerArray& aFilters, TDes& aFilterMimeType, RPointerArray& aProperties, TDesC& aStoreName ); + +private: + + /** + * C++ Constructor. + */ + CSmsDataProvider(); + + /** + * 2nd-phase Constructor. + */ + void ConstructL(); + + /** + * Creates new DataStore format. + */ + CSmlDataStoreFormat* DoOwnStoreFormatL(); + +private: + + /** + * String pool, used in store format creation. + */ + RStringPool iStringPool; + + /** + * Data store format. + */ + CSmlDataStoreFormat* iOwnStoreFormat; + + /** + * Supported filters (none supported at the moment). + */ + RPointerArray iFilters; + + /** + * File system handle. + */ + RFs iRFs; + + /** + * Message store handle. + */ + CMsvSession* iMsvSession; + + /** + * Reserved pointer for future extension. + */ + TAny* iReserved; + + }; + +#endif // __SMSDATAPROVIDER_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/smsdataproviderdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/smsdataproviderdefs.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2005-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: Constant definitions used by SMS DS Plug-in Adapter +* +*/ + + +#ifndef __SMSDATAPROVIDERDEFS_H__ +#define __SMSDATAPROVIDERDEFS_H__ + + +// ------------------------------------------------------------------------------------------------ +// Databases +// ------------------------------------------------------------------------------------------------ +// Database name +_LIT( KNSmlDefaultLocalDbName, "SmsSyncLocalDb" ); + +// Resource file for CSmlDataStoreFormat + +// The following works with DS plugin added into ROM image +_LIT( KSmsStoreFormatRscRom,"z:smsdatastore.rsc"); + +// The following works with DS plugin installed from SIS +_LIT( KSmsStoreFormatRsc,"smsdatastore.rsc"); + +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ +// max foldername +const TInt KMaxFolderNameLength = 50; + +// Implementation uid +const TUint KSmsDataProviderImplUid = 0x10206B5C; + +// ------------------------------------------------------------------------------------------------ +// Macros +// ------------------------------------------------------------------------------------------------ +#define SAFEDELETE( x ) {delete x; x = NULL;} +#define SAFEDELETEARRAY( x ) {delete[] x; x = NULL;} + +#endif // __SMSDATAPROVIDERDEFS_H__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/smsdatastore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/smsdatastore.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2005-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: CSmsDataStore header +* +*/ + + +#ifndef __SMSDATASTORE_H__ +#define __SMSDATASTORE_H__ + +// INCLUDES +#include +#include "snapshotitem.h" +#include "changefinder.h" + +// FORWARD DECLARATIONS +class CSmsAdapterMsvApi; +class CNSmlDataItemUidSet; +class TNSmlSnapshotItem; +class CVMessageParser; +class COMADSFolderObject; + +// CLASS DECLARATION + +/** +* Class CSmsDataStore +* Data Store class of SMS DS Plug In Adapter implementation. +* Inherited from generic CSmlDataStore class. +*/ +class CSmsDataStore : public CSmlDataStore + { +public: + + /** + * Constructor, leaves the created instance into the CleanupStack. + * + * @return CSmsDataStore*, a new CSmsDataStore instance. + */ + static CSmsDataStore* NewLC(); + + /** + * Destructor + */ + virtual ~CSmsDataStore(); + +protected: + + // Virtual functionality from CSmlDataStore, for comments see the CSmlDataStore header file + virtual void DoOpenL( const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus ); + virtual void DoCancelRequest(); + virtual const TDesC& DoStoreName() const; + virtual void DoBeginTransactionL(); + virtual void DoCommitTransactionL( TRequestStatus& aStatus ); + virtual void DoRevertTransaction( TRequestStatus& aStatus ); + virtual void DoBeginBatchL(); + virtual void DoCommitBatchL( RArray& aResultArray, TRequestStatus& aStatus ); + virtual void DoCancelBatch(); + virtual void DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat ); + virtual void DoSetRemoteMaxObjectSize( TInt aServerMaxObjectSize ); + virtual TInt DoMaxObjectSize() const; + virtual void DoOpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, TSmlDbItemUid& aParent, TDes8& aMimeType, TDes8& aMimeVer, TRequestStatus& aStatus ); + virtual void DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& aMimeVer, TRequestStatus& aStatus ); + virtual void DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, TBool aFieldChange, TRequestStatus& aStatus ); + virtual void DoReadItemL( TDes8& aBuffer ); + virtual void DoWriteItemL( const TDesC8& aData ); + virtual void DoCommitItemL( TRequestStatus& aStatus ); + virtual void DoCloseItem(); + virtual void DoMoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus ); + virtual void DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ); + virtual void DoSoftDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ); + virtual void DoDeleteAllItemsL( TRequestStatus& aStatus ); + virtual TBool DoHasSyncHistory() const; + virtual const MSmlDataItemUidSet& DoAddedItems() const; + virtual const MSmlDataItemUidSet& DoDeletedItems() const; + virtual const MSmlDataItemUidSet& DoSoftDeletedItems() const; + virtual const MSmlDataItemUidSet& DoModifiedItems() const; + virtual const MSmlDataItemUidSet& DoMovedItems() const; + virtual void DoResetChangeInfoL( TRequestStatus& aStatus ); + virtual void DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems ); + virtual void DoCommitChangeInfoL( TRequestStatus& aStatus ); + +private: + + + /** + * Constructor. + */ + CSmsDataStore(); + + /** + * 2nd-phase Constructor. + */ + void ConstructL(); + + /** + * Registers snapshot to ChangeFinder. + */ + void RegisterSnapshotL() const; + + /** + * Registers a single folder to snapshot, used by RegisterSnapshotL. + * + * @param aSnapshot IN: a snapshot item array. + * @param aId IN: folder id. + * @return TInt, Not used. + */ + TInt RegisterFolderL( CSnapshotArray* aSnapshot, const TMsvId& aId ) const; + + /** + * Registers user folder messages to snapshot, used by RegisterSnapshotL. + * + * @param aSnapshot IN: a snapshot item array. + * @return TInt, Not used. + */ + TInt RegisterUserFoldersL(CSnapshotArray* aSnapshot) const; + +private: // Data members + + /** + * @brief Data Store states: + * ESmsClosed: Store is closed. + * ESmsOpenAndWaiting: Store is ready to be used. + * ESmsItemOpen: Item is being read. + * ESmsItemCreating: Item is being created. + * ESmsItemUpdating: Item is being updated. + */ + enum TState + { + ESmsClosed = 0, + ESmsOpenAndWaiting, + ESmsItemOpen, + ESmsItemCreating, + ESmsItemUpdating + }; + + /** + * @brief Possible MIME types: + * EMessageFolder: Message folder + * ESmsMessageItem: SMS message. + */ + enum TMimeType + { + EMessageFolder = 0, + ESmsMessage + }; + + /** + * Access to streams, used by ChangeFinder. + */ + MSmlSyncRelationship* iContext; + + /** + * A flag indicating the existence of synchronization history. + */ + TBool iHasHistory; + /** + * Flag indicating, whether database is opened. + */ + TBool iDataBaseOpened; + /** + * Pointer to the variable, receiving the created Uid. + */ + TSmlDbItemUid* iCreatedUid; + + /** + * The state of the active object. + */ + TState iCurrentState; + + /** + * MIME type of the active object + */ + TMimeType iMimeType; + + /** + * Key that is used in sorting snapshot. + */ + const TKeyArrayFix iKey; + /** + * Change finder, used to determine db modifications. + */ + CChangeFinder* iChangeFinder; + + /** + * Used to access SMS message store; + */ + CSmsAdapterMsvApi* iMsvApi; + + /** + * The location for temporary data + */ + CBufFlat* iDataBuffer; + /** + * Current position in a temporary data buffer (write). + */ + TInt iWriterPosition; + /** + * Current position in a temporary data buffer (read). + */ + TInt iReaderPosition; + + /** + * Stores the currently active message id. + */ + TSmlDbItemUid iCurrentId; + /** + * Stores the parent id of currently active message. + */ + TSmlDbItemUid iParentId; + + /** + * Used to get asynchronous return values. + */ + TRequestStatus* iCallerStatus; + + /** + * Used to store new items. + */ + CNSmlDataItemUidSet* iNewItems; + /** + * Used to store deleted items. + */ + CNSmlDataItemUidSet* iDeletedItems; + /** + * Used to store updated items. + */ + CNSmlDataItemUidSet* iUpdatedItems; + /** + * Used to store moved items. + */ + CNSmlDataItemUidSet* iMovedItems; + /** + * Used to store soft-deleted items (not supported). + */ + CNSmlDataItemUidSet* iSoftDeletedItems; + + /** + * Used to parse VMessages + */ + CVMessageParser* iMessageParser; + + /** + * Used to parse OMA DS Folder Objects + */ + COMADSFolderObject* iFolderObjectParser; + + /** + * Reserved pointer for future extension. + */ + TAny* iReserved; + }; + +#endif // __SMSDATASTORE_H__ + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/snapshotitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/snapshotitem.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2005-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: Private snapshot item header +* +*/ + + +#ifndef __SNAPSHOTITEM_H__ +#define __SNAPSHOTITEM_H__ + +// INCLUDES +#include +#include +#include "smsdataproviderdefs.h" + +typedef TBuf TFolderName; + +// CLASS DECLARATION + +/** +* @brief TSnapshotItem +* This class represents a single item in the ChangeFinder snapshot. +* It's derived from the generic snapshot item and extended +* to contain the read/unread information, which is mandatory when +* partial update of the messages is required. +*/ + +class TSnapshotItem : public TNSmlSnapshotItem + { +public: + + /** + * Constructor + */ + TSnapshotItem(); + + /** + * Constructor + * + * @param aItemId IN: id of the item. + * @param aParent IN: parent item, 0 as default. + * @param aUnread IN: read/unread information, the default is read. + */ + TSnapshotItem( const TSmlDbItemUid& aItemId, const TSmlDbItemUid& aParent = 0, TBool aUnread = EFalse ); + + /** + * Writes the item to a stream. + * + * @param aStream IN: a reference to a stream, where this item is to be written. + */ + void ExternalizeL( RWriteStream& aStream ) const; + + /** + * Reads item from a stream. + * + * @param aStream IN: a reference to a stream, where this item is read from. + */ + void InternalizeL( RReadStream& aStream ); + + /** + * Sets the read flag + * + * @param aState IN: a new state. + */ + void SetUnread( TBool aState ); + + /** + * Sets the read flag + * + * @return TBool, ETrue if the item is not read and EFalse if it has been read. + */ + TBool Unread() const; + + void SetFolderNameL( const TDesC& aFolderName ); + + const TDesC& FolderName() const; + +private: + + /** + * Read / Unread information + */ + TBool iUnread; + + TFolderName iFolderName; + }; + +#endif diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/inc/vmessageparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/inc/vmessageparser.h Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,352 @@ +/* +* Copyright (c) 2005-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: CVMessageParser header +* +*/ + + +#ifndef VMESSAGEPARSER_H +#define VMESSAGEPARSER_H + +#include "omadsfolderobject.h" + + +// CONSTANTS +_LIT(KVMsgTagBegin, "BEGIN:"); +_LIT(KVMsgTagEnd, "END:"); +_LIT(KVMsgTagStatus, "X-IRMC-STATUS:"); +_LIT(KVMsgTagBox, "X-IRMC-BOX:"); +_LIT(KVMsgTagVersion, "VERSION:"); +_LIT(KVMsgTagName, "N:"); +_LIT(KVMsgTagTelephone, "TEL:"); +_LIT(KVMsgTagDateTime, "X-NOK-DT:"); +_LIT(KVMsgTagDate, "Date:"); +_LIT(KVMsgSectionVMsg, "VMSG"); +_LIT(KVMsgSectionVCard, "VCARD"); +_LIT(KVMsgSectionVEnv, "VENV"); +_LIT(KVMsgSectionVBody, "VBODY"); +_LIT(KVMsgSectionEndVBody, "END:VBODY"); +_LIT(KVMsgLineFeed, "\n"); +_LIT(KDesNoData, ""); +_LIT(KVMsgVersion, "1.1"); +_LIT(KVMsgVCardVersion, "2.1"); +_LIT(KVMsgStatusRead, "READ"); +_LIT(KVMsgStatusUnread, "UNREAD"); +_LIT(KVMsgStatusSent, "SENT"); +_LIT(KVMsgStatusUnsent, "UNSENT"); +_LIT(KFolderInbox, "INBOX"); +_LIT(KFolderOutbox, "OUTBOX"); +_LIT(KFolderDraft, "DRAFT"); +_LIT(KFolderSent, "SENT"); +_LIT(KFolderMyFolders, "MY FOLDERS"); +_LIT(KFolderUnspesified, ""); +const TInt KIndentStepSize = 1; + + +// FORWARD DECLARATIONS +class CRichText; + +// CLASS DECLARATION + +const TInt KNameMaxLength = 32; +const TInt KNumberMaxLength = 48; + +/** +* Class CVMessageParser +* Helper class for converting SMS message information to/from text/x-VMessage. +*/ +class CVMessageParser: public CBase + { +public: // Data types + + struct TTelephoneNumber + { + TBuf iName; + TBuf iNumber; + }; + +public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVMessageParser* NewL(); + + /** + * Two-phased constructor leaving item to clenup stack + */ + static CVMessageParser* NewLC(); + + /** + * Destructor. + */ + ~CVMessageParser(); + +private: // Private constructors + + /** + * C++ default constructor. + * C++ default constructor can NOT contain any code, that + * might leave. + */ + CVMessageParser(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + +public: // New functions + + /** + * This function decodes received text/x-vMessage and stores the data + * to member variables of this class. + * + * @param aMessage IN: buffer containing received text/x-vMessage + * @return TInt Result, Length of SMS message body or negative error code. + */ + TInt ParseMessageL( const TDesC8& aMessage ); + + /** + * This function constructs a text/x-vMessage based on the data stored + * to member variables of this class. + * + * @param aMessage OUT: dynamic buffer where text/x-vMessage is constructed + */ + void ConstructMessageL( CBufBase& aMessage ); + + /** + * Initialises all variables to with default values + */ + void ResetAll(); + + /** + * Loads message body data to given rich text object + * + * @param aMsgBody where to load the data + */ + void LoadMessageBodyL( CRichText& aMsgBody ); + + /** + * Stores message body data from given rich text object + * + * @param aMsgBody where from store the data + */ + void StoreMessageBodyL( CRichText& aMsgBody ); + + /** + * Parses telephone number and name from the string containing number and possibly contact name + * + * @param aNumberSring IN: String from which to parse the number (like "Abc Pqr <+0123456789>") + * @param aNumberStore OUT: Variable where to store the output data + * @return TBool ETrue if operation was successful + */ + TBool ParseTelephoneNumber(const TDesC& aNumberString, TTelephoneNumber& aNumberStore); + +private: // Internal functions used by ReadMessage() + + /** + * Reads and decodes text/x-VMessage header. + * + * @return TInt KErrNone or negative error code + */ + TInt ReadMessageHeader(); + + /** + * Reads and decodes envelope part of text/x-VMessage header. + * There can be multiple envelopes, which are handled recursively. + * + * @return TInt KErrNone or negative error code + */ + TInt ReadEnvelope(); + + /** + * Reads and parses time stamp field found from vMessage starting from the current read position. + * Note that this field is optional. + * + * @param aTimetstamp IN: Timestamp field found from vMessage + * @param aUniversalTime OUT: Parsed timestand as universal time + * @return TInt KErrNone if operation succeeded + */ + TInt ReadTaggedTimeStamp( TTime& aUniversalTime ); + + /** + * Reads and decodes text/x-VMessage body. + * + * @return TInt Length of message body or negative value in error case + */ + TInt ReadMessageBodyL(); + + /** + * Raeds VCARD section of text/x-vMessage - contains cotact information + * + * @param aResult telephone number and contact name found is stored here + * @return TInt Result + */ + TInt ReadVCard(TTelephoneNumber& aResult); + + /** + * Searches next given message tag with given value from text/x-VMessage + * + * @param aMsgTag IN: Message tag to be found + * @param aValue IN: Expected value of the message tag to be found + * @return TInt Result, Starting point of the message tag. KErrNotFound if not found. + */ + TInt FindMessageTagWithValue( const TDesC& aMsgTag, const TDesC& aValue ); + + /** + * Searches next given message tag from text/x-VMessage and gets it's value + * Value is expected to start from tag and end to newline. + * + * @param aMsgTag IN: Message tag to be found + * @param aValue OUT: Value of the message tag + * @param aMoveReadPosition IN: whether moving start point of seach for the next field forward or not + * @return TInt Result, Starting point of the message tag. KErrNotFound if not found. + */ + TInt GetMessageTagValue( const TDesC& aMsgTag, TDes& aValue, TBool aMoveReadBufPos = ETrue ); + + /** + * Stores a portion of message data from text/x-vMessage to local descriptor varíable. + * Conversion from TDes8 to TDes16 is done and sufficient length of local descriptor + * is checked - no more bytes than maximum length of the descriptor will be copied. + * + * @param aStart IN: Start point of data to be copied in text/x-vMessage + * @param aLength IN: Length of data to be copied + * @param aLocalStore OUT: Place where the data will be copied + */ + void StoreMessageDataField(TInt aStart, TInt aLength, TDes& aLocalStore); + +private: // Internal functions used by WriteMessageL() + + /** + * Writes message properties to text/x-VMessage header. + */ + void WriteMessagePropertiesL(); + + /** + * Writes message VCARD information to text/x-VMessage header. + */ + void WriteMessageVCARDL(const TDesC& aName, const TDesC& aNumber); + + /** + * Writes message envelope information to text/x-VMessage header. + */ + void WriteMessageEnvelopeL(); + + /** + * Writes tagged timestamp field to vMessage in format + * X-NOK-DT:yyyymmddThhmmssZ (universal time format) + * + * @param aUniversalTime IN: Time value to be used + */ + void WriteTaggedTimestampL( TTime aUniversalTime ); + + /** + * Writes message body to text/x-VMessage. + */ + void WriteMessageBodyL(); + + /** + * Writes one line to text/x-vMessage + * + * @param aMsgTag IN: Message tag to use + * @param aMsgTagData IN: Message tag value to use + * @param aIndent IN: Whether indentication is used or not + */ + void WriteMessageLineL( const TDesC& aMsgTag, const TDesC& aMsgTagData, TBool aIndent = EFalse ); + + /** + * Writes given data to text/x-vMessage. + * Size of pre-allocated dynamic buffer is checked and new size allocated if necessary. + * + * @param aDate IN: Data to be written + */ + void WriteToMessageL( const TDesC& aData ); + + /** + * Gets currect indentication level for writing message line. + * + * @param aMsgTag IN: Message tag used in the line + */ + TInt GetIndentLevel( const TDesC& aMsgTag ); + + /** + * Fills fixed size buffer with given data in safe way so that max size will not be exeeded. + * + * @param aData IN: Input data + * @param aBuffer OUT: Buffer to fill + */ + void AssignDataToBuffer( const TDesC& aData, TDes& aBuffer ); + + + + + +public: // Public member variables. Contain text/x-vMessage data. + + + /** + * Actual message body is stored here + */ + HBufC* iMessageBody; + + /** + * Message time stamp in universal time + */ + TTime iUniversalTime; + + /** + * Message time stamp in home time + */ + TTime iHomeTime; + + /** + * Message folder name + */ + TBuf iFolder; + + /** + * Message status + */ + TBuf<8> iStatus; + + /** + * Sender phone number + */ + TTelephoneNumber iSender; + + /** + * Recipient phone numbers + */ + RArray iRecipients; + +private: // Internal member variables + + /** + * Internal variables used for parsing vMessage + */ + TInt iReadBufPosition; + TPtrC iReadBuf; + + /** + * Internal variables used for constructing vMessage + */ + TInt iWriteBufPosition; + TInt iWriteBufSize; + TInt iWriteIndentLevel; + CBufBase* iWriteBuf; + + }; + +#endif // VMESSAGEPARSER_H diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/rom/smsdsa.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/rom/smsdsa.iby Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2005-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: IBY file for SMS DS adapter binaries +* +*/ + + +#ifndef __SMSDSA_IBY__ +#define __SMSDSA_IBY__ + +#ifdef __SYNCML_DS_SMS + +ECOM_PLUGIN(smsdataprovider.dll,smsdataprovider.rsc) +data=DATAZ_\RESOURCE_FILES_DIR\smsdatastore.rsc RESOURCE_FILES_DIR\smsdatastore.rsc +data=DATAZ_\private\101F99F6\capability\10206b5c.xml private\101F99F6\capability\10206b5c.xml +data=ZSYSTEM\install\smsdsa_stub.sis system\install\smsdsa_stub.sis + +#endif + +#endif //__SMSDSA_IBY__ diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/sis/backup_registration.xml Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/sis/sms.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/sis/sms.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,41 @@ +; +; Copyright (c) 2010 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: SMS plugin pkg file +; + + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"SMS DS Plugin"},(0x10206B5C),1,14,0,TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\smsdatastore.rsc" -"c:\resource\smsdatastore.rsc" +"\epoc32\data\z\resource\plugins\smsdataprovider.rsc" -"c:\resource\plugins\smsdataprovider.rsc" +"\epoc32\release\armv5\urel\smsdataprovider.dll" -"c:\sys\bin\smsdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\10206b5c.xml" -"c:\private\101F99F6\import\10206b5c.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\10206B5C\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/sis/sms_debug.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/sis/sms_debug.pkg Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,41 @@ +; +; Copyright (c) 2009-2010 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: SMS debug plugin pkg file +; + + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia"} + +;Language - standard language definitions +&EN + +;package-header +#{"SMS DS Plugin"},(0x10206B5C),1,14,0,TYPE=SA, RU + +; S60 v5.2 +[0x20022E6D], 0, 0, 0, {"Series60ProductID"} + +"\epoc32\data\z\resource\smsdatastore.rsc" -"c:\resource\smsdatastore.rsc" +"\epoc32\data\z\resource\plugins\smsdataprovider.rsc" -"c:\resource\plugins\smsdataprovider.rsc" +"\epoc32\release\armv5\udeb\smsdataprovider.dll" -"c:\sys\bin\smsdataprovider.dll" + +"\epoc32\data\Z\private\101F99F6\capability\10206b5c.xml" -"c:\private\101F99F6\import\10206b5c.xml" +"backup_registration.xml" -"c:\private\10202D56\import\packages\10206B5C\backup_registration.xml" diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/changefinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/changefinder.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,697 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include "changefinder.h" +#include "logger.h" + +const TUint KSnapshotFormatVersion ( 0xf0000001 ); // format version + +// ----------------------------------------------------------------------------- +// CChangeFinder::NewL +// Static function to create CChangeFider object(s) +// ----------------------------------------------------------------------------- +CChangeFinder* CChangeFinder::NewL( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, + TBool& aHasHistory, TInt aStreamUid ) + { + CChangeFinder* self = new (ELeave) CChangeFinder( aSyncRelationship, aKey, aStreamUid ); + CleanupStack::PushL( self ); + self->ConstructL( aHasHistory ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CChangeFinder +// Constructor for the class +// ----------------------------------------------------------------------------- +CChangeFinder::CChangeFinder( MSmlSyncRelationship& aSyncRelationship, TKeyArrayFix aKey, TInt aStreamUid ) : +iSyncRelationship( aSyncRelationship ), +iKey( aKey ), +iStreamUid( aStreamUid ), +iDataStoreUid( KErrNotFound ) + { + + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::~CChangeFinder +// Destructor for the class, closes the ChangeFinder and writes snapshot to stream +// ----------------------------------------------------------------------------- +CChangeFinder::~CChangeFinder() + { + LOGGER_ENTERFN( "CChangeFinder::~CChangeFinder" ); + TInt error; + TRAP( error, CloseL() ); + if ( error != KErrNone ) + { + LOGGER_WRITE( "CChangeFinder::~CChangeFinder, CloseL failed." ); + } + + delete iCurrentSnapshot; + delete iOldSnapshot; + + LOGGER_LEAVEFN( "CChangeFinder::~CChangeFinder" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ConstructL +// 2nd phase constructor for the class, reads snapshot from stream +// ----------------------------------------------------------------------------- +void CChangeFinder::ConstructL( TBool& aHasHistory ) + { + LOGGER_ENTERFN( "CChangeFinder::ConstructL" ); + + aHasHistory = EFalse; + RReadStream readStream; + + TUid streamId; + streamId.iUid = iStreamUid; + + aHasHistory = iSyncRelationship.IsStreamPresentL(streamId); + + if (aHasHistory) + { + iSyncRelationship.OpenReadStreamLC(readStream, streamId); + + // Read the index, first create snapshot array + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + + // Read used format version + TUint formatVer = readStream.ReadUint32L(); + if ( formatVer != KSnapshotFormatVersion ) + { + // Wrong version, do not try to import data + LOGGER_WRITE("CChangeFinder::ConstructL, Wrong format version -> no history"); + aHasHistory = EFalse; + CleanupStack::PopAndDestroy(); // readStream + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + return; + } + + // Read item count + TInt count = readStream.ReadUint32L(); + + // Read items + for ( TInt i=0; iInsertIsqL( item, iKey ); + } + + readStream.Close(); + readStream.Pop(); + } + else + { + LOGGER_WRITE("CChangeFinder::ConstructL, no sync history."); + } + + LOGGER_LEAVEFN("CChangeFinder::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CloseL +// Closes ChangeFinder object and writes snapshot to stream +// ----------------------------------------------------------------------------- +void CChangeFinder::CloseL() + { + LOGGER_ENTERFN( "CChangeFinder::CloseL" ); + + // Write to stream + RWriteStream writeStream; + + TUid streamId; + streamId.iUid = iStreamUid; + + // Open write stream + iSyncRelationship.OpenWriteStreamLC( writeStream, streamId ); + + // Write used format version + writeStream.WriteUint32L( KSnapshotFormatVersion ); + + // Write item count + TInt count(0); + if ( iOldSnapshot ) + { + count = iOldSnapshot->Count(); + } + writeStream.WriteUint32L(count); + + // Write items + for (TInt i=0; iAt( i ); + item.ExternalizeL( writeStream ); + } + + writeStream.CommitL(); + writeStream.Close(); + writeStream.Pop(); + + LOGGER_LEAVEFN( "CChangeFinder::CloseL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ResetL +// Resets synchronization history, all contetn is considered new after this call +// ----------------------------------------------------------------------------- +void CChangeFinder::ResetL() + { + LOGGER_ENTERFN( "CChangeFinder::ResetL" ); + // Delete old change information + if ( iOldSnapshot ) + { + LOGGER_WRITE("iOldSnapshot->Reset()"); + iOldSnapshot->Reset(); + } + + // Write 'null' data to file, + // this removes change history from the file + CloseL(); + + LOGGER_LEAVEFN( "CChangeFinder::ResetL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindChangedItemsL +// Compares snapshots, finds changed items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindChangedItemsL( CNSmlDataItemUidSet& aChangedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindChangedItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindChangedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + // Find this entry from the old snapshot + if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + // Compare times to see whether this was changed or item was read + if ( ( oldItem.LastChangedDate() != currentItem.LastChangedDate() ) + || ( oldItem.Unread() && !currentItem.Unread() ) + || ( !oldItem.Unread() && currentItem.Unread() ) + || ( oldItem.FolderName().Compare( currentItem.FolderName() ) != 0 ) ) + { + aChangedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was changed.", currentItem.ItemId() ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindChangedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindDeletedItemsL +// Compares snapshots, finds deleted items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindDeletedItemsL( CNSmlDataItemUidSet& aDeletedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindDeletedItemsL" ); + + if ( !iOldSnapshot ) + { + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iOldSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iOldSnapshot->At( i ); + + // If there's no current snapshot, this definately is deleted item + if ( !iCurrentSnapshot ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the current snapshot. + else if ( iCurrentSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aDeletedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was deleted.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindDeletedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindNewItemsL +// Compares snapshots, finds new items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindNewItemsL( CNSmlDataItemUidSet& aNewUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindNewItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindNewItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // If there's no old snapshot, all items are new + if ( !iOldSnapshot ) + { + aNewUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + // It is also new if it doesn't exist int the old snapshot. + else if ( iOldSnapshot->FindIsq( currentItem, iKey, index ) != KErrNone ) + { + aNewUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was new.", currentItem.ItemId() ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindNewItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::FindMovedItemsL +// Compares snapshots, finds moved items +// ----------------------------------------------------------------------------- +void CChangeFinder::FindMovedItemsL( CNSmlDataItemUidSet& aMovedUids ) + { + LOGGER_ENTERFN( "CChangeFinder::FindMovedItemsL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no current snapshot." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::FindMovedItemsL leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + TInt index; + TInt count = iCurrentSnapshot->Count(); + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& currentItem = iCurrentSnapshot->At( i ); + + // Find this entry from the old snapshot + if(iOldSnapshot->FindIsq( currentItem, iKey, index ) == KErrNone) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Report only moved items in which only parent id has been changed + if ( oldItem.ParentId() != currentItem.ParentId() + && oldItem.LastChangedDate() == currentItem.LastChangedDate() + && !(oldItem.Unread() && !currentItem.Unread() ) + && !(!oldItem.Unread() && currentItem.Unread() ) ) + { + aMovedUids.AddItem( currentItem.ItemId() ); + LOGGER_WRITE_1( "Item %d was moved.", currentItem.ItemId() ); + } + } + } + + LOGGER_LEAVEFN( "CChangeFinder::FindMovedItemsL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemAddedL +// Adds item to snapshot, this item is no longer considered new +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemAddedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemAddedL" ); + + // Add this to old snapshot, if there's no old snapshot it must be created + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + LOGGER_WRITE_1( "Adding item %d.", aItem.ItemId() ); + + TRAPD( error, iOldSnapshot->InsertIsqL( aItem, iKey ) ); + if ( error == KErrAlreadyExists ) + { + // It was already committed, no actions required + LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists" ); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); + User::Leave( error ); + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemAddedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemDeletedL +// Removes item to snapshot, this item is no longer considered deleted +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemDeletedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemDeleted" ); + + LOGGER_WRITE_1( "deleting item %d.", aItem.ItemId() ); + + if ( !iOldSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::ItemDeleted leaved, no old snapshot." ); + User::Leave( KErrNotFound ); + } + + // Delete item from the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + iOldSnapshot->Delete( index ); + } + else // Skip, there wasn't such entry + { + LOGGER_WRITE( "iOldSnapshot->FindIsq, item was not found." ); + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemDeleted" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemUpdatedL +// Updates item to snapshot, this item is no longer considered changed +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemUpdatedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemUpdatedL" ); + + LOGGER_WRITE_1( "Updating item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + oldItem = aItem; + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + + } + + LOGGER_LEAVEFN( "CChangeFinder::ItemUpdatedL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::ItemMovedL +// Moves item within snapshot, this item is no longer considered moved +// ----------------------------------------------------------------------------- +void CChangeFinder::ItemMovedL( const TSnapshotItem& aItem ) + { + LOGGER_ENTERFN( "CChangeFinder::ItemMovedL" ); + + LOGGER_WRITE_1( "Moving item %d.", aItem.ItemId() ); + + // There must be such entry in the snapshot after this + // If there isn't old snapshot, we'll create it and add the item + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + ItemAddedL( aItem ); + } + else + { + // Update item's parent in the old snapshot + TInt index; + if ( iOldSnapshot->FindIsq( aItem, iKey, index ) == KErrNone ) + { + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + oldItem.SetParentId( aItem.ParentId() ); + } + else + { + // There was old snapshot but no such item. Let's add it + ItemAddedL( aItem ); + } + } + + LOGGER_LEAVEFN("CChangeFinder::ItemMovedL"); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL() + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Delete everything from the old snapshot + iOldSnapshot->Reset(); + + // Loop through all the items in current snapshot + TInt count = iCurrentSnapshot->Count(); + + // Copy everything from current to old snapshot + for ( TInt i=0; i < count; i++ ) + { + const TSnapshotItem& newItem = iCurrentSnapshot->At( i ); + + // Commit it to the old array. + TRAPD( error, iOldSnapshot->InsertIsqL( newItem, iKey ) ); + if ( error == KErrAlreadyExists ) + { + // It was already committed, this is an internal error of change finder + LOGGER_WRITE( "iOldSnapshot->InsertIsqL leaved with KErrAlreadyExists." ); + User::Leave( error ); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1( "iOldSnapshot->InsertIsqL leaved with %d.", error ); + User::Leave( error ); + } + } + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::CommitChangesL +// Commits current changes to snapshot, affects only a specified group of items +// ----------------------------------------------------------------------------- +void CChangeFinder::CommitChangesL( const MSmlDataItemUidSet& aUids ) + { + LOGGER_ENTERFN( "CChangeFinder::CommitChangesL" ); + + // This function commits changes from current snapshot to old snapshot + // But commits only the entries in the parameter array + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::CommitChangesL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + iOldSnapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + } + + // Use only these uid values + TInt index; + TInt count = aUids.ItemCount(); + + for ( TInt i=0; i < count; i++ ) + { + TSmlDbItemUid uid = aUids.ItemAt( i ); + TSnapshotItem item( uid ); + // Let's see if this uid exists in the current snapshot + if ( iCurrentSnapshot->FindIsq( item, iKey, index ) == KErrNone ) + { + // This is the new item + const TSnapshotItem& newItem = iCurrentSnapshot->At( index ); + + // Let's see if we can find the old one + if ( iOldSnapshot->FindIsq( item, iKey, index ) == KErrNone ) + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Copy new item over the old one, this'll commit the change + oldItem = newItem; + } + else // This entry was not found. It means that it is new one + { + // Commit it to the old array. + ItemAddedL( newItem ); + } + } + else + { + // This item was deleted from the current snapshot. + TSnapshotItem toDelete( item ); + ItemDeletedL( toDelete ); + } + } + + LOGGER_LEAVEFN( "CChangeFinder::CommitChangesL" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetNewSnapshot +// Sets new snapshot (to be compared against), ChangeFinder takes ownership +// ----------------------------------------------------------------------------- +void CChangeFinder::SetNewSnapshot( CSnapshotArray* aNewSnapshot ) + { + LOGGER_ENTERFN( "CChangeFinder::SetNewSnapshot" ); + + // Delete existing snapshot + delete iCurrentSnapshot; + + // Set submitted snapshot as active + iCurrentSnapshot = aNewSnapshot; + LOGGER_LEAVEFN( "CChangeFinder::SetNewSnapshot" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::DataStoreUid +// returns stored data store id number +// ----------------------------------------------------------------------------- +TInt64 CChangeFinder::DataStoreUid() const + { + LOGGER_ENTERFN( "CChangeFinder::DataStoreUid" ); + LOGGER_LEAVEFN( "CChangeFinder::DataStoreUid" ); + return iDataStoreUid; + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::SetDataStoreUid +// Sets data store id number +// ----------------------------------------------------------------------------- +void CChangeFinder::SetDataStoreUid( TInt64 aUid ) + { + LOGGER_ENTERFN( "CChangeFinder::SetDataStoreUid" ); + iDataStoreUid = aUid; + LOGGER_LEAVEFN( "CChangeFinder::SetDataStoreUid" ); + } + +// ----------------------------------------------------------------------------- +// CChangeFinder::UpdatePartialL +// Returns ETrue if item can be updated partially (only status bits are changed) +// ----------------------------------------------------------------------------- +TBool CChangeFinder::UpdatePartialL( TSmlDbItemUid& aUid ) + { + LOGGER_ENTERFN( "CChangeFinder::UpdatePartialL" ); + + if ( !iCurrentSnapshot ) + { + LOGGER_WRITE( "CChangeFinder::UpdatePartialL leaved, current snapshot missing." ); + User::Leave( KErrNotFound ); + } + + if ( !iOldSnapshot ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + TInt index; + TSnapshotItem item( aUid ); + // Find from current snapshot, if not found -> deleted + if ( iCurrentSnapshot->FindIsq( item, iKey, index ) != KErrNone ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + // Current item + const TSnapshotItem& currentItem = iCurrentSnapshot->At( index ); + + // Old item, if not found -> added + if ( iOldSnapshot->FindIsq( item, iKey, index ) != KErrNone ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + else + { + // This is the old item + TSnapshotItem& oldItem = iOldSnapshot->At( index ); + + // Status bits must have been changed to allow partial update + if ( oldItem.Unread() == currentItem.Unread() ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + + // Date should be same, otherwise 'just' changed item + if ( oldItem.LastChangedDate() == currentItem.LastChangedDate() ) + { + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return ETrue; + } + + LOGGER_LEAVEFN( "CChangeFinder::UpdatePartialL" ); + return EFalse; + } + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/omadsfolderobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/omadsfolderobject.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,355 @@ +/* +* Copyright (c) 2005-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: OMA DS Folder object XML parser +* +*/ + + +#include +#include "omadsfolderobject.h" +#include "utf.h" +#include "logger.h" + +_LIT8(KOMADSFolderElement, "Folder"); +_LIT8(KOMADSNameElement, "name"); +_LIT8(KOMADSCreatedElement, "created"); +_LIT8(KOMADSModifiedElement, "modified"); + +_LIT(KFolderBeginTag, ""); +_LIT(KFolderEndTag, ""); +_LIT(KNameBeginTag, ""); +_LIT(KNameEndTag, ""); +_LIT(KCreatedBeginTag, ""); +_LIT(KCreatedEndTag, ""); +_LIT(KModifiedBeginTag, ""); +_LIT(KModifiedEndTag, ""); +_LIT(KDateFormat, "%04d%02d%02dT%02d%02d%02d"); + + +COMADSFolderObject* COMADSFolderObject::NewLC() + { + COMADSFolderObject* pSelf = new (ELeave) COMADSFolderObject; + CleanupStack::PushL( pSelf ); + pSelf->ConstructL(); + return pSelf; + } + +COMADSFolderObject* COMADSFolderObject::NewL() + { + COMADSFolderObject* pSelf = COMADSFolderObject::NewLC(); + CleanupStack::Pop( pSelf ); + return pSelf; + } + +COMADSFolderObject::~COMADSFolderObject() + { + delete iXmlReader; + } + +void COMADSFolderObject::ConstructL() + { + iXmlReader = CSenXmlReader::NewL(); + iXmlReader->SetContentHandler(*this); + } + +TInt COMADSFolderObject::ImportFolderXml( RFs& aFs, const TDesC& aFilename ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + + TInt error; + + Reset(); + TRAP( error, iXmlReader->ParseL( aFs, aFilename ) ) + if( error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +TInt COMADSFolderObject::ImportFolderXml( const TDesC8& aData ) + { + LOGGER_ENTERFN( "COMADSFolderObject::ImportFolderXml" ); + LOG(aData); + + TInt error; + + Reset(); + + TRAP(error, iXmlReader->ParseL(aData) ); + if(error != KErrNone ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return error; + } + LOGGER_LEAVEFN( "COMADSFolderObject::ImportFolderXml" ); + return iError; + } + +void COMADSFolderObject::ExportFolderXmlL(CBufBase& aBuffer) + { + iDesc = NULL; + iBuffer = &aBuffer; + iWriteBufPosition = 0; + iWriteBufSize = aBuffer.Size(); + + ExportL(); + } + +void COMADSFolderObject::ExportFolderXmlL(TDes8& aBuffer) + { + iDesc = &aBuffer; + iBuffer = NULL; + + ExportL(); + } + +void COMADSFolderObject::ExportL() + { + // Folder + WriteL(KFolderBeginTag); + + // Name + WriteL(KNameBeginTag); + WriteEncodedXmlL(iName); + WriteL(KNameEndTag); + + // Created Date + TBuf<32> tempdate; + tempdate.Format(KDateFormat, iCreatedDate.Year(), iCreatedDate.Month()+1, iCreatedDate.Day(), + iCreatedDate.Hour(), iCreatedDate.Minute(), iCreatedDate.Second()); + WriteL(KCreatedBeginTag); + WriteL(tempdate); + WriteL(KCreatedEndTag); + + // Modified Date + tempdate.Format(KDateFormat, iModifiedDate.Year(), iModifiedDate.Month()+1, iModifiedDate.Day(), + iModifiedDate.Hour(), iModifiedDate.Minute(), iModifiedDate.Second()); + WriteL(KModifiedBeginTag); + WriteL(tempdate); + WriteL(KModifiedEndTag); + + // Folder end + WriteL(KFolderEndTag); + } + +void COMADSFolderObject::WriteL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + iTemp.Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, iTemp ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( iTemp ); + } + } + +void COMADSFolderObject::WriteEncodedXmlL( const TDesC &aData ) + { + CnvUtfConverter converter; + User::LeaveIfError( converter.ConvertFromUnicodeToUtf8( iTemp, aData ) ); + + HBufC8* xmlData = SenXmlUtils::EncodeHttpCharactersLC( iTemp ); + + if ( iBuffer ) + { + TInt newPosition = iWriteBufPosition + xmlData->Length(); + + if ( newPosition > iWriteBufSize ) + { + TInt expand = newPosition - iWriteBufSize; + iBuffer->ExpandL( iWriteBufSize, expand ); + iWriteBufSize += expand; + } + + iBuffer->Write( iWriteBufPosition, *xmlData ); + iWriteBufPosition = newPosition; + } + else if( iDesc ) + { + iDesc->Append( *xmlData ); + } + + CleanupStack::PopAndDestroy( xmlData ); + } + +TInt COMADSFolderObject::StartDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::EndDocument() + { + return KErrNone; + } + +TInt COMADSFolderObject::StartElement(const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, + const TDesC8& aName, + const RAttributeArray& /*apAttrs*/) + { + LOGGER_ENTERFN( "COMADSFolderObject::StartElement" ); + iCurrentElement.Copy( aName ); + LOGGER_LEAVEFN( "COMADSFolderObject::StartElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::EndElement(const TDesC8& /*aURI*/, + const TDesC8& /*aLocalName*/, + const TDesC8& /*aName*/) + { + LOGGER_ENTERFN( "COMADSFolderObject::EndElement" ); + iCurrentElement.SetLength(0); + LOGGER_LEAVEFN( "COMADSFolderObject::EndElement" ); + return KErrNone; + } + +TInt COMADSFolderObject::Characters( const TDesC8& aBuf, TInt aStart, TInt aLength ) + { + LOGGER_ENTERFN( "COMADSFolderObject::Characters" ); + LOG(aBuf); + + TInt error; + + if( iCurrentElement.Compare( KOMADSFolderElement ) == 0 ) + { + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + + else if ( iCurrentElement.Compare( KOMADSNameElement ) == 0 ) + { + CnvUtfConverter converter; + TBuf buf; + error = converter.ConvertToUnicodeFromUtf8( buf, aBuf.Mid( aStart, aLength ) ); + TInt length = buf.Length() + iName.Length(); + + if ( error > 0 ) + { + LOGGER_WRITE_1("Too long name, number of uncorverted bytes: %d", error); + } + else if ( error != KErrNone ) + { + LOGGER_WRITE_1("ConvertToUnicodeFromUtf8 failed with %d", error); + iError = error; + } + else if ( length > iName.MaxLength() ) + { + LOGGER_WRITE_1("Too long name total: %d", length); + } + else + { + iName.Append( buf ); + } + } + else if ( iCurrentElement.Compare( KOMADSCreatedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iCreatedDate ); + if( error != KErrNone ) + { + iError = error; + } + } + else if ( iCurrentElement.Compare( KOMADSModifiedElement ) == 0 ) + { + error = ParseDateString( aBuf.Mid( aStart, aLength ), iModifiedDate ); + if ( error != KErrNone ) + { + iError = error; + } + } + LOGGER_LEAVEFN( "COMADSFolderObject::Characters" ); + return KErrNone; + } + +TInt COMADSFolderObject::ParseDateString(const TDesC8& aString, TDateTime& aDateTime) + { + // Ensure we don't read beyond the buffer limits + if(aString.Length() < 15) + return KErrArgument; + + // Extract the fields from the string + TLex8 yearDesc(aString.Mid(0, 4)); + TLex8 monthDesc(aString.Mid(4, 2)); + TLex8 dayDesc(aString.Mid(6, 2)); + // Skip one character here, it's supposed to be 'T' + TLex8 hourDesc(aString.Mid(9, 2)); + TLex8 minuteDesc(aString.Mid(11, 2)); + TLex8 secondDesc(aString.Mid(13, 2)); + + TInt year, month, day, hour, minute, second; + TInt error; + + // Fetch the values to temporary variables + if((error = yearDesc.Val(year)) != KErrNone) + return error; + if((error = monthDesc.Val(month)) != KErrNone) + return error; + if((error = dayDesc.Val(day)) != KErrNone) + return error; + if((error = hourDesc.Val(hour)) != KErrNone) + return error; + if((error = minuteDesc.Val(minute)) != KErrNone) + return error; + if((error = secondDesc.Val(second)) != KErrNone) + return error; + + // Assign values to datetime object + if((error = aDateTime.SetYear(year)) != KErrNone) + return error; + if((error = aDateTime.SetMonth((TMonth)(month-1))) != KErrNone) + return error; + if((error = aDateTime.SetDay(day)) != KErrNone) + return error; + if((error = aDateTime.SetHour(hour)) != KErrNone) + return error; + if((error = aDateTime.SetMinute(minute)) != KErrNone) + return error; + if((error = aDateTime.SetSecond(second)) != KErrNone) + return error; + + return KErrNone; + } + +void COMADSFolderObject::Reset() + { + iError = KErrNone; + iName.SetLength(0); + iCreatedDate.Set(2005, EJanuary, 1, 0, 0, 0, 0); + iModifiedDate.Set(2005, EJanuary, 1, 0, 0, 0, 0); + } + +TInt COMADSFolderObject::Error(TInt aErrorCode) + { + iError = aErrorCode; + return KErrNone; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/smsadaptermsvapi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/smsadaptermsvapi.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1162 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "smsadaptermsvapi.h" +#include "logger.h" +#include "vmessageparser.h" +#include "smsdataproviderdefs.h" + + +// CONSTANTS + +_LIT16(KSmsNonUnicodeChars, "èéùìòÇØøÅåÆæßÉ£$¥¡ÄÖÑܧ¿äöñüà"); + +// OTHER DEFINITIONS + + + +// ============================= LOCAL FUNCTIONS =============================== + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::NewL +// ----------------------------------------------------------------------------- +// + CSmsAdapterMsvApi* CSmsAdapterMsvApi::NewL() + { + CSmsAdapterMsvApi* self = new( ELeave ) CSmsAdapterMsvApi; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::~CSmsAdapterMsvApi() +// ----------------------------------------------------------------------------- +// +CSmsAdapterMsvApi::~CSmsAdapterMsvApi() + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::~CSmsAdapterMsvApi" ); + SAFEDELETE( iContactsDb ); + SAFEDELETE( iMtm ); + SAFEDELETE( iMtmReg ); + SAFEDELETE( iSession ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::~CSmsAdapterMsvApi" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::CSmsAdapterMsvApi +// ----------------------------------------------------------------------------- +// +CSmsAdapterMsvApi::CSmsAdapterMsvApi() + { + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::ConstructL +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::ConstructL() + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::ConstructL" ); + + iSession = CMsvSession::OpenSyncL( *this ); + iMtmReg = CClientMtmRegistry::NewL( *iSession ); + iMtm = static_cast( iMtmReg->NewMtmL(KUidMsgTypeSMS) ); + + iFs = iSession->FileSession(); + iMessageDrive = MessageServer::CurrentDriveL( iFs ); + + iContactsDb = CContactDatabase::OpenL(); + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::ConstructL" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::AddSML +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::AddSML( + CVMessageParser& aSm, + TMsvId aFolder, + TMsvId& aSmId ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::AddSML" ); + + if (!ValidFolderL( aFolder )) + { + LOGGER_WRITE( "AddSML: wrong folder" ); + User::Leave( KErrArgument ); + } + + // Set first default flags + TMsvEntry newEntry; + newEntry.iType = KUidMsvMessageEntry; + newEntry.iServiceId = KMsvLocalServiceIndexEntryId; + newEntry.iMtm = KUidMsgTypeSMS; + newEntry.SetVisible(EFalse); + newEntry.SetInPreparation(ETrue); + + // Create new message entry + CMsvEntry* entry = iSession->GetEntryL( aFolder ); + CleanupStack::PushL( entry ); + entry->CreateL( newEntry ); + aSmId = newEntry.Id(); + entry->SetEntryL(newEntry.Id()); + + // Create message header + + CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL(); + CleanupStack::PushL( paraFormatLayer ); + CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL(); + CleanupStack::PushL( charFormatLayer ); + CRichText* richText = CRichText::NewL( paraFormatLayer, charFormatLayer ); + CleanupStack::PushL( richText ); + + CSmsPDU::TSmsPDUType pduType; + + if (aFolder == KMsvGlobalInBoxIndexEntryId) + { + pduType = CSmsPDU::ESmsDeliver; + } + else if (aFolder == KMsvGlobalOutBoxIndexEntryId || + aFolder == KMsvDraftEntryId || + aFolder == KMsvSentEntryId) + { + pduType = CSmsPDU::ESmsSubmit; + } + else if (aSm.iRecipients.Count() > 0) + { + pduType = CSmsPDU::ESmsSubmit; + } + else + { + pduType = CSmsPDU::ESmsDeliver; + } + + CSmsHeader* smsHeader = CSmsHeader::NewL( pduType, *richText ); + CleanupStack::PushL( smsHeader ); + + // Set the message header in the entry's store + CMsvStore* store = entry->EditStoreL(); + CleanupStack::PushL( store ); + smsHeader->StoreL( *store ); + store->StoreBodyTextL( *richText ); + store->CommitL(); + + CleanupStack::PopAndDestroy( store ); + CleanupStack::PopAndDestroy( smsHeader ); + CleanupStack::PopAndDestroy( richText ); + CleanupStack::PopAndDestroy( charFormatLayer ); + CleanupStack::PopAndDestroy( paraFormatLayer ); + CleanupStack::PopAndDestroy( entry ); + + DoUpdateSML( aSmId, aSm, ETrue ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::AddSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::ReplaceSML +// ----------------------------------------------------------------------------- +// + void CSmsAdapterMsvApi::ReplaceSML( TMsvId aSmId, CVMessageParser& aSm ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::ReplaceSML" ); + DoUpdateSML( aSmId, aSm, EFalse ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::ReplaceSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::DeleteSML +// ----------------------------------------------------------------------------- +// + void CSmsAdapterMsvApi::DeleteSML( TMsvId aSmId ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::DeleteSML" ); + + iMtm->SwitchCurrentEntryL( aSmId ); + + TMsvEntry tEntry = iMtm->Entry().Entry(); + if (tEntry.iType != KUidMsvMessageEntry || tEntry.iMtm != KUidMsgTypeSMS) + { + LOGGER_WRITE( "Not SMS entry" ); + User::Leave(KErrNotSupported); + } + + iMtm->SwitchCurrentEntryL( tEntry.Parent() ); + iMtm->Entry().DeleteL( aSmId ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DeleteSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::DeleteUserFolderL +// ----------------------------------------------------------------------------- +// + TInt CSmsAdapterMsvApi::DeleteUserFolderL( TMsvId aUid ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::DeleteUserFolderL" ); + + iMtm->SwitchCurrentEntryL( aUid ); + CMsvEntry& entry = iMtm->Entry(); + TMsvEntry tEntry = entry.Entry(); + + if (tEntry.iType != KUidMsvFolderEntry || tEntry.Parent() != KMsvMyFoldersEntryIdValue) + { + LOGGER_WRITE( "Not correct folder" ); + User::Leave(KErrNotSupported); + } + + CMsvEntrySelection* children = entry.ChildrenL(); + TInt count = children->Count(); + delete children; + + if (count > 0) + { + LOGGER_WRITE( "Folder not empty" ); + return KErrInUse; + } + + tEntry.SetReadOnly(EFalse); + entry.ChangeL( tEntry ); + + iMtm->SwitchCurrentEntryL( tEntry.Parent() ); + iMtm->Entry().DeleteL( aUid ); + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DeleteUserFolderL" ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::RetrieveSML +// ----------------------------------------------------------------------------- +// + void CSmsAdapterMsvApi::RetrieveSML( + TMsvId aSmId, + TMsvId& aParent, + CVMessageParser& aSm, + TBool& aUnread) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::RetrieveSML" ); + + iMtm->SwitchCurrentEntryL( aSmId ); + iMtm->LoadMessageL(); + + CRichText& mtmBody = iMtm->Body(); + aSm.StoreMessageBodyL( mtmBody ); + + TMsvEntry tEntry = iMtm->Entry().Entry(); + + aUnread = tEntry.Unread(); + if (aUnread) + { + aSm.iStatus = KVMsgStatusUnread; + } + else + { + aSm.iStatus = KVMsgStatusRead; + } + + aSm.iUniversalTime = tEntry.iDate; + aSm.iHomeTime = HomeTimeFromUniversalTime( aSm.iUniversalTime ); + + aParent = tEntry.Parent(); + switch (aParent) + { + case KMsvGlobalInBoxIndexEntryId: + aSm.iFolder = KFolderInbox; + break; + case KMsvGlobalOutBoxIndexEntryId: + aSm.iFolder = KFolderOutbox; + break; + case KMsvDraftEntryId: + aSm.iFolder = KFolderDraft; + break; + case KMsvSentEntryId: + aSm.iFolder = KFolderSent; + break; + case KMsvMyFoldersEntryIdValue: + aSm.iFolder = KFolderMyFolders; + break; + default: + TPtrC folderName; + TTime time; + TBool found = FindUserFolderL(aParent, folderName, time); + if (found && folderName.Length() <= KMaxFolderNameLength) + { + aSm.iFolder = folderName; + } + else + { + LOGGER_WRITE_1( "Not folder name found for folder: %d", aParent ); + } + } + LOG( aSm.iFolder ); + + const CSmsHeader& smsHeader = iMtm->SmsHeader(); + + if ( smsHeader.Type() == CSmsPDU::ESmsDeliver ) + { + TPtrC fromAddr = smsHeader.FromAddress(); + aSm.ParseTelephoneNumber( fromAddr, aSm.iSender ); + } + else + { + const CMsvRecipientList& recipients = iMtm->AddresseeList(); + for (TInt i = 0; i < recipients.Count(); i++) + { + CVMessageParser::TTelephoneNumber recipientInfo; + aSm.ParseTelephoneNumber( recipients[i], recipientInfo ); + aSm.iRecipients.Append( recipientInfo ); + } + } + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::RetrieveSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::SendSML +// ----------------------------------------------------------------------------- +// + void CSmsAdapterMsvApi::SendSML( TMsvId aSmId ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::SendSML" ); + + iMtm->SwitchCurrentEntryL( aSmId ); + + TMsvEntry msvEntry = iMtm->Entry().Entry(); + + if (msvEntry.Parent() != KMsvGlobalOutBoxIndexEntryId) + { + LOGGER_WRITE_1( "Wrong folder, parent: %d", msvEntry.Parent() ); + return; + } + + iMtm->LoadMessageL(); + + msvEntry.SetInPreparation( EFalse ); + msvEntry.SetSendingState( KMsvSendStateWaiting ); + msvEntry.iDate.UniversalTime(); + + iMtm->RestoreServiceAndSettingsL(); + CSmsHeader& header = iMtm->SmsHeader(); + + CSmsSettings* sendOptions = CSmsSettings::NewL(); + CleanupStack::PushL( sendOptions ); + + sendOptions->CopyL( iMtm->ServiceSettings() ); + sendOptions->SetDelivery( ESmsDeliveryImmediately ); + + TSmsDataCodingScheme::TSmsAlphabet dataCoding = TSmsDataCodingScheme::ESmsAlphabet7Bit; + CRichText& msgBody = iMtm->Body(); + HBufC* msgBodyBuf = HBufC::NewLC( msgBody.DocumentLength() ); + TPtr16 ptrBody = msgBodyBuf->Des(); + msgBody.Extract( ptrBody, 0, msgBody.DocumentLength() ); + LOG(ptrBody); + + for (TInt i = 0; i < ptrBody.Length(); i++) + { + if (IsUnicode( ptrBody[i] )) + { + LOGGER_WRITE_1( "Character %d is unicode", i ); + dataCoding = TSmsDataCodingScheme::ESmsAlphabetUCS2; + break; + } + } + + sendOptions->SetCharacterSet( dataCoding ); + CleanupStack::PopAndDestroy( msgBodyBuf ); + + header.SetSmsSettingsL( *sendOptions ); + if( header.Message().ServiceCenterAddress().Length() == 0 ) + { + LOGGER_WRITE( "header.Message().ServiceCenterAddress().Length() == 0" ); + + CSmsSettings* serviceSettings = &( iMtm->ServiceSettings() ); + + if (!serviceSettings->ServiceCenterCount()) + { + LOGGER_WRITE("Cervice Center not found, could not send message"); + User::Leave( KErrCompletion ); + } + else + { + CSmsServiceCenter* sc = &serviceSettings->GetServiceCenter( serviceSettings->DefaultServiceCenter() ); + header.Message().SetServiceCenterAddressL( sc->Address() ); + } + } + + const CMsvRecipientList& addrList = iMtm->AddresseeList(); + if ( addrList.Count() == 0 ) + { + LOGGER_WRITE( "SendSML: no recipient" ); + User::Leave( KErrGeneral ); + } + + CMsvEntry* entry = &( iMtm->Entry() ); + entry->ChangeL( msvEntry ); + iMtm->SaveMessageL(); + + CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection; + CleanupStack::PushL( sel ); + sel->AppendL( entry->EntryId() ); + + TBuf8<1> dummy; + CMsvOperationActiveSchedulerWait* waiter = CMsvOperationActiveSchedulerWait::NewLC(); + waiter->iStatus = KRequestPending; + CMsvOperation* op = iMtm->InvokeAsyncFunctionL( ESmsMtmCommandScheduleCopy, *sel, dummy, waiter->iStatus ); + CleanupStack::PushL( op ); + waiter->Start(); + + LOGGER_WRITE_1( "InvokeAsyncFunctionL: status %d", waiter->iStatus.Int()); + + CleanupStack::PopAndDestroy( 4 ); // op, waiter, sel, sendOptions + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::SendSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::HandleSessionEventL +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::HandleSessionEventL( TMsvSessionEvent aEvent, TAny*, TAny*, TAny* ) + { + LOGGER_WRITE_1( "CSmsAdapterMsvApi::HandleSessionEventL: %d", aEvent); + + switch ( aEvent ) + { + case EMsvCloseSession: // The client should immediately close the session with the Message Server. + case EMsvServerTerminated: // The Message Server has been terminated. + // All clients must close their sessions immediately. + { + if (iSession) + { + SAFEDELETE( iMtm ); + SAFEDELETE( iMtmReg ); + SAFEDELETE( iSession ); + } + } + break; + + default: + // Nothing is done + break; + } + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::MsvSession +// ----------------------------------------------------------------------------- +// +CMsvSession* CSmsAdapterMsvApi::MsvSessionL() + { + if (!iSession) + { + User::Leave( KErrGeneral ); + } + return iSession; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::CleanFolderGetMsvIdsL +// ----------------------------------------------------------------------------- +// +CMsvEntrySelection* CSmsAdapterMsvApi::CleanFolderGetMsvIdsL(TMsvId aFolderId) + { + LOGGER_ENTERFN( "CMsvEntrySelection::CleanFolderGetMsvIdsL" ); + + CMsvEntry* cEntry = iSession->GetEntryL( KMsvRootIndexEntryId ); + CleanupStack::PushL( cEntry ); + + cEntry->SetEntryL( aFolderId ); + cEntry->SetSortTypeL( TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, EFalse ) ); + CMsvEntrySelection* msvEntrySelection = cEntry->ChildrenWithMtmL( KUidMsgTypeSMS ); + + CleanupStack::PopAndDestroy( cEntry ); + CleanupStack::PushL( msvEntrySelection ); + + for (TInt i = 0; i < msvEntrySelection->Count(); i++) + { + CMsvEntry* entry = iSession->GetEntryL( msvEntrySelection->At(i) ); + CleanupStack::PushL( entry ); + TMsvEntry tEntry = entry->Entry(); + tEntry.SetReadOnly( EFalse ); + entry->ChangeL( tEntry ); + DeleteSML( msvEntrySelection->At(i) ); + CleanupStack::PopAndDestroy(); //entry + } + + CleanupStack::Pop(msvEntrySelection); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::CleanFolderGetMsvIdsL" ); + return msvEntrySelection; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::CleanFolderL +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::CleanFolderL(TMsvId aFolderId) + { + CMsvEntrySelection* msvEntrySelection = CleanFolderGetMsvIdsL(aFolderId); + delete msvEntrySelection; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::CleanUserFoldersL +// Cleans all user folders from SMS messages +// ----------------------------------------------------------------------------- +void CSmsAdapterMsvApi::CleanUserFoldersL() + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::CleanUserFoldersL" ); + + // Get the folder + CMsvEntry* msvEntry = iSession->GetEntryL(KMsvMyFoldersEntryIdValue); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* folders = msvEntry->ChildrenWithTypeL(KUidMsvFolderEntry); + CleanupStack::PopAndDestroy(msvEntry); + CleanupStack::PushL(folders); + + TInt error(KErrNone); + + for (TInt index = 0; index < folders->Count(); index++) + { + TMsvId folderId = folders->At(index); + + if (folderId != KMsvMyFoldersTemplatesFolderId) + { + CleanFolderL(folderId); + error = DeleteUserFolderL(folderId); + if (error != KErrNone) + { + // Note: folder is not deleted if contains other message items (like MMS) + // In this case DeleteUserFolderL returns KErrInUse. + LOGGER_WRITE_1("iMsvApi->DeleteUserFolderL failed with %d", error); + } + } + } + + CleanupStack::PopAndDestroy(folders); + + // Delete also SMS messages directly under My Folders + CleanFolderL(KMsvMyFoldersEntryIdValue); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::CleanUserFoldersL" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::DiskSpaceBelowCriticalLevelL +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::DiskSpaceBelowCriticalLevelL( TInt aDataSize ) + { + return SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, aDataSize, iMessageDrive ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::UpdateSMStatusL +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::UpdateSMStatusL( TMsvId aSmId, CVMessageParser &aSm ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::UpdateSMStatusL" ); + + iMtm->SwitchCurrentEntryL( aSmId ); + + CMsvEntry& msvEntry = iMtm->Entry(); + const TMsvEntry& oldEntry = msvEntry.Entry(); + + TMsvEntry newEntry( oldEntry ); + + // STATUS + if (aSm.iStatus.Compare( KVMsgStatusUnread ) == 0) + { + newEntry.SetUnread( ETrue ); + } + else if (aSm.iStatus.Compare( KVMsgStatusRead ) == 0) + { + newEntry.SetUnread( EFalse ); + } + else + { + LOGGER_WRITE( "Unexpected status, not updated" ); + LOG( aSm.iStatus ); + } + + msvEntry.ChangeL( newEntry ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::UpdateSMStatusL" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::DoUpdateSML +// ----------------------------------------------------------------------------- +// +void CSmsAdapterMsvApi::DoUpdateSML( TMsvId aSmId, CVMessageParser &aSm, TBool aNewSm ) + { + LOGGER_WRITE_1( "CSmsAdapterMsvApi::DoUpdateSML: %d", aSmId ); + TInt i; + + iMtm->SwitchCurrentEntryL( aSmId ); + iMtm->LoadMessageL(); + CMsvEntry& msvEntry = iMtm->Entry(); + const TMsvEntry& oldEntry = msvEntry.Entry(); + TMsvEntry newEntry(oldEntry); + + // Set message status + if (aSm.iStatus.Compare( KVMsgStatusUnread ) == 0) + { + newEntry.SetUnread( ETrue ); + } + else if (aSm.iStatus.Compare( KVMsgStatusRead ) == 0) + { + newEntry.SetUnread( EFalse ); + } + else if (aNewSm) + { + newEntry.SetUnread( EFalse ); // by default msg is not unread, if we don't know + } + + // Set time. store format is universal + if ( aSm.iUniversalTime.Int64() > 0 ) + { + newEntry.iDate = aSm.iUniversalTime; + } + else if ( aSm.iHomeTime.Int64() > 0 ) + { + newEntry.iDate = UniversalTimeFromHomeTime( aSm.iHomeTime ); + } + else + { + newEntry.iDate.UniversalTime(); + } + + // ADDRESS INFORMATION + TMsvId parent = newEntry.Parent(); + LOGGER_WRITE_1( "Parent is %d", parent ); + + TBuf addrBookName; + + CSmsHeader& header = iMtm->SmsHeader(); + + if (header.Type() == CSmsPDU::ESmsDeliver) + { + if (aSm.iSender.iName.Length() > 0) + { + newEntry.iDetails.Set( aSm.iSender.iName ); + header.SetFromAddressL( aSm.iSender.iName ); + } + else if (aSm.iSender.iNumber.Length() > 0) + { + FetchNameFromContactsL(aSm.iSender.iNumber, addrBookName); + if (addrBookName.Length() > 0) + { + newEntry.iDetails.Set( addrBookName ); + header.SetFromAddressL( addrBookName ); + } + else + { + newEntry.iDetails.Set( aSm.iSender.iNumber ); + header.SetFromAddressL( aSm.iSender.iNumber ); + } + } + CSmsMessage& smsMsg = header.Message(); + CSmsPDU& smsPdu = smsMsg.SmsPDU(); + CSmsDeliver* smsDeliver = reinterpret_cast( &smsPdu ); + smsDeliver->SetServiceCenterTimeStamp( newEntry.iDate ); + } + else // message to be sent + { + if (!aNewSm) + { + const CMsvRecipientList& addrList = iMtm->AddresseeList(); + TInt numOldAddr = addrList.Count(); + for (i = 0; i < numOldAddr; i++) + { + iMtm->RemoveAddressee( i ); + } + } + + TInt numRecipients = aSm.iRecipients.Count(); + + if (numRecipients > 0) + { + if (aSm.iRecipients[0].iName.Length() > 0) + { + newEntry.iDetails.Set( aSm.iRecipients[0].iName ); + } + else if (aSm.iRecipients[0].iNumber.Length() > 0) + { + FetchNameFromContactsL(aSm.iRecipients[0].iNumber, addrBookName); + if (addrBookName.Length() > 0) + { + newEntry.iDetails.Set( addrBookName ); + } + else + { + newEntry.iDetails.Set( aSm.iRecipients[0].iNumber ); + } + } + } + + for (i = 0; i < numRecipients; i++) + { + if (aSm.iRecipients[i].iNumber.Length() > 0) + { + if (aSm.iRecipients[i].iName.Length() > 0) + { + iMtm->AddAddresseeL( aSm.iRecipients[i].iNumber, aSm.iRecipients[i].iName ); + } + else + { + FetchNameFromContactsL( aSm.iRecipients[i].iNumber, addrBookName ); + iMtm->AddAddresseeL( aSm.iRecipients[i].iNumber, addrBookName ); + } + } + } + } // else + + // MESSAGE BODY + LOGGER_WRITE( "Add message body" ); + CRichText& mtmBody = iMtm->Body(); + mtmBody.Reset(); + aSm.LoadMessageBodyL( mtmBody ); + + TBuf description; + description.Zero(); + if (aSm.iMessageBody) + { + TPtrC16 leftBody = aSm.iMessageBody->Left( KSmsDescriptionLength ); + description.Copy( leftBody ); + + for (i = 0; i < description.Length(); i++) + { + if (description[i] == '\n' || description[i] == '\r') + { + description[i] = ' '; + } + } + newEntry.iDescription.Set( description ); + } + + newEntry.SetVisible( ETrue ); + newEntry.SetComplete( ETrue ); + newEntry.SetInPreparation( EFalse ); + newEntry.SetSendingState( KMsvSendStateUponRequest ); + + msvEntry.ChangeL( newEntry ); + + LOGGER_WRITE( "Save message" ); + iMtm->SaveMessageL(); + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DoUpdateSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::ValidUserFolder +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::ValidFolderL( TMsvId aFolder, TBool aOutboxValid ) + { + TBool valid(EFalse); + + switch ( aFolder ) + { + case KMsvGlobalInBoxIndexEntryId: + valid = ETrue; + break; + case KMsvDraftEntryId: + valid = ETrue; + break; + case KMsvSentEntryId: + valid = ETrue; + break; + case KMsvGlobalOutBoxIndexEntryId: + if (aOutboxValid) + { + valid = ETrue; + } + break; + case KMsvMyFoldersEntryIdValue: + valid = ETrue; + break; + default: + valid = FindUserFolderL(aFolder); + } + + return valid; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::FindUserFolderL(TMsvId aFolder, TPtrC& aName, TTime& aDate) + { + TBool found(EFalse); + + CMsvEntry* entry = iSession->GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL( entry ); + + CMsvEntrySelection* selection = entry->ChildrenL(); + CleanupStack::PushL( selection ); + + TMsvId serviceId; + TMsvEntry entryT; + + for( TInt i = 0; i < selection->Count(); i++ ) + { + User::LeaveIfError( iSession->GetEntry( selection->At( i ), serviceId, entryT ) ); + + if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && entryT.Id() == aFolder ) + { + found = ETrue; + aDate = entryT.iDate; + aName.Set(entryT.iDetails); + break; + } + } + + CleanupStack::PopAndDestroy( 2 ); // entry, selection + + return found; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::FindUserFolderL(TMsvId aFolder) + { + TPtrC name; + TTime time; + + return FindUserFolderL(aFolder, name, time); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::FindUserFolderL +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::FindUserFolderL(const TDesC& aName, TMsvId& aFolder) + { + CMsvEntry* entry = iSession->GetEntryL( KMsvMyFoldersEntryIdValue ); + CleanupStack::PushL( entry ); + + CMsvEntrySelection* selection = entry->ChildrenL(); + CleanupStack::PushL( selection ); + + TBool found(EFalse); + TMsvId serviceId; + TMsvEntry entryT; + + for( TInt i = 0; i < selection->Count(); i++ ) + { + User::LeaveIfError( iSession->GetEntry( selection->At( i ), serviceId, entryT ) ); + + if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && + aName.Compare(entryT.iDescription) == 0 ) + { + found = ETrue; + aFolder = entryT.Id(); + break; + } + } + + CleanupStack::PopAndDestroy( 2 ); // entry, selection + + return found; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::IsUnicode +// ----------------------------------------------------------------------------- +// +TBool CSmsAdapterMsvApi::IsUnicode( const TUint16 aValue ) + { + if ( aValue > 0x7F && KSmsNonUnicodeChars().Locate( aValue ) < 0 ) + { + LOGGER_WRITE_1( "IsUnicode: Found UC char %d", aValue ); + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::MoveSML +// Moves SM to another folder. +// ----------------------------------------------------------------------------- +void CSmsAdapterMsvApi::MoveSML( TMsvId aSmId, TMsvId aParentId ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::MoveSML starts" ); + + if ( !ValidFolderL( aParentId ) ) + { + LOGGER_WRITE( "MoveSML: wrong folder" ); + User::Leave( KErrArgument ); + } + + // Find the parent + CMsvEntry* clientEntry( NULL ); + + // Find this entry and put it to cleanup stack + clientEntry = iSession->GetEntryL( aSmId ); + CleanupStack::PushL( clientEntry ); + + // Check that this is a SMS message + TMsvEntry entryT = clientEntry->Entry(); + if (entryT.iType != KUidMsvMessageEntry || entryT.iMtm != KUidMsgTypeSMS) + { + LOGGER_WRITE( "MoveSML: wrong entry type" ); + User::Leave( KErrArgument ); + } + + // Find parent id, we'll be moving it's childs + TMsvId parentId = entryT.Parent(); + + // Make sure that the parent has changed + if (parentId != aParentId) + { + // Set parent as context + clientEntry->SetEntryL( parentId ); + + // Move the child item to another branch, use temporary waiter object + CMsvOperationActiveSchedulerWait* w = CMsvOperationActiveSchedulerWait::NewLC(); + CMsvOperation* op = clientEntry->MoveL( aSmId, aParentId, w->iStatus ); + w->Start(); + SAFEDELETE( op ); + CleanupStack::PopAndDestroy(); + + } + else + { + LOGGER_WRITE( "CSmsAdapterMsvApi::MoveSML, identical parents." ); + } + + CleanupStack::PopAndDestroy(); // entry + + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::MoveSML" ); + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::AddUserFolderL +// Creates new user folder +// ----------------------------------------------------------------------------- +TInt CSmsAdapterMsvApi::AddUserFolderL( TMsvId& aFolder, const TDesC& aName ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::AddUserFolderL" ); + LOG(aName); + + // Make sure that we are not going to add same folder twise + TBool found(EFalse); + found = FindUserFolderL(aName, aFolder); + if ( found ) + { + LOGGER_WRITE( "Folder already exists" ); + return KErrNone; + } + + CMsvEntry* entry = iSession->GetEntryL(KMsvMyFoldersEntryIdValue); + CleanupStack::PushL( entry ); + + TTime date; + date.UniversalTime(); + + TMsvEntry folderEntry; + folderEntry.iType = KUidMsvFolderEntry; + folderEntry.iMtm = KUidMsvLocalServiceMtm; + folderEntry.iDetails.Set(aName); + folderEntry.iServiceId = KMsvLocalServiceIndexEntryIdValue; + folderEntry.iSize = sizeof(folderEntry); + folderEntry.iDate = date; + folderEntry.SetStandardFolder(EFalse); + folderEntry.SetVisible(ETrue); + folderEntry.SetComplete(ETrue); + folderEntry.SetInPreparation(EFalse); + folderEntry.SetReadOnly(EFalse); + + entry->CreateL(folderEntry); + CleanupStack::PopAndDestroy(entry); + + aFolder = folderEntry.Id(); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::AddUserFolderL" ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::UpdateUserFolderL +// Updates user folder (changes name) +// ----------------------------------------------------------------------------- +TInt CSmsAdapterMsvApi::UpdateUserFolderL( TMsvId aFolder, const TDesC& aName ) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::UpdateUserFolderL" ); + LOG(aName); + + CMsvEntry* entry = iSession->GetEntryL( aFolder ); + CleanupStack::PushL( entry ); + + TMsvEntry tEntry = entry->Entry(); + + if ( tEntry.iType != KUidMsvFolderEntry ) + { + CleanupStack::PopAndDestroy( entry ); + LOGGER_WRITE( "No message folder" ); + return KErrGeneral; + } + + tEntry.iDetails.Set(aName); + tEntry.iDescription.Set(aName); + + entry->ChangeL(tEntry); + + CleanupStack::PopAndDestroy( entry ); + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::UpdateUserFolderL" ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::UniversalTimeFromHomeTime +// Converts local time to universal time. +// ----------------------------------------------------------------------------- +TTime CSmsAdapterMsvApi::UniversalTimeFromHomeTime( TTime aTime ) + { + TLocale locale; + locale.Refresh(); + + TTimeIntervalSeconds universalTimeOffset = locale.UniversalTimeOffset(); + aTime -= universalTimeOffset; + + if (locale.QueryHomeHasDaylightSavingOn()) + { + TTimeIntervalHours daylightSaving( 1 ); + aTime -= daylightSaving; + } + + return aTime; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::HomeTimeFromUniversalTime +// Converts universal time to local time. +// ----------------------------------------------------------------------------- +TTime CSmsAdapterMsvApi::HomeTimeFromUniversalTime( TTime aTime ) + { + TLocale locale; + locale.Refresh(); + + TTimeIntervalSeconds universalTimeOffset = locale.UniversalTimeOffset(); + aTime += universalTimeOffset; + + if (locale.QueryHomeHasDaylightSavingOn()) + { + TTimeIntervalHours daylightSaving( 1 ); + aTime += daylightSaving; + } + + return aTime; + } + +// ----------------------------------------------------------------------------- +// CSmsAdapterMsvApi::FetchNameFromContactsL +// Searches contact name of given number from phone book +// If not found, empty descriptor is returned. +// ----------------------------------------------------------------------------- +void CSmsAdapterMsvApi::FetchNameFromContactsL(const TDesC& aNumber, TDes& aName) + { + LOGGER_ENTERFN( "CSmsAdapterMsvApi::FetchNameFromContactsL" ); + LOG(aNumber); + + aName.Zero(); + + const TInt KNumDigitsToMatch(8); + CContactIdArray* contactIds = iContactsDb->MatchPhoneNumberL(aNumber, KNumDigitsToMatch); + if (contactIds->Count() != 1) + { + delete contactIds; + return; + } + CleanupStack::PushL(contactIds); + + CContactItem* item = iContactsDb->ReadContactLC((*contactIds)[0]); + CContactItemFieldSet& fieldSet = item->CardFields(); + + TPtrC familyName; + TPtrC givenName; + TInt pos; + + pos = fieldSet.Find(KUidContactFieldFamilyName); + if (pos >= 0) + { + CContactItemField& itemField=fieldSet[pos]; + if (!(itemField.IsHidden()) && !(itemField.IsDisabled())) + { + CContactTextField* textField = itemField.TextStorage(); + familyName.Set(textField->Text()); + } + } + pos = fieldSet.Find(KUidContactFieldGivenName); + if (pos >= 0) + { + CContactItemField& itemField=fieldSet[pos]; + if (!(itemField.IsHidden()) && !(itemField.IsDisabled())) + { + CContactTextField* textField = itemField.TextStorage(); + givenName.Set(textField->Text()); + } + } + + TInt spaceLeft = aName.MaxLength(); + + if (familyName.Length() <= spaceLeft) + { + aName.Append(familyName); + aName.Trim(); + spaceLeft -= aName.Length(); + } + + if ((givenName.Length() + 1) <= spaceLeft) + { + aName.Append(' '); + aName.Append(givenName); + aName.Trim(); + } + + LOG(aName); + + CleanupStack::PopAndDestroy(2); // item, contactIds + LOGGER_LEAVEFN( "CSmsAdapterMsvApi::FetchNameFromContactsL" ); + } + +// End of file diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/smsdataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/smsdataprovider.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,311 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "smsdataprovider.h" +#include "smsdataproviderdefs.h" +#include "logger.h" +#include "smsdatastore.h" + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::CSmsDataProvider +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +CSmsDataProvider::CSmsDataProvider() : + iOwnStoreFormat( NULL ), + iFilters( 1 ), + iMsvSession( NULL ) + { + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CSmsDataProvider::ConstructL() + { + LOGGER_ENTERFN( "ConstructL" ); + + User::LeaveIfError( iRFs.Connect() ); + iStringPool.OpenL(); + + LOGGER_LEAVEFN( "ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CSmsDataProvider* CSmsDataProvider::NewL() + { + LOGGER_ENTERFN( "CSmsDataProvider::NewL()" ); + + CSmsDataProvider* self = new (ELeave) CSmsDataProvider; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + LOGGER_LEAVEFN( "CSmsDataProvider::NewL()" ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::~CSmsDataProvider +// Destructor. +// ----------------------------------------------------------------------------- +CSmsDataProvider::~CSmsDataProvider() + { + LOGGER_ENTERFN( "~CSmsDataProvider()" ); + + SAFEDELETE( iOwnStoreFormat ); + + iStringPool.Close(); + iFilters.Close(); + + LOGGER_LEAVEFN( "~CSmsDataProvider()" ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::HandleSessionEventL +// virtual function from MMsvSessionObserver, does nothing +// ----------------------------------------------------------------------------- +void CSmsDataProvider::HandleSessionEventL( TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::HandleSessionEventL()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::HandleSessionEventL()" ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoOnFrameworkEvent +// Not used +// ----------------------------------------------------------------------------- +void CSmsDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent, TInt /*aParam1*/, TInt /*aParam2*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::DoOnFrameworkEvent()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::DoOnFrameworkEvent()" ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoSupportsOperation +// Checks whether data provider supports specific operation +// ----------------------------------------------------------------------------- +TBool CSmsDataProvider::DoSupportsOperation( TUid /*aOpId*/ ) const + { + LOGGER_ENTERFN( "CSmsDataProvider::DoSupportsOperation()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::DoSupportsOperation()" ); + + // Optional operations are not supported + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +const CSmlDataStoreFormat& CSmsDataProvider::DoStoreFormatL() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoStoreFormatL()" ); + + if (!iOwnStoreFormat) + { + iOwnStoreFormat = DoOwnStoreFormatL(); + } + + LOGGER_LEAVEFN( "CSmsDataProvider::DoStoreFormatL()" ); + + return *iOwnStoreFormat; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoListStoresLC +// Returns array fo data stores, not implemented because only single data store +// is supported +// ----------------------------------------------------------------------------- +CDesCArray* CSmsDataProvider::DoListStoresLC() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoListStoresLC()" ); + + CDesCArrayFlat* stores = new (ELeave) CDesCArrayFlat( 1 ); + CleanupStack::PushL( stores ); + stores->AppendL( KNSmlDefaultLocalDbName ); + + LOGGER_LEAVEFN( "CSmsDataProvider::DoListStoresLC()" ); + + return stores; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoDefaultStoreL +// Returns the name of the default data store +// ----------------------------------------------------------------------------- +const TDesC& CSmsDataProvider::DoDefaultStoreL() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoDefaultStoreL()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::DoDefaultStoreL()" ); + return KNSmlDefaultLocalDbName; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoNewStoreInstanceLC +// Creates a new data store object, which can be used for synchronization +// ----------------------------------------------------------------------------- +CSmlDataStore* CSmsDataProvider::DoNewStoreInstanceLC() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoNewStoreInstanceLC" ); + CSmsDataStore* newStore = CSmsDataStore::NewLC(); + LOGGER_LEAVEFN( "CSmsDataProvider::DoNewStoreInstanceLC" ); + return newStore; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoCheckSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CSmsDataProvider::DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, RPointerArray& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::DoCheckSupportedServerFiltersL()" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoCheckServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CSmsDataProvider::DoCheckServerFiltersL( RPointerArray& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::DoCheckServerFiltersL()" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoSupportedServerFiltersL +// Filters are not supported +// ----------------------------------------------------------------------------- +const RPointerArray& CSmsDataProvider::DoSupportedServerFiltersL() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoSupportedServerFiltersL()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::DoSupportedServerFiltersL()" ); + return iFilters; // empty array + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoSupportsUserSelectableMatchType +// Not supported +// ----------------------------------------------------------------------------- +TBool CSmsDataProvider::DoSupportsUserSelectableMatchType() const + { + LOGGER_ENTERFN( "CSmsDataProvider::DoSupportsUserSelectableMatchType()" ); + LOGGER_LEAVEFN( "CSmsDataProvider::DoSupportsUserSelectableMatchType()" ); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoGenerateRecordFilterQueryLC +// Filters are not supported +// ----------------------------------------------------------------------------- +HBufC* CSmsDataProvider::DoGenerateRecordFilterQueryLC( const RPointerArray& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::DoGenerateRecordFilterQueryLC()" ); + User::Leave( KErrNotSupported ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoGenerateFieldFilterQueryL +// Filters are not supported +// ----------------------------------------------------------------------------- +void CSmsDataProvider::DoGenerateFieldFilterQueryL( const RPointerArray& /*aFilters*/, TDes& /*aFilterMimeType*/, RPointerArray& /*aProperties*/, TDesC& /*aStoreName*/ ) + { + LOGGER_ENTERFN( "CSmsDataProvider::DoGenerateFieldFilterQueryL()" ); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CSmsDataProvider::DoOwnStoreFormatL +// Creates data store format +// ----------------------------------------------------------------------------- +CSmlDataStoreFormat* CSmsDataProvider::DoOwnStoreFormatL() + { + LOGGER_ENTERFN( "CSmsDataProvider::DoOwnStoreFormatL()" ); + + TParse* parse = new ( ELeave ) TParse(); + CleanupStack::PushL(parse); + TFileName fileName; + RResourceFile resourceFile; + + parse->Set( KSmsStoreFormatRscRom, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + + TRAPD( error, resourceFile.OpenL( iRFs, fileName ) ); + if ( error ) + { + LOGGER_WRITE_1( "RResourceFile::OpenL leaved with %d - try again", error ); + parse->Set( KSmsStoreFormatRsc, &KDC_RESOURCE_FILES_DIR, NULL ); + fileName = parse->FullName(); + BaflUtils::NearestLanguageFile( iRFs, fileName ); + resourceFile.OpenL( iRFs, fileName ); + } + CleanupClosePushL( resourceFile ); + + HBufC8* buffer = resourceFile.AllocReadLC( SMS_DATA_STORE ); + + TResourceReader reader; + reader.SetBuffer( buffer ); + + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + + CleanupStack::Pop(); // dsFormat + CleanupStack::PopAndDestroy( 3 ); // buffer, resourceFile, parse + + LOGGER_LEAVEFN( "CSmsDataProvider::DoOwnStoreFormatL()" ); + + return dsFormat; + } + + +// ----------------------------------------------------------------------------- +// ImplementationTable +// Required by ECom plugin interface, tells the entry point of the library +// ----------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KSmsDataProviderImplUid, CSmsDataProvider::NewL ) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns the implementation table, required by the ECom plugin interface +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/smsdataprovider.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/smsdataprovider.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2005-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: Resource definitions for SMS DS ECOM plug-in +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x10206B5C; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x101F4D3A; // Constant for all DS plug ins + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10206B5C; // DS interface implementation UID + version_no = 1; + display_name = "SMS"; // default name in UI + } + }; + } + }; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/smsdatastore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/smsdatastore.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,1362 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include +#include +#include +#include +#include +#include "smsdatastore.h" +#include "smsdataproviderdefs.h" +#include "logger.h" +#include "smsadaptermsvapi.h" +#include "vmessageparser.h" +#include "omadsfolderobject.h" + +// This is used, when databuffer is not initialized +const TInt KDataBufferNotReady = -1; +// Size for internal CBufFlat, used to buffer SMS messages +const TInt KDataBufferSize = 1024; + +_LIT8(KSmsMimeType, "text/x-vMessage"); +_LIT8(KSmsMimeVersion, "1.2"); +_LIT8(KFolderMimeType, "application/vnd.omads-folder+xml"); +_LIT8(KFolderMimeVersion, "1.2"); + + +// ----------------------------------------------------------------------------- +// CSmsDataStore::CSmsDataStore +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CSmsDataStore::CSmsDataStore(): + iHasHistory(EFalse), + iDataBaseOpened(EFalse), + iKey(TKeyArrayFix(_FOFF(TSnapshotItem, ItemId()), ECmpTInt)) + { + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::ConstructL +// Symbian 2nd phase constructor, can leave. +// ----------------------------------------------------------------------------- +void CSmsDataStore::ConstructL() + { + LOGGER_ENTERFN("CSmsDataStore::ConstructL"); + + iMsvApi = CSmsAdapterMsvApi::NewL(); + + // Item UID sets, used to transfer change info + iNewItems = new (ELeave) CNSmlDataItemUidSet; + iDeletedItems = new (ELeave) CNSmlDataItemUidSet; + iUpdatedItems = new (ELeave) CNSmlDataItemUidSet; + iMovedItems = new (ELeave) CNSmlDataItemUidSet; + iSoftDeletedItems = new (ELeave) CNSmlDataItemUidSet; + + iMessageParser = CVMessageParser::NewL(); + iFolderObjectParser = COMADSFolderObject::NewL(); + + LOGGER_LEAVEFN("CSmsDataStore::ConstructL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CSmsDataStore* CSmsDataStore::NewLC() + { + CSmsDataStore* self = new (ELeave) CSmsDataStore; + + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CSmsDataStore::~CSmsDataStore +// Destructor +// ----------------------------------------------------------------------------- +CSmsDataStore::~CSmsDataStore() + { + LOGGER_ENTERFN("CSmsDataStore::~CSmsDataStore()"); + + SAFEDELETE(iFolderObjectParser); + SAFEDELETE(iMessageParser); + + SAFEDELETE(iMsvApi); + SAFEDELETE(iChangeFinder); + + // UID sets + SAFEDELETE(iNewItems); + SAFEDELETE(iDeletedItems); + SAFEDELETE(iSoftDeletedItems); + SAFEDELETE(iUpdatedItems); + SAFEDELETE(iMovedItems); + + SAFEDELETE(iDataBuffer); + + LOGGER_LEAVEFN("CSmsDataStore::~CSmsDataStore()"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoOpenL +// Opens database. This operation is performed SYNCHRONOUSLY +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoOpenL(const TDesC& /*aStoreName*/, MSmlSyncRelationship& aContext, + TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoOpenL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + if (iDataBaseOpened) + { + User::RequestComplete(iCallerStatus, KErrInUse); + LOGGER_WRITE("CSmsDataStore::DoOpenL failed with KErrInUse."); + return; + } + + *iContext = aContext; + + // Create ChangeFinder object + iChangeFinder = CChangeFinder::NewL(aContext, iKey, iHasHistory, KSmsDataProviderImplUid); + + RegisterSnapshotL(); + + iDataBaseOpened = ETrue; + iCurrentState = ESmsOpenAndWaiting; + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoOpenL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCancelRequest +// Not supported, does nothing. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCancelRequest() + { + LOGGER_ENTERFN("CSmsDataStore::DoCancelRequestL"); + LOGGER_LEAVEFN("CSmsDataStore::DoCancelRequestL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoStoreName +// Returns the name of the DataStore +// ----------------------------------------------------------------------------- +const TDesC& CSmsDataStore::DoStoreName() const + { + LOGGER_ENTERFN("CSmsDataStore::DoStoreName"); + + if (iDataBaseOpened) + { + LOGGER_LEAVEFN("CSmsDataStore::DoStoreName"); + return KNSmlDefaultLocalDbName; + } + + LOGGER_LEAVEFN("CSmsDataStore::DoStoreName"); + return KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoBeginTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoBeginTransactionL() + { + LOGGER_ENTERFN("CSmsDataStore::DoBeginTransactionL"); + LOGGER_WRITE("CSmsDataStore::DoBeginTransactionL leaved with KErrNotSupported.") + User::Leave(KErrNotSupported); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCommitTransactionL +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCommitTransactionL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoCommitTransactionL"); + LOGGER_WRITE("CSmsDataStore::DoCommitTransactionL failed with KErrNotSupported."); + + iCallerStatus = &aStatus; + User::RequestComplete(iCallerStatus, KErrNotSupported); + + LOGGER_LEAVEFN("CSmsDataStore::DoCommitTransactionL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoRevertTransaction +// Transactions are not supported. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoRevertTransaction(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoRevertTransaction"); + iCallerStatus = &aStatus; + User::RequestComplete(iCallerStatus, KErrNone); + LOGGER_LEAVEFN("CSmsDataStore::DoRevertTransaction"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoBeginBatchL +// Batching is not supported. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoBeginBatchL() + { + LOGGER_ENTERFN("CSmsDataStore::DoBeginBatchL"); + LOGGER_WRITE("CSmsDataStore::DoBeginBatchL leaved with KErrNotSupported."); + User::Leave(KErrNotSupported); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCommitBatchL +// Batching is not supported +// ----------------------------------------------------------------------------- +// +void CSmsDataStore::DoCommitBatchL(RArray& /*aResultArray*/, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoCommitBatchL"); + LOGGER_WRITE("CSmsDataStore::DoCommitBatchL failed with KErrNotSupported"); + + iCallerStatus = &aStatus; + User::RequestComplete(iCallerStatus, KErrNotSupported); + + LOGGER_LEAVEFN("CSmsDataStore::DoCommitBatchL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCancelBatch +// Batching is not supported +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCancelBatch() + { + LOGGER_ENTERFN("CSmsDataStore::DoCancelBatch"); + LOGGER_LEAVEFN("CSmsDataStore::DoCancelBatch"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoSetRemoteStoreFormatL +// Not supported +// ----------------------------------------------------------------------------- +// +void CSmsDataStore::DoSetRemoteStoreFormatL(const CSmlDataStoreFormat& /*aServerDataStoreFormat*/) + { + LOGGER_ENTERFN("CSmsDataStore::DoSetRemoteStoreFormatL"); + LOGGER_LEAVEFN("CSmsDataStore::DoSetRemoteStoreFormatL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoSetRemoteMaxObjectSize +// Not supported +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoSetRemoteMaxObjectSize(TInt /*aServerMaxObjectSize*/) + { + LOGGER_ENTERFN("CSmsDataStore::DoSetRemoteMaxObjectSize"); + LOGGER_LEAVEFN("CSmsDataStore::DoSetRemoteMaxObjectSize"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoMaxObjectSize +// +// ----------------------------------------------------------------------------- +TInt CSmsDataStore::DoMaxObjectSize() const + { + LOGGER_ENTERFN("CSmsDataStore::DoMaxObjectSize"); + LOGGER_LEAVEFN("CSmsDataStore::DoMaxObjectSize"); + return 0; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoOpenItemL +// Opens item in the DataStore, reads it (either completely or partially) +// to the temporary buffer where it can be later read to the remote database. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoOpenItemL(TSmlDbItemUid aUid, TBool& aFieldChange, + TInt& aSize, TSmlDbItemUid& aParent, TDes8& aMimeType, + TDes8& aMimeVer, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoOpenItemL"); + + LOGGER_WRITE_1("Opening item %d.", aUid); + + // Store these for later use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoOpenItemL, Incorrect state: %d", iCurrentState); + } + + // Allocate new buffer + SAFEDELETE(iDataBuffer); + iDataBuffer = CBufFlat::NewL(KDataBufferSize); + + TBool userFolderFound(EFalse); + TTime timeStamp; + TPtrC folderName; + userFolderFound = iMsvApi->FindUserFolderL(aUid, folderName, timeStamp); + if (userFolderFound) + { + iMimeType = EMessageFolder; + iParentId = KMsvMyFoldersEntryIdValue; + + iFolderObjectParser->SetName(folderName); + iFolderObjectParser->SetCreatedDate(timeStamp.DateTime()); + iFolderObjectParser->SetModifiedDate(timeStamp.DateTime()); + iFolderObjectParser->ExportFolderXmlL(*iDataBuffer); + } + else + { + iMimeType = ESmsMessage; + iMessageParser->ResetAll(); + + TBool unread; + TMsvId parent; + TRAPD(error, iMsvApi->RetrieveSML(aUid, parent, *iMessageParser, unread)); + if(error != KErrNone) + { + User::RequestComplete(iCallerStatus, KErrNotFound); + LOGGER_WRITE_1("RetrieveSML(aUid, &parser, flags) leaved with %d.", error); + return; + } + + iParentId = parent; + iMessageParser->ConstructMessageL(*iDataBuffer); + } + + // Adjust buffer + iDataBuffer->Compress(); + iReaderPosition = 0; + iCurrentState = ESmsItemOpen; + + // Return these + aFieldChange = EFalse; + aParent = iParentId; + aSize = iDataBuffer->Size(); + + if (iMimeType == EMessageFolder) + { + TInt targetLength = KFolderMimeType().Length(); + if (aMimeType.MaxLength() < targetLength) + targetLength = aMimeType.MaxLength(); + aMimeType.Copy(KFolderMimeType().Ptr(), targetLength); + + // Set mime version (do not exceed the allocated buffer) + targetLength = KFolderMimeVersion().Length(); + if (aMimeVer.MaxLength() < targetLength) + targetLength = aMimeVer.MaxLength(); + aMimeVer.Copy(KFolderMimeVersion().Ptr(), targetLength); + } + else // ESmsMessage + { + TInt targetLength = KSmsMimeType().Length(); + if (aMimeType.MaxLength() < targetLength) + targetLength = aMimeType.MaxLength(); + aMimeType.Copy(KSmsMimeType().Ptr(), targetLength); + + // Set mime version (do not exceed the allocated buffer) + targetLength = KSmsMimeVersion().Length(); + if (aMimeVer.MaxLength() < targetLength) + targetLength = aMimeVer.MaxLength(); + aMimeVer.Copy(KSmsMimeVersion().Ptr(), targetLength); + } + + // Signal we're complete + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoOpenItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCreateItemL +// Create new item to the message store. +// Return the id number of the newly created item +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCreateItemL(TSmlDbItemUid& aUid, TInt aSize, + TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& /*aMimeVer*/, + TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoCreateItemL"); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("Incorrect state: %d", iCurrentState); + } + + // Check MIME type + LOG(aMimeType); + if (aMimeType.Compare( KFolderMimeType() ) == 0) + { + iMimeType = EMessageFolder; + } + else if (aMimeType.Compare( KSmsMimeType() ) == 0) + { + iMimeType = ESmsMessage; + } + else + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE("Bad MIME type"); + return; + } + + LOGGER_WRITE_1( "Parent folder: %d", aParent); + if ((iMimeType == EMessageFolder && aParent != KMsvMyFoldersEntryIdValue) || + (iMimeType == ESmsMessage && !iMsvApi->ValidFolderL(aParent))) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + LOGGER_WRITE( "Bad parent folder"); + return; + } + + // Ensure that we've got enough disk space for the item + if(iMsvApi->DiskSpaceBelowCriticalLevelL(aSize)) + { + User::RequestComplete(iCallerStatus, KErrDiskFull); + LOGGER_WRITE("Disk full"); + return; + } + + // Store uid values + iCreatedUid = &aUid; + iParentId = aParent; + + // Create message buffer, item will be written into this buffer + SAFEDELETE(iDataBuffer); + iDataBuffer = CBufFlat::NewL(KDataBufferSize); + iWriterPosition = 0; + iCurrentState = ESmsItemCreating; + + // Signal we're complete + User::RequestComplete( iCallerStatus, KErrNone ); + + LOGGER_LEAVEFN("CSmsDataStore::DoCreateItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoReplaceItemL +// Begin the replace operation, ensure that the item really exists +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoReplaceItemL(TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, + TBool /*aFieldChange*/, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoReplaceItemL"); + LOGGER_WRITE_1("Replacing item %d.", aUid); + LOGGER_WRITE_1("Parent folder: %d.", aParent); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("Incorrect state: %d", iCurrentState); + } + + // Ensure that we've got enough disk space for the item + if (iMsvApi->DiskSpaceBelowCriticalLevelL(aSize)) + { + User::RequestComplete(iCallerStatus, KErrDiskFull); + LOGGER_WRITE("Disk full"); + return; + } + + // Find entry + CMsvEntry* entry(NULL); + TRAPD(error, entry = iMsvApi->MsvSessionL()->GetEntryL(aUid)); + if (error != KErrNone) + { + User::RequestComplete(iCallerStatus, KErrNotFound); + LOGGER_WRITE("Item not found"); + return; + } + + // This is the representation of the actual message + TMsvEntry tEntry = entry->Entry(); + + // Not needed anymore + SAFEDELETE(entry); + + // Check entry type + if (tEntry.iType == KUidMsvFolderEntry) + { + iMimeType = EMessageFolder; + LOGGER_WRITE("Type: folder"); + } + else + { + iMimeType = ESmsMessage; + LOGGER_WRITE("Type: SMS message"); + } + + if ((iMimeType == EMessageFolder && aParent != KMsvMyFoldersEntryIdValue) || + (iMimeType == ESmsMessage && !iMsvApi->ValidFolderL(aParent) || + (aParent != tEntry.Parent()))) + { + User::RequestComplete(iCallerStatus, KErrNotSupported); + LOGGER_WRITE_1("Bad parent folder, message entry parent is %d", tEntry.Parent()); + return; + } + + // Store these for further use + iParentId = aParent; + iCurrentId = aUid; + + // Create temporary buffer for message data, item will be written here + SAFEDELETE(iDataBuffer); + iDataBuffer = CBufFlat::NewL(KDataBufferSize); + iWriterPosition = 0; + iCurrentState = ESmsItemUpdating; + + // Signal we're complete + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoReplaceItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoReadItemL +// Read specified amount of data from the temporary buffer +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoReadItemL(TDes8& aBuffer) + { + LOGGER_ENTERFN("CSmsDataStore::DoReadItemL"); + + // Check that we're in proper state + if (iCurrentState != ESmsItemOpen || !iDataBuffer) + { + LOGGER_WRITE("CSmsDataStore::DoReadItemL leaved with KErrNotReady."); + User::Leave(KErrNotReady); + } + + if (iReaderPosition == KDataBufferNotReady) + { + LOGGER_WRITE("CSmsDataStore::DoReadItemL leaved with KErrEof."); + User::Leave(KErrEof); + } + + // This is how much we've got left in the buffer + TInt left = iDataBuffer->Size() - iReaderPosition; + + // Make sure that there's something to read + if(left > 0) + { + // This is how much there's space in the destination buffer + TInt destSize = aBuffer.MaxSize(); + + // This is how much we can read + TInt toRead = destSize < left ? destSize : left; + + // Read the data from the buffer, then update the position + iDataBuffer->Read(iReaderPosition, aBuffer, toRead); + iReaderPosition += toRead; + } + else + { + iReaderPosition = KDataBufferNotReady; + LOGGER_WRITE("CSmsDataStore::DoReadItemL leaved with KErrEof."); + User::Leave(KErrEof); + } + + LOGGER_LEAVEFN("CSmsDataStore::DoReadItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoWriteItemL +// Write specified amount of data to the temporary buffer +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoWriteItemL(const TDesC8& aData) + { + LOGGER_ENTERFN("CSmsDataStore::DoWriteItemL"); + + // Ensure that we're in proper state + if ( iCurrentState != ESmsItemCreating && iCurrentState != ESmsItemUpdating ) + { + LOGGER_WRITE("CSmsDataStore::DoWriteItemL leaved with KErrNotReady."); + User::Leave( KErrNotReady ); + } + + // Calculate total size + TInt totalSize = aData.Size() + iDataBuffer->Size(); + + // Check that we have enough disk space to store this much data + if ( iMsvApi->DiskSpaceBelowCriticalLevelL( totalSize ) ) + { + LOGGER_WRITE("CSmsDataStore::DoWriteItemL leaved with KErrDiskFull."); + User::Leave(KErrDiskFull); + } + + // Add data to buffer + iDataBuffer->InsertL( iWriterPosition, aData ); + iWriterPosition += aData.Size(); + + LOGGER_LEAVEFN("CSmsDataStore::DoWriteItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCommitItemL +// Commits item from temporary buffer to the message store +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCommitItemL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoCommitItemL"); + TInt error(KErrNone); + + // Store some variables + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if ((iCurrentState != ESmsItemCreating && iCurrentState != ESmsItemUpdating) || !iDataBuffer) + { + User::RequestComplete(iCallerStatus, KErrNotReady); + LOGGER_WRITE_1("Bad state: %d", iCurrentState); + return; + } + + iDataBuffer->Compress(); + TInt size = iDataBuffer->Size(); + + // Variable to hold the information whether SMS message is unread or not for Change Finder. + // For message folders this information is not relevant and value is EFalse by default. + TBool unread(EFalse); + + if ( iMimeType == ESmsMessage ) + { + // Reset parser + iMessageParser->ResetAll(); + + // This function returns the index, where the parsing ends (>=0) + // (the error codes are in the range below 0) + error = iMessageParser->ParseMessageL(iDataBuffer->Ptr(0)); + + if ( error >= 0 ) + { + unread = iMessageParser->iStatus.Compare(KVMsgStatusUnread) == 0 ? ETrue : EFalse; + + // Check the datastore state. We're either creating or updating an item. + if (iCurrentState == ESmsItemCreating) + { + TMsvId id; + TMsvId temporaryParent = iParentId; + // in message sending case, save message first to drafts folder + if ( iParentId == KMsvGlobalOutBoxIndexEntryId ) + { + temporaryParent = KMsvDraftEntryId; + } + + TRAP(error, iMsvApi->AddSML(*iMessageParser, temporaryParent, id)); + if ( error == KErrNone ) + { + *iCreatedUid = id; + iCurrentId = id; + } + else + { + LOGGER_WRITE_1("iMsvApi->AddSML leaved with %d.", error); + } + } + else // EItemUpdating + { + if ( iParentId == KMsvGlobalInBoxIndexEntryId ) + { + // For arrived message in Inbox only status is updated + TRAP(error, iMsvApi->UpdateSMStatusL( iCurrentId, *iMessageParser)); + } + else + { + TRAP(error, iMsvApi->ReplaceSML(iCurrentId, *iMessageParser)); + } + if(error != KErrNone) + { + LOGGER_WRITE_1("iMsvApi->ReplaceSML leaved with %d.", error); + } + } + } + else + { + LOGGER_WRITE_1("iMessageParser->ParseMessageL failed with %d.", error); + } + } // if (iMimeType == ESmsMessage) + + else // EMessageFolder + { + error = iFolderObjectParser->ImportFolderXml(iDataBuffer->Ptr(0)); + + if ( error == KErrNone ) + { + const TDesC& name = iFolderObjectParser->GetName(); + + if ( name.Length() > 0 ) + { + if ( iCurrentState == ESmsItemCreating ) + { + TMsvId id; + error = iMsvApi->AddUserFolderL( id, name ); + if ( error == KErrNone ) + { + *iCreatedUid = id; + iCurrentId = id; + } + else + { + LOGGER_WRITE_1("iMsvApi->AddFolderL failed with %d", error); + } + } + else // Updating + { + error = iMsvApi->UpdateUserFolderL( iCurrentId, name ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("iMsvApi->UpdateFolderL failed with %d", error); + } + } + } + else + { + LOGGER_WRITE("No folder name available"); + error = KErrArgument; + } + } + } + + // Send the message if the parent folder is outbox + if( iParentId == KMsvGlobalOutBoxIndexEntryId && + iMimeType == ESmsMessage && + iCurrentState == ESmsItemCreating && + error == KErrNone ) + { + LOGGER_WRITE("CSmsDataStore::DoCommitItemL, sending message."); + + TRAP( error, iMsvApi->MoveSML( iCurrentId, iParentId ) ); + if( error != KErrNone ) + { + LOGGER_WRITE_1("Moving to folder failed with %d", error); + iMsvApi->DeleteSML( iCurrentId ); + } + else + { + TRAP( error, iMsvApi->SendSML(iCurrentId) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("iMsvApi->SendSML failed with %d.", error); + iMsvApi->DeleteSML( iCurrentId ); + } + } + } + + if ( error == KErrNone ) // Update Change Finder + { + CMsvSession* msvSession = iMsvApi->MsvSessionL(); + TMsvId service; + TMsvEntry msgEntry; + + // Inform ChangeFinder of added item + TSnapshotItem snapshotItem( iCurrentId, iParentId, unread ); + error = msvSession->GetEntry( iCurrentId, service, msgEntry ); + + if ( error == KErrNone ) + { + snapshotItem.SetLastChangedDate( msgEntry.iDate ); + if ( iMimeType == EMessageFolder ) + { + snapshotItem.SetFolderNameL( msgEntry.iDetails ); + } + + if ( iCurrentState == ESmsItemCreating ) + { + iChangeFinder->ItemAddedL( snapshotItem ); + } + else + { + iChangeFinder->ItemUpdatedL( snapshotItem ); + } + } + else + { + LOGGER_WRITE_1("CMsvSession::GetEntry failed with %d", error); + } + } + + // Reset and destroy write buffer, it's no longer needed + iWriterPosition = KDataBufferNotReady; + SAFEDELETE(iDataBuffer); + + // We'll be waiting for next event, signal we're done + iCurrentState = ESmsOpenAndWaiting; + User::RequestComplete(iCallerStatus, error); + + LOGGER_LEAVEFN("CSmsDataStore::DoCommitItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCloseItem +// Closes open item in the data store +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCloseItem() + { + LOGGER_ENTERFN("CSmsDataStore::DoCloseItem"); + + // Make sure that we're opened an item + if ( iCurrentState == ESmsItemOpen ) + { + // Reset read buffer + iReaderPosition = KDataBufferNotReady; + SAFEDELETE(iDataBuffer); + + // Start to wait for the next operation + iCurrentState = ESmsOpenAndWaiting; + } + else + { + LOGGER_WRITE_1("CSmsDataStore::DoCloseItem, invalid state %d.", iCurrentState); + } + + LOGGER_LEAVEFN("CSmsDataStore::DoCloseItem"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoMoveItemL +// Moves item from one folder to another in the message store +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoMoveItemL(TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoMoveItemL"); + + LOGGER_WRITE_1("Moving item %d.", aUid); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoMoveItemL, Incorrect state: %d", iCurrentState); + } + + TInt error_move(KErrNone); + TRAP(error_move, iMsvApi->MoveSML(aUid, aNewParent)); + if(error_move != KErrNone) + { + User::RequestComplete(iCallerStatus, error_move); + LOGGER_WRITE_1("iMsvApi->MoveSML leaved with %d.", error_move); + return; + } + + // Inform ChangeFinder of the moved item + TSnapshotItem snapshotItem(aUid, aNewParent); + iChangeFinder->ItemMovedL(snapshotItem); + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoMoveItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoDeleteItemL +// Removes item from the message store +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoDeleteItemL(TSmlDbItemUid aUid, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoDeleteItemL"); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoDeleteItemL, Incorrect state: %d", iCurrentState); + } + + TInt error(KErrNone); + + // Check if this is a user folder + TBool userFolder = iMsvApi->FindUserFolderL(aUid); + + if (userFolder) + { + LOGGER_WRITE_1("Delete user folder %d", aUid); + + // First delete SMS messages under the folder + CMsvEntrySelection* deletedItems = iMsvApi->CleanFolderGetMsvIdsL(aUid); + CleanupStack::PushL(deletedItems); + + for (TInt i = 0; i < deletedItems->Count(); i++) + { + TMsvId id = deletedItems->At(i); + TSnapshotItem item(id); + iChangeFinder->ItemDeletedL(item); + } + CleanupStack::PopAndDestroy(deletedItems); + + // Then delete the actual folder + // Note: folder is not deleted if it contains other message items (like MMS) + TRAP(error, iMsvApi->DeleteUserFolderL(aUid)); + } + else + { + LOGGER_WRITE_1("Delete SMS message %d", aUid); + TRAP(error, iMsvApi->DeleteSML(aUid)) + } + + if ( error != KErrNone ) + { + User::RequestComplete(iCallerStatus, error); + LOGGER_WRITE_1("iMsvApi function call leaved with %d", error); + return; + } + + // Inform ChangeFinder of the removed item + TSnapshotItem item(aUid); + iChangeFinder->ItemDeletedL(item); + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoDeleteItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoSoftDeleteItemL +// Soft delete is not supported. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoSoftDeleteItemL(TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoSoftDeleteItemL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + User::RequestComplete(iCallerStatus, KErrNotSupported); + + LOGGER_LEAVEFN("CSmsDataStore::DoSoftDeleteItemL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoDeleteAllItemsL +// Deletes all items in the standard folders of message store +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoDeleteAllItemsL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoDeleteAllItemsL"); + + // Store some variables for further use + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoDeleteAllItemsL, Incorrect state: %d", iCurrentState); + } + + // Delete all messages in the standard folders (except outbox) + iMsvApi->CleanFolderL(KMsvGlobalInBoxIndexEntryId); + iMsvApi->CleanFolderL(KMsvDraftEntryId); + iMsvApi->CleanFolderL(KMsvSentEntryId); + + iMsvApi->CleanUserFoldersL(); + + iChangeFinder->ResetL(); + + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoDeleteAllItemsL"); + } + + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoHasSyncHistory +// This method returns ETrue if Data Store has history information. +// Slow-sync will be used if Data Store does not have history information. +// ----------------------------------------------------------------------------- +TBool CSmsDataStore::DoHasSyncHistory() const + { + LOGGER_WRITE_1("CSmsDataStore::DoHasSyncHistory return %d", (TInt)iHasHistory ); + + // iHasHistory is initialized in DoOpenL method + return iHasHistory; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoAddedItems +// This method returns UIDs of added items. Those items are added after previous +// synchronization with current synchronization relationship. +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CSmsDataStore::DoAddedItems() const + { + LOGGER_ENTERFN("CSmsDataStore::DoAddedItems"); + + // Ensure that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoAddedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear new-items array + iNewItems->Reset(); + + // Search for new items + TRAP( error, iChangeFinder->FindNewItemsL(*iNewItems) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CSmsDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error); + } + + LOGGER_WRITE_1("New item count: %d.", iNewItems->ItemCount()); + LOGGER_LEAVEFN("CSmsDataStore::DoAddedItems"); + + return *iNewItems; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoDeletedItems +// +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CSmsDataStore::DoDeletedItems() const + { + LOGGER_ENTERFN("CSmsDataStore::DoDeletedItemsL"); + + // Ensure that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoDeletedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear deleted-items array + iDeletedItems->Reset(); + + // Search for deleted items + TRAP( error, iChangeFinder->FindDeletedItemsL(*iDeletedItems) ); + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CSmsDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error); + } + + + LOGGER_WRITE_1("Deleted item count: %d.", iDeletedItems->ItemCount()); + LOGGER_LEAVEFN("CSmsDataStore::DoDeletedItemsL"); + return *iDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoSoftDeletedItems +// Not directly supported, equals to "hard" delete +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CSmsDataStore::DoSoftDeletedItems() const + { + TRACE_FUNC; + + // Return empty array as a result + iSoftDeletedItems->Reset(); + return *iSoftDeletedItems; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoModifiedItems +// Finds all modified items in the data store +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CSmsDataStore::DoModifiedItems() const + { + LOGGER_ENTERFN("CSmsDataStore::DoModifiedItems"); + + // Ensure that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoModifiedItems, invalid state %d.", iCurrentState); + } + + TInt error(KErrNone); + + // Clear updated-items array + iUpdatedItems->Reset(); + + // Search for updated items + TRAP( error, iChangeFinder->FindChangedItemsL(*iUpdatedItems) ) + if ( error != KErrNone ) + { + LOGGER_WRITE_1("CSmsDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error); + } + else + { + TRAP( error, iChangeFinder->FindMovedItemsL(*iUpdatedItems) ); + if( error != KErrNone ) + { + LOGGER_WRITE_1("CSmsDataStore::DoModifiedItems, iChangeFinder->FindMovedItemsL leaved with %d.", error); + } + } + + LOGGER_WRITE_1("Modified item count: %d.", iUpdatedItems->ItemCount()); + LOGGER_LEAVEFN("CSmsDataStore::DoModifiedItems"); + return *iUpdatedItems; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoMovedItems +// Moved items not supported (handled as replaced items) +// ----------------------------------------------------------------------------- +const MSmlDataItemUidSet& CSmsDataStore::DoMovedItems() const + { + TRACE_FUNC; + + // Clear moved-items array + iMovedItems->Reset(); + + return *iMovedItems; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoResetChangeInfoL +// Resets change history in the data store. All content is considered +// new in the data store point of view. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoResetChangeInfoL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoResetChangeInfoL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Check that we're in proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState); + } + + // Reset change info in ChangeFinder + iChangeFinder->ResetL(); + iHasHistory = EFalse; + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoResetChangeInfoL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCommitChangeInfoL +// Commits change info. These items are no longer reported, when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCommitChangeInfoL(TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems) + { + LOGGER_ENTERFN("CSmsDataStore::DoCommitChangeInfoL(MSmlDataItemUidSet)"); + LOGGER_WRITE_1("Item count: %d", aItems.ItemCount()); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(aItems); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoCommitChangeInfoL"); + } + + +// ----------------------------------------------------------------------------- +// CSmsDataStore::DoCommitChangeInfoL +// Commits change info. There is no more nothing to report when change +// information is being queried. +// ----------------------------------------------------------------------------- +void CSmsDataStore::DoCommitChangeInfoL(TRequestStatus& aStatus) + { + LOGGER_ENTERFN("CSmsDataStore::DoCommitChangeInfoL"); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Ensure that we're in a proper state + if (iCurrentState != ESmsOpenAndWaiting) + { + LOGGER_WRITE_1("CSmsDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState); + } + + // Notify ChangeFinder + iChangeFinder->CommitChangesL(); + iHasHistory = ETrue; + + // Signal we're done + User::RequestComplete(iCallerStatus, KErrNone); + + LOGGER_LEAVEFN("CSmsDataStore::DoCommitChangeInfoL"); + } + + +// ----------------------------------------------------------------------------- +// CSmsDataStore::RegisterSnapshotL +// Sets Changefinder to compare against current message store content +// ----------------------------------------------------------------------------- +void CSmsDataStore::RegisterSnapshotL() const + { + LOGGER_ENTERFN("CSmsDataStore::RegisterSnapshotL"); + + CSnapshotArray* snapshot = new (ELeave) CSnapshotArray( KSnapshotGranularity ); + CleanupStack::PushL(snapshot); + + // Use only standard folders (outbox isn't synchronized) + LOGGER_WRITE( "KMsvGlobalInBoxIndexEntryId" ); + RegisterFolderL(snapshot, KMsvGlobalInBoxIndexEntryId); + LOGGER_WRITE( "KMsvDraftEntryId" ); + RegisterFolderL(snapshot, KMsvDraftEntryId); + LOGGER_WRITE( "KMsvSentEntryId" ); + RegisterFolderL(snapshot, KMsvSentEntryId); + LOGGER_WRITE( "KMsvGlobalOutBoxIndexEntryId" ); + RegisterFolderL(snapshot, KMsvGlobalOutBoxIndexEntryId); + RegisterUserFoldersL(snapshot); + + // Set new snapshot to compare against + iChangeFinder->SetNewSnapshot(snapshot); + + // Changefinder takes ownership of the snapshot + CleanupStack::Pop(); + + LOGGER_LEAVEFN("CSmsDataStore::RegisterSnapshotL"); + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::RegisterFolderL +// Adds a single folder into the snapshot array +// ----------------------------------------------------------------------------- +TInt CSmsDataStore::RegisterFolderL(CSnapshotArray* aSnapshot, const TMsvId& aId) const + { + LOGGER_ENTERFN("CSmsDataStore::RegisterFolderL"); + + CMsvSession* msvSession = iMsvApi->MsvSessionL(); + + // Get the folder + CMsvEntry* msvEntry = msvSession->GetEntryL(aId); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* messages = msvEntry->ChildrenWithTypeL(KUidMsvMessageEntry); + CleanupStack::PopAndDestroy(); // msvEntry + CleanupStack::PushL(messages); + + TMsvId id; + TMsvEntry msg; + LOGGER_WRITE_1( "messages count %d", messages->Count() ); + for(TInt index=0; indexCount(); index++) + { + TInt result = msvSession->GetEntry(messages->At(index), id, msg); + User::LeaveIfError(result); + + // We're only interested about the SMS content + if(msg.iMtm == KUidMsgTypeSMS) + { + // Create snapshot item + TKeyArrayFix key(iKey); + TSnapshotItem item((TUint) msg.Id(), msg.Parent(), msg.Unread()); + + item.SetLastChangedDate(msg.iDate); + LOGGER_WRITE_1( "item id %d", msg.Id() ); + // Add to snapshot + aSnapshot->InsertIsqL(item, key); + } + else + { + LOGGER_WRITE("Wrong type"); + } + } + + CleanupStack::PopAndDestroy(); // messages + + LOGGER_LEAVEFN("CSmsDataStore::RegisterFolderL"); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSmsDataStore::RegisterUserFoldersL +// Adds user folder messages into the snapshot array +// ----------------------------------------------------------------------------- +TInt CSmsDataStore::RegisterUserFoldersL(CSnapshotArray* aSnapshot) const + { + LOGGER_ENTERFN("CSmsDataStore::RegisterUserFoldersL"); + + CMsvSession* msvSession = iMsvApi->MsvSessionL(); + + // Get the folder + CMsvEntry* msvEntry = msvSession->GetEntryL(KMsvMyFoldersEntryIdValue); + CleanupStack::PushL(msvEntry); + + // Find all of it's childs + CMsvEntrySelection* folders = msvEntry->ChildrenWithTypeL( KUidMsvFolderEntry ); + CleanupStack::PopAndDestroy( msvEntry ); + CleanupStack::PushL( folders ); + LOGGER_WRITE_1("Folders: %d", folders->Count()); + for ( TInt index = 0; index < folders->Count(); index++ ) + { + TMsvId folderId = folders->At(index); + + if ( folderId != KMsvMyFoldersTemplatesFolderId ) + { + TMsvId service; + TMsvEntry folderEntry; + TInt result = msvSession->GetEntry(folderId, service, folderEntry); + User::LeaveIfError( result ); + + TKeyArrayFix key(iKey); + TBool unread(EFalse); + TSnapshotItem item( (TUint) folderId, folderEntry.Parent(), unread ); + item.SetLastChangedDate( folderEntry.iDate ); + item.SetFolderNameL( folderEntry.iDetails ); + + aSnapshot->InsertIsqL( item, key ); + + RegisterFolderL( aSnapshot, folderId ); + } + } + + CleanupStack::PopAndDestroy( folders ); + + // Register also SMS messages directly under My Folders + RegisterFolderL( aSnapshot, KMsvMyFoldersEntryIdValue ); + + LOGGER_LEAVEFN("CSmsDataStore::RegisterUserFoldersL"); + + return KErrNone; + } + diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/smsdatastore.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/smsdatastore.rss Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,81 @@ +/* +* 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 SmsDataProvider +* +*/ + + +#include "SmlDataFormat.rh" +#include "SmlDataFormat.hrh" + +RESOURCE SML_DATA_STORE_FORMAT SMS_DATA_STORE + { + version = 1; + display_name = "Text messages"; + sync_types = KSmlSyncType_TwoWay + KSmlSyncType_SlowSync; + mime_format= + { + SML_MIME_FORMAT + { + version = 1; + mime_type = "text/x-vMessage"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + }, + SML_MIME_FORMAT + { + version = 1; + mime_type = "application/vnd.omads-folder+xml"; + mime_ver = "1.0"; + properties= + { + SML_DATA_PROPERTY + { + version = 1; + display_name = "Read"; + name = "read"; + data_type = "bool"; + enum_values = {}; + flags = 0; + max_size = 0; + max_occur = 1; + params = {}; + } + }; + field_level = 0; + } + }; + mime_format_tx_pref = 0; // Preferred index for tx + mime_format_rx_pref = 0; // Preferred index for rx + folder_properties = {}; // No folder properties + filter_capabilities = {}; // No filter capabilities + max_size = 0; // No limit + max_items = 0; // No limit + flags = 0x00000010; // Hierarchical sync supported + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/snapshotitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/snapshotitem.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + +#include +#include "snapshotitem.h" + + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// C++ default constructor can NOT contain any code, that might leave +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem() : TNSmlSnapshotItem() + { + iUnread = EFalse; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::TSnapshotItem +// Constructor, takes item id as a parameter +// ----------------------------------------------------------------------------- +TSnapshotItem::TSnapshotItem( const TSmlDbItemUid& aItemId, + const TSmlDbItemUid& aParent, TBool aUnread ) +: TNSmlSnapshotItem( aItemId ) + { + SetParentId( aParent ); + iUnread = aUnread; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::ExternalizeL +// Writes the contents of this class and it's base to stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::ExternalizeL( RWriteStream& aStream ) const + { + TNSmlSnapshotItem::ExternalizeL( aStream ); + aStream.WriteInt32L( iUnread ); + TPckgBuf nameBuf(iFolderName); + aStream << nameBuf; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::InternalizeL +// Reads the contents of this class and it's base from stream +// ----------------------------------------------------------------------------- +void TSnapshotItem::InternalizeL( RReadStream& aStream ) + { + TNSmlSnapshotItem::InternalizeL( aStream ); + iUnread = aStream.ReadInt32L(); + TPckgBuf nameBuf; + aStream >> nameBuf; + iFolderName = nameBuf(); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::SetUnread +// Sets unread flag +// ----------------------------------------------------------------------------- +void TSnapshotItem::SetUnread( TBool aState ) + { + iUnread = aState; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::Unread +// Gets unread flag +// ----------------------------------------------------------------------------- +TBool TSnapshotItem::Unread() const + { + return iUnread; + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::SetFolderNameL +// Sets folder name +// ----------------------------------------------------------------------------- +void TSnapshotItem::SetFolderNameL( const TDesC& aFolderName ) + { + if ( aFolderName.Length() > KMaxFolderNameLength ) + { + User::Leave( KErrTooBig ); + } + iFolderName.Copy( aFolderName ); + } + +// ----------------------------------------------------------------------------- +// TSnapshotItem::FolderName +// Gets folder name +// ----------------------------------------------------------------------------- +const TDesC& TSnapshotItem::FolderName() const + { + return iFolderName; + } diff -r 0ca79e3612d9 -r 9ba7f05d28a5 omads/omadsextensions/adapters/sms/src/vmessageparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/adapters/sms/src/vmessageparser.cpp Tue Jul 06 14:06:02 2010 +0300 @@ -0,0 +1,848 @@ +/* +* Copyright (c) 2005-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: Part of SyncML Data Synchronization Plug In Adapter +* +*/ + + + +#include +#include +#include +#include "vmessageparser.h" +#include "logger.h" + + +const TInt KVersionMaxLength = 4; +const TInt KDateMaxLength = 48; +const TInt KTagAndValueMaxLength = 48; +const TInt KDefaultWriteBufSize = 1024; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVMessageParser* CVMessageParser::NewL() +// ----------------------------------------------------------------------------- +// +CVMessageParser* CVMessageParser::NewL() + { + CVMessageParser* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser* CVMessageParser::NewLC() +// ----------------------------------------------------------------------------- +// +CVMessageParser* CVMessageParser::NewLC() + { + CVMessageParser* self = new( ELeave ) CVMessageParser(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::~CVMessageParser() +// ----------------------------------------------------------------------------- +// +CVMessageParser::~CVMessageParser() + { + iRecipients.Close(); + delete iMessageBody; + iMessageBody = NULL; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::CVMessageParser() +// ----------------------------------------------------------------------------- +// +CVMessageParser::CVMessageParser() + { + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ConstructL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadMessage() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ParseMessageL( const TDesC8& aVMessage ) + { + LOGGER_ENTERFN( "CVMessageParser::ParseMessageL" ); + + const TUint8* ptr8 = aVMessage.Ptr(); + const TUint16* ptr16 = reinterpret_cast( ptr8 ); + iReadBuf.Set( ptr16, aVMessage.Length()/2 ); + LOG(iReadBuf); + + iReadBufPosition = 0; + + TInt err = ReadMessageHeader(); + + if (err < 0) + { + LOGGER_WRITE_1( "ReadMessageHeader() failed with %d", err ); + } + else + { + err = ReadMessageBodyL(); + LOGGER_WRITE_1( "ReadMessageBody() result: %d", err ); + } + LOGGER_LEAVEFN( "CVMessageParser::ParseMessageL" ); + return err; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ConstructMessageL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::ConstructMessageL( CBufBase& aVMessage ) + { + LOGGER_ENTERFN( "CVMessageParser::ConstructMessageL" ); + LOGGER_WRITE_1( "Initial buffer size: %d", aVMessage.Size() ); + + iWriteBuf = &aVMessage; + iWriteBufPosition = 0, + iWriteIndentLevel = 0; + + iWriteBufSize = KDefaultWriteBufSize; + if (iMessageBody) + { + iWriteBufSize += iMessageBody->Size(); + } + + iWriteBuf->ResizeL( iWriteBufSize ); + LOGGER_WRITE_1( "Buffer size resized to %d", iWriteBuf->Size() ); + + WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVMsg ); // BEGIN:VMSG + WriteMessagePropertiesL(); + WriteMessageVCARDL( iSender.iName, iSender.iNumber ); + WriteMessageEnvelopeL(); + WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVMsg ); // END:VMSG + + iWriteBuf->ResizeL( iWriteBufPosition ); + + LOGGER_WRITE_1( "Message length: %d", iWriteBufPosition ); + LOGGER_LEAVEFN( "CVMessageParser::ConstructMessageL" ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ResetAll() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::ResetAll() + { + // Public data + + iHomeTime = 0; + iUniversalTime = 0; + iFolder.Zero(); + iStatus.Zero(); + iSender.iNumber.Zero(); + iSender.iName.Zero(); + iRecipients.Reset(); + if (iMessageBody) + { + delete iMessageBody; + iMessageBody = NULL; + } + + + // Private variables + iReadBufPosition = 0; + iWriteBufPosition = 0; + iWriteIndentLevel = 0; + iWriteBuf = NULL; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::LoadMessageBodyL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::LoadMessageBodyL( CRichText &aMsgBody ) + { + if (iMessageBody) + { + aMsgBody.InsertL(0, *iMessageBody); + } + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::StoreMessageBodyL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::StoreMessageBodyL( CRichText &aMsgBody ) + { + if (iMessageBody) + { + LOGGER_WRITE( "Message body not empty" ); + User::Leave( KErrGeneral ); + } + + TInt bodyLenght = aMsgBody.DocumentLength(); + + if (bodyLenght > 0) + { + iMessageBody = HBufC::NewL( bodyLenght ); + TPtr16 ptrBody = iMessageBody->Des(); + aMsgBody.Extract( ptrBody ); + } + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ParseTelephoneNumber() +// ----------------------------------------------------------------------------- +// +TBool CVMessageParser::ParseTelephoneNumber( const TDesC &aNumberString, TTelephoneNumber &aNumberStore ) + { + _LIT( KStartMarker, "<" ); + _LIT( KEndMarker, ">" ); + LOGGER_WRITE_1("aNumberString: %S", &aNumberString ); + TInt startMarker = aNumberString.Find( KStartMarker ); + + if (startMarker >= 0) + { + TInt endMarker = aNumberString.Find( KEndMarker ); + if (endMarker <= (startMarker + 1)) + { + LOGGER_WRITE( "Incorrect number" ); + return EFalse; + } + else // case 1: Abc Pqr <+01234567890> + { + TPtrC16 name = aNumberString.Left( startMarker ); + TPtrC16 number = aNumberString.Mid( (startMarker + 1), (endMarker - startMarker - 1) ); + AssignDataToBuffer( name, aNumberStore.iName ); + AssignDataToBuffer( number, aNumberStore.iNumber ); + } + } + else // just number + { + AssignDataToBuffer( aNumberString, aNumberStore.iNumber ); + aNumberStore.iName.Zero(); + } + LOGGER_WRITE_1("aNumberStore.iName: %S", &aNumberStore.iName); + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadMessageHeader() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ReadMessageHeader() + { + LOGGER_WRITE( "CVMessageParser::ReadMessageHeader()" ); + + TInt err; + + err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVMsg ); + if (err < 0) + { + return err; + } + + err = ReadTaggedTimeStamp( iUniversalTime ); + if ( err == KErrNone ) + { + LOGGER_WRITE( "Time stamp tag found, universal time set" ); + } + + err = GetMessageTagValue( KVMsgTagStatus, iStatus ); + if (err < 0) + { + return err; + } + err = GetMessageTagValue( KVMsgTagBox, iFolder ); + if (err < 0) + { + return err; + } + err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVCard ); + if (err < 0) + { + return err; + } + err = ReadVCard( iSender ); + if (err < 0) + { + return err; + } + err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVEnv ); + if (err < 0) + { + return err; + } + else + { + err = ReadEnvelope(); + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadEnvelope() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ReadEnvelope() + { + TBuf tagValue; + TInt err( KErrNone ); + + err = GetMessageTagValue( KVMsgTagBegin, tagValue ); + if (err < 0) + { + return err; + } + else if (tagValue.Compare( KVMsgSectionVCard ) == 0) + { + TTelephoneNumber recipient; + err = ReadVCard( recipient ); + if (err < 0) + { + return err; + } + else + { + if (recipient.iNumber.Length() > 0) + { + iRecipients.Append( recipient ); + } + + err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVEnv ); + if (err >= 0) + { + err = ReadEnvelope(); + } + } + } + else if (tagValue.Compare( KVMsgSectionVBody ) == 0) + { + err = KErrNone; + } + else + { + LOGGER_WRITE( "Unexpected message tag value" ); + return KErrGeneral; + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadTaggedTimestamp() +// Read and parse tagged timestamp from vMessage (optional feature) +// Format: X-NOK-DT:yyyymmddThhmmssZ (example: X-NOK-DT:20060329T091530Z) +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ReadTaggedTimeStamp( TTime& aUniversalTime ) + { + LOGGER_WRITE( "CVMessageParser::ReadTaggedTimestamp" ); + + TInt err( KErrNone ); + TBuf<20> timeStamp; + + err = GetMessageTagValue( KVMsgTagDateTime, timeStamp, EFalse ); + if ( err < 0 ) + { + return KErrNotFound; + } + + LOG( timeStamp ); + + if (timeStamp.Length() != 16 || timeStamp[8] != 'T' || timeStamp[15] != 'Z') + { + return KErrNotSupported; + } + + TLex lexYear( timeStamp.Mid( 0, 4 ) ); + TLex lexMonth( timeStamp.Mid( 4, 2 ) ); + TLex lexDay( timeStamp.Mid( 6, 2 ) ); + TLex lexHour( timeStamp.Mid( 9, 2 ) ); + TLex lexMinute( timeStamp.Mid( 11, 2 ) ); + TLex lexSecond( timeStamp.Mid( 13, 2 ) ); + + TInt valYear( 0 ); + TInt valMonth( 0 ); + TInt valDay( 0 ); + TInt valHour( 0 ); + TInt valMinute( 0 ); + TInt valSecond( 0 ); + + TBool parseDone( EFalse ); + if ( lexYear.Val( valYear ) == KErrNone ) + { + if ( lexMonth.Val( valMonth ) == KErrNone ) + { + if ( lexDay.Val( valDay ) == KErrNone ) + { + if ( lexHour.Val( valHour ) == KErrNone ) + { + if ( lexMinute.Val( valMinute ) == KErrNone ) + { + if ( lexSecond.Val( valSecond ) == KErrNone ) + { + parseDone = ETrue; + } + } + } + } + } + } + if ( !parseDone ) + { + return KErrNotSupported; + } + + TDateTime dateTime; + TMonth month = static_cast(--valMonth); + err = dateTime.Set( valYear, month, --valDay, valHour, valMinute, valSecond, 0 ); + if ( err != KErrNone ) + { + return KErrNotSupported; + } + + aUniversalTime = dateTime; + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadVCard() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ReadVCard( TTelephoneNumber &aResult ) + { + TInt err = KErrNone; + TBuf version; + + err = GetMessageTagValue( KVMsgTagVersion, version ); + if (err < 0) + { + return err; + } + + err = GetMessageTagValue( KVMsgTagName, aResult.iName ); + if (err < 0) + { + return err; + } + + err = GetMessageTagValue( KVMsgTagTelephone, aResult.iNumber ); + if (err < 0) + { + return err; + } + + err = FindMessageTagWithValue( KVMsgTagEnd, KVMsgSectionVCard ); + if (err < 0) + { + return err; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::ReadMessageBody() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::ReadMessageBodyL() + { + LOGGER_WRITE( "CVMessageParser::ReadMessageBody()" ); + + TInt err; + + TPtrC pBuf = iReadBuf.Mid( iReadBufPosition ); + err = pBuf.Find( KVMsgLineFeed ); + if (err < 0) + { + return err; + } + + iReadBufPosition += ( err + KVMsgLineFeed().Length() ); + TInt bodyStart = iReadBufPosition; + + TBuf dateBuf; + err = GetMessageTagValue(KVMsgTagDate, dateBuf); + if (err < 0) + { + LOGGER_WRITE( "No date field in message body" ); + iReadBufPosition = bodyStart; + } + else + { + for (TInt i = 0; i < dateBuf.Length(); i++) + { + // This is needed, because TTime::Parse() can not handle + // situation where '.' character is used as a delimiter in date. + // Expected date format is like 18.1.2005 17:32:50. + // + if (dateBuf[i] == ' ') + { + break; + } + else if (dateBuf[i] == '.') + { + dateBuf[i] = '/'; + } + } + + TLocale locale; + TDateFormat originalFormat = locale.DateFormat(); + locale.SetDateFormat( EDateEuropean ); + locale.Set(); // transfer the new locale settings to the system + + err = iHomeTime.Parse( dateBuf ); + if ( err < 0 ) + { + LOGGER_WRITE_1( "Parsing date from message body failed with %d", err ); + iHomeTime = 0; + } + locale.SetDateFormat( originalFormat ); + locale.Set(); // transfer the original locale settings back to the system + + TPtrC pDateStart = iReadBuf.Mid( iReadBufPosition ); + err = pDateStart.Find( KVMsgLineFeed ); + if (err < 0) + { + return err; + } + iReadBufPosition += ( err + KVMsgLineFeed().Length() ); + bodyStart = iReadBufPosition; + } + + err = FindMessageTagWithValue( KVMsgTagEnd, KVMsgSectionVBody ); + if (err < 0) + { + return err; + } + else + { + TInt bodyLength = err - bodyStart; + iMessageBody = HBufC::NewL( bodyLength ); + TPtrC pData = iReadBuf.Mid( bodyStart, bodyLength ); + TPtr pMsgBody = iMessageBody->Des(); + pMsgBody.Copy( pData ); + pMsgBody.Trim(); + err = pMsgBody.Length(); + LOG( pMsgBody ); + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::FindMessageTagWithValue() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::FindMessageTagWithValue( const TDesC& aMsgTag, const TDesC& aValue ) + { + TBuf tagAndValue( aMsgTag ); + tagAndValue.Append( aValue ); + + TPtrC pBuf = iReadBuf.Mid( iReadBufPosition ); + + TInt err; + TInt tagStartPosition; + + err = pBuf.Find( tagAndValue ); + if (err < 0) + { + LOGGER_WRITE( "Message tag with value not found" ); + return err; + } + else + { + tagStartPosition = iReadBufPosition + err; // position before tag and value + iReadBufPosition += ( err + tagAndValue.Length() ); // position after tag and value + } + + return tagStartPosition; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::GetMessageTagValue() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::GetMessageTagValue( const TDesC& aMsgTag, TDes& aValue, TBool aMoveReadBufPosition ) + { + TInt err; + TInt valueLength; + TInt readBufPosition( iReadBufPosition ); + + TPtrC pBuf = iReadBuf.Mid( readBufPosition ); + + err = pBuf.Find( aMsgTag ); + if (err < 0) + { + LOGGER_WRITE( "Message tag not found" ); + return err; + } + else + { + readBufPosition += (err + aMsgTag.Length()); + } + + TPtrC pValueStart = iReadBuf.Mid( readBufPosition ); + + err = pValueStart.Find( KVMsgLineFeed ); + if (err < 0) + { + return err; + } + else + { + valueLength = err; + } + + StoreMessageDataField( readBufPosition, valueLength, aValue ); + + if ( aMoveReadBufPosition ) + { + iReadBufPosition = readBufPosition; + } + + return valueLength; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::StoreMessageDataField() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::StoreMessageDataField(TInt aStart, TInt aLength, TDes &aLocalStore) + { + TInt copyLength; + + copyLength = aLength > aLocalStore.MaxLength() ? aLocalStore.MaxLength() : aLength; + + TPtrC pData = iReadBuf.Mid( aStart, copyLength ); + aLocalStore.Copy( pData ); + aLocalStore.Trim(); + + if (copyLength < aLength) + { + LOGGER_WRITE_2( "Data length: %d, stored: %d", aLength, copyLength ); + } + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteMessagePropertiesL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteMessagePropertiesL() + { + LOGGER_WRITE( "CVMessageParser::WriteMessagePropertiesL()" ); + WriteMessageLineL( KVMsgTagVersion, KVMsgVersion ); + WriteMessageLineL( KVMsgTagStatus, iStatus ); + WriteMessageLineL( KVMsgTagBox, iFolder ); + WriteTaggedTimestampL( iUniversalTime ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteMessageVCARDL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteMessageVCARDL(const TDesC& aName, const TDesC& aNumber) + { + LOGGER_WRITE( "CVMessageParser::WriteMessageVCARDL()" ); + WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVCard ); + WriteMessageLineL( KVMsgTagVersion, KVMsgVCardVersion ); + WriteMessageLineL( KVMsgTagName, aName ); + WriteMessageLineL( KVMsgTagTelephone, aNumber ); + WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVCard ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteMessageEnvelopeL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteMessageEnvelopeL() + { + LOGGER_WRITE( "CVMessageParser::WriteMessageEnvelopeL()" ); + + TInt i; + TInt numRecipients = iRecipients.Count(); + + for (i = 0; i < numRecipients; i++) + { + WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVEnv ); + WriteMessageVCARDL( iRecipients[i].iName, iRecipients[i].iNumber ); + } + + WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVEnv ); + WriteMessageBodyL(); + WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVEnv ); + + for (i = 0; i < numRecipients; i++) + { + WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVEnv ); + } + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteTaggedTimestampL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteTaggedTimestampL( TTime aUniversalTime ) + { + LOGGER_WRITE( "CVMessageParser::WriteTaggedTimestamp()" ); + + TDateTime dateTime = aUniversalTime.DateTime(); + + TBuf<16> timestamp; + + // Default timesamp format: yyyymmddThhmmssZ - like 20060329T091530Z + _LIT( KTimestampFormat, "%+04d%+02d%+02dT%+02d%+02d%+02dZ" ); + timestamp.Format( KTimestampFormat, + dateTime.Year(), + dateTime.Month() + 1, + dateTime.Day() + 1, + dateTime.Hour(), + dateTime.Minute(), + dateTime.Second() ); + + WriteMessageLineL( KVMsgTagDateTime, timestamp ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteMessageBodyL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteMessageBodyL() + { + LOGGER_WRITE( "CVMessageParser::WriteMessageBodyL()" ); + + WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVBody ); + + // "Date" field is always device local time, not UTC + TBuf dateStr; + _LIT( KDateFormat, "%F%*D.%*M.%Y% %H:%T:%S" ); + iHomeTime.FormatL( dateStr, KDateFormat ); + WriteMessageLineL(KVMsgTagDate, dateStr ); + + if (iMessageBody) + { + LOG(*iMessageBody); + WriteMessageLineL( KDesNoData, *iMessageBody, EFalse ); + } + else + { + LOGGER_WRITE( "Message body empty" ); + } + + WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVBody ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteMessageLineL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteMessageLineL( const TDesC& aMsgLineTag, const TDesC& aMsgLineData, TBool aIndent ) + { + if (aIndent) + { + TInt indent = GetIndentLevel( aMsgLineTag ); + TBuf indentSpace; + indentSpace.AppendFill( TChar(' '), indent ); + WriteToMessageL( indentSpace ); + } + + if (aMsgLineTag.Length() > 0) + { + WriteToMessageL( aMsgLineTag ); + } + + WriteToMessageL( aMsgLineData ); + WriteToMessageL( KVMsgLineFeed ); + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::WriteToMessageL() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::WriteToMessageL( const TDesC &aData ) + { + TPtrC8 writeData; + + const TUint16* ptr16 = aData.Ptr(); + const TUint8* ptr8 = reinterpret_cast(ptr16); + writeData.Set( ptr8, aData.Length()*2 ); + + TInt newPosition = iWriteBufPosition + writeData.Length(); + + if (newPosition > iWriteBufSize) + { + LOGGER_WRITE( "Expand write buffer" ); + TInt expandStep = newPosition - iWriteBufSize + 100; + iWriteBuf->ExpandL( iWriteBufSize, expandStep ); + iWriteBufSize += expandStep; + LOGGER_WRITE_1( "Write buffer expanded to %d bytes", iWriteBufSize ); + } + + iWriteBuf->Write( iWriteBufPosition, writeData ); + iWriteBufPosition = newPosition; + } + + +// ----------------------------------------------------------------------------- +// CVMessageParser::GetIndentLevel() +// ----------------------------------------------------------------------------- +// +TInt CVMessageParser::GetIndentLevel( const TDesC& aMsgLineTag ) + { + if (aMsgLineTag.Compare( KVMsgTagEnd ) == 0) + { + iWriteIndentLevel--; + } + TInt result = iWriteIndentLevel * KIndentStepSize; + + if (aMsgLineTag.Compare( KVMsgTagBegin ) == 0) + { + iWriteIndentLevel++; + } + return result; + } + +// ----------------------------------------------------------------------------- +// CVMessageParser::AssignDataToBuffer() +// ----------------------------------------------------------------------------- +// +void CVMessageParser::AssignDataToBuffer( const TDesC &aData, TDes &aBuffer ) + { + aBuffer.Zero(); + + if (aBuffer.MaxLength() >= aData.Length()) + { + aBuffer = aData; + } + else + { + LOGGER_WRITE_1( "AssignDataToBuffer: too short buffer for data: %d", aBuffer.MaxLength() ); + LOG( aData ); + aBuffer = aData.Left( aBuffer.MaxLength() ); + } + } + + +// End of File