testtoolsconn/stat/desktop/source/common/transport/src/cstatmessagecom.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testtoolsconn/stat/desktop/source/common/transport/src/cstatmessagecom.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,282 @@
+/*
+* 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 "CSTATMessageCOM.h"
+#include <initguid.h>
+#include "ECGUID.H"
+#include <statcommon.h>
+
+//-------------------------------------------------------------------------------
+//MESSAGE MAP
+
+BEGIN_MESSAGE_MAP(CSTATMessageCOM, CCmdTarget)
+	//{{AFX_MSG_MAP(CSTATMessageCOM)
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+//-------------------------------------------------------------------------------
+IMPLEMENT_DYNCREATE(CSTATMessageCOM, CCmdTarget)
+
+
+//constructor
+CSTATMessageCOM::CSTATMessageCOM()
+: 	m_pISendReq(NULL), m_pICommonSink(NULL), m_pResponseData(NULL), m_pIECEngineS(NULL),
+	m_pIECMachine(NULL), m_pIECDrive(NULL), Connected(false), bExternalInterface(false)
+{}
+
+//----------------------------------------------------------------------------
+//destructor
+CSTATMessageCOM::~CSTATMessageCOM()
+{
+	Disconnect();
+}
+
+//-------------------------------------------------------------------------------
+
+BEGIN_INTERFACE_MAP(CSTATMessageCOM, CCmdTarget)
+	INTERFACE_PART(CSTATMessageCOM, IID_ICommonSink, CommonSink)
+END_INTERFACE_MAP()
+
+//-------------------------------------------------------------------------------
+// IUnknown Interface 
+
+//memory management functions
+STDMETHODIMP_(ULONG) CSTATMessageCOM::XCommonSink::AddRef()
+{
+	METHOD_PROLOGUE(CSTATMessageCOM, CommonSink)
+	ASSERT(pThis);
+ 
+	TRACE(_T("Info::AddRef %d\n") ,pThis -> m_dwRef);
+	return pThis -> ExternalAddRef(); 
+}
+
+STDMETHODIMP_(ULONG) CSTATMessageCOM::XCommonSink::Release()
+{
+	METHOD_PROLOGUE(CSTATMessageCOM, CommonSink)
+	ASSERT(pThis);
+
+	TRACE(_T("Info::Release %d\n"),pThis -> m_dwRef);
+	return pThis -> ExternalRelease();
+}
+
+STDMETHODIMP CSTATMessageCOM::XCommonSink::QueryInterface(REFIID riid, void** ppv)
+{
+	METHOD_PROLOGUE(CSTATMessageCOM, CommonSink);
+	TRACE(_T("CSTATMessageCOM::XPWBKInfoQueryInterface\n"));
+
+	return pThis -> ExternalQueryInterface(&riid, ppv);
+}
+//-------------------------------------------------------------------------------
+// ICommonSink Interface
+STDMETHODIMP CSTATMessageCOM::XCommonSink::ProcessResponse(BYTE* Response, DWORD bufsize)
+{
+	METHOD_PROLOGUE(CSTATMessageCOM, CommonSink);
+	ASSERT(pThis);
+
+	pThis -> ProcessResponse(Response, bufsize);
+
+	return S_OK;
+}
+//----------------------------------------------------------------------------
+//Connection
+int CSTATMessageCOM::Connect(CString& platformtype, CSTATLogFile *theLog)
+{
+	pLog = theLog;
+
+	// convert to uppercase
+	platformtype.MakeUpper();
+
+	//select DLL to be initialised
+	CString STATServer;
+	if(platformtype == _T("ARM") || platformtype == _T("ARM4"))
+		STATServer = _T("STATApiARM4.DLL");
+	else if(platformtype == _T("WINS"))
+		STATServer = _T("STATApiWINS.DLL");
+	else if(platformtype == _T("THUMB"))
+		STATServer = _T("STATApiTHUMB.DLL");
+	else if(platformtype == _T("WINSCW"))
+		STATServer = _T("STATApiWINSCW.DLL");
+	else
+		return E_BADPLATFORM;
+
+	// disconnect if already connected
+	Disconnect();
+
+	// create an instance of the EPOC Connect Engine
+	if (FAILED(CoCreateInstance(CLSID_ECEngineS, NULL, CLSCTX_INPROC_SERVER, IID_IECEngineS, (void **)&m_pIECEngineS))) 
+	{
+		Disconnect();
+		return E_ENGINEOBJECTFAILURE;
+	}
+		
+	// get ISendReq interface
+	if (FAILED(ExternalQueryInterface(&IID_ICommonSink, (void**)&m_pICommonSink)))
+	{
+		Disconnect();
+		return E_BADREQUESTINTERFACE;
+	}
+	
+	IFileSystemInfoS *pFSInfo;
+	LPVOID *ppFSInfo = (LPVOID *)&pFSInfo;
+
+	// get an interface pointer to the FileSystemInfo struct
+	if (!bExternalInterface)
+	{
+		ExternalQueryInterface(&IID_IFileSystemInfoS, ppFSInfo);
+		bExternalInterface = true;
+	}
+
+	// initialise the EPOC Connect engine
+	m_pIECEngineS -> Init(pFSInfo);
+	if (m_pIECEngineS->Connect(15000) != S_OK) // connect, giving 15 seconds as maximum wait
+	{
+		Disconnect();
+		return E_ENGINECONNECTFAILURE;
+	}
+
+	// create an instance of the EPOC send request
+	if (FAILED(CoCreateInstance(CLSID_SendRequest, NULL, CLSCTX_INPROC_SERVER, IID_ISendRequest, (void**) &m_pISendReq)))
+	{
+		Disconnect();
+		return E_REQUESTOBJECTFAILURE;
+	}
+
+	BSTR bSTATstrServer = STATServer.AllocSysString();	//converts from CString to BSTR
+
+	//The 'Initialise' function starts up the generic custom server, copying it to the remote 
+	//EPOC machine if it is not there. It then checks that the application-specific server DLL 
+	//is loaded and up to date and, if not, copies it over to C:/system/libs. Finally, it 
+	//checks that the generic custom server found the interface.
+	if (FAILED(m_pISendReq -> Initialise(bSTATstrServer)))
+	{
+		Disconnect();
+		SysFreeString(bSTATstrServer);
+		return E_REQUESTINITFAILURE;
+	}
+
+	SysFreeString(bSTATstrServer);
+	Connected = true;	//flagged
+	return ITS_OK;
+}
+
+//-------------------------------------------------------------------------------
+//Disconnection
+bool CSTATMessageCOM::Disconnect()
+{
+	Connected = false;	//flagged as disconnected
+
+	if (m_pIECEngineS)
+	{
+		m_pIECEngineS->Release();
+		m_pIECEngineS = NULL;
+	}
+
+	// make sure tell EPOC side to close
+	if (m_pISendReq)
+	{
+		m_pISendReq->Release();
+		m_pISendReq = NULL;
+	}
+
+	if (bExternalInterface)
+	{
+		ExternalRelease();
+		bExternalInterface = false;
+	}
+
+	if(m_pResponseData)
+	{
+		delete[] m_pResponseData;
+		m_pResponseData = NULL;
+	}
+	
+	return true;
+}
+
+//-------------------------------------------------------------------------------
+//Send Message to device - no data
+HRESULT CSTATMessageCOM::SendMsg(BYTE id)
+{
+	HRESULT hr = S_OK;
+
+	for (int i=0;i<STAT_MAXRETRIES;i++)
+	{
+		if (SUCCEEDED(hr = m_pISendReq -> BuildNewRequest(1, id)))	//BuildNewRequest needed for creating header of message
+			if (SUCCEEDED(hr = m_pISendReq -> SendRequest(m_pICommonSink)))
+				return hr;
+
+		pLog->Set(E_COMMANDRETRY);
+		Sleep(STAT_RETRYDELAY);
+	}
+
+	pLog->Set(E_COMMANDFAILED);
+	return hr;
+}
+
+//-------------------------------------------------------------------------------
+//send message with data
+HRESULT CSTATMessageCOM::SendMsg(BYTE id, VARIANT data)
+{
+	HRESULT hr = S_OK;
+	
+	for (int i=0;i<STAT_MAXRETRIES;i++)
+	{
+		//will send data that has already been created in calling function
+		if (SUCCEEDED(hr = m_pISendReq -> BuildNewRequest(1, id)))
+			if (SUCCEEDED(hr = m_pISendReq -> AddBody(data)))		//adds body to the header (newly converted data)
+		{
+			if (SUCCEEDED(hr = m_pISendReq -> SendRequest(m_pICommonSink)))
+				return hr;
+		}
+
+		pLog->Set(E_COMMANDRETRY);
+		Sleep(STAT_RETRYDELAY);
+	}
+
+	pLog->Set(E_COMMANDFAILED);
+	return hr;
+}
+
+//-------------------------------------------------------------------------------
+// Retrieves a response from EPOC device
+STDMETHODIMP CSTATMessageCOM::ProcessResponse(BYTE* pResponse, DWORD bufsize)
+{
+	CopyResponseData(pResponse + 11, bufsize - 11);	//function called, removing the first 11 bytes (header info)
+	return S_OK;
+}
+
+//-------------------------------------------------------------------------------
+//function used to store newly formatted data into new variable
+void CSTATMessageCOM::CopyResponseData(BYTE* pResponse, DWORD bufsize)
+{
+	if(m_pResponseData)
+	{
+		delete[] m_pResponseData;
+		m_pResponseData = NULL;
+	}
+	
+	if(bufsize)
+	{
+		m_pResponseData = new BYTE[bufsize];
+		memcpy(m_pResponseData, pResponse, bufsize);
+	}
+}
+
+//-----------------------------------------------------------------------------