--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sapi_sysinfo/sysinfoservice/src/sysnetworkrequest.cpp Mon Mar 30 12:51:10 2009 +0300
@@ -0,0 +1,312 @@
+/*
+* 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 <etel.h>
+#include <etelmm.h>
+#include <MmTsy_names.h>
+
+#include "sysinfoservice.h"
+#include "sysnetworkrequest.h"
+#include "entitykeys.h"
+#include "sysrequest.h"
+#include "SysInfoUtils.h"
+
+// --------------------------------------------------------------------
+// CNetwork::CNetwork()
+// C++ default constructor.
+// --------------------------------------------------------------------
+//
+CNetwork::CNetwork( TSysRequest::TRequestType aReqType, TInt32 aTransID,
+ TInt aNetworkInfoType, ISystemObserver* aObsrver )
+ :CActiveRequest(aReqType,aTransID,aObsrver),
+ iNetworkInfoType((TNetInfoType)aNetworkInfoType),
+ iNetworkInfoBuf(iNetworkInfo), iIsThresholdSet(EFalse)
+ {
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::~CNetwork()
+// Destructor
+// --------------------------------------------------------------------
+//
+CNetwork::~CNetwork()
+ {
+ Cancel();
+ iMobilePhone.Close();
+ iTelServer.Close();
+ delete iEntity;
+ delete iKey;
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::NewL()
+// Two-phased constructor, returns instance of this class.
+// --------------------------------------------------------------------
+//
+CNetwork* CNetwork::NewL( const TSysRequest& aRequest,TInt aNetworkInfoType )
+ {
+ CNetwork* self;
+ self = new (ELeave) CNetwork(aRequest.RequestType(), aRequest.TransactionID(),
+ aNetworkInfoType, aRequest.Observer() );
+ CleanupStack::PushL(self);
+ self->ConstructL(aRequest);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::ConstructL()
+// 2nd Phase constructor to allocate required resources for this obj.
+// --------------------------------------------------------------------
+//
+void CNetwork::ConstructL(const TSysRequest& aRequest)
+ {
+ //For Network signal strength and battery user can specify threshold.
+ if( TSysRequest::ENotification == RequestType() &&
+ (ESignalStrength == iNetworkInfoType ||
+ EBatteryStrength == iNetworkInfoType) )
+ {
+ const CSysData* Input = aRequest.SystemData();
+ // check if any input parameter
+ if(Input)
+ {
+ //perform parameter validation.
+ if( CSysData::EStatus != Input->DataType())
+ User::Leave(KErrArgument);
+ //get threshold value.
+ iThreshold = ((CStatus*)Input)->Status();
+ iIsThresholdSet = ETrue;
+ }
+ }
+
+ //Create a handle to RMobile
+ User::LeaveIfError(RPhoneInstance::Connect( iTelServer,iMobilePhone ));
+
+ // Make local copy of SA.
+ iEntity = aRequest.Entity().AllocL();
+ iKey = aRequest.Key().AllocL();
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::Request()
+// Issues network request.
+// --------------------------------------------------------------------
+//
+TInt CNetwork::Request()
+ {
+ TSysRequest::TRequestType ReqType = RequestType();
+
+ if( !IsActive() )
+ {
+ // Issue request based on request type.
+ if(TSysRequest::EASyncONESHOT == ReqType)
+ {
+ switch(iNetworkInfoType)
+ {
+ case ESignalStrength:
+ iMobilePhone.GetSignalStrength(iStatus,iSignalStrength,iBar);
+ break;
+// HomeNetwork info require ReadDeviceData, which is not user grantable permission, and
+// is currently not supported.
+#ifdef _REQUIRE_READDEVICEDATA_
+ case EHomeNetworkInfo:
+ iMobilePhone.GetHomeNetwork( iStatus, iNetworkInfoBuf );
+ break;
+#endif
+ case ECurrentNetworkInfo:
+ iMobilePhone.GetCurrentNetwork(iStatus,iNetworkInfoBuf,iArea);
+ break;
+
+ case EBatteryStrength:
+ iMobilePhone.GetBatteryInfo(iStatus,iBatteryInfo);
+ break;
+
+ default:
+ return KErrNotFound;
+ }
+ }
+ else //Notification.
+ {
+ switch(iNetworkInfoType)
+ {
+ case ESignalStrength:
+ iMobilePhone.NotifySignalStrengthChange(iStatus,iSignalStrength,iBar);
+ break;
+
+ case ECurrentNetworkInfo:
+ case ELocationAreaCode:
+ case ECellId:
+ iMobilePhone.NotifyCurrentNetworkChange(iStatus,iNetworkInfoBuf,iArea);
+ break;
+
+ case EBatteryStrength:
+ iMobilePhone.NotifyBatteryInfoChange(iStatus,iBatteryInfo);
+ break;
+
+ default:
+ return KErrNotFound;
+ }
+ }
+ SetActive ();
+ }
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::RunL()
+// Gets called in event of request completion or error situation.
+// --------------------------------------------------------------------
+//
+void CNetwork::RunL()
+ {
+ TSysRequest::TRequestType ReqType = RequestType();
+ CSysData* OutputParam = NULL;
+ TInt32 transId = this->TransactionID();
+ TInt error( iStatus.Int() );
+
+ if(KErrNone == error)
+ {
+ switch(iNetworkInfoType)
+ {
+ case ESignalStrength:
+ //if threshold not specified. notify every change.
+ if( !iIsThresholdSet )
+ OutputParam = CStatus::NewL(iSignalStrength);
+ else if( (iSignalStrength > iThreshold) )
+ OutputParam = CStatus::NewL(iSignalStrength);
+ break;
+
+ case EHomeNetworkInfo:
+ case ECurrentNetworkInfo:
+ OutputParam = CNetworkInfo::NewL(iNetworkInfo,iArea);
+ break;
+
+ case ELocationAreaCode:
+ if( iArea.iAreaKnown && iLocationAreaCodeOld != iArea.iLocationAreaCode )
+ {
+ OutputParam = CStatus::NewL(iArea.iLocationAreaCode);
+ iLocationAreaCodeOld = iArea.iLocationAreaCode;
+ }
+ break;
+
+ case ECellId:
+ if( iArea.iAreaKnown && iCellIdOld != iArea.iCellId )
+ {
+ OutputParam = CStatus::NewL(iArea.iCellId);
+ iCellIdOld = iArea.iCellId;
+ }
+ break;
+
+ case EBatteryStrength:
+ //if threshold not specified. notify every change.
+ if( !iIsThresholdSet )
+ OutputParam = CStatus::NewL(iBatteryInfo.iChargeLevel);
+ else if( (iSignalStrength <= iThreshold) )
+ OutputParam = CStatus::NewL(iBatteryInfo.iChargeLevel);
+ break;
+
+ default:
+ break;
+ }
+
+ //In case notification Re-Issue Request.
+ if (TSysRequest::ENotification == ReqType)
+ Request();
+
+ //Notify only if threshold reached.
+ if(OutputParam)
+ TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity,*iKey,OutputParam,transId,RequestType(),error));
+
+ }
+ //If error
+ else
+ {
+ TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity,*iKey,NULL,transId,RequestType(),error));
+ ActiveStore::RemoveRequest(TransactionID());
+ }
+
+ //If its a ONSHOT Requeust remove this from active store.
+ if (TSysRequest::EASyncONESHOT == ReqType)
+ ActiveStore::RemoveRequest(transId);
+ }
+
+// --------------------------------------------------------------------
+// CNetwork::DoCancel()
+// cancels ongoing network request.
+// --------------------------------------------------------------------
+//
+void CNetwork::DoCancel()
+ {
+ TSysRequest::TRequestType ReqType = RequestType();
+
+ //Cancel request based on type of request.
+ if(TSysRequest::EASyncONESHOT == ReqType)
+ {
+ switch(iNetworkInfoType)
+ {
+ case ESignalStrength:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneGetSignalStrength);
+ break;
+
+ case EHomeNetworkInfo:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneGetHomeNetwork);
+ break;
+
+ case ECurrentNetworkInfo:
+ case ELocationAreaCode:
+ case ECellId:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneGetNetworkRegistrationStatus);
+ break;
+
+ case EBatteryStrength:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneGetBatteryInfo);
+ break;
+
+ default:
+ break;
+ }
+ }
+ //Notification
+ else
+ {
+ switch(iNetworkInfoType)
+ {
+ case ESignalStrength:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneNotifySignalStrengthChange);
+ break;
+
+ case EHomeNetworkInfo:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneGetHomeNetwork);
+ break;
+
+ case ECurrentNetworkInfo:
+ case ELocationAreaCode:
+ case ECellId:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneNotifyCurrentNetworkChange);
+ break;
+
+ case EBatteryStrength:
+ iMobilePhone.CancelAsyncRequest(EMobilePhoneNotifyBatteryInfoChange);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+//End of File.