datacommsserver/esockserver/inc/SS_rslv.H
changeset 0 dfb7c4ff071f
child 24 00c6709d25aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/SS_rslv.H	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,260 @@
+// 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:
+//
+
+#if !defined(__SS_RSLV_H__)
+#define __SS_RSLV_H__
+
+#define SYMBIAN_NETWORKING_UPS
+
+#include <ss_std.h>
+#include <comms-infras/ss_flowbinders.h>
+#include "ss_flowrequest.h"
+
+#include <comms-infras/ss_nodemessages_dataclient.h>
+
+class CSockSession;
+class CPlayer;
+
+class CHostResolvProvdBase;
+struct TServerProtocolDesc;
+
+namespace ESock
+{
+
+class MFlowBinderControl;
+class MLowerDataSender;
+class CSubConnectionFlowBase;
+
+NONSHARABLE_CLASS(CHostResolver) : public CSockSubSession, public Messages::ASimpleNodeIdBase, public AIPCFlowRequester,
+								   public MResolverNotify,
+								   protected MUpperControl //workaround until we have app layer protocols
+#ifdef SYMBIAN_NETWORKING_UPS
+								 , private ASockSubSessionPlatsecApiExt
+#endif
+/**
+ @internalComponent
+ */
+	{
+	friend class ::ProtocolManager;
+	friend class ::CPlayer; //SetBlockedReq(..)
+public:
+	static CHostResolver* NewLC(CProtocolRef* aProtRef, CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+    virtual ~CHostResolver();
+
+	virtual Den::TSubSessInfo Type() const
+		{
+		return TCFSubSessInfo(TCFSubSessInfo::EHostResolver);
+		}
+
+	virtual Messages::RNodeInterface* ServiceProvider() const
+		{
+		return NULL;
+		}
+	TBool GetFlowAndSCPR(Messages::TNodeId& aFlow, Messages::TNodeId& aSCPR) const;
+
+	inline void SetResolver(CHostResolvProvdBase* aResolver);
+
+    void GetByNameL();
+	void Next();
+	void GetByAddressL();
+	void GetHostName();
+	void SetHostNameL();
+	void SetOptionL();
+
+    void QueryL(void);
+    void QueryGetNext(void);
+
+
+	void Cancel();
+	void QueryComplete(TInt anError);
+
+	inline TUint RequiresOwnerInfo() const;
+
+	virtual void ProcessMessageL();
+
+	void InitiateDestruction();
+
+protected:
+	void LockToConnectionInfo();
+	void LockToConnectionInfo(const TDesC8& aConnectionInfo);
+    void SetBlockedReq(const RMessage2& aMsg)
+        {
+        iBlockedReq = aMsg;
+        }
+protected:
+
+    //Messages::MNode
+
+	virtual void ReceivedL(
+		const Messages::TRuntimeCtxId& aSender,
+		const Messages::TNodeId& aRecipient,
+		Messages::TSignatureBase& aMessage
+		);
+
+#ifdef SYMBIAN_NETWORKING_UPS
+	// from ASockSubSessionPlatSecApiExt
+	TInt GetMessage(const RMessage2*& aMessage) const;
+#endif
+
+	//messages
+	void BindToL(const TCFDataClient::TBindTo& aBindTo);
+
+private:
+	CHostResolver(CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	void CreateL(CProtocolRef* aProtRef);
+	inline TUint RequiresConnectionStartup();
+	void HandleConnectionSetupL();
+	void FinalCompleteAllBlockedMessages(TInt aResult);
+    HBufC8* GetBuffer(HBufC8* apBuf, TInt aBufLenRequired);
+    TBool   GetQueryRespBuffer(void);
+    TBool   GetQueryBuffer(void);
+
+private:
+    //MUpperControl
+    virtual void StartSending();
+	virtual void Error(TInt aError);
+
+#ifdef SYMBIAN_NETWORKING_UPS
+	void InitialiseFlow(CSubConnectionFlowBase* aFlow);
+	TInt GetProcessAndThreadId(TProcessId& aProcessId, TThreadId& aThreadId) const;
+#endif 
+	void ReadAndSetOptionL();
+
+
+private:
+	CHostResolvProvdBase* iRSP;
+	MLowerControl* iLowerControl;
+	MLowerDataSender* iLowerDataSender;
+	MFlowBinderControl* iFlowBinderControl;
+	TBool iBusy : 1;
+	TBool iAwaitingConnection : 1;
+	RMessage2 iBlockedReq;
+	TNameRecord iNameRec;
+	TInt iCount;
+	TInt iCurrentOp;
+	TDblQueLink iInterfaceLink;			// for CInterface::iHostResolvers
+	TProtocolDesc* iProtocolInfo;
+
+    HBufC8* ipQryBuf;       //< pointer to the query data buffer heap descriptor
+    HBufC8* ipQryRespBuf;   //< pointer to the query response buffer heap descriptor
+
+    TPtr8   iPtrQryBuf;     //< Pointer descriptor, associated with ipQryBuf
+    TPtr8   iPtrQryResBuf;  //< Pointer descriptor, associated with ipQryRespBuf
+
+    };
+
+inline void CHostResolver::SetResolver(CHostResolvProvdBase* aResolver)
+	{iRSP=aResolver;}
+
+inline TUint CHostResolver::RequiresConnectionStartup()
+	{ return iProtocolInfo->iNamingServices & KNSRequiresConnectionStartup; };
+
+inline TUint CHostResolver::RequiresOwnerInfo() const
+	{
+	return (iProtocolInfo->iServiceInfo & KSIRequiresOwnerInfo);
+	}
+
+// ================================================================================================
+
+NONSHARABLE_CLASS(CServiceResolver) : public CSockSubSession, public MResolverNotify
+/**
+@internalComponent
+*/
+	{
+	friend class ProtocolManager;
+private:
+	CServiceResolver(CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	void CreateL();
+public:
+
+	static CServiceResolver* NewLC(CProtocolRef* aProtRef, CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	virtual Den::TSubSessInfo Type() const
+		{
+		return TCFSubSessInfo(TCFSubSessInfo::EServiceResolver);
+		}
+
+	virtual Messages::RNodeInterface* ServiceProvider() const
+		{
+		return NULL;
+		}
+
+	inline void SetResolver(CServiceResolvProvdBase* aResolver);
+	void GetByNameL();
+	void GetByNumber();
+	void RegisterServiceL();
+	void RemoveServiceL();
+	virtual ~CServiceResolver();
+	void Cancel();
+	void QueryComplete(TInt anError);
+
+	virtual void ProcessMessageL();
+private:
+	void FinalCompleteAllBlockedMessages(TInt aResult);
+private:
+	CServiceResolvProvdBase* iRSP;
+	RMessage2 iBlockedReq;
+	TBool iBusy;
+	TServiceName iNameBuf;
+	TInt32 iPortNum;
+	};
+
+inline void CServiceResolver::SetResolver(CServiceResolvProvdBase* aResolver)
+	{iRSP=aResolver;}
+
+NONSHARABLE_CLASS(CNetDatabase) : public CSockSubSession, public MResolverNotify
+/**
+@internalComponent
+*/
+	{
+	friend class ProtocolManager;
+private:
+	CNetDatabase(CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+public:
+	static CNetDatabase* NewLC(CProtocolRef* aProtRef, CSockSession* aSession, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	virtual Den::TSubSessInfo Type() const
+		{
+		return TCFSubSessInfo(TCFSubSessInfo::ENetDatabase);
+		}
+
+	virtual Messages::RNodeInterface* ServiceProvider() const
+		{
+		return NULL;
+		}
+
+	void RequestL();
+	inline void SetProvd(CNetDBProvdBase* aResolver);
+	virtual ~CNetDatabase();
+	void QueryComplete(TInt anError);
+	void Cancel();
+
+	virtual void ProcessMessageL();
+
+private:
+	void FinalCompleteAllBlockedMessages(TInt aResult);
+private:
+	CNetDBProvdBase* iRSP;
+	RMessage2 iBlockedReq;
+	TBool iBusy;
+	HBufC8* iBuf;
+	TPtr8* iBufPtr;
+	};
+
+inline void CNetDatabase::SetProvd(CNetDBProvdBase* aResolver)
+	{iRSP=aResolver;}
+
+} //namespace ESock
+
+#endif
+// __SS_RSLV_H__