linklayercontrol/networkinterfacemgr/agentprcore/inc/CAgentAdapter.h
changeset 0 af10295192d8
child 53 7e41d162e158
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayercontrol/networkinterfacemgr/agentprcore/inc/CAgentAdapter.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,217 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+
+#ifndef CAGENTADAPTER_H
+#define CAGENTADAPTER_H
+
+
+#include <comms-infras/nifagt.h>
+#include <comms-infras/ss_nodemessages.h> //TStateChange
+#include <comms-infras/ss_nodemessages_legacy.h>
+#include <comms-infras/ss_nodemessages_legacy_internal.h>
+#include <comms-infras/ss_legacyinterfaces.h>
+#include <comms-infras/responsemsg.h>
+#include <comms-infras/nifprvar_internal.h>
+
+class CAgentSubConnectionProvider;
+class CNifAgentBase;
+class CAgentCprDataAccess;
+class CAgentAdapterSessionNotifier;
+
+namespace ESock
+	{
+	class MPlatsecApiExt;
+	}
+
+/**
+This is the Agent Adapter for new style NIFs/SCPRs/CPRs
+It is created and owned by Link Layer MCPRs and passed to the left in
+the BindTo messages. It is controlled ONLY by the SCPR.  
+
+@internalTechnology
+@prototype
+*/
+NONSHARABLE_CLASS(CAgentAdapter) : public CBase, private MNifAgentNotify, 
+	public ESock::MLinkCprServiceChangeNotificationApiExt
+    {
+    friend class CAgentCprDataAccess;
+    friend class CAgentConnectionProvider;
+    friend class CAgentAdapterSessionNotifier;
+    
+public:
+    enum TAgentState
+        {
+        EDisconnected,
+        EConnecting,
+        EConnected,
+        EDisconnecting,
+        EReconnecting
+        };
+
+    static CAgentAdapter* NewL(CAgentSubConnectionProvider& aAgentScpr, const TDesC& aAgentName);
+    ~CAgentAdapter();
+
+    void ConnectAgent(TAgentConnectType aConnectType);
+    void DisconnectAgent(TInt aReason);
+    void PromptForReconnect();
+    void Authenticate(TDes& aUsername, TDes& aPassword);
+    void CancelAuthenticate();
+
+    // Database Access Methods
+    TInt ReadNifName(TDes8& aNifName);
+    TInt ReadPortName(TDes8& aPortName);
+    TInt ReadIfParams(TDes8& aIfParams);
+    TInt ReadIfNetworks(TDes8& aIfNetworks);
+
+    TInt ReadNifName(TDes16& aNifName);
+    TInt ReadPortName(TDes16& aPortName);
+    TInt ReadIfParams(TDes16& aIfParams);
+    TInt ReadIfNetworks(TDes16& aIfNetworks);
+
+    TInt ReadExcessData(TDes8& aBuffer);
+    TInt QueryIsDialIn();
+
+    TInt NotificationToAgent(TFlowToAgentEventType aEvent, TAny* aInfo);
+
+    inline const TAgentState AgentState() const;
+    
+    TInt Control(TUint aOptionLevel, TUint aOptionName, TDes8& aOption, ESock::MPlatsecApiExt* aPlatsecItf);
+	void ClientAttachControl();
+	
+	// From MLinkCprServiceChangeNotificationApiExt Interface
+	void RequestServiceChangeNotificationL(const Messages::TNodeId& aSender, ESock::RLegacyResponseMsg& aResponse);
+	void CancelServiceChangeNotification(const Messages::TNodeId& aSender);
+
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	inline CNifAgentBase * Agent() const; 
+#endif //SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+protected:
+    CAgentAdapter(CAgentSubConnectionProvider& aAgentScpr);
+    inline CAgentSubConnectionProvider& AgentScpr() const;
+
+private:
+    // MNifAgentNotify Interface
+    virtual void ConnectComplete(TInt aStatus);
+    virtual void ReconnectComplete(TInt aStatus);
+    virtual void AuthenticateComplete(TInt aStatus);
+    virtual void DisconnectComplete();
+    virtual void AgentProgress(TInt aStage, TInt aError);
+    virtual TInt Notification(TAgentToNifEventType aEvent, TAny* aInfo = NULL);
+    virtual void AgentEvent(TNetworkAdaptorEventType aEventType, TUint aEvent, const TDesC8& aEventData, TAny* aSource=0);
+    virtual void ServiceStarted();
+
+    // MNifAgentNotify Interface (Empty implementations)
+    virtual TInt IncomingConnectionReceived();
+    virtual void ServiceClosed();
+    virtual void AgentProgress(TSubConnectionUniqueId aSubConnectionUniqueId, TInt aStage, TInt aError);
+
+    CNifFactory* FindOrCreateAgentFactoryL(const TDesC& aFilename);
+    void CreateAgentL(const TDesC& aAgentName);
+    
+private:
+    CAgentSubConnectionProvider& iAgentScpr;
+    CNifAgentBase* iAgent;
+    CNifAgentFactory* iFactory;
+    TAgentState iAgentState; 
+    TAgentConnectType iAgentConnectType;
+    Elements::TStateChange iLastProgress;
+	RPointerArray<CAgentAdapterSessionNotifier> iAgentAdapterSessionNotifiers;
+    };
+
+
+CAgentSubConnectionProvider& CAgentAdapter::AgentScpr() const
+    {
+    return iAgentScpr;
+    }
+
+
+const CAgentAdapter::TAgentState CAgentAdapter::AgentState() const
+    {
+    return iAgentState;
+    }
+    
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+/**
+ * Returns the agent 
+ * @param none
+ * @return Interface of the Nifman/Agent
+**/
+CNifAgentBase *CAgentAdapter::Agent() const
+	{
+   	return iAgent;
+ 	}
+#endif //SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+/**
+ * This class is an Adapter to allow CAgentBase to Notify for
+ * ServiceChangeNotification post-399.
+ * 
+ * @internalTechnology
+ * @prototype */
+NONSHARABLE_CLASS(CAgentAdapterSessionNotifier) : public CBase,
+	public MAgentSessionNotify
+    {
+private:
+	// Phase #1 Constructor
+	CAgentAdapterSessionNotifier (CAgentAdapter* aCreator,
+			const Messages::TNodeId& aSender);
+	
+	// Phase #2 Constructor
+	void ConstructL (ESock::RLegacyResponseMsg& aResponseMsg);
+public:
+	// 2-Phase Static Constructor
+	static CAgentAdapterSessionNotifier* NewL(CAgentAdapter* aCreator,
+			const Messages::TNodeId& aSender,
+			ESock::RLegacyResponseMsg& aResponseMsg);
+	
+	// 2-Phase Static Constructor. In this case it builds an "empty" Notifier.
+	static CAgentAdapterSessionNotifier* NewL(CAgentAdapter* aCreator,
+				const Messages::TNodeId& aSender);
+	
+	// Virtual Destructor
+	virtual ~CAgentAdapterSessionNotifier();
+
+	// Operator to allow the usage of Find(...) inside a R(Pointer)Array container
+	virtual TBool operator== (const CAgentAdapterSessionNotifier& aOtherInstanceOfThisClass) const;
+	
+	// Return an Id that identify this Agent Session
+	virtual const Messages::TNodeId& NodeId() const;
+
+	// Implementation of MAgentSessionNotify interface
+    virtual void ServiceChangeNotification(TUint32 aId, const TDesC& aType);
+    
+    virtual void CancelServiceChangeNotification(TInt aReason = KErrCancel);
+    
+private:
+	/** This identify "who" asked for being notified. */
+	Messages::TNodeId iSender;
+	/** The RResponseMsg to use to answer(notify) the request. */
+	ESock::RLegacyResponseMsg* iResponseMsg;
+	/** The AgentAdapter which has created this object.
+	 * This Pointer allows this CAgentAdapterSessionNotifier to remove
+	 * itself from the Array in the Creator (Queue of S.C. Notifications) */
+	CAgentAdapter* iCreator;
+    };
+
+#endif
+// CAGENTADAPTER_H
+