--- /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<aPosition; i++)
+ {
+ iView.NextL();
+ }
+ }
+ }
+
+ if(iTotalRows == 0 || aPosition >= iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ return 0;
+ }
+
+ TInt64 suidId = 0;
+ TInt64 puidlow = 1;
+ TBuf8<KMTPPuidSize> puidBuffer;
+
+ for(TInt count=0;count <aMaxArraySize;count++)
+ {
+ iView.GetL();
+ //Get the data from the current row
+ suidId = iView.ColInt64(1);
+ TInt8 opCode = iView.ColInt8(2);
+ puidBuffer.Copy(TPtrC8((const TUint8*)&suidId, sizeof(TInt64)));
+ puidBuffer.Append(TPtrC8((const TUint8*)&puidlow, sizeof(TInt64)));
+ TMTPTypeUint128 puid(puidBuffer);
+
+ if(opCode == EDeleted)
+ {
+ aDeletedPuidArray.AppendL(puid);
+ }
+ else
+ {
+ aModifiedPuidIdArray.AppendL(puid);
+ }
+ aPosition++;
+
+ if(aPosition == iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ break;
+ }
+ else
+ {
+ //Move to the next row
+ iView.NextL();
+ }
+ }
+
+ __FLOG(_L8("GetChangedPuidsL - Exit"));
+ return (iTotalRows - aPosition);
+ }
+
+/**
+@param total number of items to be filled into aAddedPuidIdArray
+@param reference to added 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::GetAddedPuidsL(TInt aMaxArraySize, TInt &aPosition, CMTPTypeArray& aAddedPuidIdArray)
+ {
+ __FLOG(_L8("GetAddedPuidsL - Entry"));
+
+ if(!iNeedToSendMore)
+ {
+ TInt opcode = EAdded;
+ _LIT(KSQLSelectAdded, "SELECT * FROM MTPDeltaDataTable WHERE OpCode = %d");
+ iSqlStatement.Format(KSQLSelectAdded, opcode);
+
+ User::LeaveIfError(iView.Prepare(iDatabase, TDbQuery(iSqlStatement)));
+ User::LeaveIfError(iView.EvaluateAll());
+ iNeedToSendMore = ETrue;
+ iView.FirstL();
+ iTotalRows = iView.CountL();
+
+ if(aPosition !=0 && aPosition < iTotalRows)
+ {
+ for(TInt i=0; i<aPosition; i++)
+ {
+ iView.NextL();
+ }
+ }
+ }
+
+ if(iTotalRows == 0 || aPosition >= iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ return 0;
+ }
+
+ TInt64 suidId = 0;
+ TInt64 puidlow = 1;
+ TBuf8<KMTPPuidSize> puidBuffer;
+
+ for(TInt count=0;count <aMaxArraySize;count++)
+ {
+
+ iView.GetL();
+ //Get the data from the current row
+ suidId = iView.ColInt64(1);
+ puidBuffer.Copy(TPtrC8((const TUint8*)&suidId, sizeof(TInt64)));
+ puidBuffer.Append(TPtrC8((const TUint8*)&puidlow, sizeof(TInt64)));
+ TMTPTypeUint128 puid(puidBuffer);
+
+ aAddedPuidIdArray.AppendL(puid);
+ aPosition++;
+
+ if(aPosition == iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ break;
+ }
+ else
+ {
+ //Move to the next row
+ iView.NextL();
+ }
+ }
+
+ __FLOG(_L8("GetAddedPuidsL - Exit"));
+ return (iTotalRows - aPosition);
+ }
+
+/**
+@param total number of items to be filled into aAddedPuidIdArray
+@param reference to 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::GetDeletedPuidsL(TInt aMaxArraySize, TInt &aPosition, CMTPTypeArray& aDeletedPuidIdArray)
+ {
+ __FLOG(_L8("GetDeletedPuidsL - Entry"));
+
+ if(!iNeedToSendMore)
+ {
+ TInt opcode = EDeleted;
+ _LIT(KSQLSelectDeleted, "SELECT * FROM MTPDeltaDataTable WHERE OpCode = %d");
+ iSqlStatement.Format(KSQLSelectDeleted, opcode);
+
+ User::LeaveIfError(iView.Prepare(iDatabase, TDbQuery(iSqlStatement)));
+ User::LeaveIfError(iView.EvaluateAll());
+ iNeedToSendMore = ETrue;
+ iView.FirstL();
+ iTotalRows = iView.CountL();
+
+ if(aPosition !=0 && aPosition < iTotalRows)
+ {
+ for(TInt i=0; i<aPosition; i++)
+ {
+ iView.NextL();
+ }
+ }
+ }
+
+ if(iTotalRows == 0 || aPosition >= iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ return 0;
+ }
+
+ TInt64 suidId = 0;
+ TInt64 puidlow = 1;
+ TBuf8<KMTPPuidSize> puidBuffer;
+
+ for(TInt count=0;count <aMaxArraySize;count++)
+ {
+
+ iView.GetL();
+ //Get the data from the current row
+ suidId = iView.ColInt64(1);
+ puidBuffer.Copy(TPtrC8((const TUint8*)&suidId, sizeof(TInt64)));
+ puidBuffer.Append(TPtrC8((const TUint8*)&puidlow, sizeof(TInt64)));
+ TMTPTypeUint128 puid(puidBuffer);
+
+ aDeletedPuidIdArray.AppendL(puid);
+ aPosition++;
+
+ if(aPosition == iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ break;
+ }
+ else
+ {
+ //Move to the next row
+ iView.NextL();
+ }
+ }
+
+ __FLOG(_L8("GetDeletedPuidsL - Exit"));
+ return (iTotalRows - aPosition);
+ }
+
+/**
+@param total number of items to be filled into aAddedPuidIdArray
+@param reference to Modified 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::GetModifiedPuidsL(TInt aMaxArraySize, TInt &aPosition, CMTPTypeArray& aModifiedPuidIdArray)
+ {
+ __FLOG(_L8("GetDeletedPuidsL - Entry"));
+
+ if(!iNeedToSendMore)
+ {
+ TInt opcode = EModified;
+ _LIT(KSQLSelectModified, "SELECT * FROM MTPDeltaDataTable WHERE OpCode = %d");
+ iSqlStatement.Format(KSQLSelectModified, opcode);
+
+ User::LeaveIfError(iView.Prepare(iDatabase, TDbQuery(iSqlStatement)));
+ User::LeaveIfError(iView.EvaluateAll());
+ iNeedToSendMore = ETrue;
+ iView.FirstL();
+ iTotalRows = iView.CountL();
+
+ if(aPosition !=0 && aPosition < iTotalRows)
+ {
+ for(TInt i=0; i<aPosition; i++)
+ {
+ iView.NextL();
+ }
+ }
+ }
+
+ if(iTotalRows == 0 || aPosition >= iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ return 0;
+ }
+
+ TInt64 suidId = 0;
+ TInt64 puidlow = 1;
+ TBuf8<KMTPPuidSize> puidBuffer;
+
+ for(TInt count=0;count <aMaxArraySize;count++)
+ {
+ iView.GetL();
+ //Get the data from the current row
+ suidId = iView.ColInt64(1);
+
+ puidBuffer.Copy(TPtrC8((const TUint8*)&suidId, sizeof(TInt64)));
+ puidBuffer.Append(TPtrC8((const TUint8*)&puidlow, sizeof(TInt64)));
+ TMTPTypeUint128 puid(puidBuffer);
+
+ aModifiedPuidIdArray.AppendL(puid);
+ aPosition++;
+
+ if(aPosition == iTotalRows)
+ {
+ iNeedToSendMore = EFalse;
+ iView.Close();
+ break;
+ }
+ else
+ {
+ //Move to the next row
+ iView.NextL();
+ }
+ }
+
+ __FLOG(_L8("GetDeletedPuidsL - Exit"));
+ return (iTotalRows - aPosition);
+ }
+
+/**
+@leave One of the system wide error codes, if a processing failure occurs.
+*/
+EXPORT_C void CMtpDeltaDataMgr::ResetMTPDeltaDataTableL()
+ {
+ __FLOG(_L8("ResetMTPDeltaDataTableL - Entry"));
+
+ iView.Close();
+ iNeedToSendMore = EFalse;
+ User::LeaveIfError(iDatabase.Execute(KDeleteDeltaTable));
+
+ __FLOG(_L8("ResetMTPDeltaDataTableL - Exit"));
+ }