fotaapplication/fotaserver/src/FotaDB.cpp
branchRCL_3
changeset 26 19bba8228ff0
parent 25 b183ec05bd8c
child 27 5cc2995847ea
--- a/fotaapplication/fotaserver/src/FotaDB.cpp	Tue Aug 31 16:04:06 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,549 +0,0 @@
-/*
- * 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:   Fota package state preservation 
- *
- */
-
-#include <centralrepository.h>
-#include "FotaDB.h"
-#include "FotaSrvDebug.h"
-#include "fotaserverPrivateCRKeys.h"
-
-#define __LEAVE_IF_ERROR(x) if(KErrNone!=x) {FLOG(_L("LEAVE in %s: %d"), __FILE__, __LINE__); User::Leave(x); }
-
-// ====================== MEMBER FUNCTIONS ===================================
-
-// ---------------------------------------------------------------------------
-// CFotaDB::CFotaDB()
-// ---------------------------------------------------------------------------
-CFotaDB::CFotaDB() :
-    iIsOpen(EFalse)
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::~CFotaDB()
-// ---------------------------------------------------------------------------
-CFotaDB::~CFotaDB()
-    {
-    //Delete columns set
-    if (iColSet)
-        {
-        delete iColSet;
-        iColSet = NULL;
-        }
-    //Close table
-    iTable.Close();
-
-    //Close database
-    iStateDB.Close();
-
-    //Close file server session
-    if (iFSSession.Handle())
-        iFSSession.Close();
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::NewL()
-// ---------------------------------------------------------------------------
-CFotaDB* CFotaDB::NewL()
-    {
-    CFotaDB* self = new (ELeave) CFotaDB();
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::ConstructL()
-// ---------------------------------------------------------------------------
-void CFotaDB::ConstructL()
-    {
-    TInt err;
-    TBuf<KMaxPath> tmp;
-    User::LeaveIfError(iFSSession.Connect());
-    err = iFSSession.CreatePrivatePath(EDriveC);
-    if (err != KErrNone && err != KErrAlreadyExists)
-        User::Leave(err);
-    User::LeaveIfError(iFSSession.SetSessionToPrivate(EDriveC));
-    User::LeaveIfError(iFSSession.SessionPath(tmp));
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::CreateDatabaseL()
-// Creates db in private dir of fotaserver
-// ---------------------------------------------------------------------------
-void CFotaDB::CreateDatabaseL()
-    {
-    FLOG(_L("CFotaDB::CreateDatabaseL()  >>"));
-    TInt err;
-    User::LeaveIfError(iStateDB.Create(iFSSession, KDatabaseName));
-    User::LeaveIfError(iStateDB.Begin());
-    User::LeaveIfError(iStateDB.Execute(KCreateTable));
-    err = iStateDB.Commit();
-    if (err)
-        {
-        FLOG(_L("      cdb err %d"), err);
-        iStateDB.Rollback();
-        User::Leave(err);
-        }
-    User::LeaveIfError(iStateDB.Compact());
-    FLOG(_L("CFotaDB::CreateDatabaseL()  <<"));
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::AddPackageStateL
-// Adds state to db
-// ---------------------------------------------------------------------------
-void CFotaDB::AddPackageStateL(const TPackageState& aState,
-        const TDesC8& aPkgURL)
-    {
-    FLOG(_L("  CFotaDB::AddPackageStateL   >>"));
-    TInt err;
-    RDbView view;
-    CleanupClosePushL(view);
-    TPackageState pkgstate(aState);
-    pkgstate.iResult = -1; // result should be -1 if no Execs have been done
-    err = view.Prepare(iStateDB, TDbQuery(KSelectAll), RDbView::EInsertOnly);
-    __LEAVE_IF_ERROR(err);
-    FLOG(_L("  CFotaDB::AddPackageStateL   inserting. pkgid:%d result:%d  state:%d"),
-            pkgstate.iPkgId, pkgstate.iResult, pkgstate.iState);
-    view.InsertL();
-    StateToRowL(pkgstate, aPkgURL, view);
-    view.PutL();
-    CleanupStack::PopAndDestroy(); //view
-    FLOG(_L("  CFotaDB::AddPackageStateL   <<"));
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::GetAllL
-// Get all states
-// ---------------------------------------------------------------------------
-void CFotaDB::GetAllL(RArray<TInt>& aStates)
-    {
-    RDbView view;
-    CleanupClosePushL(view);
-
-    TInt err = view.Prepare(iStateDB, TDbQuery(KSelectAll));
-    __LEAVE_IF_ERROR(err);
-    view.EvaluateAll();
-
-    view.FirstL();
-    FLOG(_L("[fota DB] --- rows ------------------------------------------------------------------- v"));
-    while (view.AtRow())
-        {
-        view.GetL();
-        HBufC8* url;
-        TPackageState s = RowToStateL(url, view);
-        aStates.Append(s.iPkgId);
-        CleanupStack::PushL(url);
-        FLOG(_L("[fotaDB] pkgid: %d profid:%d state:%d  result:%d \
-                url: %d chars sessiontype:%d IapId:%d Pkgsize:%d UpdateLtr:%d"),
-                s.iPkgId, s.iProfileId, s.iState, s.iResult,
-                url->Des().Length(), s.iSessionType, s.iIapId, s.iPkgSize,
-                s.iUpdateLtr);
-        CleanupStack::PopAndDestroy(); // url
-        view.NextL();
-        }
-    FLOG(_L("[fota DB] --- rows ------------------------------------------------------------------- ^"));
-    view.Close();
-    CleanupStack::PopAndDestroy(); //view
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::OpenDBL()
-// Opens database
-// ---------------------------------------------------------------------------
-void CFotaDB::OpenDBL()
-    {
-    FLOG(_L("CFotaDB::OpenDBL()"));
-    if (!iIsOpen) //Prevents accidental opening of database twice
-        {
-        TInt err;
-        err = iStateDB.Open(iFSSession, KDatabaseName);
-
-        if (err == KErrNotFound)
-            {
-            CreateDatabaseL();
-            }
-        else if (err != KErrNone)
-            {
-            FLOG(_L("[fota DB openDB]\t db open error: %d"), err);
-            FLOG(_L("deleting fota DB and creating it again..."));
-            err = iFSSession.Delete(KDatabaseName);
-            CreateDatabaseL();
-            User::LeaveIfError(err);
-            }
-        User::LeaveIfError(iTable.Open(iStateDB, KTblState));
-        iColSet = iTable.ColSetL();
-
-        iIsOpen = ETrue;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::CloseAndCommitDB
-// Closes and commits DB
-// ---------------------------------------------------------------------------
-void CFotaDB::CloseAndCommitDB()
-    {
-    if (iColSet)
-        {
-        delete iColSet;
-        iColSet = NULL;
-        }
-    iTable.Close();
-    iStateDB.Close();
-    iIsOpen = EFalse;
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::IsOpen()
-// Chekcs if db is open
-// ---------------------------------------------------------------------------
-TBool CFotaDB::IsOpen()
-    {
-    return iIsOpen;
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::GetStateL
-// Gets pkg state from db
-// ---------------------------------------------------------------------------
-TPackageState CFotaDB::GetStateL(const TInt aPkgId, TDes8& aPkgURL)
-    {
-    RDbView view;
-    TPackageState s;
-    CleanupClosePushL(view);
-
-    s.iState = RFotaEngineSession::EIdle; // default state is idle
-
-    HBufC* select = HBufC::NewLC(KSelect_where_packageid().Length() + 10);
-    select->Des().Format(KSelect_where_packageid, aPkgId);
-
-    TInt err = view.Prepare(iStateDB, TDbQuery(*select));
-    __LEAVE_IF_ERROR(err);
-    view.EvaluateAll();
-    view.FirstL();
-
-    while (view.AtRow())
-        {
-        view.GetL();
-        HBufC8* url;
-        s = RowToStateL(url, view);
-        CleanupStack::PushL(url);
-        aPkgURL.Copy(url->Des());
-        CleanupStack::PopAndDestroy(); // url
-        view.NextL();
-        }
-    CleanupStack::PopAndDestroy(); //select
-    CleanupStack::PopAndDestroy(); //view
-    return s;
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::SetStateL
-// Writes package state to DB. 
-// ---------------------------------------------------------------------------
-void CFotaDB::SetStateL(TPackageState& aState, const TDesC8& aPkgURL,
-        TUint aChangedFields)
-    {
-    FLOG(_L("  CFotaDB::SetStateL  >>  id %d result %d  state %d sessiontype %d iapid %d pkgsize %d updateltr %d"), aState.iPkgId, aState.iResult, aState.iState);
-    __ASSERT_ALWAYS( aChangedFields!=0, User::Leave(KErrArgument) );
-    TBuf8<KMaxFileName> temp;
-    TPackageState found = GetStateL(aState.iPkgId, temp);
-    if (found.iPkgId == KErrNotFound)
-        {
-        AddPackageStateL(aState, aPkgURL);
-        }
-    else
-        {
-        // sml try count must be reset, if state is set
-        if (aChangedFields & EFDBState)
-            {
-            aChangedFields = aChangedFields | EFDBSmlTryCount;
-            SetRetryCount(aState);
-            }
-
-        // Construct a SQL string for update. 
-        // Example: UPDATE State SET Result=40,State=4 WHERE pkgID=5
-        // 
-        TInt sqlsize = 0;
-        _LIT8( KSqlbegin, "UPDATE State SET " );
-        TBuf<21> sqlEnd;
-        HBufC8* sql(NULL);
-        // determine characters needed 
-        sqlsize = DetermineCharNeeded(aChangedFields, aState, aPkgURL);
-        sqlEnd.AppendFormat(_L(" WHERE pkgID=%d"), aState.iPkgId);
-
-        sql = HBufC8::NewLC(((TDesC8) KSqlbegin).Length() + sqlsize
-                + sqlEnd.Length());
-
-        sql->Des().Append(KSqlbegin);
-
-        if (aChangedFields & EFDBResult)
-            {
-            // check FUMO compability
-            __ASSERT_ALWAYS( aState.iResult>=KErrNotFound
-                    && aState.iResult<=602, User::Leave(KErrArgument) );
-            sql->Des().AppendFormat(_L8("Result=%d,"), aState.iResult);
-            }
-        if (aChangedFields & EFDBState)
-            {
-            // check FUMO compability
-            __ASSERT_ALWAYS( aState.iState>=0 && aState.iState<=100
-                    , User::Leave(KErrArgument) );
-            sql->Des().AppendFormat(_L8("State=%d,"), aState.iState);
-            }
-        if (aChangedFields & EFDBProfileId)
-            {
-            sql->Des().AppendFormat(_L8("profileid=%d,"), aState.iProfileId);
-            }
-        if (aChangedFields & EFDBPkgUrl)
-            {
-            sql->Des().AppendFormat(_L8("pkgurl='%S',"), &aPkgURL);
-            }
-        if (aChangedFields & EFDBPkgName)
-            {
-            sql->Des().AppendFormat(_L8("pkgname='%S',"), &(aState.iPkgName));
-            }
-        if (aChangedFields & EFDBVersion)
-            {
-            sql->Des().AppendFormat(_L8("Version='%S',"),
-                    &(aState.iPkgVersion));
-            }
-        if (aChangedFields & EFDBSmlTryCount)
-            {
-            __ASSERT_ALWAYS( aState.iSmlTryCount>=0
-                    , User::Leave(KErrArgument) );
-            sql->Des().AppendFormat(_L8("SmlTryCount=%d,"),
-                    aState.iSmlTryCount);
-
-            }
-        if (aChangedFields & EFDBSessionType)
-            {
-            sql->Des().AppendFormat(_L8("SessionType=%d,"),
-                    aState.iSessionType);
-            }
-        if (aChangedFields & EFDBIapId)
-            {
-            // validate IAP ID
-            __ASSERT_ALWAYS( aState.iIapId>=-1 ,User::Leave(KErrArgument) );
-            sql->Des().AppendFormat(_L8("IapId=%d,"), aState.iIapId);
-            }
-        if (aChangedFields & EFDBPkgSize)
-            {
-            sql->Des().AppendFormat(_L8("PkgSize=%d,"), aState.iPkgSize);
-            }
-        if (aChangedFields & EFDBUpdateLtr)
-            {
-            // validate bit
-            sql->Des().AppendFormat(_L8("UpdateLtr=%d,"), aState.iUpdateLtr);
-            }
-        // remove trailing ,
-        if (aChangedFields)
-            {
-            sql->Des().SetLength(sql->Des().Length() - 1);
-            }
-        sql->Des().Append(sqlEnd);
-        HBufC* sql2 = HBufC::NewLC(sql->Length()); // to cleanupstack
-        sql2->Des().Copy(sql->Des());
-        FLOG(_L("  sql:%S"), sql2);
-
-        User::LeaveIfError(iStateDB.Begin());
-        User::LeaveIfError(iStateDB.Execute(*sql2));
-        User::LeaveIfError(iStateDB.Commit());
-        User::LeaveIfError(iStateDB.Compact());
-
-        CleanupStack::PopAndDestroy(sql2); //sql2
-        CleanupStack::PopAndDestroy(sql); //sql
-        }
-    FLOG(_L("  CFotaDB::SetStateL  <<"));
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::DetermineCharNeeded 
-// Returns the char needed fro the query 
-// ---------------------------------------------------------------------------
-
-TInt CFotaDB::DetermineCharNeeded(TInt aChangedFields, TPackageState& aState,
-        const TDesC8& aPkgURL)
-
-    {
-
-    TInt sqlsize = 0;
-    if (aChangedFields & EFDBResult)
-        sqlsize += 4 + 7 + 4;
-    if (aChangedFields & EFDBState)
-        sqlsize += 4 + 5 + 4;
-    if (aChangedFields & EFDBProfileId)
-        sqlsize += 4 + 9 + 4;
-    if (aChangedFields & EFDBPkgUrl)
-        sqlsize += aPkgURL.Length() + 6 + 4;
-    if (aChangedFields & EFDBPkgName)
-        sqlsize += aState.iPkgName.Length() + 7 + 4;
-    if (aChangedFields & EFDBVersion)
-        sqlsize += aState.iPkgVersion.Length() + 7 + 4;
-    if (aChangedFields & EFDBSmlTryCount)
-        sqlsize += 4 + 11 + 4;
-
-    if (aChangedFields & EFDBSessionType)
-        sqlsize += 4 + 11 + 4;
-    if (aChangedFields & EFDBIapId)
-        sqlsize += 4 + 5 + 4;
-    if (aChangedFields & EFDBPkgSize)
-        sqlsize += 4 + 7 + 10;
-    if (aChangedFields & EFDBUpdateLtr)
-        sqlsize += 4 + 11 + 4;
-
-    return sqlsize;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::SetRetryCount
-// Sets the retry count
-// ---------------------------------------------------------------------------
-void CFotaDB::SetRetryCount(TPackageState& aState)
-    {
-    CRepository* centrep(NULL);
-    TInt err = KErrNone;
-    TInt retry = 0;
-
-    TRAP(err, centrep = CRepository::NewL( KCRUidFotaServer ) );
-    if (centrep)
-        {
-        err = centrep->Get(KGenericAlertRetries, retry);
-        delete centrep;
-        centrep = NULL;
-        }
-    if (err == KErrNone)
-        {
-        if (retry < 0)
-            {
-            aState.iSmlTryCount = KDefaultSmlTryCount;
-            }
-        else if (retry == 0)
-            {
-            aState.iSmlTryCount = 2;
-            }
-        else if (retry > KMaximumSmlTryCount)
-            {
-            aState.iSmlTryCount = KMaximumSmlTryCount + 1;
-            }
-        else
-            {
-            aState.iSmlTryCount = retry + 1;
-            }
-        }
-    else
-        {
-        aState.iSmlTryCount = KDefaultSmlTryCount;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::RowToStateL
-// Extracts db row contents to package state object and aPkgUrl
-// Returns url in aPkgURL parameter
-// ---------------------------------------------------------------------------
-TPackageState CFotaDB::RowToStateL(HBufC8*& aPkgUrl, const RDbView& aView)
-    {
-    TPackageState s;
-    TInt pkgid = aView.ColInt(iColSet->ColNo(KColPkgId));
-    TInt state = aView.ColInt(iColSet->ColNo(KColState));
-    TInt result = aView.ColInt(iColSet->ColNo(KColResult));
-    TSmlProfileId profileid(aView.ColInt(iColSet->ColNo(KColProfileId)));
-    TPtrC pkgname = aView.ColDes(iColSet->ColNo(KColPkgName));
-    TPtrC version = aView.ColDes(iColSet->ColNo(KColVersion));
-    TInt smltrycount = aView.ColInt(iColSet->ColNo(KColSmlTryCount));
-    TInt sessiontype = aView.ColInt(iColSet->ColNo(KColSessionType));
-    TInt iapid = aView.ColInt(iColSet->ColNo(KColIapId));
-    TUint pkgsize = aView.ColUint(iColSet->ColNo(KColPkgSize));
-    TBool updateltr = aView.ColUint8(iColSet->ColNo(KColUpdateLtr));
-
-    s.iPkgId = pkgid;
-    s.iPkgName.Copy(pkgname);
-    s.iPkgVersion.Copy(version);
-    s.iProfileId = profileid;
-    s.iResult = result;
-    s.iState = RFotaEngineSession::TState(state);
-    s.iSmlTryCount = smltrycount;
-    s.iSessionType = sessiontype;
-    s.iIapId = iapid;
-    s.iPkgSize = pkgsize;
-    s.iUpdateLtr = updateltr;
-
-    RDbColReadStream rstream;
-    TInt len = aView.ColLength(iColSet->ColNo(KColPkgUrl));
-    rstream.OpenLC(aView, iColSet->ColNo(KColPkgUrl));
-    HBufC* pkgurl = HBufC::NewLC(len);
-    TPtr ptr = pkgurl->Des();
-    rstream.ReadL(ptr, len);
-
-    HBufC8* tmp = HBufC8::NewL(pkgurl->Des().Length());
-    tmp->Des().Copy(pkgurl->Des());
-    aPkgUrl = tmp;
-
-    CleanupStack::PopAndDestroy(pkgurl);
-    CleanupStack::PopAndDestroy(&rstream);
-    return s;
-    }
-
-// ---------------------------------------------------------------------------
-// CFotaDB::StateToRowL
-// Converts state object to database row (into view object)
-// ---------------------------------------------------------------------------
-void CFotaDB::StateToRowL(const TPackageState& aPkg, const TDesC8& aPkgURL,
-        RDbView& aView)
-    {
-    HBufC* pkgname = HBufC::NewLC(aPkg.iPkgName.Length());
-    HBufC* version = HBufC::NewLC(aPkg.iPkgVersion.Length());
-
-    pkgname->Des().Copy(aPkg.iPkgName);
-    version->Des().Copy(aPkg.iPkgVersion);
-
-    aView.SetColL(iColSet->ColNo(KColPkgId), aPkg.iPkgId);
-    aView.SetColL(iColSet->ColNo(KColResult), aPkg.iResult);
-    aView.SetColL(iColSet->ColNo(KColState), aPkg.iState);
-    aView.SetColL(iColSet->ColNo(KColProfileId), aPkg.iProfileId);
-    aView.SetColL(iColSet->ColNo(KColPkgName), *pkgname);
-    aView.SetColL(iColSet->ColNo(KColVersion), *version);
-    aView.SetColL(iColSet->ColNo(KColSmlTryCount), aPkg.iSmlTryCount);
-    aView.SetColL(iColSet->ColNo(KColSessionType), aPkg.iSessionType);
-    aView.SetColL(iColSet->ColNo(KColIapId), aPkg.iIapId);
-    aView.SetColL(iColSet->ColNo(KColPkgSize), aPkg.iPkgSize);
-    aView.SetColL(iColSet->ColNo(KColUpdateLtr), aPkg.iUpdateLtr);
-
-    RDbColWriteStream wstream;
-    CleanupClosePushL(wstream);
-    wstream.OpenL(aView, iColSet->ColNo(KColPkgUrl));
-    // Cannot write 8 bit descriptors to databae
-    HBufC* buf = HBufC::NewLC(aPkgURL.Length());
-    buf->Des().Copy(aPkgURL);
-    wstream.WriteL(buf->Des());
-
-    FLOG(_L("CFotaDB::StateToRowL  id:%d result:%d state:%d profileid:%d \
-    		name:%d chars version: %d chars url: %d chars sessiontype:%d iapid:%d pkgsize:%d updateltr = %d"),
-            aPkg.iPkgId, aPkg.iResult, aPkg.iState, aPkg.iProfileId,
-            pkgname->Des().Length(), version->Des().Length(),
-            buf->Des().Length(), aPkg.iSessionType, aPkg.iIapId,
-            aPkg.iPkgSize, aPkg.iUpdateLtr);
-
-    CleanupStack::PopAndDestroy(buf);
-    CleanupStack::PopAndDestroy(&wstream);
-    CleanupStack::PopAndDestroy(version);
-    CleanupStack::PopAndDestroy(pkgname);
-    }