--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/PC_Tools/HTIGateway/HtiGateway/src/main.cpp Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,229 @@
+/*
+* 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 module contains the UI operations of DataGateway.
+*/
+
+#pragma warning ( disable : 4786 )
+
+#include "Socket.h"
+
+#include <windows.h>
+#include <process.h>
+#include <string>
+#include <map>
+
+#include "util.h"
+#include "datagateway.h"
+#include "common.h"
+
+// GLOBAL DEFINES
+// Command line switches
+#define PARAM_SWITCH_PORT "-port"
+#define PARAM_SWITCH_BUFSIZE "-bufsize"
+#define PARAM_SWITCH_COMMPLUGIN "-commchannel"
+#define PARAM_SWITCH_STAYALIVE "-stayalive"
+#define PARAM_SWITCH_CCLATEINIT "-cclateinit"
+#define PARAM_SWITCH_SWT "-swt"
+#define PARAM_SWITCH_VERBOSE "-v"
+#define PARAM_SWITCH_TIMESTAMP "-t"
+
+#define VERSION "1.68.0"
+#define INFO "HtiGateway %s - Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.\n\n"
+
+// Event object to catch console signal
+Event g_ConsoleCloseEvent;
+
+// Event object to wait datagateway shutdown
+Event g_DataGatewayClosedEvent;
+
+// Maximum time to wait
+extern long g_MaximumShutdownWaitTime;
+
+extern DWORD g_ErrorCode;
+
+// Global parameters to be used in datagateway and all plugins
+map<string, string> g_parameters;
+
+// FUNCTION PROTOTYPES
+// Prints usage of DataGateway
+void usage();
+
+// Initializes phoenixtool default values
+void init(map<string, string>&, map<string, string>&);
+
+// Catches console control signals
+BOOL WINAPI ConsoleControlHandler(DWORD);
+
+int main(int argv, char *args[])
+{
+ printf(INFO, VERSION);
+ if (argv == 2 && strcmp("-h", args[1]) == 0)
+ {
+ usage();
+ return 0;
+ }
+ map<string, string> props;
+
+ try {
+ Util::ReadProperties("HtiGateway.ini", props);
+
+ // Sets values from properties file
+ init(props, g_parameters);
+
+ if (argv > 1)
+ {
+ // Overrides properties file values
+ // if specified in command line
+ Util::ParseCmdLine(argv, args, g_parameters);
+ Util::SetTimestamp(g_parameters[PARAM_SWITCH_TIMESTAMP]);
+ }
+ Util::SetVerboseLevel(g_parameters[PARAM_SWITCH_VERBOSE]);
+
+ bool stayalive = (strcmp("true", g_parameters[PARAM_SWITCH_STAYALIVE].c_str()) == 0
+ ? true
+ : false);
+ bool cclateinit = (strcmp("true", g_parameters[PARAM_SWITCH_CCLATEINIT].c_str()) == 0
+ ? true
+ : false);
+ int port = atoi(g_parameters[PARAM_SWITCH_PORT].c_str());
+ long bufsize = atol(g_parameters[PARAM_SWITCH_BUFSIZE].c_str());
+ g_MaximumShutdownWaitTime = atol(g_parameters[PARAM_SWITCH_SWT].c_str());
+ string ch = Util::ToUpper(g_parameters[PARAM_SWITCH_COMMPLUGIN]);
+
+ DataGateway dg(port, bufsize, ch, stayalive, cclateinit);
+
+ // Installs console control handler for catching
+ // signals
+ if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleControlHandler, TRUE))
+ {
+ Util::Error("Error registering the console control handler");
+ return ERR_DG_CONSOLEHANDLER;
+ }
+
+ dg.Start();
+ HANDLE handles[2];
+ handles[0] = dg.ThreadHandle();
+ handles[1] = g_ConsoleCloseEvent.EventHandle();
+ DWORD dwResult = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
+ switch (dwResult)
+ {
+ case WAIT_OBJECT_0 + 0:
+ {
+ Util::Debug("main() HtiGateway thread stopped");
+ }
+ break;
+ case WAIT_OBJECT_0 + 1:
+ {
+ dg.Stop();
+ if (g_MaximumShutdownWaitTime > 0)
+ {
+ Util::Info("[HtiGateway] Waiting HtiGateway to shutdown");
+ WaitForSingleObject(dg.ThreadHandle(), g_MaximumShutdownWaitTime);
+ }
+ }
+ break;
+ }
+ g_DataGatewayClosedEvent.Set();
+ } catch (UtilError ue) {
+ Util::Error(ue.iError, ue.iResult);
+ g_ErrorCode = ue.iResult;
+ }
+ if (g_ErrorCode != NO_ERRORS)
+ {
+ // Resolve error code to clear text
+ ERROR_LOOKUP(g_ErrorCode);
+ }
+
+ return g_ErrorCode;
+}
+
+void init(map<string, string>& props,
+ map<string, string>& params)
+{
+ // Setting default values from properties file
+ // to parameters
+ params[PARAM_SWITCH_BUFSIZE] = props["TCPIP_RECV_BUFFER_SIZE"];
+ params[PARAM_SWITCH_PORT] = props["TCPIP_PORT"];
+ params[PARAM_SWITCH_COMMPLUGIN] = props["DEFAULT_COMM_CHANNEL_PLUGIN"];
+ params[PARAM_SWITCH_SWT] = props["MAXIMUM_SHUTDOWN_WAITTIME"];
+ params[PARAM_SWITCH_VERBOSE] = "info";
+ params[PARAM_SWITCH_STAYALIVE] = "true";
+ params[PARAM_SWITCH_TIMESTAMP] = "false";
+ params[PARAM_SWITCH_CCLATEINIT] = "false";
+}
+
+void usage()
+{
+
+ cout << "USAGE: HtiGateway.exe [SWITCHES in form -switch=value]\n\n";
+ cout << "\tSWITCHES:\n";
+ cout << "\t-port TCP/IP port\n";
+ cout << "\t-bufsize TCP/IP receive buffer size in bytes\n";
+ cout << "\t-commchannel Communication Channel Plugin (CCP) name e.g. SERIAL\n";
+ cout << "\t-stayalive Whether HtiGateway remains when client disconnects\n";
+ cout << "\t or not\n";
+ cout << "\t-cclateinit Whether CCP is initialized when client connects or not\n";
+ cout << "\t-swt Maximum shutdown wait time in milliseconds. 0 means\n";
+ cout << "\t no waiting.\n";
+ cout << "\t-v Verbose mode\n";
+ cout << "\t-t Timestamped output\n\n";
+ cout << "\tBy default these values are defined in HtiGateway.ini file.\n";
+ cout << "\tIf any switches are used those override values from ini file\n\n";
+ cout << "\tSTAYALIVE:\n";
+ cout << "\tfalse HtiGateway shutdown after client closes connection\n";
+ cout << "\ttrue HtiGateway remains waiting new connections (*)\n\n";
+ cout << "\tCCLATEINIT:\n";
+ cout << "\tfalse HtiGateway initializes CCP when started (*)\n";
+ cout << "\ttrue HtiGateway initializes CCP only when client connects to\n\n";
+ cout << "\tVERBOSE:\n";
+ cout << "\toff Silent mode\n";
+ cout << "\tresult Prints only result (no info/errors)\n";
+ cout << "\terror Prints result and errors (*)\n";
+ cout << "\tinfo Prints normal output\n";
+ cout << "\tdebug Prints all\n\n";
+ cout << "\tTIMESTAMPED:\n";
+ cout << "\tfalse No timestamp (*)\n";
+ cout << "\ttrue Adds timestamp to output\n\n";
+ cout << "\t(*) means default value\n\n";
+ cout << "\tAll communication channel plugin parameters can also be passed from\n";
+ cout << "\tcommand line just by adding \"-\" to the parameter name. For example:\n";
+ cout << "\t\"-COMPORT=COM3\" or -REMOTE_PORT=3000\n";
+ cout << endl;
+}
+
+BOOL WINAPI ConsoleControlHandler(DWORD dwCtrlType)
+{
+ BOOL bReturnStatus = FALSE;
+ switch (dwCtrlType)
+ {
+ case CTRL_C_EVENT:
+ case CTRL_BREAK_EVENT:
+ case CTRL_CLOSE_EVENT:
+ case CTRL_LOGOFF_EVENT:
+ case CTRL_SHUTDOWN_EVENT:
+ {
+ Util::Info("[HtiGateway] Request to terminate");
+ g_ConsoleCloseEvent.Set();
+
+ // Wait DG shutdown before returning control to system
+ WaitForSingleObject(g_DataGatewayClosedEvent.EventHandle(), g_MaximumShutdownWaitTime);
+ }
+ break;
+ }
+ bReturnStatus = TRUE;
+ return bReturnStatus;
+}
+
+// End of the file
\ No newline at end of file