testtoolsconn/stat/desktop/source/lib/src/statmember.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testtoolsconn/stat/desktop/source/lib/src/statmember.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,635 @@
+/*
+* 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 "statmember.h"
+#include <stdio.h>
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Construct and initialise a STAT object and check it hasn't passed it's expiry date.
+//
+STATDLLMember::STATDLLMember(const STATCONNECTTYPE iConnectType, const char *pszPlatformType, Reporter *theRep)
+: pRep(theRep), 
+  iConnectionType(iConnectType), 
+  iErrorCode(GENERAL_FAILURE), 
+  lNextConnection((STATDLLMember*)0), 
+  lPrevConnection((STATDLLMember*)0),
+  pEngine(NULL)
+{
+	CString lPrefix="";
+
+	pszAddress = NULL;
+	iErrorCode = GENERAL_FAILURE;
+	strcpy(szErrorText, "An unknown error has occured");
+
+	// set logging identifier
+	lPrefix.Format(LPCTSTR("[%d:%s] "), iConnectType, pszPlatformType);
+ 	const char *lPrefixPtr=(const char *)lPrefix.GetBuffer(lPrefix.GetLength());
+	strncpy(szPrefix, lPrefixPtr, MAX_ID_PREFIX);
+
+	pEngine = new CSTATEngine;
+	if (pEngine)
+	{
+		if ((iErrorCode = pEngine->Initialise(iConnectType, pszPlatformType)) != ITS_OK)
+		{
+			ErrorMessage("Could not initialise new connection object");
+			delete pEngine;
+			pEngine = NULL;
+		}
+		else
+		{
+			pszAddress = new char[strlen(pszPlatformType) + 1];
+			if (pszAddress)
+				strcpy(pszAddress, pszPlatformType);
+		}
+	}
+	else
+		ErrorMessage("Could not create new connection object");
+
+	// did we make it?
+	if (iErrorCode == ITS_OK)
+		Message("Connection initialised successfully");
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Release any STAT resources.
+//
+STATDLLMember::~STATDLLMember()
+{
+	if (pEngine)
+	{
+		Message("Releasing member resources");
+		pEngine->Release();
+		delete pEngine;
+	}
+
+	if (pszAddress)
+		delete [] pszAddress;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Do all the preparations in one go
+//
+bool
+STATDLLMember::Prepare(int iMillisecondDelay, LPTSTR pszLogPath, bool bAppend, MessageReporter *const aMessageReporter, LPTSTR pszRefDir, const bool bRemoveOldImages, const int iFactor, bool bState)
+{
+	if (pEngine)
+	{
+		pEngine->SetMultithreaded(bState);
+	}
+
+	if (!SetCommandDelay(iMillisecondDelay))
+		return false;
+
+	if (pszLogPath && (*pszLogPath) && !SetLogging(pszLogPath, bAppend, aMessageReporter))
+		return false;
+
+	if (pszRefDir && (*pszRefDir) && !SetImageVerification(pszRefDir, bRemoveOldImages, iFactor))
+		return false;
+
+	return true;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Set the delay time between commands
+//
+int
+STATDLLMember::SetCommandDelay(int iMillisecondDelay)
+{
+	if (pEngine)
+	{
+		pEngine->SetCommandDelay(iMillisecondDelay);
+		Message("Command delay set");
+		iErrorCode = ITS_OK;
+		return true;
+	}
+
+	iErrorCode = GENERAL_FAILURE;
+	ErrorMessage("Command delay could not be set");
+	return false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Set logging of STAT commands.
+//
+int
+STATDLLMember::SetLogging(LPTSTR pszLogPath, bool bAppend, MessageReporter *const aMessageReporter)
+{
+	iErrorCode = GENERAL_FAILURE;
+	CString logpath = pszLogPath;
+
+	if (pEngine)
+	{
+		if (LOG_FILE_OK == (iErrorCode = pEngine->SetLogging(logpath, szPrefix, bAppend, 
+				(aMessageReporter != NULL), true, aMessageReporter)))
+		{
+			Message("Logging set");
+			return LOG_FILE_OK;
+		}
+	}
+
+	ErrorMessage("Logging could not be set");
+	return GENERAL_FAILURE;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Send a string of STAT commands through to the STAT object.
+//
+int
+STATDLLMember::SendRawCommand(LPCTSTR pszText, ScriptProgressMonitor *const monitor)
+{
+	iErrorCode = GENERAL_FAILURE;
+	CString file = pszText;
+
+	if (pEngine)
+	{
+		{
+		CString msg;
+		msg.Format( "Sending raw command...%s", pszText );
+		Message(msg.operator LPCTSTR());
+		}
+		if ((iErrorCode = pEngine->OpenScriptFile(file, false)) == ITS_OK)
+			if ((iErrorCode = pEngine->RunScript(monitor)) == END_SCRIPT)
+				return ITS_OK;
+	}
+
+	ErrorMessage("Command text could not be processed successfully");
+	return iErrorCode;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Open a script file or text block in the engine.
+//
+int
+STATDLLMember::OpenScriptFile(LPCTSTR pszText, bool bIsFile)
+{
+	iErrorCode = GENERAL_FAILURE;
+	CString file = pszText;
+
+	if (pEngine)
+	{
+		{
+		CString msg;
+		msg.Format( "Opening script file...%s", pszText );
+		Message(msg.operator LPCTSTR());
+		}
+		if ((iErrorCode = pEngine->OpenScriptFile(pszText, bIsFile)) == ITS_OK)
+				return iErrorCode;
+	}
+
+	ErrorMessage("Open script file could not be processed successfully");
+	return iErrorCode;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Runs the script in the engine.
+//
+int
+STATDLLMember::RunScript(ScriptProgressMonitor *const monitor)
+{
+	iErrorCode = GENERAL_FAILURE;
+
+	if (pEngine)
+	{
+		{
+		CString msg;
+		msg.Format( "Running script..." );
+		Message(msg.operator LPCTSTR());
+		}
+
+		iErrorCode = pEngine->RunScript(monitor);
+	}
+
+	if( iErrorCode != END_SCRIPT )
+	{
+		ErrorMessage("Run script could not be processed successfully");
+	}
+
+	if(monitor)
+	{
+		monitor->OnCompleteScript( iErrorCode );
+	}
+
+	return iErrorCode;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Send a command file containing a string of STAT commands through to the STAT object.
+// Checks that it is actually an accessible file before accepting it.
+//
+int
+STATDLLMember::SendCommandFile(LPCTSTR pszFile, ScriptProgressMonitor *const monitor)
+{
+	iErrorCode = GENERAL_FAILURE;
+	CString file = pszFile;
+
+	if (pEngine)
+	{
+		Message("Sending command file...");
+		if ((iErrorCode = pEngine->OpenScriptFile(file, true)) == ITS_OK)
+			if ((iErrorCode = pEngine->RunScript(monitor)) == END_SCRIPT)
+				return true;
+	}
+
+	ErrorMessage("Script file could not be processed successfully");
+	return false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Stops processing the current command.
+//
+int
+STATDLLMember::StopProcessing(void)
+{
+	iErrorCode = GENERAL_FAILURE;
+
+	if (pEngine)
+	{
+		Message("Stopping processing...");
+		pEngine->eStopProcessing = STAT_PAUSE;
+		return true;
+	}
+
+	ErrorMessage("Stopping the process could not be processed successfully");
+	return false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Returns the number of commands in the current script.
+//
+int
+STATDLLMember::GetCommandCount(LPCTSTR pszFile, int* commandCount)
+{
+	iErrorCode = GENERAL_FAILURE;
+
+	if (pEngine)
+	{
+		Message("Sending command file...");
+		if ((iErrorCode = pEngine->GetCommandCount(pszFile, commandCount)) == ITS_OK)
+				return ITS_OK;
+	}
+
+	ErrorMessage("Getting the command count could not be processed successfully");
+	return GENERAL_FAILURE;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Returns the number of the current command.
+//
+int
+STATDLLMember::GetCurrentCommandNumber( int* commandNumber )
+{
+	iErrorCode = GENERAL_FAILURE;
+
+	if (pEngine)
+	{
+		Message("Getting current command number...");
+		*commandNumber =	pEngine->iCurrentCommand;
+		iErrorCode = ITS_OK;
+			return iErrorCode;
+	}
+
+	ErrorMessage("Getting the current command number could not be processed successfully");
+	return iErrorCode;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Returns the text recevied by the commands.
+//
+const char *
+STATDLLMember::GetReceivedData(void)
+{
+	if (pEngine)
+	{
+		Message("Getting data received by commands...");
+		return ( pEngine->GetReceivedData() );
+	}
+
+	return ( "Getting the error text could not be processed successfully" );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Returns the text associated with an error value.
+//
+const char *
+STATDLLMember::GetErrorText( int errorCode )
+{
+	if (pEngine)
+	{
+		Message("Getting current command number...");
+		return ( pEngine->GetErrorText(errorCode) );
+	}
+
+	return ( "Getting the error text could not be processed successfully" );
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Sets image verification with supplied reference directory, and will remove existing
+// images if specified.  Also sets the 'fudge' factor for the verification itself.
+//
+int
+STATDLLMember::SetImageVerification(LPTSTR pszRefDir, const bool bRemoveOldImages, const int iFactor)
+{
+	iErrorCode = GENERAL_FAILURE;
+	Message("Setting image verification Dir [%s] Remove Old %d Factor %d...", ToAnsi(pszRefDir), bRemoveOldImages, iFactor);
+
+	if (pEngine && pEngine->pImageVerify)
+	{
+		//set default logging path
+		CString defaultDirectory=STAT_LOGFILEPATH_VALUE;
+		//read from inifile if entry exists
+		if(statIniFile.SectionExists(ST_TEST_KEY) )
+		{
+			CString setting;
+			setting.Empty();
+			setting=statIniFile.GetKeyValue(ST_LOGFILEPATH,ST_TEST_KEY);
+			if(!setting.IsEmpty())
+				defaultDirectory = setting;
+		}
+		iErrorCode = pEngine->pImageVerify->Initialise(defaultDirectory);
+		if(iErrorCode == ERROR_REGISTRY)
+		{
+			ErrorMessage("Config file failure");
+		}
+		else if(iErrorCode == REFDIR_FOUND)
+		{
+			if (bRemoveOldImages)
+			{
+				Message("Removing old images...");
+				iErrorCode = pEngine->pImageVerify->DeleteReferenceImages();
+			}
+			else
+				Message("Old reference images exist");
+		}
+
+		// if preparations went OK...
+		if(iErrorCode == ITS_OK)
+		{
+			Message("Copying new images from [%s]...", ToAnsi(pszRefDir));
+			iErrorCode = pEngine->pImageVerify->CopyReferenceImages(pszRefDir);
+			if(iErrorCode != ITS_OK)
+				ErrorMessage("Images could not be copied");
+		}
+
+		// success?
+		if(iErrorCode == ITS_OK || iErrorCode == REFDIR_FOUND)
+		{
+			if (pEngine->pImageVerify->EnableVerification(iFactor) > 0)
+			{
+				Message("Image verification set");
+				return true;
+			}
+			else
+			{
+				iErrorCode = GENERAL_FAILURE;
+				ErrorMessage("No images available for verification");
+			}
+		}
+
+		// disable on error
+		pEngine->pImageVerify->DisableVerification();
+	}
+
+	ErrorMessage("Image verification could not be set");
+	return false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Gets a 'snapshot' of the screen of the remote target and returns the information
+// and data in the supplied parameters. Only stores the most recent snapshot.
+//
+STATDLLMember::GetSnapshot(TBitmapFileHeader **ppFile, TBitmapInfoHeader **ppBitmap, char **ppData, unsigned long *pSize)
+{
+	// basic screenshot command
+	CString file = "<B><S><E>";
+
+	iErrorCode = GENERAL_FAILURE;
+	*ppFile = NULL;
+	*ppBitmap = NULL;
+	*ppData = NULL;
+	*pSize = NULL;
+
+	if (pEngine)
+	{
+		Message("Sending snapshot command...");
+		if ((iErrorCode = pEngine->OpenScriptFile(file, false)) == ITS_OK)
+		{
+			pEngine->pConverter->bWriteToFile = false;
+			if ((iErrorCode = pEngine->RunScript(NULL)) == END_SCRIPT)
+			{
+				Message("Accessing bitmap data...");
+				pEngine->pConverter->GetScreenshotData(ppFile, ppBitmap, ppData, pSize);
+			}
+			pEngine->pConverter->bWriteToFile = true;
+		}
+	}
+
+	// success
+	if (ppFile && (*ppFile) && ppBitmap && (*ppBitmap) && ppData && (*ppData) && pSize && (*pSize))
+	{
+		Message("Bitmap data retrieved successfully");
+		return true;
+	}
+
+	ErrorMessage("Snapshot could not be taken");
+	return false;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Converts a char * to it's Unicode equivalent
+//
+LPTSTR
+STATDLLMember::ToUnicode(const char *string)
+{
+#ifdef UNICODE
+	static TCHAR szBuffer[MAX_UNICODE_LEN + 1] = {0};
+	szBuffer[0] = (TCHAR)0;
+
+    // Convert to UNICODE.
+    if (!MultiByteToWideChar(CP_ACP,					// conversion type
+							 0,							// flags
+							 string,					// source
+							 -1,						// length
+							 szBuffer,					// dest
+							 MAX_UNICODE_LEN))			// length
+    {
+        return _T("Could not convert");
+    }
+
+    return szBuffer;
+#else
+	return (LPTSTR)string;
+#endif
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Converts a Unicode to it's char * equivalent
+//
+const char *
+STATDLLMember::ToAnsi(LPCTSTR string)
+{
+#ifdef UNICODE
+	static char szBuffer[MAX_UNICODE_LEN + 1] = {0};
+	szBuffer[0] = (char)0;
+
+    // Convert to ANSI.
+    if (!WideCharToMultiByte(CP_ACP,					// conversion type
+							 0,							// flags
+							 string,					// source
+							 -1,						// length
+							 szBuffer,					// dest
+							 MAX_UNICODE_LEN,			// length
+							 NULL,
+							 NULL ))
+    {
+        return "Could not convert";
+    }
+
+    return szBuffer;
+#else
+	return (char *)string;
+#endif
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Split a connection registry entry into its respective parts
+void
+STATDLLMember::ParseConnection(char *pConnection, STATCONNECTTYPE *pType, char **ppAddress)
+{
+	(*pType) = SymbianInvalid;
+	(*ppAddress) = NULL;
+
+	static char szConnection[256];
+	memset(szConnection, 0, sizeof(szConnection));
+	strcpy(szConnection, pConnection);
+
+	char *p = strchr(szConnection, ':');
+	if (p)
+	{
+		(*p) = (char)0;
+		(*ppAddress) = p + 1;
+
+		if (stricmp(szConnection, "SymbianSocket") == 0)
+		{
+			(*pType) = SymbianSocket;
+		}
+		else if (stricmp(szConnection, "SymbianSerial") == 0)
+		{
+			(*pType) = SymbianSerial;
+		}
+		else if (stricmp(szConnection, "SymbianInfrared") == 0)
+		{
+			(*pType) = SymbianInfrared;
+		}
+		else if (stricmp(szConnection, "SymbianBluetooth") == 0)
+		{
+			(*pType) = SymbianBluetooth;
+		}
+
+		(*p) = ':';
+	}
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// PRIVATE METHODS
+//////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Writes a message to file
+//
+void
+STATDLLMember::Message(const char * message, ...)
+{
+	if (pRep)
+	{
+		char szText[MAX_ERROR_MSG_LEN * 2] = {0};
+		va_list pMsg;
+
+		strcpy(szText, szPrefix);
+
+		va_start (pMsg, message);
+		vsprintf (szText + strlen(szText), message, pMsg);
+		va_end (pMsg);
+
+		pRep->info(szText);
+	}
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Writes an error message to file
+//
+void
+STATDLLMember::ErrorMessage(const char * message, ...)
+{
+	if (pRep)
+	{
+		va_list pMsg;
+		char szErrorMsg[MAX_ERROR_MSG_LEN + 1] = {0};
+
+		// get the API error
+		va_start (pMsg, message);
+		vsprintf (szErrorMsg, message, pMsg);
+		va_end (pMsg);
+
+		// save the complete error
+		if (pEngine)
+		{
+			if (pEngine->GetDeviceReturnCode() != 0)
+			{
+				sprintf(szErrorText, "%s (%d : %s - Device return code %d)", 
+										szErrorMsg, 
+										iErrorCode, 
+										ToAnsi(pEngine->GetErrorText(iErrorCode)),
+										pEngine->GetDeviceReturnCode());
+			}
+			else
+			{
+				sprintf(szErrorText, "%s (%d : %s)", 
+										szErrorMsg, 
+										iErrorCode, 
+										ToAnsi(pEngine->GetErrorText(iErrorCode)));
+			}
+		}
+		else
+			strcpy(szErrorText, "(STAT Engine not initialised)");
+
+		// construct a full log message
+		char szLogError[MAX_ERROR_MSG_LEN * 2] = {0};
+		sprintf(szLogError, "%sERROR: %s", szPrefix, szErrorText);
+		pRep->error(szLogError);
+	}
+}