diff -r 000000000000 -r 3da2a79470a7 testtoolsconn/stat/desktop/source/stat2perl/src/stat2perl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testtoolsconn/stat/desktop/source/stat2perl/src/stat2perl.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,495 @@ +/* +* Copyright (c) 2005-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: +* +*/ + + + + + +#include "stdafx.h" +#include +#include +#include +#include + +#define IN_LINE_MAX 4096 + +/////////////////////////////////////////////// +// AUTO-GENERATED TEXT - DO NOT MODIFY!!! +/////////////////////////////////////////////// +#define S2P_VERSION "4.0" +/////////////////////////////////////////////// + +DWORD nFileLength = 0; +char *lpBuffer = NULL; +char szConnection[3] = {0}; +char szPlatform[20] = {0}; +char szInputName[MAX_PATH + 1] = {0}; +char szOutputName[MAX_PATH + 1] = {0}; + +void cleanup(char *message, UINT errorcode = 0); +bool ReadFileIntoArray(const char *file); +bool ProcessFileContents(const char *file); +void ConvertBackslash(char *szCommand); +void WriteHeader(HANDLE outfile); +void WriteTrailer(HANDLE outfile); +void SkipOverComment(DWORD *counter); + +int main(int argc, char* argv[]) +{ + printf("\n------------------------------\n" + "STAT2PERL Script Converter %s\n" + "------------------------------\n" + "Copyright Symbian Ltd 2002.\n" + "---------------------------", S2P_VERSION); + + CommandLine oCmd; + if (oCmd.GetNumberOfArgs() == 5) + { + strcpy(szConnection, oCmd.GetProgramArgument(1)); + strcpy(szPlatform, oCmd.GetProgramArgument(2)); + strcpy(szInputName, oCmd.GetProgramArgument(3)); + strcpy(szOutputName, oCmd.GetProgramArgument(4)); + + if (ReadFileIntoArray(szInputName)) + { + if (ProcessFileContents(szOutputName)) + { + printf("\n\nFile converted successfully.\n"); + return 1; + } + } + else + printf("\nERROR: Could not read [%s] into memory.\n", szInputName); + } + else + printf("\n\nERROR: Incorrect Number of arguments.\nUsage: stat2perl \n Eg: stat2perl 3 COM1 file.txt file.pl\n"); + + return -1; +} + + +bool ReadFileIntoArray(const char *file) +{ + HANDLE infile; + DWORD bytes = 0; + struct stat buf; + + if (stat(file, &buf) == 0) + { + nFileLength = buf.st_size; + + if ((infile = CreateFile(file, + GENERIC_READ, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + 0)) + != INVALID_HANDLE_VALUE) + { + lpBuffer = new char [nFileLength + 1]; + if (lpBuffer) + { + if (ReadFile(infile, lpBuffer, nFileLength, &bytes, NULL) && bytes == nFileLength) + { + CloseHandle(infile); + return true; + } + else + printf("\nERROR: Failed to read entire file into memory."); + + } + else + printf("\nERROR: Could not allocate memory to read file."); + + CloseHandle(infile); + } + else + printf("\nERROR: Could not open [%s] to read.", file); + } + else + printf("\nERROR: [%s] does not exist.", file); + + return false; +} + +bool ProcessFileContents(const char *file) +{ + HANDLE outfile; + DWORD bytes = 0; + + // open our output file + if ((outfile = CreateFile(file, + GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0)) + != INVALID_HANDLE_VALUE) + { + bool bCommand = false; + DWORD counter = 0; + DWORD actualstart = 0; + DWORD actualend = 0; + + WriteHeader(outfile); + + // find the beginning and end + while(counter < nFileLength) + { + // check command format is correct + if(lpBuffer[counter] == '<') + { + counter++; + if(lpBuffer[counter] == 'B') + actualstart = counter + 2; + + if(lpBuffer[counter] == 'E') + { + actualend = counter - 2; + break; + } + } + else if (lpBuffer[counter] == '/') // start of comment or command + { + SkipOverComment(&counter); + } + + counter++; + } + + // only concerned with usable part of script + counter = actualstart; + nFileLength = actualend; + + // now parse it... + while(counter < nFileLength) //while not reached end of the file + { + // check command format is correct + if(lpBuffer[counter] == '<') + { + bCommand = true; + } + else if (lpBuffer[counter] == '/') // start of comment or command + { + SkipOverComment(&counter); + } + else if (bCommand) // start of comment or command + { + char szCommand[2048] = {0}; + char szLine[IN_LINE_MAX + 1] = {0}; + char *ptr = NULL; + int cmdLength = 0; + + // extract the command + while (lpBuffer[counter + cmdLength] != '>') + cmdLength++; + strncpy(szLine, lpBuffer + counter, cmdLength); + *(szLine + counter + cmdLength) = (char)0; + + switch(lpBuffer[counter]) + { + case '#' : // set image directory - format: '#image + if ((ptr = strchr(szLine, ' ')) && strncmp(szLine, "#image", 6) == 0) + { + (*ptr++) = (char)0; + sprintf(szCommand, "set_screenshot_dir(\"%s\") or goto scripterror;", ptr); + } + break; + case 'D' : // retrieves information about connected device + case 'd' : + strcpy(szCommand, "get_device_info($hndl) or goto scripterror;"); + break; + case 'K' : //standard QWERTY Keypress command + case 'k' : + sprintf(szCommand, "basic_key_sequence($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'L' : //used to send non-standard key data over (ie - Menu button, Home button, PageDown button) + case 'l' : + sprintf(szCommand, "control_keystroke($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'M' : //used when combination keys are to be sent over + case 'm' : + sprintf(szCommand, "combination_keystroke($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'H' : // hold key down for a while + case 'h' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "hold_key($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + break; + case 'A' : //Fire up application (second character is a number which opens up the app (e.g - )) + case 'a' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "start_application($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + else + sprintf(szCommand, "start_application($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'F' : //Open file + case 'f' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "open_application($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + break; + case 'T' : //used to transfer files from the PC to the EPOC device + case 't' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "copy_testfile_to_target($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + break; + case 'R' : //used to retrieve files from the EPOC device + case 'r' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "copy_from_target($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + break; + case 'X' : + case 'x' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "move_from_target($hndl, \"%s\", \"%s\") or goto scripterror;", szLine + 1, ptr); + } + break; + case 'S' : // Used for screen capture + case 's' : + if (cmdLength > 1) + sprintf(szCommand, "get_screenshot($hndl, \"%s\") or goto scripterror;", szLine + 1); + else + strcpy(szCommand, "get_screenshot($hndl) or goto scripterror;"); + break; + case 'I' : //Icon coordinates + case 'i' : + if (ptr = strchr(szLine, ',')) + { + (*ptr++) = (char)0; + sprintf(szCommand, "touch_screen($hndl, %s, %s) or goto scripterror;", szLine + 1, ptr); + } + break; + case 'C' : //Close currently active application + case 'c' : + strcpy(szCommand, "close_application($hndl) or goto scripterror;"); + break; + case '!' : // Start ESHELL.EXE + if (*(szLine + 1) != '!') + strcpy(szCommand, "start_eshell($hndl) or goto scripterror;"); + else + strcpy(szCommand, "stop_eshell($hndl) or goto scripterror;"); + break; + case 'P' : //pause + case 'p' : + sprintf(szCommand, "pause($hndl, %s) or goto scripterror;", szLine + 1); + break; + case 'U' : // remove file + case 'u' : + sprintf(szCommand, "remove_file($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'Y' : // create folder + case 'y' : + sprintf(szCommand, "create_folder($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + case 'Z' : // remove folder + case 'z' : + sprintf(szCommand, "remove_folder($hndl, \"%s\") or goto scripterror;", szLine + 1); + break; + } // switch + + // if command supported, write it to file + if (*szCommand) + { + ConvertBackslash(szCommand); + WriteFile(outfile, szCommand, strlen(szCommand), &bytes, NULL); + WriteFile(outfile, "\r\n", 2, &bytes, NULL); + (*szCommand) = (char)0; + } + + counter += cmdLength; + bCommand = false; + } + + counter++; + } + + WriteTrailer(outfile); + CloseHandle(outfile); + } + else + { + printf("\nERROR: Could not open [%s] to write.", file); + return false; + } + + return true; +} + +void SkipOverComment(DWORD *counter) +{ + int iInComment = 0; + + // beginning of comment + if (lpBuffer[(*counter) + 1] == '*') + { + iInComment++; + (*counter)+=2; + while(iInComment && (*counter) < nFileLength) //while not reached end of the file + { + if (lpBuffer[(*counter)] == '/') + { + // beginning of comment - support nested comments + if (lpBuffer[(*counter) + 1] == '*') + { + iInComment++; + (*counter)++; + } + + // end of comment + if (lpBuffer[(*counter) - 1] == '*') + { + iInComment--; + } + } + + (*counter)++; + } + } +} + +void ConvertBackslash(char *szCommand) +{ + char szCopy[IN_LINE_MAX + 1] = {0}; + int iSrc = 0, iDest = 0; + + while(*(szCommand + iSrc)) + { + // need to substitute the special chars + if (*(szCommand + iSrc) == '\r') + { + *(szCopy + iDest) = '\\'; + iDest++; + *(szCopy + iDest) = 'r'; + iDest++; + } + else if (*(szCommand + iSrc) == '\n') + { + *(szCopy + iDest) = '\\'; + iDest++; + *(szCopy + iDest) = 'n'; + iDest++; + } + else if (*(szCommand + iSrc) == '\t') + { + *(szCopy + iDest) = '\\'; + iDest++; + *(szCopy + iDest) = 't'; + iDest++; + } + else if (*(szCommand + iSrc) == '@') + { + *(szCopy + iDest) = '\\'; + iDest++; + *(szCopy + iDest) = '@'; + iDest++; + } + else + { + // append a backslash + if (*(szCommand + iSrc) == '\\') + { + *(szCopy + iDest) = '\\'; + iDest++; + } + + // now copy the char + *(szCopy + iDest) = *(szCommand + iSrc); + iDest++; + } + + // don't go too far + if (iDest >= IN_LINE_MAX) + { + *(szCopy + iDest) = (char)0; + break; + } + iSrc++; + } + + strcpy(szCommand, szCopy); +} + +void WriteHeader(HANDLE outfile) +{ + DWORD bytes = 0; + char szLine[2048] = {0}; + + WriteFile(outfile, "#########################################################################\r\n", 75, &bytes, NULL); + WriteFile(outfile, "# STAT2PERL CONVERTED SCRIPT\r\n", 30, &bytes, NULL); + WriteFile(outfile, "#\r\n", 3, &bytes, NULL); + WriteFile(outfile, "# For STAT Perl Interface ", 26, &bytes, NULL); + WriteFile(outfile, S2P_VERSION, strlen(S2P_VERSION), &bytes, NULL); + WriteFile(outfile, " or higher\r\n#\r\n", 15, &bytes, NULL); + WriteFile(outfile, "# Auto-Generated from script:\r\n", 31, &bytes, NULL); + sprintf(szLine, "# %s\r\n#\r\n", szInputName); + WriteFile(outfile, szLine, strlen(szLine), &bytes, NULL); + WriteFile(outfile, "#########################################################################\r\n", 75, &bytes, NULL); + WriteFile(outfile, "\r\n", 2, &bytes, NULL); + WriteFile(outfile, "use Symbian::StatAPI30; # must include this library\r\n\r\n", 56, &bytes, NULL); + WriteFile(outfile, "my $result = 1; # test result\r\n", 40, &bytes, NULL); + WriteFile(outfile, "my $hndl; # handle to connection\r\n\r\n", 51, &bytes, NULL); + WriteFile(outfile, "# set everything up\r\n", 21, &bytes, NULL); + sprintf(szLine, "my @arglist = (\"STAT.DLL\", %c, \"%s\");\r\n", szConnection[0], _strupr(szPlatform)); + WriteFile(outfile, szLine, strlen(szLine), &bytes, NULL); + WriteFile(outfile, "initialise(@arglist) or goto scripterror;\r\n\r\n", 45, &bytes, NULL); + WriteFile(outfile, "# connect to the board\r\n", 24, &bytes, NULL); + WriteFile(outfile, "$hndl = connect_to_target();\r\n", 30, &bytes, NULL); + WriteFile(outfile, "$hndl or goto scripterror;\r\n\r\n", 30, &bytes, NULL); + WriteFile(outfile, "# send commands\r\n", 17, &bytes, NULL); +} + + +void WriteTrailer(HANDLE outfile) +{ + DWORD bytes = 0; + + WriteFile(outfile, "\r\n\r\n#########################################################################\r\n", 79, &bytes, NULL); + WriteFile(outfile, "# test succeeded\r\n", 18, &bytes, NULL); + WriteFile(outfile, "goto endscript;\r\n\r\n\r\n", 21, &bytes, NULL); + WriteFile(outfile, "#########################################################################\r\n", 75, &bytes, NULL); + WriteFile(outfile, "# fail the test\r\n", 17, &bytes, NULL); + WriteFile(outfile, "scripterror:\r\n", 14, &bytes, NULL); + WriteFile(outfile, "print \"\\nScript aborted due to error:\\n\" . get_last_error($hndl) . \"\\n\";\r\n", 74, &bytes, NULL); + WriteFile(outfile, "$result = 0;\r\n\r\n\r\n", 18, &bytes, NULL); + WriteFile(outfile, "#########################################################################\r\n", 75, &bytes, NULL); + WriteFile(outfile, "# finish\r\n", 10, &bytes, NULL); + WriteFile(outfile, "endscript:\r\n", 12, &bytes, NULL); + WriteFile(outfile, "$hndl and disconnect_from_target($hndl) and print \"Disconnected OK\\n\";\r\n\r\n\r\n", 76, &bytes, NULL); + WriteFile(outfile, "#########################################################################\r\n", 75, &bytes, NULL); + WriteFile(outfile, "# return value (zero=fail, non-zero=success)\r\n", 46, &bytes, NULL); + WriteFile(outfile, "exit($result);\r\n", 16, &bytes, NULL); + WriteFile(outfile, "\r\n", 2, &bytes, NULL); +}