hti/PC_Tools/HTIGateway/HtiGateway/src/main.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
--- /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