javaextensions/iapinfo/src.s60/javacommdb.cpp
branchRCL_3
changeset 14 04becd199f91
child 25 ae942d28ec0e
--- /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 <e32base.h>
+#include <e32debug.h>
+#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<JavaCommDB *>(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<jint>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<JavaCommDB *>(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<CCDRecordBase> *)(new(ELeave) CMDBRecordSet<
+                 CCDIAPRecord> (KCDTIdIAPRecord));
+        LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB  OpenL(): IAP table opened.");
+    }
+    else if (0 == aTableName.Compare(KGlobalSettingsTable))
+    {
+        iTable = (CMDBRecordSet<CCDRecordBase> *) new(ELeave) CMDBRecordSet<
+                 CCDGlobalSettingsRecord> (KCDTIdGlobalSettingsRecord);
+        LOG(EJavaIapInfo, EInfo,
+            "CJAVACOMMDB  OpenL(): GlobalSettings table opened.");
+    }
+    else if (0 == aTableName.Compare(KConnectionPreferencesTable))
+    {
+        iTable = (CMDBRecordSet<CCDRecordBase> *) 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<CCDRecordBase*>(iTable->iRecords[iCurrentRecord]))->RecordId();
+        LOG1(EJavaIapInfo, EInfo,
+             "CJAVACOMMDB  GetIntFieldValueL(): getting RecordId: %D", value);
+        return value;
+    }
+
+    // Get reference to the field by its name
+    CMDBField<TUint32>
+    * field =
+        (CMDBField<TUint32> *)(static_cast<CCDRecordBase*>(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<TDesC>
+    * descField =
+        (CMDBField<TDesC> *)(static_cast<CCDRecordBase*>(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<TDesC>
+        * descField =
+            (CMDBField<TDesC> *)(static_cast<CCDRecordBase*>(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<CCDRecordBase*>(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<CCDRecordBase*>(iTable->iRecords[i])->RecordId()))
+        {
+            LOG(EJavaIapInfo, EInfo, "CJAVACOMMDB  FindById(): record found.");
+            iCurrentRecord = i;
+            ret
+            = (static_cast<CCDRecordBase*>(iTable->iRecords[i])->RecordId());
+        }
+
+        i++;
+    }
+
+    return ret;
+}
+