diff -r 000000000000 -r b497e44ab2fc omaprovisioning/provisioning/ProvisioningEngine/Src/CWPInternetAPDB.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omaprovisioning/provisioning/ProvisioningEngine/Src/CWPInternetAPDB.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,350 @@ +/* +* Copyright (c) 2002 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: create/save/get Internet connection methods from database. +* +*/ + +//Include files +#include "CWPInternetAPDB.h" +#include "ProvisioningDebug.h" +#include + +#ifdef SYMBIAN_SECURE_DBMS +_LIT(KInternetSecureDBMShostID, "SECURE[101F84D6]"); +#endif + +const TInt KWPDBMSFileValue = 0x101F84D6; +const TUid KWPDBMSFileUid = + { + KWPDBMSFileValue + }; + +CWPInternetAPDB* CWPInternetAPDB::NewL() + { + CWPInternetAPDB* self = NewLC(); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWPInternetAPDB* CWPInternetAPDB::NewLC() + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::NewLC:" ) ); + CWPInternetAPDB* self = new( ELeave ) CWPInternetAPDB; + + CleanupStack::PushL(self); + self->ConstructL(); + + FLOG( _L( "[Provisioning] CWPInternetAPDB::NewLC:done" ) ); + return self; + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::~CWPInternetAPDB +// ----------------------------------------------------------------------------- +// +CWPInternetAPDB::~CWPInternetAPDB() + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::~CWPInternetAPDB" ) ); + iItemsDatabase.Close(); + iRdbSession.Close(); + iFsSession.Close(); + + FLOG( _L( "[Provisioning] CWPInternetAPDB::~CWPInternetAPDB: done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::ConstructL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::ConstructL() + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::ConstructL" ) ); + TParse name; + TInt err; + + User::LeaveIfError(iFsSession.Connect()); + User::LeaveIfError(iRdbSession.Connect() ); + + iFsSession.SetSessionToPrivate(EDriveC); + +#ifdef SYMBIAN_SECURE_DBMS + name.Set(KtxDatabaseName, NULL, NULL); + err = iItemsDatabase.Open(iRdbSession, name.FullName(), + KInternetSecureDBMShostID); +#else + name.Set( KtxDatabaseName, KNonSecureDbFullName, NULL ); + err = iItemsDatabase.Open(iRdbSession, DBFileName); +#endif + + if (err == KErrNotFound) + { + CreateandOpenL(name); + } + else + { + + if ( (err == KErrEof ) || (err == KErrCorrupt ) || (err + == KErrArgument )) + { + // something seriously wrong with the db, delete it and try + // to create new + iRdbSession.DeleteDatabase(name.FullName(), KWPDBMSFileUid); + CreateandOpenL(name); + } + + } + + FLOG( _L( "[Provisioning] CWPInternetAPDB::ConstructL: done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::CreateandOpenL +// ----------------------------------------------------------------------------- +// +inline void CWPInternetAPDB::CreateandOpenL(TParse& name) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::CreateandOpenL" ) ); + TInt err; + +#ifdef SYMBIAN_SECURE_DBMS + iItemsDatabase.Create(iRdbSession, name.FullName(), + KInternetSecureDBMShostID); +#else + if( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, KEmptyDbSizeEstimate ) ) + { + User::Leave( KErrDiskFull ); + } + iItemsDatabase.Create(iFsSession, name.FullName()); +#endif + + CreateTableL(iItemsDatabase); + iItemsDatabase.Close(); +#ifdef SYMBIAN_SECURE_DBMS + + err = iItemsDatabase.Open(iRdbSession, name.FullName(), + KInternetSecureDBMShostID); + +#else + err = iItemsDatabase.Open(iFsSession, DBFileName); +#endif + + //Debug + if (err != KErrNone) + { + FLOG(_L("Error man?" )); + User::LeaveIfError(err); + } + + FLOG( _L( "[Provisioning] CWPInternetAPDB::CreateandOpenL:done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::CreateTableL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::CreateTableL(RDbDatabase& aDatabase) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::CreateTableL" ) ); + + // Create a table definition + CDbColSet* columns=CDbColSet::NewLC(); + + // Add Columns + TDbCol id(NCol1, EDbColInt32); + + // automatic indexing for items,it is our key field. + id.iAttributes=id.EAutoIncrement; + columns->AddL(id); + + columns->AddL(TDbCol(NCol2, EDbColInt32)); + columns->AddL(TDbCol(NCol3, EDbColInt32)); + columns->AddL(TDbCol(NCol4, EDbColText, KOriginatorMaxLength)); + + // Create a table + User::LeaveIfError(aDatabase.CreateTable(KtxtItemlist, *columns) ); + + // cleanup the column set + CleanupStack::PopAndDestroy(columns); + FLOG( _L( "[Provisioning] CWPInternetAPDB::CreateTableL: done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::ReadDbItemsForOrigL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::ReadDbItemsForOrigL( + RArray& aItemArray, TDesC& aValue) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadDbItemsForOrigL" ) ); + aItemArray.Reset();// first reset the array + + _LIT(KEqualToString,"='%S'"); + _LIT(KQuery, "SELECT * FROM %S WHERE %S"); + + TBuf<100> bufsql; + bufsql.Append(KQuery); + bufsql.Append(KEqualToString); + TBuf<100> bufsql1; + bufsql1.Format(bufsql, &KtxtItemlist, &NCol4, &aValue); + + ReadItemsL(aItemArray, bufsql1); + + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadDbItemsForOrigL:done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::ReadDbItemsL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::ReadDbItemsL(RArray& aItemArray) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadDbItemsL" ) ); + aItemArray.Reset();// first reset the array + + TFileName QueryBuffer; + + // just get all columns & rows of same originator + QueryBuffer.Copy(_L("SELECT * FROM ")); + QueryBuffer.Append(KtxtItemlist); + + ReadItemsL(aItemArray, QueryBuffer); + + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadDbItemsL:done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::ReadItemsL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::ReadItemsL(RArray& aItemArray, + TFileName QueryBuffer) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadItemsL" ) ); + RDbView Myview; + Myview.Prepare(iItemsDatabase, TDbQuery(QueryBuffer)); + CleanupClosePushL(Myview); + Myview.EvaluateAll(); + Myview.FirstL(); + + while (Myview.AtRow()) + { + Myview.GetL(); + + TAccessPointItem AccessPointItem; + AccessPointItem.iIndex = Myview.ColInt(1); + AccessPointItem.iAPID = Myview.ColInt(2); + AccessPointItem.iBearerType = Myview.ColInt(3); + AccessPointItem.iOriginator.Copy(Myview.ColDes(4)); + + aItemArray.Append(AccessPointItem); + Myview.NextL(); + } + + CleanupStack::PopAndDestroy(); // Myview + FLOG( _L( "[Provisioning] CWPInternetAPDB::ReadItemsL: done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::SaveToDatabaseL +// ----------------------------------------------------------------------------- +// +void CWPInternetAPDB::SaveToDatabaseL(TInt& aIndex, TUint aAPId, + TUint32 aBearerType, const TDesC& aOriginator) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::SaveToDatabaseL" ) ); + + //If there is any existing rows for the same APID, delete those + if (DeleteFromDatabaseL(aAPId)) + { + iItemsDatabase.Begin(); + } + + TFileName QueryBuffer; + QueryBuffer.Copy(_L("SELECT * FROM ")); + QueryBuffer.Append(KtxtItemlist); + + RDbView Myview; + Myview.Prepare(iItemsDatabase, TDbQuery(QueryBuffer)); + CleanupClosePushL(Myview); + + Myview.InsertL(); + + Myview.SetColL(2, aAPId); + Myview.SetColL(3, aBearerType); + Myview.SetColL(4, aOriginator); + + Myview.PutL(); + + aIndex = Myview.ColInt(1);// autoincrement gives us unique index. + + CleanupStack::PopAndDestroy(1); // Myview + iItemsDatabase.Commit(); + FLOG( _L( "[Provisioning] CWPInternetAPDB::SaveToDatabaseL:done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPInternetAPDB::DeleteFromDatabaseL +// ----------------------------------------------------------------------------- +// +TBool CWPInternetAPDB::DeleteFromDatabaseL(TUint aAPId) + { + FLOG( _L( "[Provisioning] CWPInternetAPDB::DeleteFromDatabaseL" ) ); + TBool rowsdeleted = EFalse; + TFileName QueryBuffer; + QueryBuffer.Copy(_L("SELECT * FROM ")); + QueryBuffer.Append(KtxtItemlist); + QueryBuffer.Append(_L(" WHERE ")); + QueryBuffer.Append(NCol2); + QueryBuffer.Append(_L(" = ")); + QueryBuffer.AppendNum(aAPId); + + iItemsDatabase.Begin(); + + RDbView Myview; + // query buffer with index finds only the selected item row. + Myview.Prepare(iItemsDatabase, TDbQuery(QueryBuffer)); + CleanupClosePushL(Myview); + + Myview.EvaluateAll(); + Myview.FirstL(); + + if (!Myview.IsEmptyL()) + { + // we have autoincrement in index so it should be unique + // but just to make sure, we use 'while', instead of 'if' + while (Myview.AtRow()) + { + Myview.GetL(); + Myview.DeleteL(); + Myview.NextL(); + } + + iItemsDatabase.Commit(); + // compacts the databse, by physically removig deleted data. + iItemsDatabase.Compact(); + rowsdeleted = ETrue; + } + CleanupStack::PopAndDestroy(1); // Myview + + FLOG( _L( "[Provisioning] CWPInternetAPDB::DeleteFromDatabaseL: done" ) ); + return rowsdeleted; + } + +//End of the file