mtpfws/mtpfw/src/cmtppkgidstore.cpp
changeset 0 d0791faffa3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/src/cmtppkgidstore.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,136 @@
+// 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:
+//
+
+#include "cmtppkgidstore.h"
+#include "dbutility.h"
+
+/**
+Two-phase construction
+@param aDatabase    The reference to the database object
+@return pointer to the created <pkgid, dpid> map instance
+*/
+CMTPPkgIDStore* CMTPPkgIDStore::NewL(RDbDatabase& aDatabase)
+    {
+    CMTPPkgIDStore* self = new (ELeave) CMTPPkgIDStore(aDatabase);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+/**
+Standard c++ constructor
+*/  
+CMTPPkgIDStore::CMTPPkgIDStore(RDbDatabase& aDatabase)
+    :iDatabase(aDatabase)
+    {
+    }
+
+/**
+Second phase constructor.
+*/    
+void CMTPPkgIDStore::ConstructL()
+    {
+    CreatePkgIDStoreTableL();
+    }
+
+/**
+Create table to store the mapping from object handle to other properties 
+(data provider id, storage id, formatcode, etc.)
+*/    
+void CMTPPkgIDStore::CreatePkgIDStoreTableL()
+    {   
+    _LIT(KSQLPkgIDTableName, "PkgIDStore");
+    if (!DBUtility::IsTableExistsL(iDatabase, KSQLPkgIDTableName))
+        {
+        _LIT(KSQLCreatePkgIDTableText,
+            "CREATE TABLE PkgIDStore (DataProviderId UNSIGNED INTEGER, PkgId UNSIGNED INTEGER)");
+        User::LeaveIfError(iDatabase.Execute(KSQLCreatePkgIDTableText));            
+        }
+    _LIT(KSQLGetPKGID, "SELECT * FROM PkgIDStore");
+    iSqlStatement.Format(KSQLGetPKGID);    
+    RDbView view;
+    CleanupClosePushL(view);
+    User::LeaveIfError(view.Prepare(iDatabase, TDbQuery(iSqlStatement)));
+    User::LeaveIfError(view.Evaluate());
+    while (view.NextL())
+        {
+        view.GetL();
+        iDPIDs.AppendL(view.ColInt64(EPkgIDStoreDataProviderId));
+        iPkgIDs.AppendL(view.ColInt64(EPkgIDStorePKGID));
+        }
+    CleanupStack::PopAndDestroy(&view); 
+    }
+    
+/**
+Destructor.
+*/    
+CMTPPkgIDStore::~CMTPPkgIDStore()
+    {
+    iDPIDs.Close();
+    iPkgIDs.Close();
+    }
+
+
+void CMTPPkgIDStore::InsertPkgIdL(TUint aDPId, TUint aPkgId)
+    {       
+    TInt index = 0;
+    TRAPD(err, index = iDPIDs.FindL(aDPId));
+    if(KErrNotFound == err)
+        {
+        _LIT(KSQLInsertPkgIDObjectText, "INSERT INTO PkgIDStore (DataProviderId, PkgId) VALUES (%u, %u)");
+        iSqlStatement.Format(KSQLInsertPkgIDObjectText, aDPId, aPkgId);
+        User::LeaveIfError(iDatabase.Execute(iSqlStatement));
+        iDPIDs.AppendL(aDPId);
+        iPkgIDs.AppendL(aPkgId);
+        }
+    else
+        {
+        if(aPkgId != iPkgIDs[index])
+            {
+            _LIT(KSQLSetPkgIDObjectText, "UPDATE PkgIDStore SET PkgId = %u WHERE DataProviderId = %u");
+            iSqlStatement.Format(KSQLSetPkgIDObjectText, aPkgId,aDPId);
+            User::LeaveIfError(iDatabase.Execute(iSqlStatement));
+            iPkgIDs[index] = aPkgId;
+            }
+        }
+    }
+
+const RArray<TUint>& CMTPPkgIDStore::DPIDL() const
+    {
+    __ASSERT_DEBUG((iPkgIDs.Count() == iDPIDs.Count()), User::Invariant());
+    return iDPIDs;
+    }
+
+TUint CMTPPkgIDStore::PKGIDL (TUint aIndex) const
+    {
+    __ASSERT_DEBUG((aIndex < iPkgIDs.Count()), User::Invariant());
+    return iPkgIDs[aIndex];
+    }
+
+TInt CMTPPkgIDStore::RemoveL(TUint aDpId)
+    {
+    TInt index = iDPIDs.Find(aDpId);
+    if(KErrNotFound != index)
+        {
+        iDPIDs.Remove(index);
+        iPkgIDs.Remove(index);
+        _LIT(KSQLDeleteObjectText, "DELETE FROM PkgIDStore WHERE DataProviderId = %u");
+        iSqlStatement.Format(KSQLDeleteObjectText, aDpId);
+        User::LeaveIfError(iDatabase.Execute(iSqlStatement));
+        }
+    return index;
+    }