diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/src/cmtpdeltadatamgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/src/cmtpdeltadatamgr.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,559 @@ +// Copyright (c) 2007-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: +// + +/** + @file + @publishedPartner +*/ + + +#include "cmtpdeltadatamgr.h" +//! Size of a PUID in bytes +static const TInt KMTPPuidSize = 16; + + +__FLOG_STMT(_LIT8(KComponent,"MTPDeltaDataMgr:");) + +_LIT(KMTPDeltaDataTable, "MTPDeltaDataTable"); +_LIT(KSQLPuidIndexName, "PuidIndex"); +_LIT(KSQLIdentifierIndexName, "IdentifierIndex"); +_LIT(KAnchorIdTable, "AnchorIdTable"); +_LIT (KDeleteDeltaTable, "DELETE FROM MTPDeltaDataTable"); +/** +Standard c++ constructor +*/ +CMtpDeltaDataMgr::CMtpDeltaDataMgr(RDbDatabase& aDatabase) + :iDatabase(aDatabase) + { + } + + +/** +Second-phase construction +@leave One of the system wide error codes, if a processing failure occurs. +*/ +void CMtpDeltaDataMgr::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("ConstructL - Entry")); + __FLOG(_L8("ConstructL - Exit")); + } + + +/** +Two-phase construction +@param aDatabase The reference to the database object +@return pointer to the created CMtpDeltaDataMgr instance +*/ +CMtpDeltaDataMgr* CMtpDeltaDataMgr::NewL(RDbDatabase& aDatabase) + { + CMtpDeltaDataMgr* self = new (ELeave) CMtpDeltaDataMgr(aDatabase); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +/** +Destructor +*/ +CMtpDeltaDataMgr::~CMtpDeltaDataMgr() + { + iDeltaTableBatched.Close(); + iAnchorTableBatched.Close(); + iView.Close(); + iSuidIdArray.Close(); + __FLOG_CLOSE; + } +/** +Create the MTP Delta Data Table +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C void CMtpDeltaDataMgr::CreateDeltaDataTableL() + { + __FLOG(_L8("CreateDeltaDataTableL - Entry")); + + iDeltaTableBatched.Close(); + if(!DBUtility::IsTableExistsL(iDatabase, KMTPDeltaDataTable)) + { + _LIT(KSQLCreateMTPDeltaDataTableText,"CREATE TABLE MTPDeltaDataTable (SuidId BIGINT , OpCode TINYINT )"); + User::LeaveIfError(iDatabase.Execute(KSQLCreateMTPDeltaDataTableText)); + + if(!DBUtility::IsIndexExistsL(iDatabase, KMTPDeltaDataTable, KSQLPuidIndexName)) + { + _LIT(KSQLCreateReferenceIndexText,"CREATE UNIQUE INDEX PuidIndex on MTPDeltaDataTable (SuidId)"); + User::LeaveIfError(iDatabase.Execute(KSQLCreateReferenceIndexText)); + } + } + iDeltaTableBatched.Open(iDatabase, KMTPDeltaDataTable, RDbRowSet::EUpdatable); + + __FLOG(_L8("CreateDeltaDataTableL - Exit")); + } + +/** +Create the Anchor Id Table anchor Id will be stored here +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C void CMtpDeltaDataMgr::CreateAnchorIdTableL() + { + __FLOG(_L8("CreateAnchorIdTableL - Entry")); + iAnchorTableBatched.Close(); + if(!DBUtility::IsTableExistsL(iDatabase, KAnchorIdTable)) + { + _LIT(KSQLCreateAnchorIdTableText,"CREATE TABLE AnchorIdTable (anchorid INTEGER, curindex INTEGER, identifier INTEGER)"); + User::LeaveIfError(iDatabase.Execute(KSQLCreateAnchorIdTableText)); + + if(!DBUtility::IsIndexExistsL(iDatabase, KAnchorIdTable, KSQLIdentifierIndexName)) + { + _LIT(KSQLCreateRefIndexText,"CREATE UNIQUE INDEX IdentifierIndex on AnchorIdTable (identifier)"); + User::LeaveIfError(iDatabase.Execute(KSQLCreateRefIndexText)); + } + } + iAnchorTableBatched.Open(iDatabase, KAnchorIdTable, RDbRowSet::EUpdatable); + + __FLOG(_L8("CreateAnchorIdTableL - Exit")); + } + +/** +Add a new anchor ID to the AnchorIdTable +@param aAnchorId The anchor ID +@param aIdentifier The identifier of the anchor +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C void CMtpDeltaDataMgr::InsertAnchorIdL(TInt aAnchorId, TInt aIdentifier) + { + __FLOG(_L8("InsertAnchorIdL - Entry")); + iAnchorTableBatched.SetIndex(KSQLIdentifierIndexName); + if(!(iAnchorTableBatched.SeekL(aIdentifier))) + { + iAnchorTableBatched.InsertL(); + iAnchorTableBatched.SetColL(1, aAnchorId); + iAnchorTableBatched.SetColL(2, 0); + iAnchorTableBatched.SetColL(3, aIdentifier); + iAnchorTableBatched.PutL(); + } + __FLOG(_L8("InsertAnchorIdL - Exit")); + } + +/** +Overwrite the anchor Id with new one +@param aAnchorId The new anchor ID +@param aIdentifier The identifier of the anchor +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C void CMtpDeltaDataMgr::UpdateAnchorIdL(TInt aAnchorId, TInt aIdentifier) + { + __FLOG(_L8("UpdateAnchorIdL - Entry")); + iAnchorTableBatched.SetIndex(KSQLIdentifierIndexName); + if(iAnchorTableBatched.SeekL(aIdentifier)) + { + iAnchorTableBatched.UpdateL(); + iAnchorTableBatched.SetColL(1, aAnchorId); + iAnchorTableBatched.PutL(); + } + __FLOG(_L8("UpdateAnchorIdL - Exit")); + } + +/** +Get the anchor ID with specified identifier +@param aIdentifier The identifier of the anchor +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C TInt CMtpDeltaDataMgr::GetAnchorIdL(TInt aIdentifier) + { + __FLOG(_L8("GetAnchorIdL - Entry")); + TInt anchorId = 0; + iAnchorTableBatched.SetIndex(KSQLIdentifierIndexName); + if(iAnchorTableBatched.SeekL(aIdentifier)) + { + iAnchorTableBatched.GetL(); + anchorId = iAnchorTableBatched.ColInt32(1); + } + __FLOG(_L8("GetAnchorIdL - Exit")); + return anchorId; + } + +/** +Overwrite the old index with new one +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C void CMtpDeltaDataMgr::UpdatePersistentIndexL(TInt aCurindex, TInt aIdentifier) + { + __FLOG(_L8("UpdatePersistentIndexL - Entry")); + iAnchorTableBatched.SetIndex(KSQLIdentifierIndexName); + if(iAnchorTableBatched.SeekL(aIdentifier)) + { + iAnchorTableBatched.UpdateL(); + iAnchorTableBatched.SetColL(2, aCurindex); + iAnchorTableBatched.PutL(); + } + __FLOG(_L8("UpdatePersistentIndexL - Exit")); + } + +/** +returns the stored index +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C TInt CMtpDeltaDataMgr::GetPersistentIndexL(TInt aIdentifier) + { + __FLOG(_L8("GetPersistentIndexL - Entry")); + + TInt currIndex = 0; + iAnchorTableBatched.SetIndex(KSQLIdentifierIndexName); + if(iAnchorTableBatched.SeekL(aIdentifier)) + { + iAnchorTableBatched.GetL(); + currIndex = iAnchorTableBatched.ColInt32(2); + } + __FLOG(_L8("GetPersistentIndexL - Exit")); + return currIndex; + } + +/** +Add the Opcode and SuidId to the MTPDeltaDataTable +@param aSuidId The suid identifier of the object to be added +@param aOpCode operation code +@leave One of the system wide error codes, if a processing failure occurs. +*/ +void CMtpDeltaDataMgr::UpdateDeltaDataTableL(TInt64 aSuidId, TOpCode aOpCode) + { + __FLOG(_L8("UpdateDeltaDataTableL - Entry")); + if(!DBUtility::IsTableExistsL(iDatabase, KMTPDeltaDataTable)) + return; + + iDeltaTableBatched.SetIndex(KSQLPuidIndexName); + if(iDeltaTableBatched.SeekL(aSuidId)) + { + iDeltaTableBatched.UpdateL(); + iDeltaTableBatched.SetColL(2, aOpCode); + } + else + { + iDeltaTableBatched.InsertL(); + iDeltaTableBatched.SetColL(1, aSuidId); + iDeltaTableBatched.SetColL(2, aOpCode); + } + iDeltaTableBatched.PutL(); + __FLOG(_L8("UpdateDeltaDataTableL - Exit")); + } + +/** +@param total number of items to be filled into aModifiedPuidIdArray and aDeletedPuidArray +@param the start position +@param reference to modifed and deleted mtp arrays +@return Number of remaining items to be retrieved from table +@leave One of the system wide error codes, if a processing failure occurs. +*/ +EXPORT_C TInt CMtpDeltaDataMgr::GetChangedPuidsL(TInt aMaxArraySize, TInt& aPosition, CMTPTypeArray& aModifiedPuidIdArray, CMTPTypeArray& aDeletedPuidArray) + { + __FLOG(_L8("GetChangedPuidsL - Entry")); + + if(!iNeedToSendMore) + { + _LIT(KSQLGetAll, "SELECT * FROM MTPDeltaDataTable"); + + User::LeaveIfError(iView.Prepare(iDatabase, TDbQuery(KSQLGetAll))); + User::LeaveIfError(iView.EvaluateAll()); + iNeedToSendMore = ETrue; + iView.FirstL(); + iTotalRows = iView.CountL(); + + if(aPosition !=0 && aPosition < iTotalRows) + { + for(TInt i=0; i= iTotalRows) + { + iNeedToSendMore = EFalse; + iView.Close(); + return 0; + } + + TInt64 suidId = 0; + TInt64 puidlow = 1; + TBuf8 puidBuffer; + + for(TInt count=0;count = iTotalRows) + { + iNeedToSendMore = EFalse; + iView.Close(); + return 0; + } + + TInt64 suidId = 0; + TInt64 puidlow = 1; + TBuf8 puidBuffer; + + for(TInt count=0;count = iTotalRows) + { + iNeedToSendMore = EFalse; + iView.Close(); + return 0; + } + + TInt64 suidId = 0; + TInt64 puidlow = 1; + TBuf8 puidBuffer; + + for(TInt count=0;count = iTotalRows) + { + iNeedToSendMore = EFalse; + iView.Close(); + return 0; + } + + TInt64 suidId = 0; + TInt64 puidlow = 1; + TBuf8 puidBuffer; + + for(TInt count=0;count