--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/PC_Tools/HTIGateway/HtiGateway/src/util.cpp Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,739 @@
+/*
+* 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 implementation of Util class member functions.
+* Util class provides static utility functions for logging and string
+* manipulation.
+*/
+
+// INCLUDE FILES
+#include "util.h"
+
+// command line parameters
+extern map<string, string> g_parameters;
+
+//**********************************************************************************
+// Class Util
+//
+// Provides static utility functions for logging and string handling.
+//**********************************************************************************
+
+// The default verbose level for Util output is error
+Util::VerboseLevel Util::iVerbose(Util::error);
+
+// The default output is without timestamp
+int Util::iTimestamp(0);
+
+#ifdef ENABLE_LOG_SYNC
+ Mutex Util::iCritical;
+#endif
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: SetVerboseLevel
+
+ Description: Sets new verbose level by string:
+
+ "none"
+ "result"
+ "error"
+ "info"
+ "debug"
+
+ Parameters: const string& aVerbose : in: Verbose level as string
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::SetVerboseLevel(const string& aVerbose)
+{
+ string verbose(aVerbose);
+ ToLower(verbose);
+ if (verbose.compare("result") == 0)
+ {
+ iVerbose = result;
+ }
+ else if (verbose.compare("error") == 0)
+ {
+ iVerbose = error;
+ }
+ else if (verbose.compare("info") == 0)
+ {
+ iVerbose = info;
+ }
+ else if (verbose.compare("debug") == 0)
+ {
+ iVerbose = debug;
+ }
+ else
+ {
+ iVerbose = none;
+ }
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: SetVerboseLevel
+
+ Description: Sets new verbose level by enumeration.
+
+ Parameters: const VerboseLevel aVerbose : in: Verbose level
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::SetVerboseLevel(const VerboseLevel aVerbose)
+{
+ iVerbose = aVerbose;
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: GetVerboseLevel
+
+ Description: Returns current verbose level.
+
+ Parameters: None
+
+ Return Values: VerboseLevel : Current verbose level
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+Util::VerboseLevel Util::GetVerboseLevel()
+{
+ return iVerbose;
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: SetTimestamp
+
+ Description: Enables/disables timestamp from output by string "yes" or "no".
+
+ Parameters: const string& aTimestamp : in : "yes" to enable timestamp, "no" to
+ disable.
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::SetTimestamp(const string& aTimestamp)
+{
+ string timestamp(aTimestamp);
+ ToLower(timestamp);
+ if (timestamp.compare("true") == 0)
+ {
+ SetTimestamp(1);
+ }
+ else
+ {
+ SetTimestamp(0);
+ }
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: SetTimestamp
+
+ Description: Enables/disables timestamp from output. 0 is disabled.
+
+ Parameters: const int aTimestamp : in : Enable/disable time stamp
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::SetTimestamp(const int aTimestamp)
+{
+ iTimestamp = aTimestamp;
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: ParseCmdLine
+
+ Description: Parses command line parameters to map. The map which is passed
+ as argument must contain all valid keys (command line swicthes).
+ Function adds values to map to all keys found from command line.
+ The command line switch is form <key>=<value>. Default values for
+ keys can be specified.
+
+ Parameters: const int aArgc : in : The number of arguments
+ char **aArgs : in : Pointer array to arguments
+ map<string, string>& aMap : in/out : Map containing possible command
+ line switches (keys). Values of
+ switches are returned as values.
+
+ Return Values: None
+
+ Errors/Exceptions: UtilError
+
+-------------------------------------------------------------------------------*/
+void Util::ParseCmdLine(const int aArgc,
+ char **aArgs,
+ map<string, string>& aMap) throw (UtilError)
+{
+ for (int i = 1; i < aArgc; i++)
+ {
+ string p(aArgs[i]);
+ string v;
+ int idx = p.find_first_of("=");
+ if (idx != string::npos)
+ {
+ if ((idx + 1) == p.length())
+ {
+ string err("Parameter '" + p.substr(0, idx) + "' without value");
+ throw UtilError(err, ERR_UTIL_NO_PARAM_VALUE);
+ }
+ v = &aArgs[i][idx + 1];
+ p = p.substr(0, idx);
+ }
+ else
+ {
+ v = "";
+ }
+
+ // 28.03.06 Disabled this "check" to enable parameter passing to plug-ins also
+ //string def;
+ //GetValue(p, aMap, def);
+ aMap[p] = v;
+ }
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: GetValue
+
+ Description: Returns value by key from a map.
+
+ Parameters: const string& aKey : in : Key to value
+ map<string, string>& aMap : in : Map containing valid keys
+ string& aValue : out : Value of key
+
+ Return Values: None
+
+ Errors/Exceptions: UtilError
+
+-------------------------------------------------------------------------------*/
+void Util::GetValue(const string& aKey,
+ const map<string,
+ string>& aMap, string& aValue) throw (UtilError)
+{
+ map<string, string>::const_iterator i = aMap.find(aKey);
+ if (i != aMap.end())
+ {
+ aValue = i->second;
+ }
+ else
+ {
+ string err("Unknown parameter '" + aKey + "'");
+ throw UtilError(err, ERR_UTIL_UNKNOWN_PARAM);
+ }
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: ReadProperties
+
+ Description: Reads properties from a file to a map. Line beginning with
+ hash character ('#') are considered as comments. The form
+ of prooerties in file is <property> = <value>.
+
+ Parameters: const string& aFilename : in : Filename where properties are read
+ map<string, string>& aMap : out : Map where property values are put
+
+ Return Values: None
+
+ Errors/Exceptions: UtilError
+
+-------------------------------------------------------------------------------*/
+void Util::ReadProperties(const string& aFilename,
+ map<string, string>& aMap) throw (UtilError)
+{
+ ifstream in(aFilename.c_str());
+ if (!in)
+ {
+ string err("Cannot open properties file '");
+ err += aFilename + "'.";
+ throw UtilError(err, ERR_UTIL_PROPERTIES_NOT_FOUND);
+ }
+ while (in)
+ {
+ char tmp[256];
+ in.getline(tmp, 256);
+ string line(tmp);
+ if (line.length() == 0 || line.find_first_of("#") == 0)
+ {
+ continue;
+ }
+ int idx = line.find_first_of('=');
+ string v, p;
+ if (idx != string::npos)
+ {
+ p = line.substr(0, idx);
+ int r = p.find(" ");
+ while (r != string::npos)
+ {
+ p.replace(r, 1, "");
+ r = p.find(" ");
+ }
+ v = line.substr(idx + 1);
+ string::iterator i = v.begin();
+ int spaces = 0;
+ while (i != v.end() && *i == ' ')
+ {
+ ++spaces;
+ ++i;
+ }
+ v.erase(0, spaces);
+ if (v.length() == 0)
+ {
+ string err = "Value not specified for parameter '";
+ err += line.substr(0, idx) + "'.";
+ throw UtilError(err, ERR_UTIL_NO_PROPERTY_VALUE);
+ }
+ }
+ else
+ {
+ p = line;
+ v = "";
+ }
+ aMap[p] = v;
+ }
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Error
+
+ Description: Prints message to output in error level.
+
+ Parameters: const string& aMsg : in : Error message to output
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Error(const string& aMsg)
+{
+ Print(cerr, aMsg, error);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Error
+
+ Description: Prints message to output in error level with error code number.
+
+ Parameters: const string& aMsg : in : Error message to output
+ const long aCode : in : Error code to output
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Error(const string& aMsg, const long aCode)
+{
+ Print(cerr, aMsg, error, aCode);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Log
+
+ Description: Prints message to output in result level.
+
+ Parameters: const string& aMsg : in : Result message to output
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Log(const string& aMsg)
+{
+ Print(cout, aMsg, result);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Info
+
+ Description: Prints message to output in info level.
+
+ Parameters: const string& aMsg : in : Info message to output
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Info(const string& aMsg)
+{
+ Print(cout, aMsg, info);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Debug
+
+ Description: Prints message to output in debug level.
+
+ Parameters: const string& aMsg : in : Debug message to output
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Debug(const string& aMsg)
+{
+ Print(cout, aMsg, debug);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Print
+
+ Description: Prints output to a stream.
+
+ Parameters: ostream& out : in : Stream where to write
+ const string& aMsg : in : Message to output
+ const VerboseLevel aLevel : in : Verbose level of message
+ const long aCode : in : Possible error code if != 0
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Print(ostream& out,
+ const string& aMsg,
+ const VerboseLevel aLevel,
+ const long aCode)
+{
+#ifdef ENABLE_LOG_SYNC
+ iCritical.Lock();
+#endif
+
+ if (aLevel <= iVerbose)
+ {
+ if (iTimestamp)
+ {
+ char timestamp[128];
+ _strdate(timestamp);
+ char tmp[16];
+ _strtime(tmp);
+ strcat(timestamp, " ");
+ strcat(timestamp, tmp);
+ struct _timeb tb;
+ _ftime(&tb);
+ sprintf(tmp, ".%03d", tb.millitm);
+ strcat(timestamp, tmp);
+ out << "[" << timestamp << "] ";
+ }
+ //out << "[" << GetCurrentThreadId() << "] ";
+ out << aMsg;
+ //if (aLevel == debug)
+ {
+ OutputDebugString(aMsg.c_str());
+ OutputDebugString("\r\n");
+ }
+ if (aCode != 0)
+ {
+ out.setf(ios_base::hex, ios_base::basefield);
+ out << " (error: 0x" << aCode << ")";
+ }
+ out << endl;
+ }
+#ifdef ENABLE_LOG_SYNC
+ iCritical.Unlock();
+#endif
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: ToLower
+
+ Description: Converts string to lower case.
+
+ Parameters: string& aString : in/out : String which is converted to lower case
+
+ Return Values: string& : Reference to converted string.
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+string& Util::ToLower(string& aString)
+{
+ string::iterator p = aString.begin();
+ while (p != aString.end())
+ {
+ *p = tolower(*p);
+ ++p;
+ }
+ return aString;
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: ToUpper
+
+ Description: Converts string to upper case.
+
+ Parameters: string& aString : in/out : String which is converted to upper case
+
+ Return Values: string& : Reference to converted string.
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+string& Util::ToUpper(string& aString)
+{
+ string::iterator p = aString.begin();
+ while (p != aString.end())
+ {
+ *p = toupper(*p);
+ ++p;
+ }
+ return aString;
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Hex
+
+ Description: Prints hex dump of char table to output.
+
+ Parameters: const char aData[] : in : Data to be output as hex dump
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Hex(const char aData[])
+{
+ string s(aData);
+ Hex(s);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Hex
+
+ Description: Prints hex dump of string to output.
+
+ Parameters: const string& aMsg : in : Data to be output as hex dump
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Hex(const string& aMsg)
+{
+ Hex((const unsigned char *)aMsg.c_str(), aMsg.length());
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Hex
+
+ Description: Prints hex dump of data to output.
+
+ Parameters: const unsigned char* aData : in : Pointer to data to be output
+ as hex dump
+ const int aLength : in : The lenght of data
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Hex(const unsigned char* aData, const int aLength)
+{
+ Hex((void *)aData, aLength);
+}
+
+/*-------------------------------------------------------------------------------
+
+ Class: Util
+
+ Method: Hex
+
+ Description: Prints hex dump of data to output.
+
+ Parameters: void *aData : in : Pointer to data to be output as hex dump
+ const int aLength : in : The lenght of data
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+-------------------------------------------------------------------------------*/
+void Util::Hex(void *aData, const int aLength)
+{
+ Hex(aData, aLength, NULL);
+}
+
+void Util::Hex(void* aData, const int aLength, string* aHexDump)
+{
+#ifdef ENABLE_LOG_SYNC
+ iCritical.Lock();
+#endif
+
+ char line[16];
+ int line_len = 16;
+ int bytes_to_copy = 0;
+ int printed = 0;
+ bool print_out = (aHexDump == NULL ? true : false);
+ unsigned char *data = (unsigned char *)aData;
+
+ if (print_out)
+ {
+ printf("\n");
+ }
+ else
+ {
+ aHexDump->append("\r\n");
+ }
+ while (printed < aLength)
+ {
+ bytes_to_copy = ((aLength - printed >= line_len ? line_len : (aLength - printed)));
+ memset(line, 0, sizeof(line));
+ memcpy(line, &data[printed], bytes_to_copy);
+ for (int j = 0; j < line_len; j++)
+ {
+ char hex[4];
+ sprintf(hex, "%02X ", (unsigned char)line[j]);
+ if (print_out)
+ {
+ printf("%s", hex);
+ }
+ else
+ {
+ string s(hex);
+ aHexDump->append(s);
+ }
+ }
+ if (print_out) printf(" | ");
+ for (int j = 0; j < line_len; j++)
+ {
+ char c = line[j];
+ if (c >= ' ' && c <= 'z')
+ {
+ if (print_out)
+ {
+ printf("%c", c);
+ }
+ else
+ {
+ char tmp[2];
+ sprintf(tmp, "%c", c);
+ string s(tmp);
+ aHexDump->append(s);
+ }
+ }
+ else
+ {
+ if (print_out)
+ {
+ printf(".");
+ }
+ else
+ {
+ aHexDump->append(".");
+ }
+ }
+ }
+ if (print_out)
+ {
+ printf("\n");
+ }
+ else
+ {
+ aHexDump->append("\r\n");
+ }
+ if ((printed - line_len) < aLength)
+ {
+ printed += 16;
+ }
+ else
+ {
+ printed = aLength - printed;
+ }
+ }
+ if (print_out) printf("\n");
+
+#ifdef ENABLE_LOG_SYNC
+ iCritical.Unlock();
+#endif
+}
+
+void Util::CheckCommandlineParam( const string& paramname, string& paramvalue )
+{
+ // Command line parameter overrides ini-file value
+ if ( !g_parameters[paramname].empty() )
+ paramvalue = g_parameters[paramname];
+}
+
+// End of the file
\ No newline at end of file