--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/PC_Tools/HTIGateway/HtiGateway/inc/IPCommPlugin.h Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 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:
+* This file contains headers of IPCommPlugin,
+* IPCommReaderThread, IPCommWriterThread and IPCommMonitorThread classes.
+*/
+
+#ifndef IPCOMMPLUGIN_H
+#define IPCOMMPLUGIN_H
+
+//#pragma warning ( disable : 4786 )
+#include <iostream>
+#include <process.h>
+#include <string>
+#include <map>
+#include <comdef.h>
+
+#include "common.h"
+#include "plugin.h"
+#include "safequeue.h"
+#include "thread.h"
+#include "datagateway.h" // for g_DataGatewayDefaultTcpIpBufferSize
+
+// forward declarations
+class Socket;
+
+using namespace std;
+
+#define IP_INI_FILE_NAME "ipcommplugin.ini"
+
+#define IP_INI_LOCAL_PORT_PARAM "LOCAL_PORT"
+#define IP_INI_REMOTE_HOST_PARAM "REMOTE_HOST"
+#define IP_INI_REMOTE_PORT_PARAM "REMOTE_PORT"
+#define IP_INI_RECV_BUFFER_SIZE_PARAM "RECV_BUFFER_SIZE"
+
+#define PARAM_SWITCH_LOCAL_PORT_PARAM "-LOCAL_PORT"
+#define PARAM_SWITCH_REMOTE_HOST_PARAM "-REMOTE_HOST"
+#define PARAM_SWITCH_REMOTE_PORT_PARAM "-REMOTE_PORT"
+#define PARAM_SWITCH_RECV_BUFFER_SIZE_PARAM "-RECV_BUFFER_SIZE"
+
+const DWORD g_IPCommDefaultTimeout = 40000; //ms
+const DWORD g_IPPluginTimeout = 10000; //not used
+
+// Maximum time to wait
+extern long g_MaximumShutdownWaitTime;
+
+//**********************************************************************************
+// Class IPCommReaderThread
+//
+// This thread is used to read bytes from TCP/IP socket, encapsulate the bytes to Data objects
+// and push them to incoming queue
+//**********************************************************************************
+
+class IPCommReaderThread : public Thread<IPCommReaderThread>
+{
+public:
+ IPCommReaderThread(SafeQueue<Data*>* q, long bufsize);
+ /*
+ * Main execution loop which reads bytes from socket, encapsulates the bytes to Data object and pushes them to incoming queue
+ */
+ void Run();
+ void Stop();
+ bool IsRunning();
+
+private:
+ friend class IPCommMonitorThread;
+ //incoming queue
+ SafeQueue<Data*>* m_Queue;
+ //Socket connected to mobile device
+ Socket* m_Socket;
+ bool m_Running;
+ //size of buffer used when reading data from socket
+ long m_TcpIpBufferSize;
+};
+
+//**********************************************************************************
+// Class IPCommWriterThread
+//
+// This thread is used to write data from outgoing queue to TCP/IP port
+//**********************************************************************************
+
+class IPCommWriterThread : public Thread<IPCommWriterThread>
+{
+public:
+ IPCommWriterThread(SafeQueue<Data*>* q);
+ /*
+ * Main execution loop which gets Data from outgoing queue and sends it to socket
+ */
+ void Run();
+ void Stop();
+ bool IsRunning();
+
+private:
+ friend class IPCommMonitorThread;
+ //outgoing queue
+ SafeQueue<Data*>* m_Queue;
+ //Socket connected to mobile device
+ Socket* m_Socket;
+ bool m_Running;
+};
+
+//**********************************************************************************
+// Class IPCommMonitorThread
+//
+// This thread creates and starts reader and writer threads
+// The thread also monitors if reader and writer threads are running and restarts them in case either isn't running
+//**********************************************************************************
+
+class IPCommMonitorThread : public Thread<IPCommMonitorThread>
+{
+public:
+ IPCommMonitorThread(SafeQueue<Data*>* TxQueue,
+ SafeQueue<Data*>* RxQueue,
+ int LocalPort,
+ string& RemoteHost,
+ int RemotePort,
+ long RecvBufferSize);
+ ~IPCommMonitorThread();
+ /*
+ * Main execution loop of thread
+ * -Creates reader and writer threads and starts them
+ * -Monitors if either reader or writer thread aren't running and restarts them if not
+ */
+ void Run();
+ void Stop();
+ bool IsRunning();
+
+private:
+ /*
+ * This method has two functionalities
+ * -It waits for incoming connections if local port is defined
+ * -It tries to connect to remote host if local host is not defined
+ */
+ void Connect(Socket*& s);
+
+private:
+ bool m_Running;
+ //outgoing queue
+ SafeQueue<Data*>* m_TxQueue;
+ //incoming queue
+ SafeQueue<Data*>* m_RxQueue;
+ //used to read data from TCP/IP port and push them to incoming queue
+ IPCommReaderThread* m_ReaderThread;
+ //used to write data from outgoing queue to TCP/IP port
+ IPCommWriterThread* m_WriterThread;
+ //port that thread should listen to
+ int m_LocalPort;
+ //hostname that thread should connect to
+ string& m_RemoteHost;
+ //Port that thread should connect to
+ int m_RemotePort;
+ long m_RecvBufferSize;
+};
+
+//**********************************************************************************
+// Class IPCommPlugin
+//
+// This class implements a CommChannelPlugin used in TCP/IP communication with device
+//**********************************************************************************
+
+class IPCommPlugin : public CommChannelPlugin
+{
+public:
+ /*
+ * This method initializes IPCommPlugin and Starts IPCommMonitorThread
+ */
+ DWORD Init();
+ /*
+ * This method is used to push given data to outgoing queue and then
+ * wait for data to become available and read all data into single Data object
+ */
+ DWORD SendReceive( Data* data_in, Data** data_out, long timeout = g_IPPluginTimeout );
+ /*
+ * This method pushes the given Data object(of type Data::EData) to outgoing queue
+ */
+ DWORD Send( Data* data_in, long timeout = g_IPPluginTimeout );
+ /*
+ * This method is used to read all data in incoming queue to single Data object and store the result
+ * to the data object given parameter
+ */
+ DWORD Receive( Data** data_out, long timeout = g_IPPluginTimeout );
+ /*
+ * This method is used to wait for data to become available in incoming queue
+ * and then read all data into single Data object which is given as parameter
+ */
+ DWORD ReceiveWait( Data** data_out, long timeout = g_IPPluginTimeout );
+ /*
+ * This method checks if data is available on incoming queue
+ */
+ bool IsDataAvailable();
+ DWORD Open();
+ DWORD Close();
+ IPCommPlugin( const CommChannelPluginObserver* observer = NULL );
+ ~IPCommPlugin();
+
+private:
+ /*
+ * This method initializes class member variables from values in map
+ */
+ void CheckProperties( map<string, string>& props );
+
+private:
+ //outgoing queue
+ SafeQueue<Data*> m_TxQueue;
+ //incoming queue
+ SafeQueue<Data*> m_RxQueue;
+ //thread which starts and monitors reader and writer threads
+ IPCommMonitorThread* m_MonitorThread;
+ //port that IPCommPlugin should listen to
+ int m_PropertyLocalPort;
+ //hostname that IPCommPlugin should connect to
+ string m_PropertyRemoteHost;
+ //port that IPCommPlugin should connect to
+ int m_PropertyRemotePort;
+ long m_PropertyRecvBufferSize;
+};
+
+#endif
+
+// End of the file
\ No newline at end of file