datacommsserver/esockserver/csock/cs_connectionserv.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/csock/cs_connectionserv.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,165 @@
+// 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
+ @publishedPartner
+ @released since 399
+*/
+
+#include <ecom/ecom.h>
+#include <es_sock.h>
+#include <comms-infras/es_connectionserv.h>
+#include "cs_connectionservimpl.h"
+#include <comms-infras/es_connectionservermessages.h>
+#include <connpref.h>
+#include <comms-infras/ss_log.h>
+#include <rsshared.h>
+#include <es_ver.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ESockCSockcscnct, "ESockCSockcscnct");
+#endif
+
+
+using namespace ConnectionServ;
+
+
+_LIT(KConnectionServerName, "!ConnectionServer");
+
+EXPORT_C RConnectionServ::RConnectionServ() :
+	iConnectionServImpl(0)
+/**
+ Empty ctor
+ */
+	{
+	LOG( ESockLog::Printf(_L8("RConnectionServ %08x:\tRConnectionServ() tid %d"), this, (TUint)RThread().Id()); );
+	}
+
+
+EXPORT_C TInt RConnectionServ::Connect(TUint aTierId)
+/** Opens a session to the connection server.
+
+RHandleBase::Close() should be called once the session is no longer required.
+All resources which are opened using the session will be automatically closed
+when the session terminates.
+
+@return KErrNone if successful, otherwise another of the system-wide error
+codes. */
+	{
+	LOG( ESockLog::Printf(_L8("RConnectionServ %08x:\tConnect() tid %d tier %d"), this, (TUint)RThread().Id(), aTierId ));
+#ifndef __ESOCK_SUPPRESS_ESOCK_HANDLE_OVERWRITE_PANICS
+	__ASSERT_DEBUG(Handle() == 0, User::Panic(KSpecAssert_ESockCSockcscnct, 1));
+	__ASSERT_DEBUG(iConnectionServImpl == 0, User::Panic(KSpecAssert_ESockCSockcscnct, 2));
+#endif
+
+	if(Handle())
+		{
+		return KErrInUse;
+		}
+
+	TVersion ver(KES32MajorVersionNumber,KES32MinorVersionNumber,KES32BuildVersionNumber);
+	TInt result = CreateSession(KConnectionServerName,ver,8,EIpcSession_Sharable);
+
+	if (result==KErrNotFound)
+		{
+		result=StartC32Full();
+		if (result==KErrNone || result==KErrAlreadyExists)
+			{
+			const TUint numberOfConcurrentRequests = 8;
+
+			// If this connection attempt also fails then most likely the connection server is
+			// not enabled in the current configuration.
+			result=CreateSession(KConnectionServerName,ver,numberOfConcurrentRequests,EIpcSession_Sharable);
+			}
+		}
+
+	if(result != KErrNone)
+		{
+		this->Close();
+		return result;
+		}
+
+	__ASSERT_DEBUG(Handle(), User::Panic(KSpecAssert_ESockCSockcscnct, 3));
+
+    result = SendReceive(ECMAttachToTierManager, TIpcArgs(aTierId));
+	
+	if(result != KErrNone)
+		{
+		this->Close();
+		return result;
+		}
+
+	if( iConnectionServImpl == 0 )
+		{
+		TRAP(result, iConnectionServImpl = CConnectionServImpl::NewL(*this));
+		if (result != KErrNone)
+    		{
+    		this->Close();
+    		}
+		}
+
+	return result;
+	}
+
+
+EXPORT_C void RConnectionServ::Close()
+/**
+ Closes the comms manager sub-session
+
+ Delete owned object and drop to base class
+ */
+	{
+	LOG( ESockLog::Printf(_L8("RConnectionServ%08x:\tClose() tid %d"), this, (TUint)RThread().Id()); );
+	delete iConnectionServImpl; // this causes any requests to be cancelled
+	iConnectionServImpl = 0;
+	RSessionBase::Close();
+	
+	// The API uses ECom types.. This is the last time we get to attempt a cleanup.
+	// This call does no harm if the types are still in use (e.g. stored by client code).
+	REComSession::FinalClose();
+	}
+
+
+// Asynchronous multiple-IPC functions. Proxy them through to the active objects which handle them, via the impl object.
+
+EXPORT_C void RConnectionServ::AccessPointStatusQuery(const CConnectionServParameterBundle& aQuery, CConnectionServParameterBundle& aResult, TRequestStatus& aStatus)
+	{
+	__ASSERT_ALWAYS(iConnectionServImpl != NULL, User::Panic(KConnectionServerName, KErrBadHandle));
+	iConnectionServImpl->AccessPointStatusQuery(aQuery,aResult,aStatus);
+	}
+
+EXPORT_C void RConnectionServ::CancelAccessPointStatusQuery()
+	{
+	__ASSERT_ALWAYS(iConnectionServImpl != NULL, User::Panic(KConnectionServerName, KErrBadHandle));
+	iConnectionServImpl->CancelAccessPointStatusQuery();
+	}
+
+EXPORT_C void RConnectionServ::AccessPointNotification(const CConnectionServParameterBundle& aQuery, MAccessPointNotificationObserver& aObserver)
+	{
+	__ASSERT_ALWAYS(iConnectionServImpl != NULL, User::Panic(KConnectionServerName, KErrBadHandle));
+	iConnectionServImpl->AccessPointNotification(aQuery,aObserver);
+	}
+
+EXPORT_C void RConnectionServ::CancelAccessPointNotification()
+	{
+	__ASSERT_ALWAYS(iConnectionServImpl != NULL, User::Panic(KConnectionServerName, KErrBadHandle));
+	iConnectionServImpl->CancelAccessPointNotification();
+	}
+
+