diff -r 0aa8cc770c8a -r 4a793f564d72 localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h --- a/localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h Tue Aug 31 16:03:15 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,990 +0,0 @@ -/* -* Copyright (c) 2009-2010 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: AT command handler and notifier -* -*/ - -#ifndef C_CDUNATCMDHANDLER_H -#define C_CDUNATCMDHANDLER_H - -#include -#include -#include -#include "DunDataPusher.h" -#include "DunAtCmdPusher.h" -#include "DunAtCmdEchoer.h" -#include "DunAtEcomListen.h" -#include "DunAtModeListen.h" -#include "DunAtNvramListen.h" -#include "DunAtSpecialCmdHandler.h" - -const TInt KDunChSetMaxCharLen = 1; // Only ASCII supported for now -const TInt KDunOkBufLength = 1+1+2+1+1; // ++"OK"++ -const TInt KDunErrorBufLength = 1+1+5+1+1; // ++"ERROR"++ -const TInt KDunLineBufLength = (512 + 1); // 512 chars for command + -const TInt KDunEscBufLength = 1; // Escape (0x1B) character - -class CDunAtUrcHandler; -class MDunConnMon; -class MDunStreamManipulator; - -/** - * Class used for storing information related to string conversion and parsing - * - * @lib dunatext.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( TDunParseInfo ) - { - -public: - - /** - * Buffer for sending to ATEXT (one command) - * (length is part of KDunLineBufLength) - */ - TBuf8 iSendBuffer; - - /** - * Conversion limit for upper case conversion. - * This is needed to convert the base part of special commands to upper case - * where the part after the base part should not be converted to upper case. - */ - TInt iLimit; - - }; - -/** - * Class used for AT command decoding related functionality - * - * @lib dunatext.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( TDunDecodeInfo ) - { - -public: - - /** - * Flag to indicate if first decode - */ - TBool iFirstDecode; - - /** - * Index in iLineBuffer for decoding to iSendBuffer - */ - TInt iDecodeIndex; - - /** - * Index in iLineBuffer for extended character position - */ - TInt iExtendedIndex; - - /** - * Previous character in parsing - */ - TChar iPrevChar; - - /** - * Flag to indicate if previous character exists - */ - TBool iPrevExists; - - /** - * Flag to indicate if assignment mark found - */ - TBool iAssignFound; - - /** - * Flag to indicate if processing inside quotes - */ - TBool iInQuotes; - - /** - * Flag to indicate if special subcommand found - */ - TBool iSpecialFound; - - /** - * Number of commands handled (for debugging purposes) - */ - TBool iCmdsHandled; - - }; - -/** - * Class used for AT command editor mode related functionality - * - * @lib dunatext.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( TDunEditorModeInfo ) - { - -public: - - /** - * Flag to indicate if content found (not used if iContentFindStarted is EFalse) - */ - TBool iContentFound; - - /** - * AT command decoding related information for peeked data - * (not to be used if HandleNextSubCommand() returns EFalse) - */ - TDunDecodeInfo iPeekInfo; - - }; - -/** - * Notification interface class for command mode start/end - * - * @lib dunutils.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( MDunCmdModeMonitor ) - { - -public: - - /** - * Notifies about command mode start - * - * @since TB9.2 - * @return None - */ - virtual void NotifyCommandModeStart() = 0; - - /** - * Notifies about command mode end - * - * @since TB9.2 - * @return None - */ - virtual void NotifyCommandModeEnd() = 0; - - }; - -/** - * Notification interface class for status changes in AT command handling - * - * @lib dunatext.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( MDunAtCmdStatusReporter ) - { - -public: - - /** - * Notifies about parser's need to get more data - * - * @since TB9.2 - * @return None - */ - virtual void NotifyParserNeedsMoreData() = 0; - - /** - * Notifies about editor mode reply - * - * @since TB9.2 - * @param aStart ETrue if start of editor mode, EFalse otherwise - * @return None - */ - virtual void NotifyEditorModeReply( TBool aStart ) = 0; - - }; - -/** - * Class for AT command handler and notifier - * - * @lib dunatext.lib - * @since TB9.2 - */ -NONSHARABLE_CLASS( CDunAtCmdHandler ) : public CBase, - public MDunAtCmdPusher, - public MDunAtEcomListen, - public MDunAtModeListen - { - -public: - - /** - * Two-phased constructor. - * @param aUpstream Callback to upstream - * @param aDownstream Callback to downstream - * @param aConnectionName Connection identifier name - * @return Instance of self - */ - IMPORT_C static CDunAtCmdHandler* NewL( - MDunAtCmdStatusReporter* aUpstream, - MDunStreamManipulator* aDownstream, - const TDesC8* aConnectionName ); - - /** - * Destructor. - */ - virtual ~CDunAtCmdHandler(); - - /** - * Resets data to initial values - * - * @since TB9.2 - * @return None - */ - IMPORT_C void ResetData(); - - /** - * Adds callback for command mode notification - * The callback will be called when command mode starts or ends - * - * @since TB9.2 - * @param aCallback Callback to call when command mode starts or ends - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt AddCmdModeCallback( MDunCmdModeMonitor* aCallback ); - - /** - * Adds data for parsing and parses if necessary - * - * @since TB9.2 - * @param aInput Data to add for parsing - * @param aMoreNeeded ETrue if more data needed, EFalse otherwise - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt AddDataForParsing( TDesC8& aInput, TBool& aMoreNeeded ); - - /** - * Manages request to abort command handling - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt ManageAbortRequest(); - - /** - * Sends a character to be echoed - * - * @since TB9.2 - * @param aInput Input to echo - * @param aCallback Callback to echo request completions - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt SendEchoCharacter( const TDesC8* aInput, - MDunAtCmdEchoer* aCallback ); - - /** - * Stops sending of AT command from decode buffer - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt Stop(); - - /** - * Starts URC message handling - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt StartUrc(); - - /** - * Stops URC message handling - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt StopUrc(); - -private: - - CDunAtCmdHandler( MDunAtCmdStatusReporter* aUpstream, - MDunStreamManipulator* aDownstream, - const TDesC8* aConnectionName ); - - void ConstructL(); - - /** - * Initializes this class - * - * @since TB9.2 - * @return None - */ - void Initialize(); - - /** - * Creates plugin handlers for this class - * - * @since TB9.2 - * @return None - */ - void CreatePluginHandlersL(); - - /** - * Creates the array of special commands - * - * @since TB9.2 - * @return None - */ - void CreateSpecialCommandsL(); - - /** - * Recreates special command data. - * This is done when a plugin is installed or uninstalled. - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - TInt RecreateSpecialCommands(); - - /** - * Gets default settings from RATExtCommon and sets them to RATExt - * - * @since TB9.2 - * @return None - */ - void GetAndSetDefaultSettingsL(); - - /** - * Regenerates the reply strings based on settings - * - * @since TB9.2 - * @return ETrue if quiet mode, EFalse otherwise - */ - TBool RegenerateReplyStrings(); - - /** - * Regenerates the ok reply based on settings - * - * @since TB9.2 - * @return ETrue if quiet mode, EFalse otherwise - */ - TBool RegenerateOkReply(); - - /** - * Regenerates the error reply based on settings - * - * @since TB9.2 - * @return ETrue if quiet mode, EFalse otherwise - */ - TBool RegenerateErrorReply(); - - /** - * Gets current mode - * - * @since TB9.2 - * @param aMask Mask for current mode (only one supported) - * @return New current mode - */ - TUint GetCurrentModeL( TUint aMask ); - - /** - * Instantiates one URC message handling class instance and adds it to - * the URC message handler array - * - * @since TB9.2 - * @return None - */ - CDunAtUrcHandler* AddOneUrcHandlerL(); - - /** - * Deletes all instantiated URC message handlers - * - * @since TB9.2 - * @return None - */ - void DeletePluginHandlers(); - - /** - * Manages partial AT command - * - * @since TB9.2 - * @return ETrue if more data needed, EFalse otherwise - */ - TBool ManagePartialCommand(); - - /** - * Echoes a command if echo is on - * - * @since TB9.2 - * @return ETrue if echo push started, EFalse otherwise - */ - TBool EchoCommand(); - - /** - * Handles backspace and cancel characters - * - * @since TB9.2 - * @return ETrue if special character found, EFalse otherwise - */ - TBool HandleSpecialCharacters(); - - /** - * Extracts line from input buffer to line buffer - * - * @since TB9.2 - * @return ETrue if more data needed, EFalse otherwise - */ - TBool ExtractLineFromInputBuffer(); - - /** - * Handles generic buffer management - * (explanation in ExtractLineFromInputBuffer()) - * - * @since TB9.2 - * @param aStartIndex Start index for buffer to be copied - * @param aCopyLength Length for data needed to be copied - * @param aCopyNeeded ETrue if buffer copy needed - * @return ETrue if more data needed, EFalse otherwise - */ - TBool HandleGenericBufferManagement( TInt& aStartIndex, - TInt& aCopyLength, - TBool& aCopyNeeded ); - - /** - * Handles special buffer management - * (explanation in ExtractLineFromInputBuffer()) - * - * @since TB9.2 - * @param aStartIndex Start index for buffer to be copied - * @param aCopyLength Length for data needed to be copied - * @param aCopyNeeded ETrue if buffer copy needed - * @return ETrue if more data needed, EFalse otherwise - */ - TBool HandleSpecialBufferManagement( TInt aStartIndex, - TInt& aCopyLength, - TBool& aCopyNeeded ); - - /** - * Skips end-of-line characters - * - * @since TB9.2 - * @param aStartIndex Start index - * @return Index to end of non-end-of-line or Symbian error code on error - */ - TInt SkipEndOfLineCharacters( TInt aStartIndex ); - - /** - * Skips subcommand delimiter characters - * - * @since TB9.2 - * @param aStartIndex Start index - * @return Index to end of delimiter or Symbian error code on error - */ - TInt SkipSubCommandDelimiterCharacters( TInt aStartIndex ); - - /** - * Finds the end of the line - * - * @since TB9.2 - * @param aStartIndex Start index - * @return Index to end of line or Symbian error code on error - */ - TInt FindEndOfLine( TInt aStartIndex ); - - /** - * Handles next subcommand from line buffer - * - * @since TB9.2 - * @return ETrue if last command decoded, EFalse otherwise - */ - TBool HandleNextSubCommand(); - - /** - * Manages end of AT command handling - * - * @since TB9.2 - * @param aNotifyLocal Notify local parties - * @param aNotifyExternal Notify external parties - * @return None - */ - void ManageEndOfCmdHandling( TBool aNotifyLocal, - TBool aNotifyExternal ); - - /** - * Extracts next subcommand from line buffer to send buffer - * - * @since TB9.2 - * @param aPeek Peek for the next command if ETrue, EFalse otherwise - * @return ETrue if command extracted, EFalse otherwise - */ - TBool ExtractNextSubCommand( TBool aPeek=EFalse ); - - /** - * Finds the start of subcommand from line buffer - * - * @since TB9.2 - * @return Index to the next command or Symbian error code on error - */ - TInt FindStartOfSubCommand(); - - /** - * Restores old decode info. For ExtractNextSubCommand() when aPeeks is - * ETrue. - * - * @since TB9.2 - * @param aPeek Peek for the next command if ETrue, EFalse otherwise - * @param aOldInfo Old information to restore when aPeek is ETrue - * @return None - */ - void RestoreOldDecodeInfo( TBool aPeek, TDunDecodeInfo& aOldInfo ); - - /** - * Tests for end of AT command line - * - * @since TB9.2 - * @param aCharacter Character to test - * @return ETrue if end of command, EFalse otherwise - */ - TBool IsEndOfLine( TChar& aCharacter ); - - /** - * Checks if character is delimiter character - * - * @since TB9.2 - * @param aCharacter Character to test - * @return ETrue if delimiter character, EFalse otherwise - */ - TBool IsDelimiterCharacter( TChar aCharacter ); - - /** - * Checks if character is of extended group - * - * @since TB9.2 - * @param aCharacter Character to test - * @return ETrue if extended character, EFalse otherwise - */ - TBool IsExtendedCharacter( TChar aCharacter ); - - /** - * Checks special command - * - * @since TB9.2 - * @param aEndIndex End index (changes) - * @return Symbian error code on error, KErrNone otherwise - */ - TBool CheckSpecialCommand( TInt& aEndIndex ); - - /** - * Saves character decode state for a found character - * - * @since TB9.2 - * @param aCharacter Character to save a state for - * @param aAddSpecial ETrue to add character for special command, - * EFalse otherwise - * @return Symbian error code on error, KErrNone otherwise - */ - void SaveFoundCharDecodeState( TChar aCharacter, - TBool aAddSpecial=ETrue ); - - /** - * Saves character decode state for a not found character - * - * @since TB9.2 - * @param aStartIndex Start index (doesn't change) - * @param aEndIndex End index (changes) - * @return Symbian error code on error, KErrNone otherwise - */ - void SaveNotFoundCharDecodeState(); - - /** - * Find quotes within subcommands - * - * @since TB9.2 - * @param aCharacter Character to check - * @param aStartIndex Start index (doesn't change) - * @param aEndIndex End index (changes) - * @return Symbian error code on error, KErrNone otherwise - */ - TBool FindSubCommandQuotes( TChar aCharacter, TInt aStartIndex, TInt& aEndIndex ); - - /** - * Check if in next subcommand's extended border - * - * @since TB9.2 - * @param aCharacter Extended character to check - * @param aStartIndex Start index (doesn't change) - * @param aEndIndex End index (changes) - * @return ETrue if in next command's extended border, EFalse otherwise - */ - TBool IsExtendedBorder( TChar aCharacter, TInt aStartIndex, TInt& aEndIndex ); - - /** - * Finds subcommand with alphanumeric borders - * - * @since TB9.2 - * @param aCharacter Character to check - * @param aEndIndex End index (changes) - * @return ETrue if alpha border found, EFalse otherwise - */ - TBool FindSubCommandAlphaBorder( TChar aCharacter, TInt& aEndIndex ); - - /** - * Finds subcommand - * - * @since TB9.2 - * @param aEndIndex End index (changes) - * @return Symbian error code on error, KErrNone otherwise - */ - TInt FindSubCommand( TInt& aEndIndex ); - - /** - * Check if "A/" command - * - * @since TB9.2 - * @return ETrue if "A/" command, EFalse otherwise - */ - TBool IsASlashCommand(); - - /** - * Handles "A/" command - * - * @since TB9.2 - * @return ETrue if error reply push started, EFalse otherwise - */ - TBool HandleASlashCommand(); - - /** - * Manages command mode change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return ETrue if command mode change detected, EFalse otherwise - */ - TBool ManageCommandModeChange( TUint aMode ); - - /** - * Reports command mode start/end change - * - * @since TB9.2 - * @param aStart Command mode start if ETrue, end otherwise - * @return None - */ - void ReportCommandModeChange( TBool aStart ); - - /** - * Manages echo mode change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return ETrue if echo mode change detected, EFalse otherwise - */ - TBool ManageEchoModeChange( TUint aMode ); - - /** - * Manages quiet mode change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return ETrue if quiet mode change detected, EFalse otherwise - */ - TBool ManageQuietModeChange( TUint aMode ); - - /** - * Manages verbose mode change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return ETrue if verbose mode change detected, EFalse otherwise - */ - TBool ManageVerboseModeChange( TUint aMode ); - - /** - * Manages character change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return None - */ - void ManageCharacterChange( TUint aMode ); - - /** - * Manages editor mode reply - * - * @since TB9.2 - * @param aStart ETrue if start of editor mode, EFalse otherwise - * @return Symbian error code on error, KErrNone otherwise - */ - TInt ManageEditorModeReply( TBool aStart ); - - /** - * Finds the next content from the input buffer - * - * @since TB9.2 - * @param aStart ETrue if start of editor mode, EFalse otherwise - * @return ETrue if next content found, EFalse otherwise - */ - TBool FindNextContent( TBool aStart ); - -// from base class MDunAtCmdPusher - - /** - * From MDunAtCmdPusher. - * Notifies about end of AT command processing. - * This is after all reply data for an AT command is multiplexed to the - * downstream. - * - * @since TB9.2 - * @param aError Error code of command processing completion - * @return None - */ - TInt NotifyEndOfProcessing( TInt aError ); - - /** - * Notifies about request to stop AT command handling for the rest of the - * command line data - * - * @since TB9.2 - * @return None - */ - void NotifyEndOfCmdLineProcessing(); - - /** - * Notifies about request to peek for the next command - * - * @since TB9.2 - * @return ETrue if next command exists, EFalse otherwise - */ - TBool NotifyNextCommandPeekRequest(); - - /** - * Notifies about editor mode reply - * - * @since TB9.2 - * @return Symbian error code on error, KErrNone otherwise - */ - TInt NotifyEditorModeReply(); - -// from base class MDunAtCmdEchoer - - /** - * Notifies about completed echo in text mode - * - * @since TB9.2 - * @return None - */ - void NotifyEchoComplete(); - -// from base class MDunAtEcomListen - - /** - * From MDunAtEcomListen. - * Notifies about new plugin installation - * - * @since TB9.2 - * @return None - */ - TInt NotifyPluginInstallation( TUid& aPluginUid ); - - /** - * From MDunAtEcomListen. - * Notifies about existing plugin uninstallation - * - * @since TB9.2 - * @return None - */ - TInt NotifyPluginUninstallation( TUid& aPluginUid ); - -// from base class MDunAtModeListen - - /** - * From MDunAtModeListen. - * Gets called on mode status change - * - * @since TB9.2 - * @param aMode Mode to manage - * @return Symbian error code on error, KErrNone otherwise - */ - TInt NotifyModeStatusChange( TUint aMode ); - -private: // data - - /** - * Callback to call when AT command handling status changes - * Not own. - */ - MDunAtCmdStatusReporter* iUpstream; - - /** - * Callback to call when data to push - * Not own. - */ - MDunStreamManipulator* iDownstream; - - /** - * Callback(s) to call when command mode starts or ends - * Usually two needed: one for upstream and second for downstream - */ - RPointerArray iCmdCallbacks; - - /** - * Connection identifier name - */ - const TDesC8* iConnectionName; - - /** - * Current state of AT command handling: active or inactive - */ - TDunState iHandleState; - - /** - * Character for carriage return - */ - TInt8 iCarriageReturn; - - /** - * Character for line feed - */ - TInt8 iLineFeed; - - /** - * Character for backspace - */ - TInt8 iBackspace; - - /** - * Current input to AddDataForParsing() - * Not own. - */ - TDesC8* iInput; - - /** - * Special commands for parsing - */ - RPointerArray iSpecials; - - /** - * Buffer for character echoing - */ - TBuf8 iEchoBuffer; - - /** - * Buffer for ok reply - */ - TBuf8 iOkBuffer; - - /** - * Buffer for error reply - */ - TBuf8 iErrorBuffer; - - /** - * Buffer for AT command (one line) - */ - TBuf8 iLineBuffer; - - /** - * Buffer for last AT command input (for "A/") - */ - TBuf8 iLastBuffer; - - /** - * Buffer for command - */ - TBuf8 iEscapeBuffer; - - /** - * AT command decoding related information - */ - TDunDecodeInfo iDecodeInfo; - - /** - * Information for parsing - */ - TDunParseInfo iParseInfo; - - /** - * Information for editor mode - */ - TDunEditorModeInfo iEditorModeInfo; - - /** - * AT command reply pusher - * Own. - */ - CDunAtCmdPusher* iCmdPusher; - - /** - * AT command reply echoer - * Own. - */ - CDunAtCmdEchoer* iCmdEchoer; - - /** - * URC message handlers - * Own. - */ - RPointerArray iUrcHandlers; - - /** - * ECOM plugin interface status change listener - * Own. - */ - CDunAtEcomListen* iEcomListen; - - /** - * Modem mode status change listener - * Own. - */ - CDunAtModeListen* iModeListen; - - /** - * NVRAM status change listener - * Own. - */ - CDunAtNvramListen* iNvramListen; - - /** - * Flag to mark command mode start/end - */ - TBool iDataMode; - - /** - * Flag to be set on if echo on - */ - TBool iEchoOn; - - /** - * Flag to be set on if quiet mode on - */ - TBool iQuietOn; - - /** - * Flag to be set on if verbose mode on - */ - TBool iVerboseOn; - - /** - * End index for not added data in iCommand - */ - TInt iEndIndex; - - /** - * AT command extension - */ - RATExt iAtCmdExt; - - /** - * AT command extension to common functionality - */ - RATExtCommon iAtCmdExtCommon; - - /** - * Special AT command handler for handling commands like AT&FE0Q0V1&C1&D2+IFC=3,1. - */ - CDunAtSpecialCmdHandler* iAtSpecialCmdHandler; - }; - -#endif // C_CDUNATCMDHANDLER_H