vpnengine/vpnconnagt/inc/vpnconnagt.h
changeset 0 33413c0669b9
child 2 ef893827b4d1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/vpnconnagt/inc/vpnconnagt.h	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,760 @@
+/*
+* Copyright (c) 2000-2006 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:   VPN Connection Agent declaration.
+
+*
+*/
+
+
+
+
+
+/**  
+
+ * @file vpnconnagt.h
+
+ *
+
+ * VPN Connection Agent declaration.
+
+ *
+
+ */
+
+
+
+
+
+#if !defined __VPN_CONN_AGT_H__
+
+#define __VPN_CONN_AGT_H__
+
+
+
+// INCLUDES
+
+#include <comms-infras/cagentbase.h>
+
+
+
+#include "eventmediatorapi.h"
+
+
+
+#include "vpnconnagtprog.h"
+
+#include "vpnconnagtdefs.h"
+
+#include "eventdefssit.h"
+
+#include "log_r6.h"
+
+
+
+// CONSTANTS
+
+const TInt KMajorVerNumber=1;
+
+const TInt KMinorVerNumber=0;
+
+const TInt KBuildVerNumber=0;
+
+
+
+_LIT(KVPNConnAgtName,"vpnconnagt");
+
+
+
+class CAsyncDisconnecter;
+
+
+
+/**
+
+ * A Factory for creating a VPNConnAgent.
+
+ */
+
+class CVPNConnAgtFactory : public CNifAgentFactory
+
+    {
+
+    /**
+
+    @internalComponent
+
+    */
+
+    protected:  // Methods
+
+
+
+        /**
+
+         * "Installs" this factory to the system. From this Agent point of view
+
+         * it doesn't do anything...
+
+         */
+
+        void InstallL();
+
+
+
+        /**
+
+         * Creates a new VPN Agent instance.
+
+         * @param aName Not used.
+
+         * @return Returns the pointer to the agent created if succeed. Otherwise it
+
+         * leaves.
+
+         */
+
+        CNifAgentBase *NewAgentL(const TDesC& aName);
+
+
+
+        /**
+
+         * Returns the information defined in TNifAgentInfo.
+
+         * @param aInfo The reference to the TNifAgentInfo object to be used to pass
+
+         * the needed information.
+
+         * @param aIndex Not used.
+
+         */
+
+        TInt Info(TNifAgentInfo& aInfo, TInt aIndex) const;
+
+    };
+
+
+
+
+
+/**
+
+ * Class declaration for VPN connection agent. Each agent reference
+
+ * has it's own instance of agent and nif. Nif sends it's name via
+
+ * agent reference to agent. This triggers agent to initialize the VPN connection
+
+ * through the VPN Manager Server. After VPN tunnel has been created
+
+ * agent sends the IP address and the DNS addresses to the nif which
+
+ * in turn informs the Nifman and IP stack that the connection has
+
+ * been created.
+
+ */
+
+class CVPNConnAgt : public CAgentBase, public MEventObserver
+
+    {
+
+    /**
+
+    @internalComponent
+
+    */
+
+    friend class CAsyncDisconnecter;
+
+    public: // Methods
+
+
+
+        /**
+
+         * Static constructor.
+
+         * @return The return value is the pointer to the CVPNConnAgt
+
+         * if it succeed. Otherwise the fuction leaves.
+
+         */
+
+        static CVPNConnAgt* NewL();
+
+
+
+        /**
+
+         * Default C++ destructor.
+
+         * Cancels all the Callbacks.
+
+         */
+
+        virtual ~CVPNConnAgt();
+
+        
+
+        // from CNifAgentBase
+
+        /**
+
+         * Returns the information defined in TNifAgentInfo.
+
+         * @param aInfo A reference to TNifAgentInfo object which is
+
+         * used to pass the information to caller of this function.
+
+         */
+
+        void Info(TNifAgentInfo& aInfo) const;
+
+
+
+        /**
+
+         * Starts the connection creation process.
+
+         * @param aType Not used.
+
+         */
+
+        void Connect(TAgentConnectType aType);
+
+
+
+        /**
+
+         * Starts the connection by calling Connect(TAgentConnectType aType).
+
+         * @param aType Type of the connection e.g. EAgentReconnect.
+
+         * @param aOverrideSettings Not used.
+
+         */
+
+        void Connect(TAgentConnectType aType, CStoreableOverrideSettings* aOverrideSettings);
+
+
+
+        /**
+
+         * Starts the cancellation of the connect.
+
+         */
+
+        void CancelConnect();
+
+
+
+        /**
+
+         * Disconnects an ongoing connection.
+
+         * @param aReason Not used.
+
+         */
+
+        void Disconnect(TInt aReason);
+
+
+
+        /**
+
+         * Called after Connect() in connection creation phase. Connection configuration
+
+         * parameters are read and request for the VPNManServer to open the connection
+
+         * is done. During the execution of this function VPN Nif is created.
+
+         * @param aError Not used.
+
+         */
+
+        void ServiceStarted(TInt& aError);
+
+
+
+        /**
+
+         * The addresses got from the VPN Manager Server are send to VPN Nif.
+
+         * Nifman is informed with the progress call (with parameter EVPNConnAgtConnected).
+
+         * MNifAgentNotify interface's ConnectComplete() is called (this generates the Start()
+
+         * call to VPN Nif.
+
+         * @param aError Not used.
+
+         */
+
+        void ConnectionComplete(TInt aError);
+
+
+
+        /**
+
+         * Causes the deactivationing/unloading of the VPN Policies.
+
+         */
+
+        void DisconnectionComplete();
+
+
+
+        /**
+
+         * Not Supported.
+
+         * @param aBuffer Not used.
+
+         * @return Always returns KErrNotSupported.
+
+         */
+
+        TInt GetExcessData(TDes8& aBuffer);
+
+
+
+        /**
+
+         * Used to deliver the name of the VPN Nif to the VPN Agent.
+
+         * @param aEvent If the value of this is ENifToVPNAgentEventTypeIfName the name of the
+
+         * VPN Nif is copied from the aInfo parameter.
+
+         * @param aInfo TName type pointer containing the name of the VPN NIf (if aEvent value is
+
+         * ENifToVPNAgentEventTypeIfName).
+
+         * @return Returns KErrNone if the fuction is used to deliver the name of the VPN Nif,
+
+         * otherwise it returns KErrNotSupported.
+
+         */
+
+        TInt Notification(TNifToAgentEventType aEvent, TAny* aInfo);
+
+
+
+        /**
+
+         * Passes the last error code to the caller.
+
+         * @param aError Reference to the TInt type error code.
+
+         */
+
+        void GetLastError(TInt& aError);
+
+
+
+        /**
+
+         * 
+
+         */
+
+        TBool IsReconnect() const {return (ETrue);};
+
+
+
+        /**
+
+         * Not supported.
+
+         */
+
+        TInt IncomingConnectionReceived();
+
+
+
+        /**
+
+         * Is called when an event comes from real interface via event mediator.
+
+         * @param aStatus Error code if the call fails. KErrNone if everything succees.
+
+         * @param aType Type pf the event e.g. ESingleInterfaceEvent.
+
+         * @param aData Pointer to the TInterfaceNotificationBuf type packaged buffer. Contains
+
+         * the status of the real interface.
+
+         */
+
+        void EventOccured(TInt aStatus, TEventType aType, TDesC8* aData);
+
+
+
+    protected:  // Methods
+
+
+
+        /**
+
+         * Overwrites the default implementation to catch the ip version reading from the
+
+         * database. This value is retrieved from the VPN Manager Server.
+
+         * @param aField Colum name in the CommDb. Ip version colum name is SERVICE_IF_NETWORKS.
+
+         * @param aValue Value to be returned. In SERVICE_IF_NETWORKS case it's ip or ip6.
+
+		 * @param aMessage Message to validate capabilities
+
+         * @return Returns KErrNone if the function succeed. Otherwise it returns system wide
+
+         * error code.
+
+         */
+
+        TInt DoReadDes(const TDesC& aField, TDes16& aValue, const RMessagePtr2* aMessage );
+
+
+
+
+
+        /**
+
+         * Returns the pointer to the parameter object defined in vpnconnagtdefs.h.
+
+         * @return The pointer to the connection parameter object.
+
+         */
+
+        TVPNParameters* VPNParameters() { return &iVPNParameters; };
+
+
+
+        /**
+
+         * Returns the pointer to the name of the VPN Nif sent by the nif itself.
+
+         * @return The pointer to the TName type object containing the name of the
+
+         * VPN Nif.
+
+         */
+
+        TName* VPNNifName(void){ return iVPNParameters.GetVPNNifName();};
+
+
+
+        /**
+
+         * Returns the pointer to the interface from the Agent to Nifman. This interface
+
+         * is used to e.g. send progress notifications from Agent to Nifman.
+
+         * @return The pointer to the interface from the Agent to Nifman.
+
+         */
+
+        MNifAgentNotify* Notify() { return iNotify; };
+
+
+
+        /**
+
+         * After deactivationing/unloading of the VPN Policies Nifman is informed with the
+
+         * progress call (with EVPNConnAgtDisconnected).
+
+         * MNifAgentNotify interface's DisconnectComplete() is called (this generates the deletion
+
+         * of the VPN Nif and at the end deletion of the agent.
+
+         * 
+
+         */
+
+        void VPNDisconnCompleted(TInt aError);
+
+
+
+    private:    // Methods
+
+
+
+        /**
+
+         * Second phase constructor.
+
+         */
+
+        void ConstructL();
+
+
+
+        /**
+
+         * Default constructor.
+
+         */
+
+        CVPNConnAgt();
+
+
+
+        /**
+
+         * CallBack to start the service (means the connection creation).
+
+         * @param aThisPtr Pointer to the CVPNConnAgt type object.
+
+         * @return Always returns KErrNone. 
+
+         */
+
+        static TInt ServiceStartedCb(TAny* aThisPtr);
+
+
+
+        /**
+
+         * CallBack to complete the connection.
+
+         * @param aThisPtr Pointer to the CVPNConnAgt type object.
+
+         * @return Always returns KErrNone. 
+
+         */
+
+        static TInt ConnectCompleteCb(TAny* aThisPtr);
+
+
+
+        /**
+
+         * CallBack to disconnect.
+
+         * @param aThisPtr Pointer to the CVPNConnAgt type object.
+
+         * @return Always returns KErrNone. 
+
+         */
+
+        static TInt DisconnectCompleteCb(TAny* aThisPtr);
+
+
+
+        /**
+
+         * Reads needed configuration settings from the CommDb database.
+
+         */
+
+        void ReadConfigurationL();
+
+
+
+        /**
+
+         * Starts the listening of real interface events.
+
+         */
+
+        void ListenRealIAP();
+
+
+
+        /**
+
+         * Starts the listening of virtual nif address change event.
+
+         */
+
+        void ListenAddressChange();
+
+
+
+        /**
+
+         * Cancels the listening of the real interface events and the
+
+         * listening of virtual nif address change event.
+
+         */
+
+        void CancelListeners();
+
+
+
+
+
+    private:
+
+
+
+        /**
+
+         * Defines the internal states.
+
+         */
+
+        enum TRequestState
+
+            {
+
+            EGettingProtocolVersion,
+
+            EConnecting,
+
+            EConnected,
+
+            EClosingConnection,
+
+            EConnectionClosed,
+
+            EStartingRealIf,
+
+            EListeningEvents,
+
+            EIdle
+
+            };
+
+
+
+
+
+        /** CallBack object to implement ServiceStarted asynchronously. */
+
+        CAsyncCallBack      iServiceStartedCallback;
+
+
+
+        /** CallBack object to implement ConnectCompleted asynchronously. */
+
+        CAsyncCallBack      iConnectCompleteCallback;
+
+
+
+        /** CallBack object to implement Disconnect asynchronously. */
+
+        CAsyncCallBack      iDisconnectCallback;
+
+
+
+        /** Defines wether Agent is connected (Connection completed successfully). */
+
+        TBool               iConnected;
+
+
+
+        /** Connection configuration parameter member object. See vpnconnagtdefs.h. */
+
+        TVPNParameters      iVPNParameters;
+
+
+
+        /** An integer to keep last error code in memory. */
+
+        TInt                iLastErrorCode;
+
+
+
+        /** An API to EventMediator */
+
+        REventMediator      iEventMediator;
+
+        
+
+        /** Tells if vpnconnagt must close tunnelnif */
+
+        TBool               iEventActivatedClose;
+
+
+
+        /** This defines the shutdown type to the kmd. Value 0 is normal and 1 is to 
+
+            force it to shutdown without trying to send any packets anymore */
+
+        TDeactivateType		iDisconnectType;
+
+
+
+        /* State of the agent object */
+
+        TRequestState       iState;
+
+
+
+        /** Boolean to define wether disconnecting operation is ongoing */
+
+        TBool               iDisconnecting;
+
+
+
+        /** PckgBufs used when creating connection through eventmediator api */
+
+        TPckgBuf<TGetProtocolVersionEventSpec>  iProtocolVersionDes;
+
+        TPckgBuf<TStartVpnConnEventSpec>        iStartVpnConnDes;
+
+        TPckgBuf<TCloseVpnConnEventSpec>        iCloseVpnConnDes;
+
+        TPckgBuf<TObserveRealIapConnEventSpec>  iObserveRealIapConnDes;
+
+
+
+        /** Poiter to an object which confirms disconnect operation to Nifman */
+
+        CAsyncDisconnecter* iAD;
+
+    };
+
+
+
+class CAsyncDisconnecter : public CAsyncOneShot
+
+    {
+
+    /**
+
+    @internalComponent
+
+    */
+
+    public:
+
+        static CAsyncDisconnecter* NewL(CVPNConnAgt* aAgent);
+
+        void ConfirmDisconnect();
+
+
+
+    private:
+
+        CAsyncDisconnecter(CVPNConnAgt* aAgent);
+
+        void RunL(); // From CAsyncOneShot
+
+
+
+    private:
+
+        CVPNConnAgt*    iAgent;
+
+    };
+
+
+
+#endif // VPN_CONN_AGT_H
+