diff -r c3e98f10fcf4 -r 388a17646e40 localconnectivityservice/modematplugin/inc/atcopscmd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/modematplugin/inc/atcopscmd.h Tue Feb 02 00:45:58 2010 +0200 @@ -0,0 +1,434 @@ +/* +* 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: Handles the commands "AT+COPS=..." and "AT+COPS?" +* +*/ + + +#ifndef C_CATCOPSCMD_H +#define C_CATCOPSCMD_H + +#include +#include +#include +#include +#include +#include +#include "modematplugin.h" + +class MCmdPluginObserver; +class CRetrieveMobilePhoneDetectedNetworks; + +/** Handler types for the AT commands */ +enum TCmdHandlerType + { + ECmdHandlerTypeUndefined, + ECmdHandlerTypeTest, // For command "AT+COPS=?" + ECmdHandlerTypeRead, // For command "AT+COPS?" + ECmdHandlerTypeSet // For command "AT+COPS=..." + }; + +/** Keeps track of the current operation for the state machine */ +enum TCurrentOperation + { + EIdle = 0, + EInspectModeAndProcessCommand = 1, + EAutomaticallyRegisterToNetwork = 2, + EManuallyRegisterToNetwork = 3, + EManuallyRegisterToNetworkAndChooseAccTech = 4, + EGetNetworkInfoOperatorName = 5, + ESetSystemNetworkBand = 6, + EUpdateAvailableNetworkOperators = 7, + EListAvailableNetworkOperators = 8 + }; + +/** These are in the same order as in 3GPP TS 27.007 V8.4.1 */ +enum TOperatorFormat + { + EFormatLong, + EFormatShort, + EFormatNumeric + }; + +/** These are in the same order as in 3GPP TS 27.007 V8.4.1 */ +enum TNetworkRegistrationMode + { + EModeAutomatic, + EModeManual, + EModeDeregister, + EModeSetFormatParameter, + EModeManualAutomatic, + }; + +/** Currently selected access technology for outgoing replies. +* S60 uses definitions from RMobilePhone class, but they are +* in diffent order and cannot be used directly. +* These are in the same order as in 3GPP TS 27.007 V8.4.1 */ +enum TAccessTechnology + { + EGSM = 0, + EGSMCompact = 1, + EUDMA = 2, + EGSMwithEGPRS = 3, + EHSDPA = 4, + EHSUPA = 5, + EUDMAwithHSDPAandHSUPA = 6, + EAccTechNotSet = 255 + }; + +/** + * Class for handling commands "AT+COPS?" and "AT+COPS=..." + * + * @since TB9.2 + */ +NONSHARABLE_CLASS( CATCOPSCmd ) : public CActive, public CATCommandHandlerBase +{ + +public: + + /** + * Two-phased constructor. + * @param aCallback Callback + * @return Instance of self + */ + static CATCOPSCmd* NewL( MCmdPluginObserver* aCallback ); + + /** + * Destructor. + */ + virtual ~CATCOPSCmd(); + +protected: + /** + * From CActive. Called when asynchronous request completes. + * @since TB9.2 + * @param None + * @return None + */ + virtual void RunL(); + + virtual void DoCancel(); + +private: + + CATCOPSCmd( MCmdPluginObserver* aCallback ); + + void ConstructL(); + + /** + * Reports the support status of an AT command. This is a synchronous API. + * + * @param aCmd The AT command. Its format may vary depending on the + * specification. E.g. in BT HFP case, the command may contain + * a character carriage return () in the end. + * @return ETrue if the command is supported; EFalse otherwise. + */ + TBool IsCommandSupported( const TDesC8& aCmd ); + + /** + * Handles an AT command. Cancelling of the pending request is done by + * HandleCommandCancel(). The implementation in the extension plugin should + * be asynchronous. + * + * The extension plugin which accepts this command is responsible to supply + * the result codes and response and to format result codes properly, e.g. + * in BT HFP case, the format should be + * + * After an extension plugin has handled or decided to reject the given AT + * command, it must inform ATEXT by HandleCommandCompleted() with a proper + * error code. + * + * @since TB9.2 + * @param aCmd The AT command to be handled. Its format may vary depending + * on the specification. E.g. in BT HFP case, the command may + * contain a character carriage return () in the end. + * @param aReply When passed in, contains the built in answer filled by + * ATEXT if it is not empty; when command handling completes + * successfully, contains the result codes and responses to + * this command; Its ownership always belongs to ATEXT, plugin + * may reallocate its space when needed. + * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse, + * the aReply must not contain the reply, otherwise it + * must contain verbose or numeric reply (ATV0/1) or an + * empty string reply (with ATQ). + * @return None + */ + void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + + /** + * Cancels a pending HandleCommand request. + * + * @since TB9.2 + * @return None + */ + void HandleCommandCancel(); + + +private: + + + void HandleCommandTest( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + void HandleCommandRead( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + void HandleCommandSet( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + + void HandleError(); + + /** + * This method parses the parameter part of command and populates + * iParamArray class member. Quotation marks are removed in process. + * + * @since TB9.2 + * @param aCmd The AT command. + * @return Leaves in out of memory case. + */ + void ExtractParametersL(const TDesC8& aCmd); + + /** + * This method strips all quotation parms from the string passed in. + * + * @since TB9.2 + * @param aParameter one parameter from AT command as extracted by ExtractParametersL. + * @return None + */ + void RemoveQuotationMarks(TPtr8& aParameter); + + /** + * This method returns the selected mode in aMode. + * It also checks that there are enough parameters for the mode in question. + * + * @since TB9.2 + * @param aParameter one parameter from AT command as extracted by ExtractParametersL. + * @param aMode contains the converted parameter if method completed successfully. + * @return KErrArgument if mode is invalid or there is not enough parameters. + * KErrNone if iParamArray contains all the parameters the mode requires. + */ + TInt GetModeAndCheckParameterCount(const TDesC8& aParameter, TNetworkRegistrationMode &aMode); + + /** + * This method converts an AT command parameter to numeric format value and checks it is valid. + * + * @since TB9.2 + * @param aParameter one parameter from AT command as extracted by ExtractParametersL. + * @param aFormat contains the converted parameter if method completed successfully. + * @return KErrArgument if format is invalid. + * KErrNone if format is valid. + */ + TInt GetFormatFromParameter(const TDesC8& aParameter, RMmCustomAPI::TOperatorNameType &aFormat); + + /** + * This method converts an AT command parameter to numeric access technology value and checks it is valid. + * + * @since TB9.2 + * @param aParameter one parameter from AT command as extracted by ExtractParametersL. + * @param aAccTech contains the converted parameter if method completed successfully. + * @return KErrArgument if acc. tech. is invalid. + * KErrNone if acc. tech. is valid. + */ + TInt GetAccTechFromParameter(const TDesC8& aParameter, TAccessTechnology &aAccTech); + + /** + * This method converts an AT command parameter to ETel compatible operator values + * + * @since TB9.2 + * @param aDetectedNetworks contains the list of networks. May be NULL. + * @param aFormat contains the format (numeric/text) of operator parameter. + * @param aOperatorParameter contains the operator parameter string. + * @param aMcc contains the converted parameter if method completed successfully. + * @param aMnc contains the converted parameter if method completed successfully. + * @return KErrArgument if operator parameter invalid, + * KErrNotFound if operator list exists but the operator is not in it, + * or the operator list is missing. (Required if aFormat is text.) + * KErrNone if conversion succeeds. aMcc and aMnc contain ETel compatible operator values. + */ + TInt ConvertOperatorToMccMnc(const CMobilePhoneNetworkListV2 *aDetectedNetworks, + const RMmCustomAPI::TOperatorNameType aFormat, + const TBuf& aOperatorParameter, + RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, + RMobilePhone::TMobilePhoneNetworkIdentity& aMnc); + + /** + * This method initiates an automatic network registration. + * + * @since TB9.2 + * @return None + */ + void AutomaticNetworkRegistration(); + + /** + * This method initiates a manual network registration. + * + * @since TB9.2 + * @param aMcc contains the country code part of ETel operator info. + * @param aMnc contains the network code part of ETel operator info. + * @return None + */ + void ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, + const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc); + + /** + * This method initiates a manual network registration and access technology selection. + * + * @since TB9.2 + * @param aMcc contains the country code part of ETel operator info. + * @param aMnc contains the network code part of ETel operator info. + * @param aAccTech contains the access technology in ETel compatible format. + * @return None + */ + void ManualNetworkRegistration( const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, + const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc, + const TAccessTechnology aAccTech); + + /** + * This is a helper function used by RunL + * + * @since TB9.2 + * @return standard Symbian OS return code. + */ + TInt InspectModeAndProcessCommand(); + + /** + * This method contructs a response for the test command. + * + * @since TB9.2 + * @return None. Leaves with standar symbian OS error code on error. + */ + void ConstructNetworkListResponseL(); + + /** + * This method contructs a response for the read command. + * + * @since TB9.2 + * @return standard Symbian OS return code. + */ + TInt ConstructNetworkInfoResponse(); + + /** + * This helper method converts the ETel access technology into + * 3GPP TS 27.007 V8.4.1 compatible format. + * + * @since TB9.2 + * @param aAccTech contains the access technology in ETel compatible format. + * @return Standard Symbian OS return code. + */ + TInt SolveAccessTechnology(RMobilePhone::TMobilePhoneNetworkAccess &aAccessTech); + + /** + * This helper method finalises the response and sends it. + * + * @since TB9.2 + * @param aIsOK tells whether to create an OK or ERROR response. + * @param aReply contains the response string to be sent before OK, if any. + * @return None + */ + void CreateReply(TBool aIsOK, const TDesC8 &aReply = KNullDesC8); + +private: // data + + /** + * Callback to call when accessing plugin information + */ + MCmdPluginObserver* iCallback; + + /** + * Handler type for the three AT commands + */ + TCmdHandlerType iCmdHandlerType; + + /** + * Telephony server instance. + */ + RTelServer iServer; + + /** + * Phone instance, used for network selection. + */ + RMobilePhone iPhone; + + /** + * Telephony Custom API instance, used for setting + * the access technology (only GSM and UDMA supported). + */ + RMmCustomAPI iCustomApi; + + /** + * Current network info collected via the RMobilePhone is stored here. + */ + RMobilePhone::TMobilePhoneNetworkInfoV2 iNetworkInfo; + + /** + * The parameters extracted from the AT command are stored here. + */ + RPointerArray iParamArray; + + /** + * Used for getting the static packet capabilities of the phone. + * This is needed for supporting more detailed access technology. + */ + RPacketService iPacketService; + + /** + * The format of the operator parameter is stored here. + * it is used both for interpreting the incoming operator and + * responding with correctly formatted outgoing operator info. + * this can be done because it is specified that the latest incoming + * format info is also used for responses from that onwards. + */ + RMmCustomAPI::TOperatorNameType iFormat; + + /** + * The requested/current network registration mode is stored here. It is used + * also when responding to the Read command. This can be done because the two + * operations are completely independent. + */ + TNetworkRegistrationMode iRegistrationMode; + + /** + * The requested/current access tehcnology is stored here. It is used + * also when responding to the Read and Test commands. This can be done + * because the operations are completely independent. + */ + TAccessTechnology iAccTech; + + /** + * The incoming reply buffer is kept here. Not owned. + */ + RBuf8* iReply; + + /** + * The currently running operation is kept here. + */ + TCurrentOperation iCurrentOperation; + + /** + * The country code part of ETel compatible operator info. + */ + RMobilePhone::TMobilePhoneNetworkCountryCode iMcc; + + /** + * The network code part of ETel compatible operator info. + */ + RMobilePhone::TMobilePhoneNetworkIdentity iMnc; + + /** + * Used for retrieving a list of networks the phone detected. + */ + CRetrieveMobilePhoneDetectedNetworks *iRetrieveDetectedNetworks; + + /** + * Used for reading the list the CRetrieveMobilePhoneDetectedNetworks returned. + */ + CMobilePhoneNetworkListV2 *iDetectedNetworks; +}; + +#endif // C_LCLISTALLCMD_H