diff -r 000000000000 -r 3da2a79470a7 testtoolsconn/stat/desktop/testsource/dllcommstesters/teststatcomms/testcomdlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testtoolsconn/stat/desktop/testsource/dllcommstesters/teststatcomms/testcomdlg.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,361 @@ +/* +* 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: +* +*/ + + + + +// testcomDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "testcom.h" +#include "testcomDlg.h" +#include +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +DWORD WINAPI ThreadProcOut(LPVOID lpParameter); +void ProcessInput(STATComms *pComms, CTestcomDlg *pDlg); + +bool bFinished = true; +bool bReset = true; +char szBitmapFile[] = "C:\\basicscreen.mbm"; +char szReceiveFile[] = "C:\\basicapp.exe"; + +///////////////////////////////////////////////////////////////////////////// +// CTestcomDlg dialog + +CTestcomDlg::CTestcomDlg(CWnd* pParent /*=NULL*/) + : CDialog(CTestcomDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CTestcomDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +CTestcomDlg::~CTestcomDlg() +{ + if (hThread2Out) + CloseHandle(hThread2Out); +} + +void CTestcomDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CTestcomDlg) + DDX_Control(pDX, IDC_PORT, m_Port); + DDX_Control(pDX, IDC_TRANSPORT, m_Transport); + DDX_Control(pDX, IDC_LIST1, m_List1); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CTestcomDlg, CDialog) + //{{AFX_MSG_MAP(CTestcomDlg) + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_TRANSFER, OnTransfer) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CTestcomDlg message handlers + +BOOL CTestcomDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // defaults + m_Transport.SetCurSel(1); + m_Port.SetWindowText("3000"); + m_Port.SetLimitText(25); + + return TRUE; // return TRUE unless you set the focus to a control +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CTestcomDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialog::OnPaint(); + } +} + +HCURSOR CTestcomDlg::OnQueryDragIcon() +{ + return (HCURSOR) m_hIcon; +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Start it all +/////////////////////////////////////////////////////////////////////////////////// +void CTestcomDlg::OnTransfer() +{ + if (bFinished) + { + bReset = true; + DWORD dwThreadID2Out; + if (!(hThread2Out = CreateThread( NULL, // security attributes + 0, // stack size + ThreadProcOut, // proc to call + this, // proc parameter + 0, // creation flags + &dwThreadID2Out))) // thread identifier + { + AfxMessageBox("Could not create listening thread"); + } + } + else + { + bFinished = true; // signal thread to stop + AddString("Stopping..."); + Sleep(250); // ...and wait for it + } +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Thread entry point +/////////////////////////////////////////////////////////////////////////////////// +DWORD WINAPI ThreadProcOut(LPVOID lpParameter) +{ + CTestcomDlg *pDlg = (CTestcomDlg *)lpParameter; + + STATComms *pComms; + pComms = new STATComms(); + if (pComms) + { + pComms->SetTransport((STATCONNECTTYPE)(pDlg->m_Transport.GetCurSel() + 1)); + if (pComms->Initialise() == ITS_OK) + { + char szPort[25]; + pDlg->m_Port.GetWindowText(szPort, 25); + + while (bReset) + { + pDlg->AddString("Listening..."); + if (pComms->Connect(szPort) == ITS_OK) + { + bFinished = false; + bReset = false; + pDlg->AddString("Connected."); + pDlg->AddString(szPort); + + ProcessInput(pComms, pDlg); + + pComms->Disconnect(); + } + else + { + pDlg->AddString("Could not connect."); + pDlg->AddString(szPort); + } + + pDlg->AddString("Stopped."); + } + + pComms->Release(); + } + else + { + pDlg->AddString("Could not initialise."); + } + } + else + pDlg->AddString("Out of memory."); + + return 1; +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Listen on the port +/////////////////////////////////////////////////////////////////////////////////// +void +ProcessInput(STATComms *pComms, CTestcomDlg *pDlg) +{ + int ret = GENERAL_FAILURE; + char szBuf[512] = {0}; + char cIdentifier; + char *pExtra = NULL; + unsigned long ulReadLength = 0; + + while (!bFinished) + { + if ((ret = pComms->Receive(&cIdentifier, &pExtra, &ulReadLength)) == ITS_OK) + { + // display what we received + if (ulReadLength && ulReadLength < MAX_LOG_MSG_LEN) + { + char szContents[MAX_LOG_MSG_LEN + 1]; + strncpy(szContents, pExtra, ulReadLength); + *(szContents + ulReadLength) = (char)0; + sprintf(szBuf, "%c [%s] (%ld)", cIdentifier, szContents, ulReadLength); + } + else + sprintf(szBuf, "%c (%ld)", cIdentifier, ulReadLength); + pDlg->AddString(szBuf); + + // special behaviour + switch(cIdentifier) + { + case 'T': + { + pDlg->ReleaseData(&pExtra); + ulReadLength = 0; + break; + } + case 'S': + { + // read bitmap data + pDlg->ReleaseData(&pExtra); + ret = pDlg->ReadTransferFile(szBitmapFile, &pExtra, &ulReadLength); + if (ret != ITS_OK) + { + pDlg->AddString("Read of bitmap failed!!!"); + pDlg->AddString(szBitmapFile); + } + break; + } + case 'R': + case 'X': + { + // read binary + pDlg->ReleaseData(&pExtra); + ret = pDlg->ReadTransferFile(szReceiveFile, &pExtra, &ulReadLength); + if (ret != ITS_OK) + { + pDlg->AddString("Read of application file failed!!!"); + pDlg->AddString(szReceiveFile); + } + break; + } + } + + // now send data back as a response to show we got it ok + if (pComms->Send(cIdentifier, pExtra, ulReadLength) != ITS_OK) + pDlg->AddString("Send failed!!!"); + + // need to delete received data once finished with it + pDlg->ReleaseData(&pExtra); + } + else + { + // restart the connection + if (ret != NO_DATA_AT_PORT) + { + bReset = true; + break; + } + } + + Sleep (250); + } +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Release memory resources +/////////////////////////////////////////////////////////////////////////////////// +void +CTestcomDlg::ReleaseData(char **ppData) +{ + if (*ppData) + { + delete [] (*ppData); + (*ppData) = NULL; + } +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Add a string to the list box +/////////////////////////////////////////////////////////////////////////////////// +void +CTestcomDlg::AddString(char *szText) +{ + m_List1.AddString(szText); + int nCount = m_List1.GetCount(); + if (nCount > 0) + m_List1.SetTopIndex(nCount - 1); + UpdateWindow(); +} + + +/////////////////////////////////////////////////////////////////////////////////// +// Read in a file +/////////////////////////////////////////////////////////////////////////////////// +int CTestcomDlg::ReadTransferFile(const char *pFile, char **ppContents, unsigned long *pLength) +{ + int ret = E_BADFILENAME; + CString path = pFile; + CFile script_file; + if (script_file.Open(path, CFile::modeRead)) + { + try + { + (*pLength) = script_file.GetLength(); + (*ppContents) = new char [*pLength]; + if (*ppContents) + { + script_file.Read(*ppContents, *pLength); + ret = ITS_OK; + } + else + ret = E_OUTOFMEM; + } + catch(CFileException *e) + { + e->Delete(); + ret = GENERAL_FAILURE; + } + + script_file.Abort(); + } + + return ret; +}