diff -r f7fbeaeb166a -r b23265fb36da cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp Tue Apr 27 16:49:44 2010 +0300 @@ -0,0 +1,261 @@ +// Copyright (c) 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: +// This file contains the implementation of the AT command parser and common utilities +// +// + +#include "atcommandparser.h" +#include + +#include "debug.h" + + +// Max buffer length for an MD5 digest +const TInt KSCPMaxHashLength( 32 ); + + +TAtCommandParser::TAtCommandParser() + : iCmdType(EUnknown), iCmdHandlerType(ECmdHandlerTypeUndefined) + { + } + +TAtCommandParser::TAtCommandParser(const TDesC8& aCmd) + : iCmdType(EUnknown), iCmdHandlerType(ECmdHandlerTypeUndefined) + { + ParseAtCommand(aCmd); + } + + +void TAtCommandParser::ParseAtCommand(const TDesC8& aCmd) + { + TRACE_FUNC_ENTRY + iCmd.Assign(aCmd); + iCmd.Mark(); + TChar c = 0; + // First extract the AT command "AT+COMMAND" + while(!iCmd.Eos() && !(c=='=' || c=='?')) + { + iCmd.Inc(); + c = iCmd.Peek(); + } + + TPtrC8 token = iCmd.MarkedToken(); + + _LIT8(KAtCfun, "AT+CFUN"); + _LIT8(KAtCbc, "AT+CBC"); + _LIT8(KAtClck, "AT+CLCK"); + _LIT8(KAtCpwd, "AT+CPWD"); + _LIT8(KAtCpin, "AT+CPIN"); + _LIT8(KAtCusd, "AT+CUSD"); + _LIT8(KAtCnum, "AT+CNUM"); + + Trace(KDebugPrintS, "token: ", &token); + // Determine the AT command type + if(!token.Compare(KAtCfun)) + { + iCmdType = ECmdAtCfun; + } + else if(!token.Compare(KAtCbc)) + { + iCmdType = ECmdAtCbc; + } + else if(!token.Compare(KAtClck)) + { + iCmdType = ECmdAtClck; + } + else if(!token.Compare(KAtCpwd)) + { + iCmdType = ECmdAtCpwd; + } + else if(!token.Compare(KAtCpin)) + { + iCmdType = ECmdAtCpin; + } + else if(!token.Compare(KAtCusd)) + { + iCmdType = ECmdAtCusd; + } + else if(!token.Compare(KAtCnum)) + { + iCmdType = ECmdAtCnum; + } + else + { + iCmdType = EUnknown; + TRACE_FUNC_EXIT + return; + } + + // Now find out the AT command handler type + if(iCmd.Eos()) + { + iCmdHandlerType = ECmdHandlerTypeBase; + } + else if(iCmd.Peek() == '?') + { + iCmdHandlerType = ECmdHandlerTypeRead; + } + else if(iCmd.Peek() == '=') + { + iCmd.Inc(); + if(iCmd.Peek() == '?') + { + iCmd.Inc(); + iCmdHandlerType = ECmdHandlerTypeTest; + } + else + { + iCmdHandlerType = ECmdHandlerTypeSet; + } + } + else + { + iCmdHandlerType = ECmdHandlerTypeUndefined; + } + TRACE_FUNC_EXIT + } + +TAtCommandParser::TCommandType TAtCommandParser::Command() const + { + return iCmdType; + } + +TAtCommandParser::TCommandHandlerType TAtCommandParser::CommandHandlerType() const + { + return iCmdHandlerType; + } + +TPtrC8 TAtCommandParser::NextParam() + { + TRACE_FUNC_ENTRY + iCmd.SkipSpace(); // Skip front spaces + iCmd.Mark(); + TChar chr = 0; + + if(!iCmd.Eos()) + { + chr = iCmd.Peek(); + while(!iCmd.Eos() && chr != ',' && !chr.IsSpace() && !chr.IsControl()) + {// Stop at any of those chars: comma, space or control + iCmd.Inc(); + chr = iCmd.Peek(); + } + } + + // Extract the token at this point + TPtrC8 retVal = iCmd.MarkedToken(); + + // Skip comma, space and control chars + while(!iCmd.Eos() && (chr == ',' || chr.IsSpace() || chr.IsControl())) + { + iCmd.Inc(); + chr = iCmd.Peek(); + } + TRACE_FUNC_EXIT + return retVal; + } + +TPtrC8 TAtCommandParser::NextTextParam(TInt& aError) + { + TPtrC8 param = NextParam(); + + if (param.Compare(KNullDesC8) == 0) + { + aError = KErrNotFound; + return param; + } + + if(param.Length()<2 + || param[0] != '"' + || param[param.Length()-1] != '"') + { + aError = KErrArgument; + return param.Left(0); + } + aError = KErrNone; + return param.Mid(1, param.Length() - 2); + } + +TInt TAtCommandParser::NextIntParam(TInt& aValue) + { + TRACE_FUNC_ENTRY + TInt retVal =KErrNone; + TPtrC8 param = NextParam(); + if (param.Compare(KNullDesC8) == 0) + { + retVal = KErrNotFound; + } + else + { + TLex8 lex(param); + retVal = lex.Val(aValue); + } + TRACE_FUNC_EXIT + return retVal; + } + +TInt TAtCommandParser::HashSecurityCode(const TDesC8& aPasscode, TDes8& aHashCode) + { + TRACE_FUNC_ENTRY + TInt ret = KErrNone; + + // Get MD5 Hash + // see remotemgmt component CSCPServer::HashISACode() for encoding algorithm + CMD5* hashObject = NULL; + TRAP( ret, hashObject = CMD5::NewL() ); + + if(ret != KErrNone) + { + TRACE_FUNC_EXIT + return ret; + } + + RBuf pwdBuffer; + ret = pwdBuffer.Create(KSCPMaxHashLength); + if(ret != KErrNone) + { + delete hashObject; + TRACE_FUNC_EXIT + return ret; + } + pwdBuffer.Copy(aPasscode); // convert to TDes16 + + // add TDes16 to a binary buffer + TUint16* inputPtr = const_cast( pwdBuffer.Ptr() ); + TPtrC8 inputData( reinterpret_cast(inputPtr), pwdBuffer.Length()*2 ); + + TPtrC8 hash = hashObject->Final( inputData ); + delete hashObject; + + pwdBuffer.Zero(); + pwdBuffer.Copy(hash); + + // Compute the hash sum as four 32-bit integers. + TInt64 hashSum = *(reinterpret_cast(&pwdBuffer[0])) + + *(reinterpret_cast(&pwdBuffer[4])) + + *(reinterpret_cast(&pwdBuffer[8])) + + *(reinterpret_cast(&pwdBuffer[12])); + pwdBuffer.Close(); + + // Create a five-digit security code from this number + TInt isaCode = ( hashSum % 90000 ) + 10000; + + // save encoded security code to TDes + aHashCode.Zero(); + aHashCode.AppendNum(isaCode); + + TRACE_FUNC_EXIT + return KErrNone; + } +