diff -r f5050f1da672 -r 04becd199f91 javaextensions/iapinfo/src.s60/javacommdb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/iapinfo/src.s60/javacommdb.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,455 @@ +/* +* Copyright (c) 2008 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: JavaCommDB class implementation + * +*/ + + +#include "javacommdb.h" +#include "jstringutils.h" +#include "s60commonutils.h" +#include +#include +#include "logger.h" +#include "javajniutils.h" + +using namespace CommsDat; +using namespace java::util; + +// CONSTANTS +_LIT(KIAPTable, "IAP"); +_LIT(KConnectionPreferencesTable, "ConnectionPreferences"); +_LIT(KGlobalSettingsTable, "GlobalSettings"); +//_LIT( KNetworkTable, "Network" ); +_LIT(KFieldNameRecordId, "RecordId"); +_LIT(KFieldNameName, "Name"); + +JNIEXPORT void JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1destroy(JNIEnv* , + jclass, + jint aHandle) +{ + LOG1(ESOCKET, EInfo, "CJAVACOMMDB + destroy() handle: %D", aHandle); + JavaCommDB* commdb = reinterpret_cast(aHandle); + delete commdb; + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - destroy()"); +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1construct(JNIEnv* , + jclass) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + construct()"); + JavaCommDB *cdb = new JavaCommDB(); + TInt handle = reinterpret_cast(cdb); + LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB - construct() handle: %D", handle); + return handle; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1open(JNIEnv* aJni, + jclass, jint aHandle, + jstring aTableName) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + open()"); + JavaCommDB* commdb = reinterpret_cast(aHandle); + JStringUtils table(*aJni, aTableName); + + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB opening table: %S", table ); + TRAPD(error, commdb->OpenL(table)); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - open()"); + return error; +} + +JNIEXPORT void JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1close(JNIEnv* , + jclass, jint aHandle) +{ + LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB + close() handle: %D", aHandle); + JavaCommDB* commdb = reinterpret_cast(aHandle); + TRAP_IGNORE(commdb->Close()); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - close()"); +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1getRecordCount(JNIEnv* , + jclass, + jint aHandle) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + getRecordCount()"); + JavaCommDB* commdb = reinterpret_cast(aHandle); + TInt count = 0; + count = commdb->GetRecordCount(); + LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB returning value: %D", count); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - getRecordCount()"); + return count; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1readIntFieldValue(JNIEnv* aJni, + jclass, + jint aHandle, + jstring aFieldName, + jintArray aError) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + readIntFieldValue()"); + TInt value = 0; + + JavaCommDB* commdb = reinterpret_cast(aHandle); + JStringUtils field(*aJni, aFieldName); + + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB reading field value: %S", field ); + TRAPD(err, value = commdb->GetIntFieldValueL(field)); + + // Put the native error code into the Java error array + jint javaError[1] = + { err}; + aJni->SetIntArrayRegion(aError, 0, 1, javaError); + + LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB returning value: %D", value); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - readIntFieldValue()"); + return value; +} + +JNIEXPORT jstring JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1readStringFieldValue(JNIEnv* aJni, + jclass, + jint aHandle, + jstring aFieldName, + jintArray aError) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + readStringFieldValue()"); + + HBufC* value = NULL; + jstring str = NULL; + + JavaCommDB* commdb = reinterpret_cast(aHandle); + JStringUtils field(*aJni, aFieldName); + + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB reading field value: %S", field ); + TRAPD(err, value = commdb->GetStringFieldValueL(field)); + if (NULL != value && KErrNone == err) + { + str = S60CommonUtils::NativeToJavaString(*aJni, value->Des()); + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB returning value: %S", value->Des() ); + delete value; + } + + // Put the native error code into the Java error array + jint javaError[1] = + { err}; + aJni->SetIntArrayRegion(aError, 0, 1, javaError); + + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - readStringFieldValue()"); + return str; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1next(JNIEnv* , + jclass, jint aHandle) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + next()"); + JavaCommDB* commdb = reinterpret_cast(aHandle); + TInt rec = commdb->Next(); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - next()"); + return rec; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1previous(JNIEnv* , + jclass, + jint /*aHandle*/) +{ + return 0; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1findById(JNIEnv* , + jclass, + jint aHandle, + jint aId) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + findById()"); + TInt recId = 0; + + JavaCommDB* commdb = reinterpret_cast(aHandle); + recId = commdb->FindById(aId); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - findById()"); + return recId; +} + +JNIEXPORT jint JNICALL Java_com_nokia_mid_iapinfo_CommsTable__1findByName(JNIEnv* aJni, + jclass, + jint aHandle, + jstring aName) +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + findByName()"); + TInt recId = 0; + JStringUtils name(*aJni, aName); + + JavaCommDB* commdb = reinterpret_cast(aHandle); + TRAP(recId, recId = commdb->FindByNameL(name)); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - findByName()"); + return recId; +} + +/* --------------------------------------------------------------------------- + * JavaCommDB class implementation ; + * --------------------------------------------------------------------------- + */ + +// --------------------------------------------------------------------------- +// Delete allocated member objects. +// ----------------------------------------------------------------------------- +JavaCommDB::~JavaCommDB() +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + ~JavaCommDB()"); + Close(); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - ~JavaCommDB()"); +} + +// --------------------------------------------------------------------------- +// Delete allocated member objects. +// @return error code +// ----------------------------------------------------------------------------- +TInt JavaCommDB::Close() +{ + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB + Close()"); + iCurrentRecord = 0; + delete iTable; + iTable = NULL; + delete iDb; + iDb = NULL; + + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - Close()"); + return KErrNone; +} + +// --------------------------------------------------------------------------- +// Opens the given table. +// @param aTablename name of the CommDB table to be opened +// @return error code +// ----------------------------------------------------------------------------- +void JavaCommDB::OpenL(const TDesC& aTableName) +{ + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB + OpenL(): open table: %S", aTableName); + iDb = CMDBSession::NewL(KCDVersion1_1); + iCurrentRecord = 0; + + if (0 == aTableName.Compare(KIAPTable)) + { + // Create IAP table recordset + iTable = (CMDBRecordSet *)(new(ELeave) CMDBRecordSet< + CCDIAPRecord> (KCDTIdIAPRecord)); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB OpenL(): IAP table opened."); + } + else if (0 == aTableName.Compare(KGlobalSettingsTable)) + { + iTable = (CMDBRecordSet *) new(ELeave) CMDBRecordSet< + CCDGlobalSettingsRecord> (KCDTIdGlobalSettingsRecord); + LOG(EJavaIapInfo, EInfo, + "CJAVACOMMDB OpenL(): GlobalSettings table opened."); + } + else if (0 == aTableName.Compare(KConnectionPreferencesTable)) + { + iTable = (CMDBRecordSet *) new(ELeave) CMDBRecordSet< + CCDConnectionPrefsRecord> (KCDTIdConnectionPrefsRecord); + LOG(EJavaIapInfo, EInfo, + "CJAVACOMMDB OpenL(): ConnectionPreferences table opened."); + } + // Load the table + iTable->LoadL(*iDb); + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB - OpenL()"); +} + +// --------------------------------------------------------------------------- +// Get number of records in the current table. +// @return record count +// ----------------------------------------------------------------------------- +TInt JavaCommDB::GetRecordCount() +{ + return iTable->iRecords.Count(); +} + +// --------------------------------------------------------------------------- +// Retrieves the value of the given field from the actual record. +// @param aFieldName name of the field. +// @return integer value of the field +// ----------------------------------------------------------------------------- +TInt JavaCommDB::GetIntFieldValueL(const TDesC& aFieldName) +{ + TPtrC fieldName(aFieldName); + TInt valueType; + TUint32 value = 0; + + // If the field is the RecordId we have to use RecordId() function + if (0 == aFieldName.Compare(KFieldNameRecordId)) + { + value + = (static_cast(iTable->iRecords[iCurrentRecord]))->RecordId(); + LOG1(EJavaIapInfo, EInfo, + "CJAVACOMMDB GetIntFieldValueL(): getting RecordId: %D", value); + return value; + } + + // Get reference to the field by its name + CMDBField + * field = + (CMDBField *)(static_cast(iTable->iRecords[iCurrentRecord]))->GetFieldByNameL( + fieldName, valueType); + + if (field->IsNull()) + { + // The field is not initialized with a value + LOG(EJavaIapInfo, EInfo, + "CJAVACOMMDB GetIntFieldValueL(): CMDBField is NULL!"); + } + else + { + value = *field; + LOG1(EJavaIapInfo, EInfo, + "CJAVACOMMDB GetIntFieldValueL(): getting int value: %D", + value); + } + + return value; +} + +// --------------------------------------------------------------------------- +// Retrieves the value of the given field from the actual record. +// @param aFieldName name of the field. +// @return String value of the field +// ----------------------------------------------------------------------------- +HBufC* JavaCommDB::GetStringFieldValueL(const TDesC& aFieldName) +{ + TPtrC fieldName(aFieldName); + HBufC* strValue = NULL; + TInt valueType; + + // Get reference to the field by its name + CMDBField + * descField = + (CMDBField *)(static_cast(iTable->iRecords[iCurrentRecord]))->GetFieldByNameL( + fieldName, valueType); + + if (descField->IsNull()) + { + LOG(EJavaIapInfo, EInfo, + "CJAVACOMMDB GetStringFieldValueL(): CMDBField is NULL!"); + } + else + { + TPtrC value = descField->GetL(); + strValue = value.AllocL(); + //LOG1(EJavaIapInfo, EInfo,"CJAVACOMMDB GetStringFieldValue(): getting string value: %S", value); + } + + return strValue; +} + +// --------------------------------------------------------------------------- +// Changes the actual record pointer to the next record. +// @return number of the actual record +// ----------------------------------------------------------------------------- +TInt JavaCommDB::Next() +{ + if (iCurrentRecord < GetRecordCount() - 1) + { + ++iCurrentRecord; + return iCurrentRecord; + } + else + { + return KErrEof; + } +} + +// --------------------------------------------------------------------------- +// Changes the actual record pointer to the previous record. +// @return number of the actual record +// ----------------------------------------------------------------------------- +TInt JavaCommDB::Previous() +{ + return NULL; +} + +// --------------------------------------------------------------------------- +// Finds a record in the current table by its name. The search is case +// sensitive. If the record exists the current record will be changed to +// this record. +// @param aName name of the record +// @return with the RecordId of the found record, KErrNotFound if no record +// found with the given name. +// ----------------------------------------------------------------------------- +TInt JavaCommDB::FindByNameL(const TDesC& aName) +{ + TInt ret = KErrNotFound; + TInt count = GetRecordCount(); + TInt i = 0; + HBufC* strValue = NULL; + TPtrC FName(KFieldNameName); + TInt valueType; + + while ((i < count) && (ret == KErrNotFound)) + { + // Get reference to the field by its name + CMDBField + * descField = + (CMDBField *)(static_cast(iTable->iRecords[i]))->GetFieldByNameL( + FName, valueType); + + if (!(descField->IsNull())) + { + TPtrC value = descField->GetL(); + + strValue = value.AllocL(); + //LOG1(EJavaIapInfo, EInfo, "CJAVACOMMDB FindByName(): getting string value: %S", value); + if (0 == aName.Compare(strValue->Des())) + { + LOG(EJavaIapInfo, EInfo, + "CJAVACOMMDB FindByName(): record found."); + iCurrentRecord = i; + ret + = (static_cast(iTable->iRecords[i])->RecordId()); + } + + delete strValue; + } + + i++; + } + + return ret; +} + +// --------------------------------------------------------------------------- +// Finds a record in the current table by its RecordId. If the record exists +// the current record will be changed to this record. +// @param aId RecordId of the record +// @return with the RecordId of the found record, KErrNotFound if no record +// found with the given RecordId. +// ----------------------------------------------------------------------------- +TInt JavaCommDB::FindById(TInt aId) +{ + TInt ret = KErrNotFound; + TInt count = GetRecordCount(); + TInt i = 0; + + while ((i < count) && (ret == KErrNotFound)) + { + if (aId + == (static_cast(iTable->iRecords[i])->RecordId())) + { + LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB FindById(): record found."); + iCurrentRecord = i; + ret + = (static_cast(iTable->iRecords[i])->RecordId()); + } + + i++; + } + + return ret; +} +