--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayercontrol/networkinterfacemgr/src/CAgentBase.cpp Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,665 @@
+// Copyright (c) 1997-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:
+// CAgentBase implementation.
+// CAgentBase is the base class for an agent that accesses CommDb and uses overrides
+//
+//
+
+/**
+ @file CAgentBase.cpp
+ @publishedPartner
+ @deprecated since v9.5. Use MCPR/CPR/SCPRs instead of agents.
+*/
+
+#include <cdbcols.h>
+#include "CAgentBase.h"
+#include "AgentPanic.h"
+#include "Ni_Log.h"
+#include "IF_DEF.H"
+#include "cagentdlgproc.h"
+
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+#include <networking/cfbearers.h>
+#endif //SYMBIAN_ADAPTIVE_TCP_WINDOW_RECEIVE
+
+
+/**
+Agent Panic
+@internalComponent
+*/
+_LIT(KAgentPanic, "CAgentBase");
+
+/**
+Panic - programming error!
+@internalComponent
+*/
+GLDEF_C void AgentPanic(Agent::TAgentPanic aPanic)
+/**
+ * Global panic function for agent base classes.
+ * A global helper function for agent base classes to log the panic number before triggering the panic itself
+ * @internalComponent
+ */
+ {
+ LOG( NifmanLog::Printf(_L("CAgentBase Panic %d"), aPanic); )
+ User::Panic(KAgentPanic, aPanic);
+ }
+
+
+//
+// Construction and Destruction
+//
+
+EXPORT_C CAgentBase::~CAgentBase()
+/**
+Destructor
+Releases resources used by CAgentBase
+
+*/
+ {
+ if (iOverrides)
+ {
+ LOG_DETAILED( NifmanLog::Printf(_L("Agent %x:\t\tDeleting overrides at %x"), this, iOverrides); )
+
+ delete iOverrides;
+ }
+
+ if (iDlgPrc)
+ {
+ iDlgPrc->CancelEverything();
+ delete iDlgPrc;
+ }
+
+ if (iDatabase)
+ {
+ iDatabase->CancelRequestNotificationOfServiceChange(this);
+ iServiceChangeNotification.Reset();
+ delete iDatabase;
+ }
+
+ if(iAuthenticateCallback)
+ delete iAuthenticateCallback;
+
+ }
+
+EXPORT_C CAgentBase::CAgentBase()
+: iAuthenticateError(KErrNone)
+/**
+Default Constructor
+*/
+ { }
+
+EXPORT_C void CAgentBase::ConstructL()
+/**
+2nd Phase of construction.
+Instantiate Member variables.
+The derived class' ConstructL() should also call this one.
+
+@exception Leaves if construction of either the database or
+the dialog processor leaves
+*/
+ {
+ // construct the database
+ iDatabase = CCommsDbAccess::NewL(ETrue);
+
+ iDatabase->RequestNotificationOfServiceChangeL(this);
+
+ // construct the dialog processor
+ iDlgPrc = CDialogProcessor::NewL();
+
+ // create the callback for authentication
+ TCallBack authCallback(AuthenticateCb, this);
+ iAuthenticateCallback = new (ELeave) CAsyncCallBack(authCallback, CActive::EPriorityStandard);
+ }
+
+
+//
+// Partial implementation of the CNifAgentBase interface
+//
+
+EXPORT_C void CAgentBase::SetConnectionSettingsL(const TConnectionSettings& aSettings)
+/**
+SetConnectionSettings
+
+Used by Network Controller to set the database to
+reflect the settings selected by the user
+
+@param aSettings contains the connection settings selected by the user
+@exception leaves if there is a problem with access to the database
+*/
+ {
+ LOG_DETAILED( NifmanLog::Printf(_L("Agent %x:\t\tSetConnectionSettingsL(aSettings = 0x%08x)"), this, &aSettings); )
+
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ iSettings = aSettings;
+ iDatabase->GetCurrentSettingsL(iSettings, iSettings.iDirection, iSettings.iRank);
+ iDatabase->GetServiceSettingsL(iSettings);
+ iDatabase->SetCurrentSettingsL(iSettings);
+
+ LOG_DETAILED(
+ NifmanLog::Printf(_L("Agent %x:\t\tNew Connection Settings:"), this);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiRank = %d"), this, aSettings.iRank);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiDirection = %d"), this, aSettings.iDirection);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiDialogPref = %d"), this, aSettings.iDialogPref);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiBearerSet = %d"), this, aSettings.iBearerSet);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiIAPId = %d"), this, aSettings.iIAPId);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiServiceId = %d"), this, aSettings.iServiceId);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiServiceType = '%S'"), this, &(aSettings.iServiceType));
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiBearerId = %d"), this, aSettings.iBearerId);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiLocationId = %d"), this, aSettings.iLocationId);
+ NifmanLog::Printf(_L("Agent %x:\t\t\tiChargeCardId = %d"), this, aSettings.iChargeCardId);
+ )
+ }
+
+EXPORT_C TConnectionSettings& CAgentBase::ConnectionSettingsL()
+/**
+@return iSettings containing the connection settings selected by the user
+*/
+ {
+ return iSettings;
+ }
+
+EXPORT_C void CAgentBase::SetOverridesL(CStoreableOverrideSettings* aOverrideSettings)
+/**
+Transfer ownership of storeable override settings to this agent
+@param aOverrideSettings
+@note that since ownership of the override settings is transfered
+to this agent and they must be deleted in the d'tor
+*/
+ {
+ LOG_DETAILED( NifmanLog::Printf(_L("Agent %x:\t\tSetOverridesL(aOverrideSettings = 0x%08x)"), this, aOverrideSettings); )
+
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ if(iOverrides)
+ {
+ // we already have some overrides so free them before setting the new ones
+ delete iOverrides;
+ iOverrides = NULL;
+ }
+
+ iOverrides = aOverrideSettings;
+ iDatabase->SetOverridesL(aOverrideSettings);
+
+ // refresh settings
+// iDatabase->GetCurrentSettingsL(iSettings, iSettings.iDirection, iSettings.iRank);
+// iDatabase->SetCurrentSettingsL(iSettings);
+ }
+
+EXPORT_C CStoreableOverrideSettings* CAgentBase::OverridesL()
+/**
+Retrieve a pointer to the override settings owned by this agent
+
+@return aOverrideSettings
+@note that ownership of the override settings remains
+with this agent and they must not be deleted elsewhere
+*/
+ {
+ return iOverrides;
+ }
+
+EXPORT_C void CAgentBase::Reconnect()
+/**
+Request that the State Machine re-establishes a connection.
+*/
+ {
+ CNifMan::Global()->AgentDialogProcessor()->PromptForReconnect(*this);
+ }
+
+EXPORT_C void CAgentBase::CancelReconnect()
+/**
+Cancel a previous request to Reconnect.
+*/
+ {
+ CNifMan::Global()->AgentDialogProcessor()->CancelPromptForReconnect(*this);
+ }
+
+EXPORT_C void CAgentBase::Authenticate(TDes& aUsername, TDes& aPassword)
+/**
+A request from the NIF to Authenticate the User
+
+@param aUserName on return will contain the User Name
+@param aPassword on return will contain the Password
+@note Although the username and password are returned by this
+function the NIF should not use either parameter until it receives
+the AuthenticateComplete() signal.
+*/
+ {
+ __ASSERT_DEBUG(iDlgPrc, AgentPanic(Agent::ENullDialogProcessor));
+
+ iAuthenticateError = ReadDes(TPtrC(SERVICE_IF_AUTH_NAME), aUsername);
+ if (iAuthenticateError!=KErrNone)
+ {
+ iAuthenticateCallback->CallBack();
+ return;
+ }
+
+ iAuthenticateError = ReadDes(TPtrC(SERVICE_IF_AUTH_PASS), aPassword);
+ if (iAuthenticateError!=KErrNone)
+ {
+ iAuthenticateCallback->CallBack();
+ return;
+ }
+
+ TBool promptForAuth(EFalse);
+ iAuthenticateError = ReadBool(TPtrC(SERVICE_IF_PROMPT_FOR_AUTH), promptForAuth);
+ if (iAuthenticateError!=KErrNone)
+ {
+ iAuthenticateCallback->CallBack();
+ return;
+ }
+
+ // at this point all of the authentication parameters have been successfully read from the database
+ if (promptForAuth)
+ {
+ iDlgPrc->Authenticate(*this, aUsername, aPassword, IsReconnect());
+ }
+ else
+ {
+ iAuthenticateCallback->CallBack();
+ }
+ }
+
+EXPORT_C void CAgentBase::CancelAuthenticate()
+/**
+A request from the NIF to cancel authentication
+*/
+ {
+ __ASSERT_DEBUG(iDlgPrc, AgentPanic(Agent::ENullDialogProcessor));
+
+ iDlgPrc->Cancel();
+ iAuthenticateCallback->Cancel();
+ }
+
+EXPORT_C TBool CAgentBase::IsActive() const
+/**
+Is this Agent in use?
+
+@return ETrue always
+@todo RC to investigate use of IsActive()
+*/
+ {
+ return ETrue;
+ }
+
+//
+// Access to database settings
+//
+
+EXPORT_C TInt CAgentBase::DoReadInt(const TDesC& aField, TUint32& aValue,const RMessagePtr2* aMessage)
+/**
+Read an integer value from the database
+
+@param aField the name of the field to read from
+@param aValue on return, contains the value of the field
+@return KErrNotFound if the field is not present
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckReadCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->ReadInt( aField, aValue );
+ }
+
+#if defined (__FLOG_ACTIVE)
+
+ if (ret==KErrNone)
+ NifmanLog::Printf(_L("Agent %x:\t\tReadInt(aField = '%S', aValue = %d)"), this, &aField, aValue);
+ else
+ NifmanLog::Printf(_L("Agent %x:\t\tReadInt(aField = '%S', aValue) returning error %d"), this, &aField, ret);
+
+#endif
+
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoWriteInt(const TDesC& aField, TUint32 aValue,const RMessagePtr2* aMessage)
+/**
+Write an integer value to the database
+
+@param aField the name of the field to write to
+@param aValue contains the value of the field
+@return KErrNotFound if the field is not present
+ KErrNotSupported if the operation is not available
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckWriteCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->WriteInt( aField, aValue );
+ }
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoReadDes(const TDesC& aField, TDes8& aValue,const RMessagePtr2* aMessage)
+/**
+Read a descriptor value from the database
+
+@param aField the name of the field to read from
+@param aValue on return, contains the value of the field
+@return KErrNotFound if the field is not present
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckReadCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->ReadDes(aField, aValue);
+ }
+
+
+#if defined (__FLOG_ACTIVE)
+
+ if (ret==KErrNone)
+ NifmanLog::Printf(_L("Agent %x:\t\tReadDes(aField = '%S', aValue = %S)"), this, &aField, &aValue);
+ else
+ NifmanLog::Printf(_L("Agent %x:\t\tReadDes(aField = '%S', aValue) returning error %d"), this, &aField, ret);
+
+#endif
+
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoWriteDes(const TDesC& aField, const TDesC8& aValue,const RMessagePtr2* aMessage)
+/**
+Write a descriptor value to the database
+
+@param aField the name of the field to write to
+@param aValue contains the value of the field
+@return KErrNotFound if the field is not present
+ KErrNotSupported if the operation is not available
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckWriteCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->WriteDes(aField, aValue);
+ }
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoReadDes(const TDesC& aField, TDes16& aValue,const RMessagePtr2* aMessage)
+
+/**
+Read a descriptor value from the database
+
+@param aField the name of the field to read from
+@param aValue on return, contains the value of the field
+@return KErrNotFound if the field is not present
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckReadCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->ReadDes(aField, aValue);
+ }
+
+
+#if defined (__FLOG_ACTIVE)
+
+ if (ret==KErrNone)
+ NifmanLog::Printf(_L("Agent %x:\t\tReadDes(aField = '%S', aValue = '%S')"), this, &aField, &aValue);
+ else
+ NifmanLog::Printf(_L("Agent %x:\t\tReadDes(aField = '%S', aValue) returning error %d"), this, &aField, ret);
+
+#endif
+
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoWriteDes(const TDesC& aField, const TDesC16& aValue,const RMessagePtr2* aMessage)
+/**
+Write a descriptor value to the database
+
+@param aField the name of the field to write to
+@param aValue contains the value of the field
+@return KErrNotFound if the field is not present
+ KErrNotSupported if the operation is not available
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckWriteCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->WriteDes(aField, aValue);
+ }
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoReadBool(const TDesC& aField, TBool& aValue,const RMessagePtr2* aMessage)
+/**
+Read a Boolean value from the database
+
+@param aField the name of the field to read from
+@param aValue on return, contains the value of the field
+@return KErrNotFound if the field is not present
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckReadCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->ReadBool(aField, aValue);
+ }
+
+
+#if defined (__FLOG_ACTIVE)
+
+ if (ret==KErrNone)
+ NifmanLog::Printf(_L("Agent %x:\t\tReadBool(aField = '%S', aValue = %d)"), this, &aField, (TInt)aValue);
+ else
+ NifmanLog::Printf(_L("Agent %x:\t\tReadBool(aField = '%S', aValue) returning error %d"), this, &aField, ret);
+
+#endif
+
+ return ret;
+ }
+
+EXPORT_C TInt CAgentBase::DoWriteBool(const TDesC& aField, TBool aValue,const RMessagePtr2* aMessage)
+/**
+Write a Boolean value to the database
+
+@param aField the name of the field to write to
+@param aValue contains the value of the field
+@return KErrNotFound if the field is not present
+ KErrNotSupported if the operation is not available
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ TInt ret = CheckWriteCapability( aField, aMessage );
+ if( KErrNone == ret )
+ {
+ ret = iDatabase->WriteBool(aField, aValue);
+ }
+ return ret;
+
+ }
+
+EXPORT_C HBufC* CAgentBase::DoReadLongDesLC(const TDesC& aField,const RMessagePtr2* aMessage)
+/**
+Read a long descriptor value from the database
+
+Leaves if the allocation of the HBufC fails
+
+@param aField the name of the field to read from
+@return a pointer to the HBufC containing the data
+*/
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+
+ LOG_DETAILED( NifmanLog::Printf(_L("Agent %x:\t\tReadLongDesLC(aField = '%S')"), this, &aField); )
+
+ User::LeaveIfError( CheckReadCapability( aField, aMessage ) );
+ return iDatabase->ReadLongDesLC(aField);
+
+ }
+
+
+//
+// Service Change Notification
+//
+
+EXPORT_C void CAgentBase::RequestNotificationOfServiceChangeL(MAgentSessionNotify* aSession)
+/**
+A request for service change notification
+
+@param aSession the session interested in the notification
+@exception Leaves if aSession cannot be added to the container
+*/
+ {
+ // Storing who asked to be Notified for ServiceChangeNotification
+ User::LeaveIfError(iServiceChangeNotification.Append(aSession));
+ }
+
+EXPORT_C void CAgentBase::CancelRequestNotificationOfServiceChange(MAgentSessionNotify* aSession)
+/**
+Cancel a previous request for service change notification
+
+@param aSession the session wishing to cancel the notification
+*/
+ {
+ const TInt result = iServiceChangeNotification.Find(aSession);
+
+ if (result != KErrNotFound)
+ {
+ iServiceChangeNotification.Remove(result);
+ }
+ }
+
+EXPORT_C void CAgentBase::ServiceChangeNotification(TUint32 aId, const TDesC& aType)
+/**
+Notification of service change.
+This is the method through which the Agent receive notification about
+Service Change events and Notify about it who asked for that.
+
+@param aId New ISP
+@param aType New Service Type
+*/
+ {
+ const TInt count = iServiceChangeNotification.Count();
+
+ for (TInt i = 0; i < count; ++i)
+ {
+ iServiceChangeNotification[0]->ServiceChangeNotification(aId, aType);
+ iServiceChangeNotification.Remove(0);
+ }
+ }
+
+
+//
+// Callbacks used for authentication
+//
+
+TInt CAgentBase::AuthenticateCb(TAny* aThisPtr)
+/**
+AuthenticateCb
+
+@param aThisPtr pointer to the instance object that triggered the callback
+@return KErrNone
+*/
+ {
+ CAgentBase* self = (CAgentBase*)aThisPtr;
+
+ __ASSERT_DEBUG(self->iNotify, AgentPanic(Agent::ENullNifmanNotifyPointer));
+
+ LOG( NifmanLog::Printf(_L("Agent %x:\t\tAuthenticate callback complete"), self); )
+
+ self->iNotify->AuthenticateComplete(self->iAuthenticateError);
+ return KErrNone;
+ }
+
+EXPORT_C void CAgentBase::MDPOAuthenticateComplete(TInt aError)
+/**
+Authenticate dialog box has completed
+
+@param aError
+*/
+ {
+ __ASSERT_DEBUG(iNotify, AgentPanic(Agent::ENullNifmanNotifyPointer));
+
+ iNotify->AuthenticateComplete(aError);
+ }
+
+
+//
+// Implementation of MNetworkControllerObserver interface
+//
+
+EXPORT_C void CAgentBase::SelectComplete(const TDesC&)
+/**
+Panics the current thread with a USER 0 panic. Typically, this is called
+when a test for a class invariant fails, i.e. when a test which checks
+that the internal data of an object is self-consistent, fails.
+
+*/
+ {
+ User::Invariant();
+ }
+
+EXPORT_C void CAgentBase::SelectComplete(TInt)
+/**
+@see EXPORT_C void CAgentBase::SelectComplete(const TDesC&)
+*/
+ {
+ User::Invariant();
+ }
+
+EXPORT_C void CAgentBase::ReconnectComplete(const TInt aError)
+/**
+Reconnect dialog box has completed
+
+*/
+ {
+ __ASSERT_DEBUG(iNotify, AgentPanic(Agent::ENullNifmanNotifyPointer));
+
+ iNotify->ReconnectComplete(aError);
+ }
+
+EXPORT_C TInt CAgentBase::DoCheckReadCapability( const TDesC& aField, const RMessagePtr2* aMessage )
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+ return iDatabase->CheckReadCapability( aField, aMessage );
+ }
+
+EXPORT_C TInt CAgentBase::DoCheckWriteCapability( const TDesC& aField, const RMessagePtr2* aMessage )
+ {
+ __ASSERT_DEBUG(iDatabase, AgentPanic(Agent::ENullDatabase));
+ return iDatabase->CheckWriteCapability( aField, aMessage );
+ }
+
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+/*
+Retrieve the default bearer information to the Agent CPR
+@return default bearer information to the Agent CPR.
+*/
+EXPORT_C TUint32 CAgentBase::GetBearerInfo() const
+ {
+ //Return the default value, if the agent
+ //has not overridden this function
+ return KDefaultBearer;
+ }
+#endif //SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+