testtoolsconn/stat/desktop/source/stat2perl/src/stat2perl.cpp
changeset 0 3da2a79470a7
--- /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 <commandline.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+
+#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 <connection> <platform> <input file> <output file>\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 <location>
+						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 - <A1>))
+					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);
+}