--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/commsdatabaseshim/commdbshim/SCDB/CDBPrefTable.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,858 @@
+// Copyright (c) 2003-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:
+// Comms Database Connection Preferences Table View definitions
+//
+//
+
+/**
+ @file
+ @deprecated since v9.1. Functionality is replaced with commsdat.
+*/
+
+#include <cdbtemp.h>
+#include <cdbpreftable.h>
+#include "CDBSTD.H"
+#include "commdb_impl.H"
+#include "Commsdat_Log.h"
+
+class TCommDbCommonBearerInfo
+/**
+@internalComponent
+*/
+ {
+public:
+ TUint32 iBearerSet;
+ TBool iBearerSetExists;
+ TUint32 iIapId;
+ TBool iIapIdExists;
+ };
+
+// TCommDbIapBearer and TCommDbIapConnectionPref definitions
+
+
+EXPORT_C CCommsDbConnectionPrefTableView::TCommDbIapBearer::TCommDbIapBearer() :
+ iBearerSet(0), iIapId(0)
+/** Default constructor.
+All member data is initialised to zero. */
+ {
+ }
+
+EXPORT_C CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref::TCommDbIapConnectionPref() :
+ iRanking(0), iDirection(ECommDbConnectionDirectionUnknown),
+ iDialogPref(ECommDbDialogPrefUnknown), iBearer()
+/** Default constructor.
+The rank is set to 0, and the direction and dialog preference to unknown. */
+ {
+ }
+
+EXPORT_C TBool CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref::operator==(const TCommDbIapConnectionPref& aPref) const
+/** Overloaded equality operator.
+Checks for equality between 'this' and another TCommDbIapConnectionPref object passed in.
+
+@param aPref Object to compare.
+@return ETrue if all fields in the objects are equal, otherwise EFalse. */
+ {
+ return (aPref.iRanking == iRanking &&
+ aPref.iDirection == iDirection &&
+ aPref.iDialogPref == iDialogPref &&
+ aPref.iBearer.iBearerSet == iBearer.iBearerSet &&
+ aPref.iBearer.iIapId == iBearer.iIapId);
+ }
+
+
+EXPORT_C CCommsDbConnectionPrefTableView::TCommDbIspBearer::TCommDbIspBearer()
+/**
+Framework left in place for 6.1BC purposes.
+*/
+ {
+ }
+
+
+EXPORT_C CCommsDbConnectionPrefTableView::TCommDbIspConnectionPref::TCommDbIspConnectionPref() :
+ iBearer()
+/**
+Framework left in place for 6.1BC purposes.
+*/
+ {
+ }
+
+
+EXPORT_C TBool CCommsDbConnectionPrefTableView::TCommDbIspConnectionPref::operator==(const TCommDbIspConnectionPref& /*aPref*/) const
+/**
+ * Check for equality between 'this' and another TCommDbIspConnectionPref object passed in.
+ * Framework letf in place for 6.1BC purposes. Returns KErrNotSupported only.
+ * @param aPref Preferences.
+ * @return KErrNotSupported Function has been deprecated therefore always return with this error.
+ */
+ {
+ return KErrNotSupported;
+ }
+
+/**
+CCommsDbConnectionPrefTableView definitions
+*/
+
+CCommsDbConnectionPrefTableView* CCommsDbConnectionPrefTableView::NewLC(CCommsDatabase& /*aDb*/, const TDbQuery& /*aQuery*/)
+/** Create a view. Usually, however, views are created by calling one of the
+CCommsDatabase::OpenConnectionPrefTable*LC() functions.
+
+@deprecated This method is deprecated from 9.1 and always returns/leaves with KErrNotSupported instead of describing past operation/parameters.
+@param aDb reference to the database to use.
+@param aQuery Query to preform
+@return Reference to the new CCommsDbConnectionPrefTableView. */
+ {
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+CCommsDbConnectionPrefTableView* CCommsDbConnectionPrefTableView::NewLC(CCommsDatabase& aDb, TCommDbConnectionDirection aDirection, TBool aSortRanking)
+/** Create a view. Usually, however, views are created by calling one of the
+CCommsDatabase::OpenConnectionPrefTable*LC() functions.
+
+@param aDb reference to the database to use.
+@param aDirection
+@param aSortRanking -> ETrue Sort by ranking, EFalse not sorted
+@return Reference to the new CCommsDbConnectionPrefTableView. */
+ {
+ CCommsDbConnectionPrefTableView* self = new(ELeave) CCommsDbConnectionPrefTableView(aDb);
+ CleanupStack::PushL(self);
+ self->ConstructL(aDirection, aSortRanking);
+ // register view in Database
+ aDb.iImpl->RegisterConnPrefViewL(self);
+ return self;
+ }
+
+CCommsDbConnectionPrefTableView* CCommsDbConnectionPrefTableView::NewL(CCommsDatabase& aDb, TCommDbConnectionDirection aDirection, TUint32 aRank)
+/** Create a view. Usually, however, views are created by calling one of the
+CCommsDatabase::OpenConnectionPrefTable*LC() functions.
+
+@param aDb reference to the database to use.
+@param aDirection
+@param aRank
+@return Reference to the new CCommsDbConnectionPrefTableView. */
+ {
+ CCommsDbConnectionPrefTableView* self = new(ELeave) CCommsDbConnectionPrefTableView(aDb);
+ CleanupStack::PushL(self);
+ TRAPD(err,self->ConstructL(aDirection, aRank));
+ if(err == KErrNotFound)
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("CCommsDbConnectionPrefTableView::NewL is leaving with KErrOverflow"));
+ err = KErrOverflow;
+ }
+ User::LeaveIfError(err);
+
+ // register view in Database
+ aDb.iImpl->RegisterConnPrefViewL(self);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CCommsDbConnectionPrefTableView::CCommsDbConnectionPrefTableView(CCommsDatabase& aDb)
+ : iDb(aDb)
+/**
+Constructor
+
+@param aDb reference to the database to use.
+*/
+ {
+ }
+
+void CCommsDbConnectionPrefTableView::ConstructL(const TDbQuery& /*aQuery*/)
+/**
+Prepares and evaluates the table view using the SQL query aQuery
+
+@deprecated This method is deprecated from 9.1 and always returns/leaves with KErrNotSupported instead of describing past operation/parameters.
+
+@param aQuery Query to perform
+*/
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+void CCommsDbConnectionPrefTableView::ConstructL(TCommDbConnectionDirection aDirection, TBool aSortRanking)
+/**
+Creates RecordSet Container and loads date to it.
+
+@param aDirection
+@param aSortRanking
+*/
+ {
+ CMDBSession* dbSession = iDb.iImpl->iDbs;
+ // create RecordSet object and save a pointer within CTableViewExtension
+ iTableExt = CCommDbTableExtension::NewL();
+
+ // object will be deleted by CTableViewExtension object
+ CMDBRecordSet<CCDConnectionPrefsRecord>* connPrefRecordSet = new(ELeave) CMDBRecordSet<CCDConnectionPrefsRecord>(KCDTIdConnectionPrefsRecord);
+ CleanupStack::PushL(connPrefRecordSet);
+
+ if(aDirection == ECommDbConnectionDirectionUnknown)
+ {
+ // Load all records regardless of direction
+ TRAPD(err,connPrefRecordSet->LoadL(*dbSession));
+ if((err != KErrNotFound) && (err != KErrNone))
+ {
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("Connection Preferences Table constructed Direction:%d, Sorted rank: %b, returned Err:%d"),
+ aDirection, aSortRanking);
+ User::Leave(err);
+ }
+
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("Connection Preferences Table constructed Direction:%d, Sorted rank: %b, returned Err:%d"),
+ aDirection, aSortRanking, err);
+ }
+ else
+ {
+ // Search per direction
+ TBool ret(EFalse);
+
+ // create 0 record for priming
+ CCDConnectionPrefsRecord* connPrefRecord = static_cast<CCDConnectionPrefsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord));
+ CleanupStack::PushL(connPrefRecord);
+
+ // prime
+ connPrefRecord->iDirection = aDirection;
+
+ // add record to record set
+ connPrefRecordSet->iRecords.AppendL(connPrefRecord);
+
+ CleanupStack::Pop(connPrefRecord);
+
+ // Load record
+ TRAPD(err, ret = connPrefRecordSet->FindL(*dbSession));
+
+ if(err != KErrNone)
+ {
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("Connection Preferences Table constructed Direction:%d, Sorted rank: %b, returned Err:%d"),
+ aDirection, aSortRanking, err);
+ // error is returned back
+ User::Leave(err);
+ }
+
+ // check if anything is returned back
+ if(!ret)
+ {
+ // remove primed record from the record set
+ connPrefRecordSet->iRecords.ResetAndDestroy();
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("Table: ConnectionPreference with Direction:%d, SortedByRanking:%b is empty"), aDirection, aSortRanking);
+ }
+ }
+
+ CleanupStack::Pop(connPrefRecordSet);
+
+ iTableExt->SetRecordSet(connPrefRecordSet);
+
+ if (aSortRanking)
+ {
+ iTableExt->SortByRank();
+ }
+ }
+
+void CCommsDbConnectionPrefTableView::ConstructL(TCommDbConnectionDirection aDirection, TUint32 aRank)
+/**
+Prepares and evaluates the table view using params
+
+@param aDirection
+@param aRank
+*/
+ {
+ TBool ret(EFalse);
+ // create RecordSet object and save a pointer within CTableViewExtension
+ iTableExt = CCommDbTableExtension::NewL();
+ // object will be deleted by CTableViewExtension object
+ CMDBRecordSet<CCDConnectionPrefsRecord>* connPrefRecordSet = new(ELeave) CMDBRecordSet<CCDConnectionPrefsRecord>(KCDTIdConnectionPrefsRecord);
+ CleanupStack::PushL(connPrefRecordSet);
+
+ // create 0 record for priming
+ CCDConnectionPrefsRecord* connPrefRecord = static_cast<CCDConnectionPrefsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord));
+ CleanupStack::PushL(connPrefRecord);
+
+ // prime
+ connPrefRecord->iDirection = aDirection;
+ connPrefRecord->iRanking = aRank;
+
+ // add record to record set
+ connPrefRecordSet->iRecords.AppendL(connPrefRecord);
+ CleanupStack::Pop(connPrefRecord);
+
+ // Load record
+ TRAPD(err, ret = connPrefRecordSet->FindL(*iDb.iImpl->iDbs));
+
+ if(err != KErrNone)
+ {
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("Connection Preferences Table constructed with Ranking: %d and Direction:%d returned Err:%d"),
+ aRank, aDirection, err);
+ // error is returned back
+ User::Leave(err);
+ }
+
+ // check if anything is returned back
+ if(!ret)
+ {
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("Table: ConnectionPreference with Direction:%d, Rank:%d is empty"), aDirection, aRank);
+ User::Leave(KErrNotFound);
+ }
+
+ iTableExt->SetRecordSet(connPrefRecordSet);
+
+ CleanupStack::Pop(connPrefRecordSet);
+ }
+
+EXPORT_C CCommsDbConnectionPrefTableView::~CCommsDbConnectionPrefTableView()
+/** Destructor.*/
+ {
+ delete iTableExt;
+ iDb.iImpl->UnRegisterConnPrefView(this);
+ }
+
+
+EXPORT_C void CCommsDbConnectionPrefTableView::InsertConnectionPreferenceL(const TCommDbIapConnectionPref& aPref, TBool aReadOnly)
+/** Inserts a new IAP connection preference into the connetion preference table.
+The supplied `aPref` is checked to ensure that the rank and direction
+do not conflict with existing records. The dialog option, bearer set
+and IAP are checked for consistancy.
+Deprecated in 7.0 but re-instated to accommodate 6.1 BC
+
+@param aPref Settings for the new connection preference.
+@param aReadOnly If ETrue the record is set to be read-only. If left unspecified the default is EFalse.
+@capability Dependent on table, see the guide page referenced below.
+*/
+ {
+ CMDBSession* dbSession = iDb.iImpl->iDbs;
+ CCDConnectionPrefsRecord* connPrefRecord = static_cast<CCDConnectionPrefsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord));
+
+ connPrefRecord->SetRecordId(KCDNewRecordRequest);
+ connPrefRecord->iDirection = aPref.iDirection;
+ connPrefRecord->iRanking = aPref.iRanking;
+ connPrefRecord->iDialogPref = aPref.iDialogPref;
+ connPrefRecord->iBearerSet = aPref.iBearer.iBearerSet;
+ connPrefRecord->iDefaultIAP = aPref.iBearer.iIapId;
+
+ CMDBRecordSetBase* recordSet = iTableExt->GetRecordSetL();
+
+ if ( recordSet->IsSetAttribute(ECDNoWriteButDelete) ||
+ recordSet->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC5(KLogComponent, KCommDbShim, _L("InsertConnectionPreferenceL -> TableName=ConnectionPreferences, Ranking=%d, Direction=%d, DialogPref=%d, Bearer=%d, ReadOnly=%b")
+ , aPref.iRanking, aPref.iDirection, aPref.iDialogPref, aPref.iBearer.iBearerSet, aReadOnly);
+ User::Leave(KErrAccessDenied);
+ }
+
+ if(aReadOnly)
+ {
+ connPrefRecord->SetAttributes(ECDNoWriteButDelete);
+ dbSession->SetAttributeMask(ECDNoWriteButDelete);
+ }
+
+ iTableExt->InsertConnPrefRecordL(connPrefRecord, *dbSession);
+
+ if (aReadOnly)
+ {
+ dbSession->ClearAttributeMask(ECDNoWriteButDelete);
+ }
+
+ __FLOG_STATIC5(KLogComponent, KCommDbShim, _L("InsertConnectionPreferenceL -> TableName=ConnectionPreferences, Ranking=%d, Direction=%d, DialogPref=%d, Bearer=%d, ReadOnly=%b")
+ , aPref.iRanking, aPref.iDirection, aPref.iDialogPref, aPref.iBearer.iBearerSet, aReadOnly);
+
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::InsertConnectionPreferenceL(const TCommDbIspConnectionPref& /*aPref*/, TBool /*aReadOnly*/)
+/**
+ * Override version of InsertConnectionPreferenceL for BC purposes.
+ * @param aPref Preferences.
+ * @param aReadOnly Read only?
+ * @deprecated This method is deprecated from 9.1 and always returns/leaves with KErrNotSupported instead of describing past operation/parameters.
+ *
+ */
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::UpdateBearerL(const TCommDbIapBearer& aUpdate, TBool aReadOnly)
+/** Update the bearer set and IAP for the currently selected IAP connection
+preference record. The dialog option, bearer set and IAP are checked for
+consistancy.
+Deprecated in 7.0 but re-instated to accomodate 6.1 BC.
+Update the bearer set and iap for the currently selected connection preference.
+The dialog option, bearer set and IAP are checked for consistancy. The function sets the bearer set
+(CONNECT_PREF_BEARER_SET) and IAP (CONNECT_PREF_IAP) fields. The direction field (CONNECTION_PREF_DIRECTION)
+cannot be altered after it has been written to the record.
+@param aUpdate Updated settings for the connection preference. Note that all fields need to be set,
+including any unchanged fields.
+@param aReadOnly If true, the record is set to be read-only. If unspecified, EFalse by default.
+@leave KErrAccessDenied The record cannot be updated as it is read-only;
+KErrArgument The specified IAP (aPref.iBearer.iIapId) cannot be used, as it does not fall in the bearer set
+defined by aPref.iBearer.iBearerSet and have the same direction as aPref.iDirection;
+KErrNotFound There is no current record in the view.
+@capability Dependent on table, see the guide page referenced below.
+*/
+ {
+ CMDBSession* dbSession = iDb.iImpl->iDbs;
+ CMDBRecordBase* currentRecord = iTableExt->GetCurrentRecordL();
+ CCDConnectionPrefsRecord* conPref = static_cast<CCDConnectionPrefsRecord*>(currentRecord);
+ conPref->iBearerSet = aUpdate.iBearerSet;
+ conPref->iDefaultIAP = aUpdate.iIapId;
+
+
+ if ( currentRecord->IsSetAttribute(ECDNoWriteButDelete) ||
+ currentRecord->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("CCommsDbConnectionPrefTableView::UpdateBearerL is leaving with KErrAccessDenied"));
+ User::Leave(KErrAccessDenied);
+ }
+
+ if(aReadOnly)
+ {
+ currentRecord->SetAttributes(ECDNoWriteButDelete);
+ dbSession->SetAttributeMask(ECDNoWriteButDelete);
+ }
+
+ // modify record
+ currentRecord->ModifyL(*dbSession);
+
+ if (aReadOnly)
+ {
+ dbSession->ClearAttributeMask(ECDNoWriteButDelete);
+ }
+
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("UpdateBearerL -> TableName=ConnectionPreferences, Bearer=%d, IAP=%d, ReadOnly=%b")
+ , aUpdate.iBearerSet, aUpdate.iIapId, aReadOnly);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::UpdateBearerL(const TCommDbIspBearer& /*aUpdate*/, TBool /*aReadOnly*/)
+/**
+ * Override version of UpdateBearerL for BC purposes.
+ * @deprecated This method is deprecated from 9.1 and always returns/leaves with KErrNotSupported instead of describing past operation/parameters.
+
+ * @param aUpdate Update.
+ * @param aReadOnly Read only?
+ * @return KErrNotSupported.
+ */
+
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::ReadConnectionPreferenceL(TCommDbIapConnectionPref& aPref)
+/** Gets the IAP connection preferences record currently selected in the view.
+
+@param aPref On return, the connection preferences
+@leave KErrNotFound There is no current record in the view
+@leave KErrUnknown A field in the connection preference record is null
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ CMDBRecordBase* currentRecord = iTableExt->GetCurrentRecordL();
+ CCDConnectionPrefsRecord* connPref = (static_cast<CCDConnectionPrefsRecord*>(currentRecord));
+
+ if (connPref->iDirection.IsNull()
+ || connPref->iRanking.IsNull()
+ || connPref->iDialogPref.IsNull()
+ || connPref->iBearerSet.IsNull() )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("ReadConnectionPreferenceL is Leaving with KErrUnknown (One of the field has NULL value)"));
+ User::Leave(KErrUnknown);
+ }
+
+ TInt dialogPref = connPref->iDialogPref;
+
+ aPref.iDirection = connPref->iDirection;
+ aPref.iRanking = connPref->iRanking;
+ aPref.iDialogPref = static_cast<TCommDbDialogPref>(dialogPref);
+ aPref.iBearer.iBearerSet = connPref->iBearerSet;
+ aPref.iBearer.iIapId = connPref->iDefaultIAP;
+
+
+ __FLOG_STATIC4(KLogComponent, KCommDbShim, _L("ReadConnectionPreferenceL -> TableName=ConnectionPreferences, Ranking=%d, Direction=%d, DialogPref=%d, Bearer=%d")
+ , aPref.iRanking, aPref.iDirection, aPref.iDialogPref, aPref.iBearer.iBearerSet);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::ReadConnectionPreferenceL(TCommDbIspConnectionPref& /*aPref*/)
+/**@deprecated in v7.0
+
+Framework left to support BC with v6.1
+@leave KErrNotSupported
+*/
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::UpdateDialogPrefL(const TCommDbDialogPref& aUpdate)
+/** Updates the dialog preference field (CONNECT_PREF_DIALOG_PREF) in the currently selected
+connection preferences IAP record in the view.
+
+@param aUpdate New value for the dialog preference field
+@leave KErrAccessDenied The record cannot be updated as it is read-only
+@leave KErrNotFound There is no current record in the view
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ CMDBRecordBase* currentRecord = iTableExt->GetCurrentRecordL();
+
+ (static_cast<CCDConnectionPrefsRecord*>(currentRecord))->iDialogPref = aUpdate;
+
+ if ( currentRecord->IsSetAttribute(ECDNoWriteButDelete) ||
+ currentRecord->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC1(KLogComponent, KCommDbShim, _L("UpdateDialogPrefL -> TableName=ConnectionPreferences, DialogPref=%d is leaving with KErrAccessDenied"), aUpdate);
+ User::Leave(KErrAccessDenied);
+ }
+
+ // store change
+ currentRecord->ModifyL(*iDb.iImpl->iDbs);
+
+ __FLOG_STATIC1(KLogComponent, KCommDbShim, _L("UpdateDialogPrefL -> TableName=ConnectionPreferences, DialogPref=%d"), aUpdate);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::SwapConnectionPreferencesL(TCommDbConnectionDirection aDirection, TUint32 aFirstRank, TUint32 aSecondRank)
+// Restores the cursor in case of a Leave in `DoSwapConnectionPreferencesL()` though it probably shouldn't.
+/** Swaps the bearer (CONNECT_PREF_BEARER_SET) and the IAP (CONNECT_PREF_IAP) fields
+between two connection preferences records.
+
+The records to use are specified by their rank (CONNECT_PREF_RANKING) and
+direction (CONNECTION_PREF_DIRECTION).
+
+Note that the dialogue option is not altered.
+
+@param aDirection Direction of the connection preferences records
+@param aFirstRank Rank of the first record to swap
+@param aSecondRank Rank of the second record to swap
+@leave KErrAccessDenied The record cannot be updated as it is read-only
+@leave KErrArgument There is more than one record with the same ranking as
+one of the rankings
+@leave KErrNotFound A record with one of the rankings does not exist
+@leave KErrOverflow One of the rankings is greater than the maximum allowed
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ CMDBSession* dbSession = iDb.iImpl->iDbs;
+ if((aFirstRank > 2) || (aSecondRank > 2))
+ {
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("SwapConnectionPreferencesL -> TableName=ConnectionPreferences, FirstRank=%d, SecondRank=%d is leaveing with Err=KErrOverflow (Rankings are greater then allowed 2)"), aFirstRank, aSecondRank);
+ User::Leave(KErrOverflow);
+ }
+
+ TInt isInTransaction = dbSession->IsInTransaction();
+
+ // start internal transaction if it is not already in transaction
+ if (!isInTransaction)
+ {
+ dbSession->OpenTransactionL();
+
+ TRAPD(err, DoSwapConnectionPreferencesL(aDirection, aFirstRank, aSecondRank));
+ if(err == KErrNone)
+ {
+ dbSession->CommitTransactionL();
+ }
+ else
+ {
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("SwapConnectionPreferencesL -> TableName=ConnectionPreferences, FirstRank=%d, SecondRank=%d RollBackTransaction Err=%d"), aFirstRank, aSecondRank, err);
+ dbSession->RollbackTransactionL();
+ User::Leave(err);
+ }
+ }
+ else
+ {
+ DoSwapConnectionPreferencesL(aDirection, aFirstRank, aSecondRank);
+ }
+
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("SwapConnectionPreferencesL -> TableName=ConnectionPreferences, FirstRank=%d, SecondRank=%d"), aFirstRank, aSecondRank);
+ }
+
+void CCommsDbConnectionPrefTableView::DoSwapConnectionPreferencesL(TCommDbConnectionDirection aDirection, TUint32 aFirstRank, TUint32 aSecondRank)
+// Restores the cursor in case of a Leave in `DoSwapConnectionPreferencesL()` though it probably shouldn't.
+/** Swaps the bearer (CONNECT_PREF_BEARER_SET) and the IAP (CONNECT_PREF_IAP) fields
+between two connection preferences records.
+
+The records to use are specified by their rank (CONNECT_PREF_RANKING) and
+direction (CONNECTION_PREF_DIRECTION).
+
+Note that the dialogue option is not altered.
+
+@param aDirection Direction of the connection preferences records
+@param aFirstRank Rank of the first record to swap
+@param aSecondRank Rank of the second record to swap
+@leave KErrAccessDenied The record cannot be updated as it is read-only
+@leave KErrArgument There is more than one record with the same ranking as
+one of the rankings
+@leave KErrNotFound A record with one of the rankings does not exist
+@leave KErrOverflow One of the rankings is greater than the maximum allowed
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ CMDBSession* dbSession = iDb.iImpl->iDbs;
+ CMDBRecordSetBase* rs = iTableExt->GetRecordSetL();
+
+ // Is it writable?
+ if ( rs->IsSetAttribute(ECDNoWriteButDelete) ||
+ rs->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("DoSwapConnectionPreferencesL is leaving with KErrAccessDenied (Table query)"));
+ User::Leave(KErrAccessDenied);
+ }
+
+ TInt indexFirstRank(0);
+ TInt indexSecondRank(0);
+
+ TBool foundFirstRank(EFalse);
+ TBool foundSecondRank(EFalse);
+
+ for (TInt i=0;i<rs->iRecords.Count();++i)
+ {
+ CCDConnectionPrefsRecord* prefRecord = static_cast<CCDConnectionPrefsRecord*>(rs->iRecords[i]);
+ if(prefRecord->iDirection == aDirection)
+ {
+ if(prefRecord->iRanking == aFirstRank)
+ {
+ indexFirstRank = i;
+
+ if (foundFirstRank)
+ {
+ // Found this rank twice!
+ User::Leave(KErrArgument);
+ }
+
+ foundFirstRank = ETrue;
+ }
+
+ if(prefRecord->iRanking == aSecondRank)
+ {
+ indexSecondRank = i;
+
+ if (foundSecondRank)
+ {
+ // Found this rank twice!
+ User::Leave(KErrArgument);
+ }
+
+ foundSecondRank = ETrue;
+ }
+ }
+ }
+
+
+ // if both ranikings are valid, exchange values
+ if(foundFirstRank && foundSecondRank)
+ {
+ if(indexFirstRank != indexSecondRank)
+ {
+ CCDConnectionPrefsRecord* firstRecord = static_cast<CCDConnectionPrefsRecord*>(rs->iRecords[indexFirstRank]);
+ CCDConnectionPrefsRecord* secondRecord = static_cast<CCDConnectionPrefsRecord*>(rs->iRecords[indexSecondRank]);
+
+ if ( firstRecord->IsSetAttribute(ECDNoWriteButDelete) ||
+ firstRecord->IsSetAttribute(ECDProtectedWrite) ||
+ secondRecord->IsSetAttribute(ECDNoWriteButDelete) ||
+ secondRecord->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("DoSwapConnectionPreferencesL is leaving with KErrAccessDenied (Record query)"));
+ User::Leave(KErrAccessDenied);
+ }
+
+
+ // temp. delete record from database
+ CCDConnectionPrefsRecord* firstRec = static_cast<CCDConnectionPrefsRecord*>(rs->iRecords[indexFirstRank]);
+ firstRec->DeleteL(*dbSession);
+
+ // gather data records
+ TInt firstBearerSet = firstRecord->iBearerSet;
+ TInt firstIapId = firstRecord->iDefaultIAP;
+
+ TInt secondBearerSet = secondRecord->iBearerSet;
+ TInt secondIapId = secondRecord->iDefaultIAP;
+
+ // modify the second one
+ secondRecord->iBearerSet = firstBearerSet;
+ secondRecord->iDefaultIAP = firstIapId;
+ secondRecord->ModifyL(*dbSession);
+
+ // change and restore the changed first record
+
+ firstRecord->iBearerSet = secondBearerSet;
+ firstRecord->iDefaultIAP = secondIapId;
+ firstRecord->StoreL(*dbSession);
+ }
+ }
+ else
+ {
+ // one or both rankings are not valid
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("SwapConnectionPreferencesL -> TableName=ConnectionPreferences, Direction=%d, FirstRank=%d, SecondRank=%d, Err: Rankings are not valid!!!")
+ ,aDirection, aFirstRank, aSecondRank);
+ User::Leave(KErrNotFound);
+ }
+
+ __FLOG_STATIC3(KLogComponent, KCommDbShim, _L("SwapConnectionPreferencesL -> TableName=ConnectionPreferences, Direction=%d, FirstRank=%d, SecondRank=%d")
+ ,aDirection, aFirstRank, aSecondRank);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::ChangeConnectionPreferenceRankL(TUint32 aNewRank)
+/** Sets the rank field (CONNECT_PREF_RANKING) in the currently selected connection preference
+record in the view.
+
+Note that if the new rank is not zero, and there is already a record with
+this rank and the same direction, then the existing record's rank is set to
+zero. This means that record is not used when the system finds the preferred
+connections.
+
+@param aNewRank The new rank for the record.
+@leave KErrAccessDenied The record cannot be updated as it is read-only
+@leave KErrNotFound There is no current record in the view
+@leave KErrOverflow aNewRank is greater than the maximum allowed
+@capability Dependent on table, see the guide page referenced below. */
+ {
+
+ CMDBRecordBase* record = iTableExt->GetCurrentRecordL();
+ // Is it writable?
+ if ( record->IsSetAttribute(ECDNoWriteButDelete) ||
+ record->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("ChangeConnectionPreferenceRankL is leaving with KErrAccessDenied"));
+ User::Leave(KErrAccessDenied);
+ }
+
+ if (aNewRank != 0)
+ {
+
+ if(aNewRank>2)
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("ChangeConnectionPreferenceRankL is leaving with KErrOverflow (Rank is greater then 2)"));
+ User::Leave(KErrOverflow);
+ }
+
+ // get current direction
+ const TCommDbConnectionDirection direction = (static_cast<CCDConnectionPrefsRecord*>(record))->iDirection;
+
+ CCommsDbConnectionPrefTableView* view = NULL;
+ TRAPD(err, view = iDb.OpenConnectionPrefTableViewOnRankLC(direction, aNewRank);CleanupStack::Pop());
+
+ if(err == KErrNone)
+ {
+ CleanupStack::PushL(view);
+
+ view->SetRankL(0);
+
+ CleanupStack::PopAndDestroy(view);
+ }
+
+ SetRankL(aNewRank);
+ // Refresh the data since there was a change of data in another view
+ iTableExt->RefreshDatabaseL(*iDb.iImpl->iDbs);
+ }
+ else
+ {
+ SetRankL(0);
+ }
+ __FLOG_STATIC1(KLogComponent, KCommDbShim, _L("ChangeConnectionPreferenceRankL -> TableName=ConnectionPreferences, NewRank=%d") , aNewRank);
+ }
+
+EXPORT_C void CCommsDbConnectionPrefTableView::DeleteConnectionPreferenceL()
+/** Deletes the currently selected connection preference record in the view.
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ // deletes current row from container and from database
+ iTableExt->DeleteCurrentRecordL(*iDb.iImpl->iDbs);
+
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("DeleteConnectionPreferenceL -> TableName=ConnectionPreferences"));
+ }
+
+EXPORT_C TInt CCommsDbConnectionPrefTableView::GotoFirstRecord()
+//Moves the cursor to first connection preference record in this view
+/** Sets the first connection preference record in this view as the current record.
+
+@return KErrNotFound if the view has no records. Error codes from DBMS can
+also be returned.
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("GotoFirstRecord -> TableName=ConnectionPreferences"));
+ return iTableExt->GotoFirstRecord(*iDb.iImpl->iDbs);
+ }
+
+EXPORT_C TInt CCommsDbConnectionPrefTableView::GotoNextRecord()
+// Moves the cursor to next connection preference record in this view
+/** Sets the next connection preference record in the view as the current record.
+
+@return KErrNotFound if the current record is the last in the view. Error
+codes from DBMS can also be returned.
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ __FLOG_STMT(TInt index;)
+ __FLOG_STMT(TInt err = iTableExt->GetRecordSetIndex(index);)
+ __FLOG_STATIC1(KLogComponent, KCommDbShim, _L("GotoNextRecord -> TableName=ConnectionPreferences, RecordNum=%d"), index);
+
+ return iTableExt->GotoNextRecord(*iDb.iImpl->iDbs);
+ }
+
+EXPORT_C TInt CCommsDbConnectionPrefTableView::GotoPreviousRecord()
+// Move the cursor to previous connection preference record in this view
+/** Sets the previous connection preference record in the view as the current record.
+
+@return KErrNotFound if the current record is the first in the view. Error
+codes from DBMS can also be returned.
+@capability Dependent on table, see the guide page referenced below. */
+ {
+ __FLOG_STMT(TInt index;)
+ __FLOG_STMT(TInt err = index = iTableExt->GetRecordSetIndex(index);)
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("GotoPreviousRecord -> TableName=ConnectionPreferences"));
+
+ return iTableExt->GotoPreviousRecord(*iDb.iImpl->iDbs);
+ }
+
+RDbRowSet::TAccess CCommsDbConnectionPrefTableView::GetL()
+/**
+Gets the operations that can be performed on the current connection preference record
+If there isn't an access table at all, then treat the table as updatable.
+@return EUpdatable, if All operations can be performed on the rowset.
+EReadOnly, Row navigation and reading are permitted.
+EInsertOnly, Inserting new rows is the only valid operation on the rowset.
+*/
+ {
+ RDbRowSet::TAccess access;
+ iTableExt->GetTableAccess(access);
+
+ return access;
+ }
+
+void CCommsDbConnectionPrefTableView::Close()
+/**
+Closes the rowset and releases any owned resources.
+*/
+ {
+ }
+
+void CCommsDbConnectionPrefTableView::SetRankL(TUint32 aNewRank)
+ {
+ CMDBRecordBase* record = iTableExt->GetCurrentRecordL();
+ CCDConnectionPrefsRecord* currConnPrefRec = static_cast<CCDConnectionPrefsRecord*>(record);
+
+ // Is it writable?
+ if ( record->IsSetAttribute(ECDNoWriteButDelete) ||
+ record->IsSetAttribute(ECDProtectedWrite) )
+ {
+ __FLOG_STATIC0(KLogComponent, KCommDbShim, _L("CCommsDbConnectionPrefTableView::SetRankL is leaving with KErrAccessDenied"));
+ User::Leave(KErrAccessDenied);
+ }
+
+ // change the ranking of a record
+ TUint32 currentrank = currConnPrefRec->iRanking;
+
+ currConnPrefRec->iRanking = aNewRank;
+ // store change
+
+ TRAPD(err,currConnPrefRec->ModifyL(*iDb.iImpl->iDbs));
+ if(err == KErrArgument)
+ {
+ err = KErrOverflow; //commdb specific error code
+ }
+
+ if(err != KErrNone)
+ {
+ currConnPrefRec->iRanking = currentrank;
+ __FLOG_STATIC2(KLogComponent, KCommDbShim, _L("CCommsDbConnectionPrefTableView::SetRankL -> Rank:%d, is leaving with Err:%d"), currentrank, err);
+ User::Leave(err);
+ }
+ __FLOG_STMT(TInt rank = currConnPrefRec->iRanking;)
+ __FLOG_STATIC1(KLogComponent, KCommDbShim, _L("CCommsDbConnectionPrefTableView::SetRankL -> Rank:%d"), rank);
+ }