diff -r 000000000000 -r b497e44ab2fc omaprovisioning/provisioning/ProvisioningSC/Src/CWPImsiDbHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omaprovisioning/provisioning/ProvisioningSC/Src/CWPImsiDbHandler.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2002-2006 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: Manages IMSI (DBMS) database +* +*/ + + + +// INCLUDE FILES +#include "CWPImsiDbHandler.h" +#include +#include "ProvisioningDebug.h" + +// CONSTANTS + +_LIT( KSimCardDb, "wpsimcard.db" ); +_LIT( KDbColImsi, "imsi" ); +_LIT( KDbSimTable, "sim" ); +_LIT( KDbImsiIndex, "I" ); +_LIT( KDbNameDrive, "C:" ); +const TInt KEmptyDbSizeEstimate = 2048; // bytes to write +const TInt KImsiSize = 16; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CWPImsiDbHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWPImsiDbHandler::CWPImsiDbHandler() + { + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::ConstructL() + { + FLOG( _L( "[ProvisioningSC] CWPImsiDbHandler::ConstructL" ) ); + + User::LeaveIfError( iFs.Connect() ); + // Get process privatepath + TInt err = iFs.CreatePrivatePath( EDriveC ); + if( err != KErrAlreadyExists ) + { + User::LeaveIfError( err ); + } + User::LeaveIfError( iFs.PrivatePath( iDataBasePath ) ); + iDataBasePath.Insert(0, KDbNameDrive ); + iDataBasePath.Append( KSimCardDb ); + + // open imsi database + TInt result( iDb.Open( iFs, iDataBasePath ) ); + FTRACE(RDebug::Print(_L("[ProvisioningSC] CWPImsiDbHandler db open 1 result (%d)"), result)); + if( result == KErrNotFound ) + { + CreateDatabaseL(); + result = iDb.Open( iFs, iDataBasePath ); + FTRACE(RDebug::Print(_L("[ProvisioningSC] CWPImsiDbHandler db open 2 result (%d)"), result)); + } + User::LeaveIfError( result ); + if( iDb.IsDamaged() ) + { + User::LeaveIfError( iDb.Recover() ); + } + User::LeaveIfError( iImsiTable.Open( iDb, KDbSimTable, + RDbRowSet::TAccess( RDbRowSet::EUpdatable ) ) ); + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWPImsiDbHandler* CWPImsiDbHandler::NewL() + { + CWPImsiDbHandler* handler = CWPImsiDbHandler::NewLC(); + CleanupStack::Pop(); + return handler; + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWPImsiDbHandler* CWPImsiDbHandler::NewLC() + { + CWPImsiDbHandler* self = new( ELeave ) CWPImsiDbHandler; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::~CWPImsiDbHandler +// Destructor +// ----------------------------------------------------------------------------- +// +CWPImsiDbHandler::~CWPImsiDbHandler() + { + iImsiTable.Close(); + iDb.Close(); + iFs.Close(); + } +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::ImsiExistsL +// Check if imsi exists in the database +// ----------------------------------------------------------------------------- +// +TBool CWPImsiDbHandler::ImsiExistsL( const TDesC& aPhoneImsi ) + { + User::LeaveIfError( iImsiTable.SetIndex( KDbImsiIndex ) ); + TBool result( ETrue ); + if( !iImsiTable.SeekL( TDbSeekKey( aPhoneImsi ) ) ) + { + result = EFalse; + } + return result; + } +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::StoreImsiL +// Store new imsi into database +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::StoreImsiL( const TDesC& aPhoneImsi ) + { + if( aPhoneImsi == KNullDesC ) + { + User::Leave( KErrBadDescriptor ); + } + if( SysUtil::FFSSpaceBelowCriticalLevelL( NULL, KImsiSize ) ) + { + User::Leave( KErrDiskFull ); + } + CDbColSet* colSet = iImsiTable.ColSetL(); + TInt imsisCol( colSet->ColNo( KDbColImsi ) ); + delete colSet; + colSet = NULL; + // create a view on the database + RDbView view; + CleanupClosePushL( view ); // 1 + _LIT( KSQLStatement,"select imsi from sim order by imsi" ); + User::LeaveIfError( view.Prepare( iDb,TDbQuery( KSQLStatement, + EDbCompareNormal ))); + User::LeaveIfError( view.EvaluateAll() ); + + // begin transaction + User::LeaveIfError( iDb.Begin() ) ; + CleanupStack::PushL( TCleanupItem( CleanupRollback, &iDb ) ); // 2 + // insert a row + view.InsertL(); + CleanupStack::PushL ( TCleanupItem( CleanupCancel, &view ) ); // 3 + view.SetColL( imsisCol, aPhoneImsi ); + view.PutL(); + CleanupStack::Pop(); // cleanupcancel, 3 + User::LeaveIfError( iDb.Commit() ); + CleanupStack::Pop(); // cleanuprollback, 2 + CleanupStack::PopAndDestroy(); // view, 1 + return; + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CreateDatabaseL +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::CreateDatabaseL() + { + if( SysUtil::FFSSpaceBelowCriticalLevelL( &iFs, KEmptyDbSizeEstimate ) ) + { + User::Leave( KErrDiskFull ); + } + + // Get process privatepath + iDataBasePath.Zero(); + User::LeaveIfError( iFs.PrivatePath( iDataBasePath ) ); + iDataBasePath.Insert(0, KDbNameDrive ); + iDataBasePath.Append( KSimCardDb ); + FLOG( _L( "[ProvisioningSC] CWPImsiDbHandler::CreateDatabaseL priv path" ) ); + + FLOG( _L( "[ProvisioningSC] CWPImsiDbHandler::CreateDatabaseL" ) ); + User::LeaveIfError( iDb.Create( iFs, iDataBasePath ) ); + FLOG( _L( "[ProvisioningSC] CWPImsiDbHandler::CreateDatabaseL ok" ) ); + CreateTableL(); + CreateIndexL(); + iDb.Close(); + FLOG( _L( "[ProvisioningSC] CWPImsiDbHandler::CreateDatabaseL done" ) ); + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CreateTableL +// Create database table +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::CreateTableL() + { + CDbColSet* colset = CDbColSet::NewLC(); // 1 + TDbCol idCol( KDbColImsi, EDbColText16 ); + idCol.iAttributes = TDbCol::ENotNull; + colset->AddL( idCol ); + User::LeaveIfError( iDb.CreateTable( KDbSimTable, *colset ) ); + CleanupStack::PopAndDestroy(); // colset + } +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CreateIndexL +// Create database index +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::CreateIndexL() + { + CDbKey* key = CDbKey::NewLC(); // 1 + TDbKeyCol imsi( KDbColImsi ); + key->AddL( imsi ); + User::LeaveIfError( iDb.CreateIndex( KDbImsiIndex, + KDbSimTable, *key ) ) ; + CleanupStack::PopAndDestroy( ); // key + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CleanupRollback +// Create database index +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::CleanupRollback( TAny* aItem ) + { + RDbDatabase* db = static_cast(aItem); + db->Rollback(); + } + +// ----------------------------------------------------------------------------- +// CWPImsiDbHandler::CleanupCancel +// ----------------------------------------------------------------------------- +// +void CWPImsiDbHandler::CleanupCancel( TAny* aItem ) + { + RDbTable* table = static_cast(aItem); + table->Cancel(); + } + +// End of File