cbsref/telephonyrefplugins/atltsy/atcommand/phone/src/atdetectnetwork.cpp
branchRCL_3
changeset 65 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/phone/src/atdetectnetwork.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,230 @@
+// Copyright (c) 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:
+// Get the detected network
+
+#include "atdetectnetwork.h"
+#include "mslogger.h"
+
+_LIT8(KDetectNetworkCommand,"AT+COPS=?\r");
+_LIT8(KGetDetectNetworkRepondStr,"+COPS:");
+const TInt KLtsyDetectNetworkReadTimeOut = 80;
+
+// ---------------------------------------------------------------------------
+// NetworkIdL
+// Utility function to translate the 5 digit ASCII network identification 
+// returned by the ME into Mobile Country Code (aCountryCode) and a Mobile 
+// Network Code (aNetworkIdentity) strings. Tbe format returned by the ME is 
+// XXXYY, where XXX represents the Mobile Country Code and YY represents the 
+// Mobile Network Code.
+// ---------------------------------------------------------------------------
+static TInt NetworkIdL(const TDesC8& aCode,
+					   RMobilePhone::TMobilePhoneNetworkCountryCode& aCountryCode, 
+					   RMobilePhone::TMobilePhoneNetworkIdentity& aNetworkIdentity)
+	{
+	if (aCode.Length()!=5)
+		{
+		return KErrGeneral;
+		}
+	
+	aCountryCode.SetLength(3);
+	aCountryCode[0] = aCode[0];
+	aCountryCode[1] = aCode[1];
+	aCountryCode[2] = aCode[2];
+
+	aNetworkIdentity.SetLength(2);
+	aNetworkIdentity[0] = aCode[3];
+	aNetworkIdentity[1] = aCode[4];
+	return KErrNone;
+	}
+// Class CATDetectNetwork
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::NewL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATDetectNetwork* CATDetectNetwork::NewL(CGlobalPhonemanager& aGloblePhone, 
+	                                     CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	CATDetectNetwork* self = new(ELeave) CATDetectNetwork(aGloblePhone,aCtsyDispatcherCallback);
+	CleanupStack::PushL(self );
+	self->ConstructL();
+	CleanupStack::Pop(self );
+	return self ;
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::CATDetectNetwork
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATDetectNetwork::CATDetectNetwork(CGlobalPhonemanager& aGloblePhone, 
+	                               CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+		:CAtCommandBase(aGloblePhone,aCtsyDispatcherCallback)
+	{
+	iReadTimeOut = KLtsyDetectNetworkReadTimeOut;
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::ConstructL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::ConstructL()
+	{
+	CAtCommandBase::ConstructL();
+	iList= NULL;
+	iCommandRunning = EFalse;
+	iCommandCancel = EFalse;
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::~CATDetectNetwork
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CATDetectNetwork::~CATDetectNetwork()
+	{
+	if(iList)
+		{
+		delete iList;
+		iList = NULL;
+		}
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::StartRequestL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::StartRequest()
+	{
+	iCommandRunning = ETrue;
+	ExecuteCommand();
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::ExecuteCommand
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::ExecuteCommand()
+	{
+	iTxBuffer.Copy(KDetectNetworkCommand);
+	Write();
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::CancelCommand
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::CancelCommand()
+	{	
+	iCommandCancel = ETrue;
+	}
+// ---------------------------------------------------------------------------
+// CATDetectNetwork::ParseResponseL
+// should be
+// +COPS: (status,"longname","shortname",code),... ,,(list),(list)
+// +COPS: [list of supported (<stat>,long alphanumeric <oper>,short alphanumeric 
+// <oper>,numeric <oper>)s]
+// <stat>:
+// 0 unknown
+// 1 available
+// 2 current
+// 3 forbidden
+// <oper>: string type; <format> indicates if the format is alphanumeric or numeric;
+// long alphanumeric format can be upto 16 characters long and short format up to 8 
+// characters (refer GSM MoU SE.13 [9]); numeric format is the GSM Location Area 
+// Identification number (refer GSM 04.08 [8] subclause 10.5.1.3) which consists of
+// a three BCD digit country code coded as in ITU-T E.212 Annex A [10], plus a two 
+// BCD digit network code, which is administration specific; returned <oper> shall 
+// not be in BCD format, but in IRA characters converted from BCD; hence the number 
+// has structure: (country code digit 3)(country code digit 2)(country code digit 1)
+// (network code digit 2)(network code digit 1)
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::ParseResponseL(const TDesC8& /*aResponseBuf*/)
+	{
+	if (CurrentLine().Match(KLtsyOkString) != 0)
+		{
+		iError = KErrGeneral;
+		return ;
+		}
+    if(iList)
+    	{
+    	delete iList;
+    	iList = NULL;
+    	}
+	iList=CMobilePhoneNetworkListV2::NewL();
+	
+	RArray<TPtrC8> array;
+	CleanupClosePushL(array);
+	iParser->ParseRespondedBuffer(array,PrecedingLine());
+	TInt Count = array.Count();
+	if (Count < 1)
+		{
+		CleanupStack::PopAndDestroy();
+		iError = KErrNotFound;
+		return ;
+		}
+	if( array[0].MatchF(KGetDetectNetworkRepondStr)==KErrNotFound)
+		{
+		CleanupStack::PopAndDestroy();
+		iError = KErrNotFound;
+		return ;
+		}
+	TInt count = array.Count() - 1;
+	for (TInt i = 1;i < count;i++)
+		{
+		RMobilePhone::TMobilePhoneNetworkInfoV2 info;	
+		// This TSY only supports GSM mode so we can hardcode this
+		info.iMode=RMobilePhone::ENetworkModeGsm;
+		TInt val;
+		TLex8 lex(array[i]);
+		lex.Val(val);
+		info.iStatus = RMobilePhone::TMobilePhoneNetworkStatus(val);
+		i++;
+		info.iLongName.Copy(array[i]);		
+		i++;
+		if(array[i].Length() > info.iShortName.MaxLength())
+			info.iShortName.Copy(array[i].Mid(0,info.iShortName.MaxLength()));			
+		else
+			info.iShortName.Copy(array[i]);
+		i++;
+		User::LeaveIfError(NetworkIdL(array[i],info.iCountryCode, info.iNetworkId));  // MNC and MCC	
+		
+		iList->AddEntryL(info); 
+		}
+	CleanupStack::PopAndDestroy();
+	} //ParseResponseL
+// ---------------------------------------------------------------------------
+// ATDetectNetwork::EventSignal
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CATDetectNetwork::EventSignal(TAtEventSource aEventSource, TInt aStatus)
+	{
+	if(KErrNone ==aStatus)
+		{
+		if(aEventSource == EReadCompletion)
+			{
+			aStatus = iError;
+			}
+		else
+			return;
+		}
+	if(iCommandCancel)
+		{
+		iCtsyDispatcherCallback.CallbackPhoneGetDetectedNetworksCancelComp(0);
+		}
+	else
+		{
+		iCtsyDispatcherCallback.CallbackPhoneGetDetectedNetworksComp(aStatus,*iList);
+		}
+	iCommandRunning = EFalse;
+	iCommandCancel = EFalse;
+	CAtCommandBase::Complete();
+	iPhoneGlobals.iEventSignalActive = EFalse;
+	
+	}
+//
+// End of file
+