--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/Multimode/Mownnum.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,400 @@
+// Copyright (c) 2000-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:
+// Deal with Network & Operator information
+//
+//
+
+#include <et_phone.h>
+#include "Mownnum.h"
+#include "mSLOGGER.H"
+#include "ATIO.H"
+#include "Matstd.h"
+#include <etelmm.h>
+#include <mmlist.h>
+#include "et_phone_util.h"
+
+// Get the own numbers from the phone
+// NB - not supported by all phones.
+
+_LIT8(KGetOwnNumbersCommand,"AT+CNUM");
+_LIT8(KGetOwnNumbersResponse,"+CNUM");
+
+CATOwnNumbers::CATOwnNumbers(CATIO* aIo, CTelObject* aTelObject, CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+ : CATCommands(aIo,aTelObject,aInit,aPhoneGlobals)
+ {}
+
+CATOwnNumbers* CATOwnNumbers::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+ {
+ CATOwnNumbers* self = new(ELeave) CATOwnNumbers(aIo, aTelObject, aInit, aPhoneGlobals);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+CATOwnNumbers::~CATOwnNumbers()
+ {
+ if (iIo != NULL)
+ {
+ iIo->RemoveExpectStrings(this);
+ }
+ delete iOwnNumbers;
+ }
+
+void CATOwnNumbers::Start(TTsyReqHandle aTsyReqHandle, TAny* /*aParam*/)
+ {
+ LOGTEXT(_L8("MMTsy:\tCATOwnNumbers:\tStarting Get Own Number"));
+ iReqHandle = aTsyReqHandle;
+ WriteExpectingResults(KGetOwnNumbersCommand, 3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL,Panic(EGeneral));
+ iState=EATImsiWaitForWriteComplete;
+ }
+
+void CATOwnNumbers::EventSignal(TEventSource aSource)
+ {
+ if (aSource==ETimeOutCompletion)
+ {
+ LOGTEXT(_L8("MMTsy:\tCATOwnNumbers:\tTimeout Error during Get Own Number read"));
+ RemoveStdExpectStrings();
+ Complete(KErrTimedOut,aSource);
+ return;
+ }
+
+ switch(iState)
+ {
+ case EATImsiWaitForWriteComplete:
+ __ASSERT_ALWAYS(aSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+ {
+ iIo->WriteAndTimerCancel(this);
+ StandardWriteCompletionHandler(aSource, 5);
+ iState=EATImsiReadComplete;
+ }
+ break;
+
+ case EATImsiReadComplete:
+ __ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+ {
+ iIo->WriteAndTimerCancel(this);
+ TInt ret(ValidateExpectString());
+ RemoveStdExpectStrings();
+ if (ret==KErrNone)
+ TRAP(ret,ParseResponseL());
+ Complete(ret,aSource);
+ }
+ break;
+
+ case EATWaitForStopState:
+ __ASSERT_ALWAYS(aSource==EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected));
+ {
+ iIo->WriteAndTimerCancel(this);
+ Complete(KErrCancel, aSource);
+ }
+ break;
+
+
+ default:
+ break;
+ }//switch
+ }//EventSignal
+
+void CATOwnNumbers::Stop(TTsyReqHandle aTsyReqHandle)
+ {
+ if(iReqHandle == TSY_HANDLE_INIT_VALUE) // default value
+ {
+ // it seems the Own numbers service has not been started
+ // just return
+ LOGTEXT(_L8("MMTsy:\tCATOwnNumbers:\tCancel called, Error - invalid request handle."));
+ return;
+ }
+
+ __ASSERT_ALWAYS(aTsyReqHandle == iReqHandle, Panic(EIllegalTsyReqHandle));
+ LOGTEXT(_L8("MMTsy:\tCATOwnNumbers:\tCancel called."));
+ switch(iState)
+ {
+ case EATNotInProgress:
+ case EATImsiWaitForWriteComplete:
+ {
+ LOGTEXT2(_L8("Current state TSY is cancelling from %d"), iState);
+ Complete(KErrCancel, EReadCompletion);
+ }
+ break;
+
+ default:
+ {
+ LOGTEXT(_L8("MMTsy:\tCATOwnNumbers:\tStop, now waiting for expected modem response"));
+ AddStdExpectStrings();
+ iIo->SetTimeOut(this);
+ iState = EATWaitForStopState;
+ }
+ break;
+
+ }
+ }
+
+
+void CATOwnNumbers::Complete(TInt aError,TEventSource aSource)
+ {
+ if (aError==KErrNone || aError==KErrNotFound)
+ iState = EATCompleted;
+ else if (aError==KErrGeneral)
+ {
+ iState = EATNotSupported;
+ aError = KErrNotSupported;
+ }
+ else
+ iState = EATNotInProgress;
+ iIo->WriteAndTimerCancel(this);
+ iIo->RemoveExpectStrings(this);
+ iOKExpectString = NULL;
+ iErrorExpectString = NULL;
+ CATCommands::Complete(aError,aSource);
+ LOGTEXT2(_L8("GsmTsy:CATOwnNumbers:\tCATOwnNumbers completed with error code : %d"), aError);
+ iTelObject->ReqCompleted(iReqHandle, aError);
+ if (aSource==EWriteCompletion)
+ iIo->Read();
+ }
+
+void CATOwnNumbers::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+ {
+ if (iState!=EATNotInProgress)
+ {
+ iIo->WriteAndTimerCancel(this);
+ iState = EATNotInProgress;
+ iTelObject->ReqCompleted(iReqHandle, aStatus);
+ }
+ }
+
+void CATOwnNumbers::ParseResponseL()
+ {
+// +CNUM: [text],number,type[,speed,service[,itc]]
+// etc.
+
+
+ CMobilePhoneONList* oNList=CMobilePhoneONList::NewL();
+ CleanupStack::PushL(oNList);
+
+//
+ ParseBufferLC(EFalse, ':');
+//
+
+ TDblQueIter<CATParamListEntry> iter(iRxResults);
+ CATParamListEntry* entry=iter++;
+ while (entry)
+ {
+ if (entry->iResultPtr!=KGetOwnNumbersResponse)
+ User::Leave(KErrGeneral);
+ //
+ // provide some default values
+ RMobileONStore::TMobileONEntryV1 info;
+ info.iMode = RMobilePhone::ENetworkModeGsm; // Hard coded since this tsy just handles GSM.
+
+ entry=iter++;
+ if (!entry)
+ User::Leave(KErrGeneral);
+ info.iText.Copy(entry->iResultPtr);
+
+ entry=iter++;
+ if (!entry)
+ User::Leave(KErrGeneral);
+ info.iNumber.iTelNumber.Copy(entry->iResultPtr);
+
+ entry=iter++;
+ info.iNumber.iTypeOfNumber = NumberTypefromGSMToMM(CATParamListEntry::EntryValL(entry)); // How is this to be used
+
+ // now the optional values
+ entry=iter++;
+ if (entry && entry->iResultPtr!=KGetOwnNumbersResponse)
+ {
+ //The baerer speed that should have been set here is not supported in the TMobileONEntryV1 class
+ entry=iter++;
+ TInt service=CATParamListEntry::EntryValL(entry);
+ switch (service)
+
+ {
+ case KServiceVoice:
+ info.iService = RMobilePhone::EVoiceService;
+ break;
+ case KServiceFax:
+ info.iService = RMobilePhone::EFaxService;
+ break;
+ case KAsynchModem:
+ case KSynchModem:
+ case KPADAccess:
+ case KPacketAccess:
+ info.iService = RMobilePhone::ECircuitDataService;
+ break;
+
+ default:
+ info.iService = RMobilePhone::EServiceUnspecified;
+ break;
+ }
+ //
+ // further optionality
+ entry=iter++;
+ if (entry && entry->iResultPtr!=KGetOwnNumbersResponse)
+ {
+ // Information about the transfer capabilities are not used in
+ // TMobileONEntryV1(the "itc" field is optionaly reurned by AT+CNUM).
+ // If it had been available it hade been set here.
+ entry=iter++;
+ }
+ }
+ oNList->AddEntryL(info);
+ }
+
+ CleanupStack::PopAndDestroy(); // results
+ CleanupStack::Pop(); // numbers
+ iOwnNumbers = oNList;
+
+ switch (iCommand)
+ {
+ case EInfo:
+ Info();
+ break;
+ case EEntry:
+ (void)User::LeaveIfError(Entry(iResultIndex));
+ break;
+ }
+ }
+
+void CATOwnNumbers::Info() const
+/**
+ * This method sets the information about the own number store to be passed
+ * back to the client with cached inforamtion.
+ */
+ {
+ RMobilePhoneStore::TMobilePhoneStoreInfoV1& storeInfo = (*iInfoPckg)();
+
+ storeInfo.iType=RMobilePhoneStore::EOwnNumberStore;
+ storeInfo.iUsedEntries = iOwnNumbers->Enumerate();
+ storeInfo.iTotalEntries = iOwnNumbers->Enumerate();
+ storeInfo.iName.Copy(KETelOwnNumberStore);
+ storeInfo.iCaps=RMobilePhoneStore::KCapsIndividualEntry | RMobilePhoneStore::KCapsReadAccess;
+
+ if (storeInfo.ExtensionId()==RMobilePhoneStore::KETelMobileONStoreV1)
+ {
+ RMobileONStore::TMobileONStoreInfoV1Pckg* onPckg
+ = reinterpret_cast<RMobileONStore::TMobileONStoreInfoV1Pckg*>(iInfoPckg);
+ RMobileONStore::TMobileONStoreInfoV1& onInfo = (*onPckg)();
+ onInfo.iNumberLen=RMobilePhone::KMaxMobileTelNumberSize;
+ onInfo.iTextLen=RMobileONStore::KOwnNumberTextSize;
+ }
+ }
+
+TInt CATOwnNumbers::Entry(TInt aIndex) const
+/**
+ * This method returnes the own number specified by aIndex.
+ * If aIndex should be out of range KErrNotFound is returned.
+ */
+ {
+ __ASSERT_DEBUG(iOwnNumbers!= NULL, PanicClient(KErrGeneral));
+
+ RMobileONStore::TMobileONEntryV1& oNEntry = (*iEntryPckg)();
+ if (TUint(aIndex)>=TUint(iOwnNumbers->Enumerate()))
+ {
+ // If the index is out of range
+ return KErrNotFound;
+ }
+
+ // Get the entry specified by the aIndex.
+ TRAPD(ret,(oNEntry = iOwnNumbers->GetEntryL(aIndex)));
+
+ return ret;
+ }
+
+
+void CATOwnNumbers::GetInfo(TTsyReqHandle aTsyReqHandle, TDes8* aInfo)
+/**
+ * Execute the command if we have not yet been run
+ * Report the own number info if we have already evaluated them
+ */
+ {
+ iInfoPckg=static_cast<RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg*>(aInfo);
+ switch (iState)
+ {
+ case EATCompleted:
+ Info();
+ iTelObject->ReqCompleted(aTsyReqHandle, KErrNone);
+ break;
+ case EATNotSupported:
+ iTelObject->ReqCompleted(aTsyReqHandle, KErrNotSupported);
+ break;
+ default:
+ iCommand=EInfo;
+ ExecuteCommand(aTsyReqHandle,aInfo);
+ break;
+ }
+ }
+
+
+void CATOwnNumbers::GetEntry(TTsyReqHandle aTsyReqHandle, TDes8* aEntry)
+/**
+ * Execute the command if we have not yet been run.
+ * @param aTsyReqHandle The request ID
+ * @param aEntry This argument is of type TMobileONEntryV1Pckg.
+ */
+ {
+ // Unpack the the TMobileONEntryV1 (aEntry)
+ iEntryPckg = static_cast<RMobileONStore::TMobileONEntryV1Pckg*>(aEntry);
+ RMobileONStore::TMobileONEntryV1& oNEntry = (*iEntryPckg)();
+
+ // Extract the index of the own number to get.
+ // Subtract 1 because SIM slots start at 1 but our list will start at 0
+ // Client has asked for SIM slot number
+ iResultIndex = oNEntry.iIndex - 1 ;
+
+ switch (iState)
+ {
+ case EATCompleted:
+ {
+ TInt r=Entry(iResultIndex);
+ if (r!=KErrNone)
+ {
+ iTelObject->ReqCompleted(aTsyReqHandle, r);
+ return;
+ }
+ iTelObject->ReqCompleted(aTsyReqHandle, KErrNone);
+ }
+ break;
+ case EATNotSupported:
+ iTelObject->ReqCompleted(aTsyReqHandle, KErrNotSupported);
+ break;
+ default:
+ iCommand=EEntry;
+ ExecuteCommand(aTsyReqHandle, &oNEntry);
+ break;
+ }
+ }//End of GetEntry
+
+
+RMobilePhone::TMobileTON CATOwnNumbers::NumberTypefromGSMToMM(TUint aTypeOfNumberGSM)
+/** Maping from MM Number Type To GSM Number Type
+ *
+ * This method maps the GSM way of representing a type of telefon number
+ * to the MM standard.
+ *
+ */
+ {
+ switch (aTypeOfNumberGSM)
+ {
+ case 129: // Nationality unknown (GSM)
+ return RMobilePhone::EUnknownNumber; // (MM)
+ case 145: // International Number (GSM)
+ return RMobilePhone::EInternationalNumber; // (MM)
+ case 161: // National Number (GSM)
+ return RMobilePhone::ENationalNumber; // (MM)
+ default:
+ return RMobilePhone::EUnknownNumber; // (MM)
+ }
+ }