diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/csock/cs_connectionserv.cpp --- /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 +#include +#include +#include "cs_connectionservimpl.h" +#include +#include +#include +#include +#include + + +#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(); + } + +