fotaapplication/fotaserver/src/FotaDB.cpp
branchRCL_3
changeset 26 19bba8228ff0
parent 25 b183ec05bd8c
child 27 5cc2995847ea
equal deleted inserted replaced
25:b183ec05bd8c 26:19bba8228ff0
     1 /*
       
     2  * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). 
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description:   Fota package state preservation 
       
    15  *
       
    16  */
       
    17 
       
    18 #include <centralrepository.h>
       
    19 #include "FotaDB.h"
       
    20 #include "FotaSrvDebug.h"
       
    21 #include "fotaserverPrivateCRKeys.h"
       
    22 
       
    23 #define __LEAVE_IF_ERROR(x) if(KErrNone!=x) {FLOG(_L("LEAVE in %s: %d"), __FILE__, __LINE__); User::Leave(x); }
       
    24 
       
    25 // ====================== MEMBER FUNCTIONS ===================================
       
    26 
       
    27 // ---------------------------------------------------------------------------
       
    28 // CFotaDB::CFotaDB()
       
    29 // ---------------------------------------------------------------------------
       
    30 CFotaDB::CFotaDB() :
       
    31     iIsOpen(EFalse)
       
    32     {
       
    33     }
       
    34 
       
    35 // ---------------------------------------------------------------------------
       
    36 // CFotaDB::~CFotaDB()
       
    37 // ---------------------------------------------------------------------------
       
    38 CFotaDB::~CFotaDB()
       
    39     {
       
    40     //Delete columns set
       
    41     if (iColSet)
       
    42         {
       
    43         delete iColSet;
       
    44         iColSet = NULL;
       
    45         }
       
    46     //Close table
       
    47     iTable.Close();
       
    48 
       
    49     //Close database
       
    50     iStateDB.Close();
       
    51 
       
    52     //Close file server session
       
    53     if (iFSSession.Handle())
       
    54         iFSSession.Close();
       
    55     }
       
    56 
       
    57 // ---------------------------------------------------------------------------
       
    58 // CFotaDB::NewL()
       
    59 // ---------------------------------------------------------------------------
       
    60 CFotaDB* CFotaDB::NewL()
       
    61     {
       
    62     CFotaDB* self = new (ELeave) CFotaDB();
       
    63     CleanupStack::PushL(self);
       
    64     self->ConstructL();
       
    65     CleanupStack::Pop();
       
    66     return self;
       
    67     }
       
    68 
       
    69 // ---------------------------------------------------------------------------
       
    70 // CFotaDB::ConstructL()
       
    71 // ---------------------------------------------------------------------------
       
    72 void CFotaDB::ConstructL()
       
    73     {
       
    74     TInt err;
       
    75     TBuf<KMaxPath> tmp;
       
    76     User::LeaveIfError(iFSSession.Connect());
       
    77     err = iFSSession.CreatePrivatePath(EDriveC);
       
    78     if (err != KErrNone && err != KErrAlreadyExists)
       
    79         User::Leave(err);
       
    80     User::LeaveIfError(iFSSession.SetSessionToPrivate(EDriveC));
       
    81     User::LeaveIfError(iFSSession.SessionPath(tmp));
       
    82     }
       
    83 
       
    84 // ---------------------------------------------------------------------------
       
    85 // CFotaDB::CreateDatabaseL()
       
    86 // Creates db in private dir of fotaserver
       
    87 // ---------------------------------------------------------------------------
       
    88 void CFotaDB::CreateDatabaseL()
       
    89     {
       
    90     FLOG(_L("CFotaDB::CreateDatabaseL()  >>"));
       
    91     TInt err;
       
    92     User::LeaveIfError(iStateDB.Create(iFSSession, KDatabaseName));
       
    93     User::LeaveIfError(iStateDB.Begin());
       
    94     User::LeaveIfError(iStateDB.Execute(KCreateTable));
       
    95     err = iStateDB.Commit();
       
    96     if (err)
       
    97         {
       
    98         FLOG(_L("      cdb err %d"), err);
       
    99         iStateDB.Rollback();
       
   100         User::Leave(err);
       
   101         }
       
   102     User::LeaveIfError(iStateDB.Compact());
       
   103     FLOG(_L("CFotaDB::CreateDatabaseL()  <<"));
       
   104     }
       
   105 
       
   106 // ---------------------------------------------------------------------------
       
   107 // CFotaDB::AddPackageStateL
       
   108 // Adds state to db
       
   109 // ---------------------------------------------------------------------------
       
   110 void CFotaDB::AddPackageStateL(const TPackageState& aState,
       
   111         const TDesC8& aPkgURL)
       
   112     {
       
   113     FLOG(_L("  CFotaDB::AddPackageStateL   >>"));
       
   114     TInt err;
       
   115     RDbView view;
       
   116     CleanupClosePushL(view);
       
   117     TPackageState pkgstate(aState);
       
   118     pkgstate.iResult = -1; // result should be -1 if no Execs have been done
       
   119     err = view.Prepare(iStateDB, TDbQuery(KSelectAll), RDbView::EInsertOnly);
       
   120     __LEAVE_IF_ERROR(err);
       
   121     FLOG(_L("  CFotaDB::AddPackageStateL   inserting. pkgid:%d result:%d  state:%d"),
       
   122             pkgstate.iPkgId, pkgstate.iResult, pkgstate.iState);
       
   123     view.InsertL();
       
   124     StateToRowL(pkgstate, aPkgURL, view);
       
   125     view.PutL();
       
   126     CleanupStack::PopAndDestroy(); //view
       
   127     FLOG(_L("  CFotaDB::AddPackageStateL   <<"));
       
   128     }
       
   129 
       
   130 // ---------------------------------------------------------------------------
       
   131 // CFotaDB::GetAllL
       
   132 // Get all states
       
   133 // ---------------------------------------------------------------------------
       
   134 void CFotaDB::GetAllL(RArray<TInt>& aStates)
       
   135     {
       
   136     RDbView view;
       
   137     CleanupClosePushL(view);
       
   138 
       
   139     TInt err = view.Prepare(iStateDB, TDbQuery(KSelectAll));
       
   140     __LEAVE_IF_ERROR(err);
       
   141     view.EvaluateAll();
       
   142 
       
   143     view.FirstL();
       
   144     FLOG(_L("[fota DB] --- rows ------------------------------------------------------------------- v"));
       
   145     while (view.AtRow())
       
   146         {
       
   147         view.GetL();
       
   148         HBufC8* url;
       
   149         TPackageState s = RowToStateL(url, view);
       
   150         aStates.Append(s.iPkgId);
       
   151         CleanupStack::PushL(url);
       
   152         FLOG(_L("[fotaDB] pkgid: %d profid:%d state:%d  result:%d \
       
   153                 url: %d chars sessiontype:%d IapId:%d Pkgsize:%d UpdateLtr:%d"),
       
   154                 s.iPkgId, s.iProfileId, s.iState, s.iResult,
       
   155                 url->Des().Length(), s.iSessionType, s.iIapId, s.iPkgSize,
       
   156                 s.iUpdateLtr);
       
   157         CleanupStack::PopAndDestroy(); // url
       
   158         view.NextL();
       
   159         }
       
   160     FLOG(_L("[fota DB] --- rows ------------------------------------------------------------------- ^"));
       
   161     view.Close();
       
   162     CleanupStack::PopAndDestroy(); //view
       
   163     }
       
   164 
       
   165 // ---------------------------------------------------------------------------
       
   166 // CFotaDB::OpenDBL()
       
   167 // Opens database
       
   168 // ---------------------------------------------------------------------------
       
   169 void CFotaDB::OpenDBL()
       
   170     {
       
   171     FLOG(_L("CFotaDB::OpenDBL()"));
       
   172     if (!iIsOpen) //Prevents accidental opening of database twice
       
   173         {
       
   174         TInt err;
       
   175         err = iStateDB.Open(iFSSession, KDatabaseName);
       
   176 
       
   177         if (err == KErrNotFound)
       
   178             {
       
   179             CreateDatabaseL();
       
   180             }
       
   181         else if (err != KErrNone)
       
   182             {
       
   183             FLOG(_L("[fota DB openDB]\t db open error: %d"), err);
       
   184             FLOG(_L("deleting fota DB and creating it again..."));
       
   185             err = iFSSession.Delete(KDatabaseName);
       
   186             CreateDatabaseL();
       
   187             User::LeaveIfError(err);
       
   188             }
       
   189         User::LeaveIfError(iTable.Open(iStateDB, KTblState));
       
   190         iColSet = iTable.ColSetL();
       
   191 
       
   192         iIsOpen = ETrue;
       
   193         }
       
   194     }
       
   195 
       
   196 // ---------------------------------------------------------------------------
       
   197 // CFotaDB::CloseAndCommitDB
       
   198 // Closes and commits DB
       
   199 // ---------------------------------------------------------------------------
       
   200 void CFotaDB::CloseAndCommitDB()
       
   201     {
       
   202     if (iColSet)
       
   203         {
       
   204         delete iColSet;
       
   205         iColSet = NULL;
       
   206         }
       
   207     iTable.Close();
       
   208     iStateDB.Close();
       
   209     iIsOpen = EFalse;
       
   210     }
       
   211 
       
   212 // ---------------------------------------------------------------------------
       
   213 // CFotaDB::IsOpen()
       
   214 // Chekcs if db is open
       
   215 // ---------------------------------------------------------------------------
       
   216 TBool CFotaDB::IsOpen()
       
   217     {
       
   218     return iIsOpen;
       
   219     }
       
   220 
       
   221 // ---------------------------------------------------------------------------
       
   222 // CFotaDB::GetStateL
       
   223 // Gets pkg state from db
       
   224 // ---------------------------------------------------------------------------
       
   225 TPackageState CFotaDB::GetStateL(const TInt aPkgId, TDes8& aPkgURL)
       
   226     {
       
   227     RDbView view;
       
   228     TPackageState s;
       
   229     CleanupClosePushL(view);
       
   230 
       
   231     s.iState = RFotaEngineSession::EIdle; // default state is idle
       
   232 
       
   233     HBufC* select = HBufC::NewLC(KSelect_where_packageid().Length() + 10);
       
   234     select->Des().Format(KSelect_where_packageid, aPkgId);
       
   235 
       
   236     TInt err = view.Prepare(iStateDB, TDbQuery(*select));
       
   237     __LEAVE_IF_ERROR(err);
       
   238     view.EvaluateAll();
       
   239     view.FirstL();
       
   240 
       
   241     while (view.AtRow())
       
   242         {
       
   243         view.GetL();
       
   244         HBufC8* url;
       
   245         s = RowToStateL(url, view);
       
   246         CleanupStack::PushL(url);
       
   247         aPkgURL.Copy(url->Des());
       
   248         CleanupStack::PopAndDestroy(); // url
       
   249         view.NextL();
       
   250         }
       
   251     CleanupStack::PopAndDestroy(); //select
       
   252     CleanupStack::PopAndDestroy(); //view
       
   253     return s;
       
   254     }
       
   255 
       
   256 // ---------------------------------------------------------------------------
       
   257 // CFotaDB::SetStateL
       
   258 // Writes package state to DB. 
       
   259 // ---------------------------------------------------------------------------
       
   260 void CFotaDB::SetStateL(TPackageState& aState, const TDesC8& aPkgURL,
       
   261         TUint aChangedFields)
       
   262     {
       
   263     FLOG(_L("  CFotaDB::SetStateL  >>  id %d result %d  state %d sessiontype %d iapid %d pkgsize %d updateltr %d"), aState.iPkgId, aState.iResult, aState.iState);
       
   264     __ASSERT_ALWAYS( aChangedFields!=0, User::Leave(KErrArgument) );
       
   265     TBuf8<KMaxFileName> temp;
       
   266     TPackageState found = GetStateL(aState.iPkgId, temp);
       
   267     if (found.iPkgId == KErrNotFound)
       
   268         {
       
   269         AddPackageStateL(aState, aPkgURL);
       
   270         }
       
   271     else
       
   272         {
       
   273         // sml try count must be reset, if state is set
       
   274         if (aChangedFields & EFDBState)
       
   275             {
       
   276             aChangedFields = aChangedFields | EFDBSmlTryCount;
       
   277             SetRetryCount(aState);
       
   278             }
       
   279 
       
   280         // Construct a SQL string for update. 
       
   281         // Example: UPDATE State SET Result=40,State=4 WHERE pkgID=5
       
   282         // 
       
   283         TInt sqlsize = 0;
       
   284         _LIT8( KSqlbegin, "UPDATE State SET " );
       
   285         TBuf<21> sqlEnd;
       
   286         HBufC8* sql(NULL);
       
   287         // determine characters needed 
       
   288         sqlsize = DetermineCharNeeded(aChangedFields, aState, aPkgURL);
       
   289         sqlEnd.AppendFormat(_L(" WHERE pkgID=%d"), aState.iPkgId);
       
   290 
       
   291         sql = HBufC8::NewLC(((TDesC8) KSqlbegin).Length() + sqlsize
       
   292                 + sqlEnd.Length());
       
   293 
       
   294         sql->Des().Append(KSqlbegin);
       
   295 
       
   296         if (aChangedFields & EFDBResult)
       
   297             {
       
   298             // check FUMO compability
       
   299             __ASSERT_ALWAYS( aState.iResult>=KErrNotFound
       
   300                     && aState.iResult<=602, User::Leave(KErrArgument) );
       
   301             sql->Des().AppendFormat(_L8("Result=%d,"), aState.iResult);
       
   302             }
       
   303         if (aChangedFields & EFDBState)
       
   304             {
       
   305             // check FUMO compability
       
   306             __ASSERT_ALWAYS( aState.iState>=0 && aState.iState<=100
       
   307                     , User::Leave(KErrArgument) );
       
   308             sql->Des().AppendFormat(_L8("State=%d,"), aState.iState);
       
   309             }
       
   310         if (aChangedFields & EFDBProfileId)
       
   311             {
       
   312             sql->Des().AppendFormat(_L8("profileid=%d,"), aState.iProfileId);
       
   313             }
       
   314         if (aChangedFields & EFDBPkgUrl)
       
   315             {
       
   316             sql->Des().AppendFormat(_L8("pkgurl='%S',"), &aPkgURL);
       
   317             }
       
   318         if (aChangedFields & EFDBPkgName)
       
   319             {
       
   320             sql->Des().AppendFormat(_L8("pkgname='%S',"), &(aState.iPkgName));
       
   321             }
       
   322         if (aChangedFields & EFDBVersion)
       
   323             {
       
   324             sql->Des().AppendFormat(_L8("Version='%S',"),
       
   325                     &(aState.iPkgVersion));
       
   326             }
       
   327         if (aChangedFields & EFDBSmlTryCount)
       
   328             {
       
   329             __ASSERT_ALWAYS( aState.iSmlTryCount>=0
       
   330                     , User::Leave(KErrArgument) );
       
   331             sql->Des().AppendFormat(_L8("SmlTryCount=%d,"),
       
   332                     aState.iSmlTryCount);
       
   333 
       
   334             }
       
   335         if (aChangedFields & EFDBSessionType)
       
   336             {
       
   337             sql->Des().AppendFormat(_L8("SessionType=%d,"),
       
   338                     aState.iSessionType);
       
   339             }
       
   340         if (aChangedFields & EFDBIapId)
       
   341             {
       
   342             // validate IAP ID
       
   343             __ASSERT_ALWAYS( aState.iIapId>=-1 ,User::Leave(KErrArgument) );
       
   344             sql->Des().AppendFormat(_L8("IapId=%d,"), aState.iIapId);
       
   345             }
       
   346         if (aChangedFields & EFDBPkgSize)
       
   347             {
       
   348             sql->Des().AppendFormat(_L8("PkgSize=%d,"), aState.iPkgSize);
       
   349             }
       
   350         if (aChangedFields & EFDBUpdateLtr)
       
   351             {
       
   352             // validate bit
       
   353             sql->Des().AppendFormat(_L8("UpdateLtr=%d,"), aState.iUpdateLtr);
       
   354             }
       
   355         // remove trailing ,
       
   356         if (aChangedFields)
       
   357             {
       
   358             sql->Des().SetLength(sql->Des().Length() - 1);
       
   359             }
       
   360         sql->Des().Append(sqlEnd);
       
   361         HBufC* sql2 = HBufC::NewLC(sql->Length()); // to cleanupstack
       
   362         sql2->Des().Copy(sql->Des());
       
   363         FLOG(_L("  sql:%S"), sql2);
       
   364 
       
   365         User::LeaveIfError(iStateDB.Begin());
       
   366         User::LeaveIfError(iStateDB.Execute(*sql2));
       
   367         User::LeaveIfError(iStateDB.Commit());
       
   368         User::LeaveIfError(iStateDB.Compact());
       
   369 
       
   370         CleanupStack::PopAndDestroy(sql2); //sql2
       
   371         CleanupStack::PopAndDestroy(sql); //sql
       
   372         }
       
   373     FLOG(_L("  CFotaDB::SetStateL  <<"));
       
   374     }
       
   375 
       
   376 // ---------------------------------------------------------------------------
       
   377 // CFotaDB::DetermineCharNeeded 
       
   378 // Returns the char needed fro the query 
       
   379 // ---------------------------------------------------------------------------
       
   380 
       
   381 TInt CFotaDB::DetermineCharNeeded(TInt aChangedFields, TPackageState& aState,
       
   382         const TDesC8& aPkgURL)
       
   383 
       
   384     {
       
   385 
       
   386     TInt sqlsize = 0;
       
   387     if (aChangedFields & EFDBResult)
       
   388         sqlsize += 4 + 7 + 4;
       
   389     if (aChangedFields & EFDBState)
       
   390         sqlsize += 4 + 5 + 4;
       
   391     if (aChangedFields & EFDBProfileId)
       
   392         sqlsize += 4 + 9 + 4;
       
   393     if (aChangedFields & EFDBPkgUrl)
       
   394         sqlsize += aPkgURL.Length() + 6 + 4;
       
   395     if (aChangedFields & EFDBPkgName)
       
   396         sqlsize += aState.iPkgName.Length() + 7 + 4;
       
   397     if (aChangedFields & EFDBVersion)
       
   398         sqlsize += aState.iPkgVersion.Length() + 7 + 4;
       
   399     if (aChangedFields & EFDBSmlTryCount)
       
   400         sqlsize += 4 + 11 + 4;
       
   401 
       
   402     if (aChangedFields & EFDBSessionType)
       
   403         sqlsize += 4 + 11 + 4;
       
   404     if (aChangedFields & EFDBIapId)
       
   405         sqlsize += 4 + 5 + 4;
       
   406     if (aChangedFields & EFDBPkgSize)
       
   407         sqlsize += 4 + 7 + 10;
       
   408     if (aChangedFields & EFDBUpdateLtr)
       
   409         sqlsize += 4 + 11 + 4;
       
   410 
       
   411     return sqlsize;
       
   412 
       
   413     }
       
   414 
       
   415 // ---------------------------------------------------------------------------
       
   416 // CFotaDB::SetRetryCount
       
   417 // Sets the retry count
       
   418 // ---------------------------------------------------------------------------
       
   419 void CFotaDB::SetRetryCount(TPackageState& aState)
       
   420     {
       
   421     CRepository* centrep(NULL);
       
   422     TInt err = KErrNone;
       
   423     TInt retry = 0;
       
   424 
       
   425     TRAP(err, centrep = CRepository::NewL( KCRUidFotaServer ) );
       
   426     if (centrep)
       
   427         {
       
   428         err = centrep->Get(KGenericAlertRetries, retry);
       
   429         delete centrep;
       
   430         centrep = NULL;
       
   431         }
       
   432     if (err == KErrNone)
       
   433         {
       
   434         if (retry < 0)
       
   435             {
       
   436             aState.iSmlTryCount = KDefaultSmlTryCount;
       
   437             }
       
   438         else if (retry == 0)
       
   439             {
       
   440             aState.iSmlTryCount = 2;
       
   441             }
       
   442         else if (retry > KMaximumSmlTryCount)
       
   443             {
       
   444             aState.iSmlTryCount = KMaximumSmlTryCount + 1;
       
   445             }
       
   446         else
       
   447             {
       
   448             aState.iSmlTryCount = retry + 1;
       
   449             }
       
   450         }
       
   451     else
       
   452         {
       
   453         aState.iSmlTryCount = KDefaultSmlTryCount;
       
   454         }
       
   455     }
       
   456 
       
   457 // ---------------------------------------------------------------------------
       
   458 // CFotaDB::RowToStateL
       
   459 // Extracts db row contents to package state object and aPkgUrl
       
   460 // Returns url in aPkgURL parameter
       
   461 // ---------------------------------------------------------------------------
       
   462 TPackageState CFotaDB::RowToStateL(HBufC8*& aPkgUrl, const RDbView& aView)
       
   463     {
       
   464     TPackageState s;
       
   465     TInt pkgid = aView.ColInt(iColSet->ColNo(KColPkgId));
       
   466     TInt state = aView.ColInt(iColSet->ColNo(KColState));
       
   467     TInt result = aView.ColInt(iColSet->ColNo(KColResult));
       
   468     TSmlProfileId profileid(aView.ColInt(iColSet->ColNo(KColProfileId)));
       
   469     TPtrC pkgname = aView.ColDes(iColSet->ColNo(KColPkgName));
       
   470     TPtrC version = aView.ColDes(iColSet->ColNo(KColVersion));
       
   471     TInt smltrycount = aView.ColInt(iColSet->ColNo(KColSmlTryCount));
       
   472     TInt sessiontype = aView.ColInt(iColSet->ColNo(KColSessionType));
       
   473     TInt iapid = aView.ColInt(iColSet->ColNo(KColIapId));
       
   474     TUint pkgsize = aView.ColUint(iColSet->ColNo(KColPkgSize));
       
   475     TBool updateltr = aView.ColUint8(iColSet->ColNo(KColUpdateLtr));
       
   476 
       
   477     s.iPkgId = pkgid;
       
   478     s.iPkgName.Copy(pkgname);
       
   479     s.iPkgVersion.Copy(version);
       
   480     s.iProfileId = profileid;
       
   481     s.iResult = result;
       
   482     s.iState = RFotaEngineSession::TState(state);
       
   483     s.iSmlTryCount = smltrycount;
       
   484     s.iSessionType = sessiontype;
       
   485     s.iIapId = iapid;
       
   486     s.iPkgSize = pkgsize;
       
   487     s.iUpdateLtr = updateltr;
       
   488 
       
   489     RDbColReadStream rstream;
       
   490     TInt len = aView.ColLength(iColSet->ColNo(KColPkgUrl));
       
   491     rstream.OpenLC(aView, iColSet->ColNo(KColPkgUrl));
       
   492     HBufC* pkgurl = HBufC::NewLC(len);
       
   493     TPtr ptr = pkgurl->Des();
       
   494     rstream.ReadL(ptr, len);
       
   495 
       
   496     HBufC8* tmp = HBufC8::NewL(pkgurl->Des().Length());
       
   497     tmp->Des().Copy(pkgurl->Des());
       
   498     aPkgUrl = tmp;
       
   499 
       
   500     CleanupStack::PopAndDestroy(pkgurl);
       
   501     CleanupStack::PopAndDestroy(&rstream);
       
   502     return s;
       
   503     }
       
   504 
       
   505 // ---------------------------------------------------------------------------
       
   506 // CFotaDB::StateToRowL
       
   507 // Converts state object to database row (into view object)
       
   508 // ---------------------------------------------------------------------------
       
   509 void CFotaDB::StateToRowL(const TPackageState& aPkg, const TDesC8& aPkgURL,
       
   510         RDbView& aView)
       
   511     {
       
   512     HBufC* pkgname = HBufC::NewLC(aPkg.iPkgName.Length());
       
   513     HBufC* version = HBufC::NewLC(aPkg.iPkgVersion.Length());
       
   514 
       
   515     pkgname->Des().Copy(aPkg.iPkgName);
       
   516     version->Des().Copy(aPkg.iPkgVersion);
       
   517 
       
   518     aView.SetColL(iColSet->ColNo(KColPkgId), aPkg.iPkgId);
       
   519     aView.SetColL(iColSet->ColNo(KColResult), aPkg.iResult);
       
   520     aView.SetColL(iColSet->ColNo(KColState), aPkg.iState);
       
   521     aView.SetColL(iColSet->ColNo(KColProfileId), aPkg.iProfileId);
       
   522     aView.SetColL(iColSet->ColNo(KColPkgName), *pkgname);
       
   523     aView.SetColL(iColSet->ColNo(KColVersion), *version);
       
   524     aView.SetColL(iColSet->ColNo(KColSmlTryCount), aPkg.iSmlTryCount);
       
   525     aView.SetColL(iColSet->ColNo(KColSessionType), aPkg.iSessionType);
       
   526     aView.SetColL(iColSet->ColNo(KColIapId), aPkg.iIapId);
       
   527     aView.SetColL(iColSet->ColNo(KColPkgSize), aPkg.iPkgSize);
       
   528     aView.SetColL(iColSet->ColNo(KColUpdateLtr), aPkg.iUpdateLtr);
       
   529 
       
   530     RDbColWriteStream wstream;
       
   531     CleanupClosePushL(wstream);
       
   532     wstream.OpenL(aView, iColSet->ColNo(KColPkgUrl));
       
   533     // Cannot write 8 bit descriptors to databae
       
   534     HBufC* buf = HBufC::NewLC(aPkgURL.Length());
       
   535     buf->Des().Copy(aPkgURL);
       
   536     wstream.WriteL(buf->Des());
       
   537 
       
   538     FLOG(_L("CFotaDB::StateToRowL  id:%d result:%d state:%d profileid:%d \
       
   539     		name:%d chars version: %d chars url: %d chars sessiontype:%d iapid:%d pkgsize:%d updateltr = %d"),
       
   540             aPkg.iPkgId, aPkg.iResult, aPkg.iState, aPkg.iProfileId,
       
   541             pkgname->Des().Length(), version->Des().Length(),
       
   542             buf->Des().Length(), aPkg.iSessionType, aPkg.iIapId,
       
   543             aPkg.iPkgSize, aPkg.iUpdateLtr);
       
   544 
       
   545     CleanupStack::PopAndDestroy(buf);
       
   546     CleanupStack::PopAndDestroy(&wstream);
       
   547     CleanupStack::PopAndDestroy(version);
       
   548     CleanupStack::PopAndDestroy(pkgname);
       
   549     }