diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_sysinfo/sysinfoservice/src/sysconnectionrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_sysinfo/sysinfoservice/src/sysconnectionrequest.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,466 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: class implementation +* +*/ + + +#include "sysinfoservice.h" +#include "sysconnectionrequest.h" +#include "sysrequest.h" + +const TInt KGranularity(2); + +// -------------------------------------------------------------------- +// CConnection::CConnection() +// C++ default constructor. +// -------------------------------------------------------------------- +// +CConnection::CConnection( TSysRequest::TRequestType aReqType, TInt32 aTransID, + ISystemObserver* aObsrver): + CActiveRequest(aReqType,aTransID,aObsrver), + iConnectionCount(0), iConnectionIndex(1), + iConnectionInfoArray(KGranularity), + iConnectionInit(ETrue) + { + } + +// -------------------------------------------------------------------- +// CConnection::~CConnection() +// Destructor. +// -------------------------------------------------------------------- +// +CConnection::~CConnection() + { + Cancel(); + + iConnectionInfoArray.Close(); + iConnMonitor.Close(); + + delete iReadConnectionInfo; + + delete iEntity; + delete iKey; + } + +// -------------------------------------------------------------------- +// CConnection::NewL +// Two-phased constructor, returns instance of this class. +// -------------------------------------------------------------------- +// +CConnection* CConnection::NewL(const TSysRequest& aRequest) + { + CConnection* self; + self = new (ELeave) CConnection(aRequest.RequestType(), + aRequest.TransactionID(), aRequest.Observer()); + + CleanupStack::PushL(self); + self->ConstructL (aRequest); + CleanupStack::Pop(self); + + return self; + } + +// -------------------------------------------------------------------- +// CConnection::ConstructL +// 2nd Phase constructor to allocate required resources for this obj. +// -------------------------------------------------------------------- +// +void CConnection::ConstructL(const TSysRequest& aRequest) + { + //connect + User::LeaveIfError(iConnMonitor.ConnectL()); + + // Make local copy of SA. + iEntity = aRequest.Entity().AllocL(); + + iKey = aRequest.Key().AllocL(); + } + +// -------------------------------------------------------------------- +// CConnection::Request +// Issues connection request. +// -------------------------------------------------------------------- +// +TInt CConnection::Request() + { + TInt err = KErrNone; + if( !IsActive() ) + { + //Retrieve all connections. + iConnMonitor.GetConnectionCount(iConnectionCount, iStatus); + SetActive(); + if(TSysRequest::ENotification == RequestType()) + TRAP(err,iConnMonitor.NotifyEventL(*this)); + } + return err; + } + +// -------------------------------------------------------------------- +// CConnection::RunL +// Gets called in event of request completion or error situation. +// -------------------------------------------------------------------- +// +void CConnection::RunL() + { + TSysRequest::TRequestType ReqType = RequestType(); + TInt32 transId = this->TransactionID(); + TInt error(iStatus.Int()); + + if(error >= KErrNone) + { + // Read All Connected Connection IDs. + for(TInt i=1; i<=iConnectionCount; i++) + { + TUint ConnectioID,IgnoreSubConnects; + iConnMonitor.GetConnectionInfo(i, ConnectioID, IgnoreSubConnects); + iConnectionIds[i-1] = ConnectioID; + } + + // read if thr are connections. + if ( iConnectionCount > 0 ) + { + //read the connections. + ReadNextConnectionL(); + } + else if( ReqType == TSysRequest::EASyncONESHOT ) + { + //create a copy of SA for response. + CConnectionList* connList = CConnectionList:: + NewL(iConnectionInfoArray); + //call observer. + TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity,*iKey, + connList,transId,RequestType(),error)); + //remove this from active store. + ActiveStore::RemoveRequest(transId); + } + } + else // in case error. + { + //call observer. + TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity,*iKey, + NULL,transId,RequestType(),error)); + } + } + +// -------------------------------------------------------------------- +// CConnection::HandleConnectionInfoL +// Gets called when an ConnectionID Connection information is read. +// -------------------------------------------------------------------- +// +void CConnection::HandleConnectionInfoL(CConnectionInfo*& aInfo,TInt error) + { + TInt32 transId = this->TransactionID(); + iReadConnectionInfo = NULL; + + if(TSysRequest::ENotification == RequestType()) + { + iConnectionInfoArray.AppendL(aInfo); + if( !iConnectionInit ) + { + CConnectionInfo* conninfo = aInfo->CopyL(); + TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, + conninfo, transId, RequestType(), error)); + } + } + else + { + //Inc index. + ++iConnectionIndex; + + //Add connection info to RArrayPointer. + if( !error ) + iConnectionInfoArray.AppendL(aInfo); + + // check if some more connections exists. + if( iConnectionIndex <= iConnectionCount) + { + ReadNextConnectionL(); + // don't send response. + return; + } + + //create a ConnectionList object. + CConnectionList* connList = CConnectionList::NewL(iConnectionInfoArray); + //call observer. + TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, + connList, transId, RequestType(), error)); + + // Remove this from active store. + ActiveStore::RemoveRequest(TransactionID()); + } + } + +// -------------------------------------------------------------------- +// CConnection::ReadNextConnectionL +// Creates CReadConnectionInfo request for an ConnectionID. +// -------------------------------------------------------------------- +// +void CConnection::ReadNextConnectionL() + { + iReadConnectionInfo = CReadConnectionInfo::NewL(iConnMonitor, + iConnectionIds[iConnectionIndex-1], + this,CConnectionInfo::EConnected, + TSysRequest::EASyncONESHOT); + + iReadConnectionInfo->Request(); + } + +// -------------------------------------------------------------------- +// CConnection::DoCancel +// cancel any notificatons. +// -------------------------------------------------------------------- +// +void CConnection::DoCancel() + { + TSysRequest::TRequestType ReqType = RequestType(); + if(ReqType ==TSysRequest::ENotification ) + iConnMonitor.CancelNotifications(); + } + +// -------------------------------------------------------------------- +// CConnection::EventL +// gets called whenever there is change in connections. +// -------------------------------------------------------------------- +// +void CConnection::EventL(const CConnMonEventBase& aEvent) + { + TUint connectionId =0; + CReadConnectionInfo* rdConnectionInfo = NULL; + switch( aEvent.EventType() ) + { + case EConnMonCreateConnection: + iConnectionInit = EFalse; + CConnMonCreateConnection* eventCreate; + eventCreate = (CConnMonCreateConnection*)& aEvent; + connectionId = eventCreate->ConnectionId(); + rdConnectionInfo = CReadConnectionInfo::NewL(iConnMonitor, + connectionId, + this, + CConnectionInfo::EConnected, + TSysRequest::ENotification); + CleanupStack::PushL(rdConnectionInfo); + // get connection details. + User::LeaveIfError(rdConnectionInfo->Request()); + CleanupStack::Pop(rdConnectionInfo); + break; + + case EConnMonDeleteConnection: + CConnMonDeleteConnection* eventDelete; + eventDelete = (CConnMonDeleteConnection*)& aEvent; + connectionId = eventDelete->ConnectionId(); + + for(TInt i=0; iConnectionId() ) + { + CConnectionInfo* info = conninfo->CopyL(); + info->SetConnectionState(CConnectionInfo::EDisconnected); + TRAP_IGNORE(SystemObserver()->HandleResponseL( + *iEntity,*iKey,info,TransactionID(), + RequestType(),KErrNone)); + + iConnectionInfoArray.Remove(i); + delete conninfo; + break; + } + } + break; + + default: + break; + } + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::CReadConnectionInfo +// C++ default constructor. +// -------------------------------------------------------------------- +// +CReadConnectionInfo::CReadConnectionInfo( RConnectionMonitor& aConnMon, + TUint aConnId, MConnectInfoCallback* aCallBack, + CConnectionInfo::TConnectionState aState, + TSysRequest::TRequestType aReqType ) : + CActive(EPriorityNormal), iConnectionID(aConnId), + iCallBack(aCallBack), iConnMon(aConnMon), + iState(EInitial), iConnState(aState),iReqType(aReqType) + { + CActiveScheduler::Add(this); + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::~CReadConnectionInfo +// Destructor. +// -------------------------------------------------------------------- +// +CReadConnectionInfo::~CReadConnectionInfo() + { + Cancel(); + delete iIAPName; + delete iNetworkName; + delete iConnectionName; + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::NewL +// Two-phased constructor, returns instance of this class. +// -------------------------------------------------------------------- +// +CReadConnectionInfo* CReadConnectionInfo::NewL(RConnectionMonitor& aConnMon, + TUint aConnId,MConnectInfoCallback* aCallBack, + CConnectionInfo::TConnectionState aState, + TSysRequest::TRequestType aReqType ) + { + CReadConnectionInfo* self = new (ELeave) CReadConnectionInfo(aConnMon, + aConnId, aCallBack, aState, aReqType); + return self; + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::Request +// Issues ConnectionInfo read request. +// -------------------------------------------------------------------- +// +TInt CReadConnectionInfo::Request() + { + if(!IsActive()) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status,KErrNone); + SetActive(); + } + return KErrNone; + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::RunL +// Gets called in event of request completion or error situation. +// -------------------------------------------------------------------- +// +void CReadConnectionInfo::RunL() + { + CConnectionInfo* connectionInfo=NULL; + + TInt error(iStatus.Int()); + if(error >= KErrNone) + { + switch(iState) + { + case EInitial: + iConnMon.GetUintAttribute(iConnectionID, 0, KIAPId, iIAPId, iStatus); + iState = EIAPId; + break; + + case EIAPId: + iConnMon.GetIntAttribute(iConnectionID, 0, KBearer,iBearerType, iStatus); + iState = EBearerType; + break; + + case EBearerType: + iConnMon.GetStringAttribute(iConnectionID, 0, KIAPName, iNameBuf, iStatus); + iState = EIAPName; + break; + + case EIAPName: + iIAPName = iNameBuf.AllocL(); + iNameBuf.Zero(); + + if(iBearerType == EBearerWLAN ) + { + iConnMon.GetStringAttribute(iConnectionID, 0, + KNetworkName, iNameBuf, iStatus); + iState = ENetworkName; + } + else + { + iConnMon.GetStringAttribute(iConnectionID, 0, + KAccessPointName, iNameBuf, iStatus); + iState = EIAPConnectionName; + } + break; + + case ENetworkName : + iNetworkName = iNameBuf.AllocL(); + iNameBuf.Zero(); + connectionInfo = CConnectionInfo::NewL(iConnectionID, iIAPId, + iBearerType, iConnState, *iIAPName, + *iNetworkName, KNullDesC); + + iState = EComplete; + break; + + case EIAPConnectionName: + iConnectionName = iNameBuf.AllocL(); + iNameBuf.Zero(); + + connectionInfo = CConnectionInfo::NewL(iConnectionID, iIAPId, + iBearerType, iConnState, *iIAPName, + KNullDesC, *iConnectionName); + iState = EComplete; + } + } + else + { + if (iState == EIAPConnectionName || iState == ENetworkName) + { + connectionInfo = CConnectionInfo::NewL(iConnectionID, iIAPId, + iBearerType, iConnState, *iIAPName, + KNullDesC, KNullDesC); + error = KErrNone; + } + iState = EComplete; + } + + //if not complete read next attribute. + if(iState != EComplete) + SetActive(); + else + { + iCallBack->HandleConnectionInfoL(connectionInfo,error); + delete this; + } + } + +// -------------------------------------------------------------------- +// CReadConnectionInfo::DoCancel +// cancels any ongoing request. +// -------------------------------------------------------------------- +// +void CReadConnectionInfo::DoCancel() + { + if( IsActive() ) + { + switch(iState) + { + case EIAPId: + iConnMon.CancelAsyncRequest(EConnMonGetUintAttribute); + break; + case EBearerType: + iConnMon.CancelAsyncRequest(EConnMonGetIntAttribute); + break; + case EIAPName: + case ENetworkName: + case EIAPConnectionName: + iConnMon.CancelAsyncRequest(EConnMonGetStringAttribute); + break; + + default: + iConnMon.CancelNotifications(); + break; + } + } + } + +// End of file