--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/UCCSDeviceControl/CNetworkEmulatorSetupCommdb.cpp Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,676 @@
+/*
+* Copyright (c) 2005-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:
+* System Includes
+*
+*/
+
+
+
+#include <cdbcols.h>
+#include <e32std.h>
+#include <d32dbms.h>
+#include <stdlib.h>
+#include <charconv.h>
+#include <f32file.h>
+#include <libc/string.h>
+
+
+/*****************************************************************************
+ *
+ * Local Includes
+ *
+ ****************************************************************************/
+#include "assert.h"
+#include "NetworkEmulatorControl.h"
+
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: Constructor
+ *
+ ****************************************************************************/
+EXPORT_C CSetUpCommDb::CSetUpCommDb()
+{
+ iStatus = TCOMMBD_IDLE;
+}
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: Destructor
+ *
+ ****************************************************************************/
+EXPORT_C CSetUpCommDb::~CSetUpCommDb()
+{
+ if( iStatus == TCOMMBD_CONNECTED ) {
+ assert( iDbComms != NULL );
+ delete iDbComms;
+ iDbComms = NULL;
+ iStatus = TCOMMBD_IDLE;
+ }
+ assert( iStatus == TCOMMBD_IDLE );
+}
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: Initialise the database
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::initialise(void)
+{
+ assert( iStatus == TCOMMBD_IDLE);
+
+ // Connect to the database.
+ // Specifying type as EFalse, so if the dB does not exist, function leaves.
+ TRAPD (r, iDbComms = CCommsDatabase::NewL(EFalse));
+ if( r != KErrNone ) {
+ return TCommDB_ErrorInitCommDb;
+ }
+ assert ( iDbComms != NULL );
+ iStatus = TCOMMBD_CONNECTED;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * SECTION: updateEntry
+ *
+ ****************************************************************************/
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: updateEntry
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::updateEntry(TPtrC aTable, TUint32 aRecordID, TPtrC aFieldName, char* aFieldValue, int* aErrCode)
+{
+ CCommsDbTableView *table_handle = NULL;
+ int ret = KErrNone;
+
+ // Check the params
+ assert ( aFieldValue != NULL );
+ assert ( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // Check the state
+ assert( iStatus == TCOMMBD_CONNECTED );
+ assert ( iDbComms != NULL );
+
+ // Open the table we are looking for
+ TRAP( ret, (table_handle = openTableL(iDbComms,aTable)) );
+ if( (ret != KErrNone) || (table_handle == NULL) ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorTableNotFound;
+ }
+
+ // find and update the record
+ FindAndUpdateRecord( table_handle, aRecordID, aFieldName, aFieldValue, aErrCode );
+
+ // cleanup and return
+ delete table_handle;
+ table_handle = NULL;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * PRIVATE METHOD: FindAndUpdateRecord
+ *
+ ****************************************************************************/
+TCommDBError CSetUpCommDb::FindAndUpdateRecord( CCommsDbTableView *aTable, TUint32 aRecordID, TPtrC aFieldName, char* aFieldValue, int* aErrCode)
+{
+ int err, ret;
+ TUint32 id = 0;
+
+ // Look for the matching record in the table
+ err = aTable->GotoFirstRecord();
+ while( err == KErrNone ) {
+
+ // Read the id for each record in the table and compare to the one we are looking for.
+ TRAP( ret, (aTable->ReadUintL(TPtrC(COMMDB_ID),id)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // We have found the record we are looking for then update the field
+ if( id == aRecordID) {
+ return UpdateField( aTable, aFieldName, aFieldValue, aErrCode );
+ }
+ }
+
+ // no matching record found
+ return TCommDB_RecNotFound;
+}
+
+
+/*****************************************************************************
+ *
+ * PRIVATE METHOD: UpdateField
+ *
+ ****************************************************************************/
+TCommDBError CSetUpCommDb::UpdateField( CCommsDbTableView *aTable, TPtrC aFieldName, char* aFieldValue, int* aErrCode )
+{
+ int err, ret;
+ TDbColType colType = EDbColBinary;
+ TUint32 attrib;
+ TUint32 entry_integer;
+
+ // Get the type of the field we are writing to
+ TRAP( ret, (aTable->ReadTypeAttribL(aFieldName,colType,attrib)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorColNotFound;
+ }
+
+ // Must call update record before editing any existing record.
+ err = aTable->UpdateRecord();
+ if( err != KErrNone ) {
+ *aErrCode = err;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+
+ // Convert the string value to the appropriate type and write entry to database
+ switch (colType) {
+
+ // convert the string to an integer and update the entry
+ case EDbColUint16:
+ case EDbColUint32:
+ case EDbColUint8:
+ entry_integer = (TUint32)atoi((const char*)aFieldValue);
+ TRAP( ret, (aTable->WriteUintL(aFieldName,entry_integer)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+ break;
+
+ // no need for conversion - just add the string
+ case EDbColText8:
+ {
+ TPtrC8 acsiiPtr((TUint8*)aFieldValue);
+ TRAP( ret, (aTable->WriteTextL(aFieldName,acsiiPtr)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+ break;
+ }
+
+ // convert the ascii string to unicode and update the entry
+ case EDbColText16:
+ err = SetUnicodeString( aTable, aFieldName, aFieldValue, aErrCode );
+ if( err != TCommDB_Success ) {
+ return TCommDB_ErrorUpdatingRecord;
+ }
+ break;
+
+ // no need for conversion - just add the string
+ case EDbColLongText8:
+ {
+ TPtrC8 asciiPtrLong((TUint8*)aFieldValue);
+ TRAP( ret, (aTable->WriteTextL(aFieldName,asciiPtrLong)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+ break;
+ }
+
+ // convert the ascii string to unicode and update the entry
+ case EDbColLongText16:
+ ret = SetUnicodeStringLong( aTable, aFieldName, aFieldValue, aErrCode );
+ if( ret != TCommDB_Success ) {
+ return TCommDB_ErrorUpdatingRecord;
+ }
+ break;
+
+ // unknown column type
+ default:
+ return TCommDB_ErrorColTypeValueNotSupported;
+ }
+
+ // commit the changes
+ err = aTable->PutRecordChanges();
+ if( err != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+
+ // done
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * SECTION: Get...
+ *
+ ****************************************************************************/
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: getIntEntry
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::getIntEntry( TPtrC aTable, TUint32 aRecordID, TPtrC aFieldName, TUint32& aFieldValue, int* aErrCode )
+{
+ int ret;
+ TCommDBError rv;
+ CCommsDbTableView* table = NULL;
+ TDbColType colType;
+
+ // check params and state
+ assert( iStatus == TCOMMBD_CONNECTED );
+ assert ( iDbComms != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // open the table
+ TRAP( ret, (table = openTableL(iDbComms, aTable)) );
+ if( (ret != KErrNone) || (table == NULL) ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorTableNotFound;
+ }
+
+ // get to the record
+ rv = FindRecordAndGetType( table, aRecordID, aFieldName, &colType, aErrCode );
+ if( rv != TCommDB_Success ) {
+ delete table;
+ return rv;
+ }
+
+ // check the field has the expected type
+ if( (colType != EDbColUint16) && (colType != EDbColUint8) ) {
+ delete table;
+ return TCommDB_ErrorUnexpectedColType;
+ }
+
+ // get the field
+ TRAP( ret, (table->ReadUintL(aFieldName,aFieldValue)) );
+ if ( ret != KErrNone ) {
+ delete table;
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // done
+ delete table;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: getBoolEntry
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::getBoolEntry(TPtrC aTable, TUint32 aRecordID, TPtrC aFieldName, TBool& aFieldValue, int* aErrCode)
+{
+ int ret;
+ TCommDBError rv;
+ CCommsDbTableView* table = NULL;
+ TDbColType colType;
+
+ // check params and state
+ assert( iStatus == TCOMMBD_CONNECTED );
+ assert ( iDbComms != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // open the table
+ TRAP( ret, (table = openTableL(iDbComms, aTable)) );
+ if( (ret != KErrNone) || (table == NULL) ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorTableNotFound;
+ }
+
+ // get to the record
+ rv = FindRecordAndGetType( table, aRecordID, aFieldName, &colType, aErrCode );
+ if( rv != TCommDB_Success ) {
+ delete table;
+ return rv;
+ }
+
+ // check the field has the expected type
+ if( colType != EDbColBit ) {
+ delete table;
+ return TCommDB_ErrorUnexpectedColType;
+ }
+
+ // get the field
+ TRAP( ret, (table->ReadBoolL(aFieldName,aFieldValue)) );
+ if ( ret != KErrNone ) {
+ delete table;
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // done
+ delete table;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: getAsciiEntry
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::getAsciiEntry(TPtrC aTable, TUint32 aRecordID, TPtrC aFieldName, TDes8& aFieldValue, int* aErrCode)
+{
+ int ret;
+ TCommDBError rv;
+ CCommsDbTableView* table = NULL;
+ TDbColType colType;
+
+ // check params and state
+ assert( iStatus == TCOMMBD_CONNECTED );
+ assert ( iDbComms != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // open the table
+ TRAP( ret, (table = openTableL(iDbComms, aTable)) );
+ if( (ret != KErrNone) || (table == NULL) ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorTableNotFound;
+ }
+
+ // get to the record
+ rv = FindRecordAndGetType( table, aRecordID, aFieldName, &colType, aErrCode );
+ if( rv != TCommDB_Success ) {
+ delete table;
+ return rv;
+ }
+
+ // check the field has the expected type
+ if( colType != EDbColText8 ) {
+ delete table;
+ return TCommDB_ErrorUnexpectedColType;
+ }
+
+ // get the field
+ TRAP( ret, (table->ReadTextL(aFieldName,aFieldValue)) );
+ if ( ret != KErrNone ) {
+ delete table;
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // done
+ delete table;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * PUBLIC METHOD: getUnicodeEntry
+ *
+ ****************************************************************************/
+EXPORT_C TCommDBError CSetUpCommDb::getUnicodeEntry(TPtrC aTable, TUint32 aRecordID, TPtrC aFieldName, TDes16& aFieldValue, int* aErrCode)
+{
+ int ret;
+ TCommDBError rv;
+ CCommsDbTableView* table = NULL;
+ TDbColType colType;
+
+ // check params and state
+ assert( iStatus == TCOMMBD_CONNECTED );
+ assert ( iDbComms != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // open the table
+ TRAP( ret, (table = openTableL(iDbComms, aTable)) );
+ if( (ret != KErrNone) || (table == NULL) ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorTableNotFound;
+ }
+
+ // get to the record
+ rv = FindRecordAndGetType( table, aRecordID, aFieldName, &colType, aErrCode );
+ if( rv != TCommDB_Success ) {
+ delete table;
+ return rv;
+ }
+
+ // check the field has the expected type
+ if( colType != EDbColText16 ) {
+ delete table;
+ return TCommDB_ErrorUnexpectedColType;
+ }
+
+ // get the field
+ TRAP( ret, (table->ReadTextL(aFieldName,aFieldValue)) );
+ if ( ret != KErrNone ) {
+ delete table;
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // done
+ delete table;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * PRIVATE METHOD: FindRecordAndGetType
+ *
+ ****************************************************************************/
+TCommDBError CSetUpCommDb::FindRecordAndGetType( CCommsDbTableView *aTable, TUint32 aRecordID, TPtrC aFieldName, TDbColType *aColType, int* aErrCode )
+{
+ int err = KErrNone;
+ int ret = KErrNone;
+ TUint32 id = 0;
+ TDbColType colType = EDbColBit;
+ TUint32 attrib;
+
+ // check params
+ assert( aTable != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // find the matching record in the table
+ err = aTable->GotoFirstRecord();
+ while( err == KErrNone) {
+
+ // get the id field
+ TRAP( ret, (aTable->ReadUintL(TPtrC(COMMDB_ID),id)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorReadingRecord;
+ }
+
+ // see if the id matches the requested id
+ if( id == aRecordID) {
+ break;
+ }
+
+ // go to the next record
+ err = aTable->GotoNextRecord();
+ }
+
+ // see if no record was found
+ if( err != KErrNone ) {
+ return TCommDB_RecNotFound;
+ }
+
+ // check the type of the field and see if it matches Int
+ TRAP( ret, (aTable->ReadTypeAttribL(aFieldName,colType,attrib)) );
+ if( ret != KErrNone ) {
+ *aErrCode = ret;
+ return TCommDB_ErrorColNotFound;
+ }
+
+ // return the coltype
+ *aColType = colType;
+
+ // done
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * SECTION: Data Writers
+ *
+ ****************************************************************************/
+/*****************************************************************************
+ *
+ * Set a unicode string in the db
+ *
+ ****************************************************************************/
+int CSetUpCommDb::SetUnicodeString( CCommsDbTableView* aTable, TPtrC aFieldName, char* aFieldValue, int* aErrCode )
+{
+ int ret;
+ HBufC16 *unicode_string;
+
+ // check params
+ assert( aTable != NULL );
+ assert( aFieldValue != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+
+ // convert the passed string to unicode
+ unicode_string = ConvertAsciiToUnicode( aFieldValue );
+ if( unicode_string == NULL ) {
+ return TCommDB_ErrorConvertingToUnicode;
+ }
+ TPtr16 unicode_string_ptr( unicode_string->Des() );
+
+ // update the entry
+ TRAP( ret, (aTable->WriteTextL(aFieldName,unicode_string_ptr)) );
+ if( ret != KErrNone ) {
+ delete unicode_string;
+ return TCommDB_ErrorUpdatingRecord;
+ }
+
+ // done
+ delete unicode_string;
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * Set a long unicode string in the db
+ *
+ ****************************************************************************/
+int CSetUpCommDb::SetUnicodeStringLong(CCommsDbTableView* aTable, TPtrC aFieldName, char* aFieldValue, int *aErrCode)
+{
+ int ret, i, value_length;
+ unsigned short *unicode_string;
+
+ // check params
+ assert( aTable != NULL );
+ assert( aFieldValue != NULL );
+ assert( aErrCode != NULL );
+ *aErrCode = 0;
+ unicode_string = (unsigned short *)aFieldValue;
+
+ // get the length of the (wide) string
+ for( i = 0; unicode_string[i] != 0; i++ )
+ ;
+ value_length = i;
+
+ // convert the passed descriptors into the correct format
+ TPtrC field_value_ptr( unicode_string, value_length );
+
+ // update the entry
+ TRAP( ret, (aTable->WriteLongTextL(aFieldName,field_value_ptr)) );
+ if( ret != KErrNone ) {
+ return TCommDB_ErrorUpdatingRecord;
+ }
+
+ // done
+ return TCommDB_Success;
+}
+
+
+/*****************************************************************************
+ *
+ * SECTION: Helpers
+ *
+ ****************************************************************************/
+/*****************************************************************************
+ *
+ * Open the given table
+ *
+ ****************************************************************************/
+CCommsDbTableView* CSetUpCommDb::openTableL( CCommsDatabase *aDbComms, TPtrC aTable )
+{
+ assert ( aDbComms != NULL );
+ CCommsDbTableView *rv = NULL;
+ rv = aDbComms->OpenTableLC( aTable );
+ CleanupStack::Pop();
+ return rv;
+}
+
+
+/*****************************************************************************
+ *
+ * Convert an ascii string to unicode
+ *
+ ****************************************************************************/
+HBufC16 *CSetUpCommDb::ConvertAsciiToUnicode( char *aAsciiString )
+{
+ RFs aFs;
+ int error_thrown, err;
+ TInt state;
+ HBufC16* unicode_string = NULL;
+ CCnvCharacterSetConverter* conv = NULL;
+ CCnvCharacterSetConverter::TAvailability available;
+
+ // Setup the descriptors and allocate the memory
+ const TPtrC8 textData( (TUint8*)aAsciiString );
+ TRAP( error_thrown, (unicode_string = HBufC16::NewL(textData.Length())) );
+ if( (error_thrown != KErrNone) || (unicode_string == NULL) ) {
+ return NULL;
+ }
+ TPtr16 textPtr( unicode_string->Des() );
+
+ // connect to the file-system to do the conversion
+ err = aFs.Connect();
+ if( err != KErrNone) {
+ return NULL;
+ }
+
+ // get the character convertor
+ TRAP( error_thrown, (conv = CCnvCharacterSetConverter::NewL()) );
+ if( (error_thrown != KErrNone) || (conv == NULL) ) {
+ delete unicode_string;
+ return NULL;
+ }
+
+ // Check if the required character set we are converting too is available
+ available = conv->PrepareToConvertToOrFromL( KCharacterSetIdentifierUtf8, aFs );
+ if( available == CCnvCharacterSetConverter::ENotAvailable ) {
+ delete unicode_string;
+ delete conv;
+ return NULL;
+ }
+
+ // finally, do the actual conversion
+ state = CCnvCharacterSetConverter::KStateDefault;
+ conv->ConvertToUnicode( textPtr, textData, state );
+
+ // ok we are done - return the new string
+ delete conv;
+ return unicode_string;
+}
+