diff --git a/src/global.h b/src/global.h index 188c08e3..2240449b 100755 --- a/src/global.h +++ b/src/global.h @@ -1,287 +1,288 @@ -/******************************************************************************\ - * Copyright (c) 2004-2011 - * - * Author(s): - * Volker Fischer - * - ****************************************************************************** - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * -\******************************************************************************/ - -#if !defined ( GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ ) -#define GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ - -#include -#include -#include -#include -#include -#include -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - - -/* Definitions ****************************************************************/ -// define this macro to get debug output -//#define _DEBUG_ -#undef _DEBUG_ - -// version and application name (always use this version) -#undef VERSION -#define VERSION "3.1.3cvs" -#define APP_NAME "llcon" - -// default name of the ini-file -#define DEFAULT_INI_FILE_NAME "llcon.ini" - -// file name for logging file -#define DEFAULT_LOG_FILE_NAME "llconsrvlog.txt" - -// default server address -#define DEFAULT_SERVER_ADDRESS "llcon.dyndns.org" - -// download URL -#define LLCON_DOWNLOAD_URL "http://sourceforge.net/projects/llcon/files" - -// defined port number for client and server -#define LLCON_DEFAULT_PORT_NUMBER 22124 - -// system sample rate (the sound card and audio coder works on this sample rate) -#define SYSTEM_SAMPLE_RATE_HZ 48000 // Hz - -// System block size, this is the block size on which the audio coder works. -// All other block sizes must be a multiple of this size -#define SYSTEM_FRAME_SIZE_SAMPLES 128 - -#define SYSTEM_BLOCK_DURATION_MS_FLOAT \ - ( static_cast ( SYSTEM_FRAME_SIZE_SAMPLES ) / \ - SYSTEM_SAMPLE_RATE_HZ * 1000 ) - -// define the allowed audio frame size factors (since the -// "SYSTEM_FRAME_SIZE_SAMPLES" is quite small, it may be that on some -// computers a larger value is required) -#define FRAME_SIZE_FACTOR_PREFERRED 1 // 128 (for frame size 128) -#define FRAME_SIZE_FACTOR_DEFAULT 2 // 256 (for frame size 128) -#define FRAME_SIZE_FACTOR_SAFE 4 // 512 (for frame size 128) - -// low complexity CELT encoder (if defined) -#define USE_LOW_COMPLEXITY_CELT_ENC - -// define the maximum mono audio buffer size at a sample rate -// of 48 kHz, this is important for defining the maximum number -// of bytes to be expected from the network interface -#define MAX_MONO_AUD_BUFF_SIZE_AT_48KHZ 4096 - -// Maximum block size for network input buffer. Consider a maximum sample rate -// of 48 kHz and two audio channels and two bytes per sample. -#define MAX_SIZE_BYTES_NETW_BUF ( MAX_MONO_AUD_BUFF_SIZE_AT_48KHZ * 4 ) - -// minimum/maximum network buffer size (which can be chosen by slider) -#define MIN_NET_BUF_SIZE_NUM_BL 1 // number of blocks -#define MAX_NET_BUF_SIZE_NUM_BL 20 // number of blocks - -// default network buffer size -#define DEF_NET_BUF_SIZE_NUM_BL 10 // number of blocks - -// maximum number of recognized sound cards installed in the system, -// definition for "no device" -#define MAX_NUMBER_SOUND_CARDS 10 -#define INVALID_SNC_CARD_DEVICE -1 - -// define the maximum number of audio channel for input/output we can store -// channel infos for (and therefore this is the maximum number of entries in -// the channel selection combo box regardless of the actual available number -// of channels by the audio device) -#define MAX_NUM_IN_OUT_CHANNELS 32 - -// maximum number of elemts in the server address combo box -#define MAX_NUM_SERVER_ADDR_ITEMS 6 - -// defines for LED input level meter -#define NUM_STEPS_INP_LEV_METER 8 -#define RED_BOUND_INP_LEV_METER 7 -#define YELLOW_BOUND_INP_LEV_METER 5 - -// maximum number of internet connections (channels) -// if you want to change this paramter, there has to be done code modifications -// on other places, too! The code tag "MAX_NUM_CHANNELS_TAG" shows these places -// (just search for the tag in the entire code) -#define MAX_NUM_CHANNELS 12 // max number channels for server - -// actual number of used channels in the server -// this parameter can safely be changed from 1 to MAX_NUM_CHANNELS -// without any other changes in the code -#define USED_NUM_CHANNELS 6 // used number channels for server - -// maximum number of servers registered in the server list -#define MAX_NUM_SERVERS_IN_SERVER_LIST 100 - -// defines the time interval at which the ping time is updated in the GUI -#define PING_UPDATE_TIME_MS 500 // ms - -// defines the time interval at which the ping time is updated for the server -// list -#define PING_UPDATE_TIME_SERVER_LIST_MS 2000 // ms - -// time-out until a registered server is deleted from the server list if no -// new registering was made in minutes -#define SERVLIST_TIME_OUT_MINUTES 60 // minutes - -// poll time for server list (to check if entries are time-out) -#define SERVLIST_POLL_TIME_MINUTES 1 // minute - -// time until a slave server registers in the server list -#define SERVLIST_REGIST_INTERV_MINUTES 30 // minutes - - -// length of the moving average buffer for response time measurement -#define TIME_MOV_AV_RESPONSE_SECONDS 30 // seconds - - -// Maximum length of fader tag and text message strings (Since for chat messages -// some HTML code is added, we also have to define a second length which includes -// this additionl HTML code. Right now the length of the HTML code is approx. 66 -// character. Here, we add some headroom to this number) -#define MAX_LEN_FADER_TAG 16 -#define MAX_LEN_CHAT_TEXT 1600 -#define MAX_LEN_CHAT_TEXT_PLUS_HTML 1800 -#define MAX_LEN_SERVER_NAME 20 -#define MAX_LEN_SERVER_TOPIC 32 -#define MAX_LEN_SERVER_CITY 20 - -// common tool tip bottom line text -#define TOOLTIP_COM_END_TEXT tr ( \ - "
" \ - "For more information use the ""What's " \ - "This"" help (? menu, right mouse button or Shift+F1)" \ - "
" ) - -#define _MAXSHORT 32767 -#define _MAXBYTE 255 // binary: 11111111 -#define _MINSHORT ( -32768 ) - -#if HAVE_STDINT_H -# include -#elif HAVE_INTTYPES_H -# include -#elif defined ( _WIN32 ) -typedef __int64 int64_t; -typedef __int32 int32_t; -typedef __int16 int16_t; -typedef unsigned __int64 uint64_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int8 uint8_t; -#else -typedef long long int64_t; -typedef int int32_t; -typedef short int16_t; -typedef unsigned long long uint64_t; -typedef unsigned int uint32_t; -typedef unsigned short uint16_t; -typedef unsigned char uint8_t; -#endif - - -/* Definitions for window message system ------------------------------------ */ -typedef unsigned int _MESSAGE_IDENT; -#define MS_RESET_ALL 0 // MS: Message -#define MS_SOUND_IN 1 -#define MS_SOUND_OUT 2 -#define MS_JIT_BUF_PUT 3 -#define MS_JIT_BUF_GET 4 -#define MS_PACKET_RECEIVED 5 -#define MS_ERROR_IN_THREAD 6 -#define MS_SET_JIT_BUF_SIZE 7 - -#define MUL_COL_LED_RED 0 -#define MUL_COL_LED_YELLOW 1 -#define MUL_COL_LED_GREEN 2 - - -/* Classes ********************************************************************/ -class CGenErr -{ -public: - CGenErr ( QString strNewErrorMsg, QString strNewErrorType = "" ) : - strErrorMsg ( strNewErrorMsg ), strErrorType ( strNewErrorType ) {} - - QString GetErrorText() - { - // return formatted error text - if ( strErrorType.isEmpty() ) - { - return strErrorMsg; - } - else - { - return strErrorType + ": " + strErrorMsg; - } - } - -protected: - QString strErrorMsg; - QString strErrorType; -}; - -class CLlconEvent : public QEvent -{ -public: - CLlconEvent ( int iNewMeTy, int iNewSt, int iNewChN = 0 ) : - QEvent ( QEvent::Type ( QEvent::User + 11 ) ), iMessType ( iNewMeTy ), iStatus ( iNewSt ), - iChanNum ( iNewChN ) {} - - int iMessType; - int iStatus; - int iChanNum; -}; - - -/* Prototypes for global functions ********************************************/ -// command line parsing, TODO do not declare functions globally but in a class -QString UsageArguments ( char** argv ); - -bool GetFlagArgument ( char** argv, - int& i, - QString strShortOpt, - QString strLongOpt ); - -bool GetStringArgument ( QTextStream& tsConsole, - int argc, - char** argv, - int& i, - QString strShortOpt, - QString strLongOpt, - QString& strArg ); - -bool GetNumericArgument ( QTextStream& tsConsole, - int argc, - char** argv, - int& i, - QString strShortOpt, - QString strLongOpt, - double rRangeStart, - double rRangeStop, - double& rValue); - -// posting a window message -void PostWinMessage ( const _MESSAGE_IDENT MessID, - const int iMessageParam = 0, - const int iChanNum = 0 ); - -#endif /* !defined ( GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ ) */ +/******************************************************************************\ + * Copyright (c) 2004-2011 + * + * Author(s): + * Volker Fischer + * + ****************************************************************************** + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * +\******************************************************************************/ + +#if !defined ( GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ ) +#define GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +/* Definitions ****************************************************************/ +// define this macro to get debug output +//#define _DEBUG_ +#undef _DEBUG_ + +// version and application name (always use this version) +#undef VERSION +#define VERSION "3.1.3cvs" +#define APP_NAME "llcon" + +// default names of the ini-file for client and server +#define DEFAULT_INI_FILE_NAME "llcon.ini" +#define DEFAULT_INI_FILE_NAME_SERVER "llconserver.ini" + +// file name for logging file +#define DEFAULT_LOG_FILE_NAME "llconsrvlog.txt" + +// default server address +#define DEFAULT_SERVER_ADDRESS "llcon.dyndns.org" + +// download URL +#define LLCON_DOWNLOAD_URL "http://sourceforge.net/projects/llcon/files" + +// defined port number for client and server +#define LLCON_DEFAULT_PORT_NUMBER 22124 + +// system sample rate (the sound card and audio coder works on this sample rate) +#define SYSTEM_SAMPLE_RATE_HZ 48000 // Hz + +// System block size, this is the block size on which the audio coder works. +// All other block sizes must be a multiple of this size +#define SYSTEM_FRAME_SIZE_SAMPLES 128 + +#define SYSTEM_BLOCK_DURATION_MS_FLOAT \ + ( static_cast ( SYSTEM_FRAME_SIZE_SAMPLES ) / \ + SYSTEM_SAMPLE_RATE_HZ * 1000 ) + +// define the allowed audio frame size factors (since the +// "SYSTEM_FRAME_SIZE_SAMPLES" is quite small, it may be that on some +// computers a larger value is required) +#define FRAME_SIZE_FACTOR_PREFERRED 1 // 128 (for frame size 128) +#define FRAME_SIZE_FACTOR_DEFAULT 2 // 256 (for frame size 128) +#define FRAME_SIZE_FACTOR_SAFE 4 // 512 (for frame size 128) + +// low complexity CELT encoder (if defined) +#define USE_LOW_COMPLEXITY_CELT_ENC + +// define the maximum mono audio buffer size at a sample rate +// of 48 kHz, this is important for defining the maximum number +// of bytes to be expected from the network interface +#define MAX_MONO_AUD_BUFF_SIZE_AT_48KHZ 4096 + +// Maximum block size for network input buffer. Consider a maximum sample rate +// of 48 kHz and two audio channels and two bytes per sample. +#define MAX_SIZE_BYTES_NETW_BUF ( MAX_MONO_AUD_BUFF_SIZE_AT_48KHZ * 4 ) + +// minimum/maximum network buffer size (which can be chosen by slider) +#define MIN_NET_BUF_SIZE_NUM_BL 1 // number of blocks +#define MAX_NET_BUF_SIZE_NUM_BL 20 // number of blocks + +// default network buffer size +#define DEF_NET_BUF_SIZE_NUM_BL 10 // number of blocks + +// maximum number of recognized sound cards installed in the system, +// definition for "no device" +#define MAX_NUMBER_SOUND_CARDS 10 +#define INVALID_SNC_CARD_DEVICE -1 + +// define the maximum number of audio channel for input/output we can store +// channel infos for (and therefore this is the maximum number of entries in +// the channel selection combo box regardless of the actual available number +// of channels by the audio device) +#define MAX_NUM_IN_OUT_CHANNELS 32 + +// maximum number of elemts in the server address combo box +#define MAX_NUM_SERVER_ADDR_ITEMS 6 + +// defines for LED input level meter +#define NUM_STEPS_INP_LEV_METER 8 +#define RED_BOUND_INP_LEV_METER 7 +#define YELLOW_BOUND_INP_LEV_METER 5 + +// maximum number of internet connections (channels) +// if you want to change this paramter, there has to be done code modifications +// on other places, too! The code tag "MAX_NUM_CHANNELS_TAG" shows these places +// (just search for the tag in the entire code) +#define MAX_NUM_CHANNELS 12 // max number channels for server + +// actual number of used channels in the server +// this parameter can safely be changed from 1 to MAX_NUM_CHANNELS +// without any other changes in the code +#define USED_NUM_CHANNELS 6 // used number channels for server + +// maximum number of servers registered in the server list +#define MAX_NUM_SERVERS_IN_SERVER_LIST 100 + +// defines the time interval at which the ping time is updated in the GUI +#define PING_UPDATE_TIME_MS 500 // ms + +// defines the time interval at which the ping time is updated for the server +// list +#define PING_UPDATE_TIME_SERVER_LIST_MS 2000 // ms + +// time-out until a registered server is deleted from the server list if no +// new registering was made in minutes +#define SERVLIST_TIME_OUT_MINUTES 60 // minutes + +// poll time for server list (to check if entries are time-out) +#define SERVLIST_POLL_TIME_MINUTES 1 // minute + +// time until a slave server registers in the server list +#define SERVLIST_REGIST_INTERV_MINUTES 30 // minutes + + +// length of the moving average buffer for response time measurement +#define TIME_MOV_AV_RESPONSE_SECONDS 30 // seconds + + +// Maximum length of fader tag and text message strings (Since for chat messages +// some HTML code is added, we also have to define a second length which includes +// this additionl HTML code. Right now the length of the HTML code is approx. 66 +// character. Here, we add some headroom to this number) +#define MAX_LEN_FADER_TAG 16 +#define MAX_LEN_CHAT_TEXT 1600 +#define MAX_LEN_CHAT_TEXT_PLUS_HTML 1800 +#define MAX_LEN_SERVER_NAME 20 +#define MAX_LEN_SERVER_TOPIC 32 +#define MAX_LEN_SERVER_CITY 20 + +// common tool tip bottom line text +#define TOOLTIP_COM_END_TEXT tr ( \ + "
" \ + "For more information use the ""What's " \ + "This"" help (? menu, right mouse button or Shift+F1)" \ + "
" ) + +#define _MAXSHORT 32767 +#define _MAXBYTE 255 // binary: 11111111 +#define _MINSHORT ( -32768 ) + +#if HAVE_STDINT_H +# include +#elif HAVE_INTTYPES_H +# include +#elif defined ( _WIN32 ) +typedef __int64 int64_t; +typedef __int32 int32_t; +typedef __int16 int16_t; +typedef unsigned __int64 uint64_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int8 uint8_t; +#else +typedef long long int64_t; +typedef int int32_t; +typedef short int16_t; +typedef unsigned long long uint64_t; +typedef unsigned int uint32_t; +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +#endif + + +/* Definitions for window message system ------------------------------------ */ +typedef unsigned int _MESSAGE_IDENT; +#define MS_RESET_ALL 0 // MS: Message +#define MS_SOUND_IN 1 +#define MS_SOUND_OUT 2 +#define MS_JIT_BUF_PUT 3 +#define MS_JIT_BUF_GET 4 +#define MS_PACKET_RECEIVED 5 +#define MS_ERROR_IN_THREAD 6 +#define MS_SET_JIT_BUF_SIZE 7 + +#define MUL_COL_LED_RED 0 +#define MUL_COL_LED_YELLOW 1 +#define MUL_COL_LED_GREEN 2 + + +/* Classes ********************************************************************/ +class CGenErr +{ +public: + CGenErr ( QString strNewErrorMsg, QString strNewErrorType = "" ) : + strErrorMsg ( strNewErrorMsg ), strErrorType ( strNewErrorType ) {} + + QString GetErrorText() + { + // return formatted error text + if ( strErrorType.isEmpty() ) + { + return strErrorMsg; + } + else + { + return strErrorType + ": " + strErrorMsg; + } + } + +protected: + QString strErrorMsg; + QString strErrorType; +}; + +class CLlconEvent : public QEvent +{ +public: + CLlconEvent ( int iNewMeTy, int iNewSt, int iNewChN = 0 ) : + QEvent ( QEvent::Type ( QEvent::User + 11 ) ), iMessType ( iNewMeTy ), iStatus ( iNewSt ), + iChanNum ( iNewChN ) {} + + int iMessType; + int iStatus; + int iChanNum; +}; + + +/* Prototypes for global functions ********************************************/ +// command line parsing, TODO do not declare functions globally but in a class +QString UsageArguments ( char** argv ); + +bool GetFlagArgument ( char** argv, + int& i, + QString strShortOpt, + QString strLongOpt ); + +bool GetStringArgument ( QTextStream& tsConsole, + int argc, + char** argv, + int& i, + QString strShortOpt, + QString strLongOpt, + QString& strArg ); + +bool GetNumericArgument ( QTextStream& tsConsole, + int argc, + char** argv, + int& i, + QString strShortOpt, + QString strLongOpt, + double rRangeStart, + double rRangeStop, + double& rValue); + +// posting a window message +void PostWinMessage ( const _MESSAGE_IDENT MessID, + const int iMessageParam = 0, + const int iChanNum = 0 ); + +#endif /* !defined ( GLOBAL_H__3B123453_4344_BB2B_23E7A0D31912__INCLUDED_ ) */ diff --git a/src/main.cpp b/src/main.cpp index 44575ab3..7bff976c 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -349,6 +349,10 @@ int main ( int argc, char** argv ) if ( bUseGUI ) { + // load settings from init-file + CSettings Settings ( &Server ); + Settings.Load ( strIniFileName ); + // GUI object for the server CLlconServerDlg ServerDlg ( &Server, 0 ); @@ -359,6 +363,9 @@ int main ( int argc, char** argv ) // show dialog ServerDlg.show(); app.exec(); + + // save settings to init-file + Settings.Save ( strIniFileName ); } else { diff --git a/src/server.h b/src/server.h index ab863b97..0f81df50 100755 --- a/src/server.h +++ b/src/server.h @@ -126,6 +126,22 @@ public: CVector& veciJitBufNumFrames, CVector& veciNetwFrameSizeFact ); + void SetServerName ( const QString& strNewName ) + { ServerListManager.SetServerName ( strNewName ); } + + QString GetServerName() { return ServerListManager.GetServerName(); } + + void SetServerCity ( const QString& strNewCity ) + { ServerListManager.SetServerCity ( strNewCity ); } + + QString GetServerCity() { return ServerListManager.GetServerCity(); } + + void SetServerCountry ( const QLocale::Country eNewCountry ) + { ServerListManager.SetServerCountry ( eNewCountry ); } + + QLocale::Country GetServerCountry() + { return ServerListManager.GetServerCountry(); } + protected: // access functions for actual channels bool IsConnected ( const int iChanNum ) diff --git a/src/serverlist.h b/src/serverlist.h index 191d0b5a..3ebf049a 100755 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -127,6 +127,7 @@ public: void SetEnabled ( const bool bState ); bool GetEnabled() const { return bEnabled; } + bool GetIsCentralServer() const { return bIsCentralServer; } void RegisterServer ( const CHostAddress& InetAddr, @@ -134,6 +135,25 @@ public: void QueryServerList ( const CHostAddress& InetAddr ); + + // set server infos -> per definition the server info of this server is + // stored in the first entry of the list, we assume here that the first + // entry is correctly created in the constructor of the class + void SetServerName ( const QString& strNewName ) + { ServerList[0].strName = strNewName; } + + QString GetServerName() { return ServerList[0].strName; } + + void SetServerCity ( const QString& strNewCity ) + { ServerList[0].strCity = strNewCity; } + + QString GetServerCity() { return ServerList[0].strCity; } + + void SetServerCountry ( const QLocale::Country eNewCountry ) + { ServerList[0].eCountry = eNewCountry; } + + QLocale::Country GetServerCountry() { return ServerList[0].eCountry; } + protected: QTimer TimerPollList; QTimer TimerRegistering; diff --git a/src/settings.cpp b/src/settings.cpp index c9b58c99..dfec9489 100755 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1,424 +1,477 @@ -/******************************************************************************\ - * Copyright (c) 2004-2011 - * - * Author(s): - * Volker Fischer - * - ****************************************************************************** - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * -\******************************************************************************/ - -#include "settings.h" - - -/* Implementation *************************************************************/ -void CSettings::ReadIniFile ( const QString& sFileName ) -{ - int iValue; - bool bValue; - QDomDocument IniXMLDocument; - - // prepare file name for loading initialization data from XML file and read - // data from file if possible - QFile file ( GetIniFileNameWithPath ( sFileName ) ); - if ( file.open ( QIODevice::ReadOnly ) ) - { - QTextStream in ( &file ); - IniXMLDocument.setContent ( in.readAll(), false ); - - file.close(); - } - - - // Actual settings data --------------------------------------------------- - // IP addresses - for ( int iIPAddrIdx = 0; iIPAddrIdx < MAX_NUM_SERVER_ADDR_ITEMS; iIPAddrIdx++ ) - { - QString sDefaultIP = ""; - - // use default only for first entry - if ( iIPAddrIdx == 0 ) - { - sDefaultIP = DEFAULT_SERVER_ADDRESS; - } - - pClient->vstrIPAddress[iIPAddrIdx] = - GetIniSetting ( IniXMLDocument, "client", - QString ( "ipaddress%1" ).arg ( iIPAddrIdx ), sDefaultIP ); - } - - // name - pClient->strName = GetIniSetting ( IniXMLDocument, "client", "name" ); - - // audio fader - if ( GetNumericIniSet ( IniXMLDocument, "client", "audfad", - AUD_FADER_IN_MIN, AUD_FADER_IN_MAX, iValue ) ) - { - pClient->SetAudioInFader ( iValue ); - } - - // reverberation level - if ( GetNumericIniSet ( IniXMLDocument, "client", "revlev", - 0, AUD_REVERB_MAX, iValue ) ) - { - pClient->SetReverbLevel ( iValue ); - } - - // reverberation channel assignment - if ( GetFlagIniSet ( IniXMLDocument, "client", "reverblchan", bValue ) ) - { - pClient->SetReverbOnLeftChan ( bValue ); - } - - // sound card selection - // special case with this setting: the sound card initialization depends on this setting - // call, therefore, if no setting file parameter could be retrieved, the sound card is - // initialized with a default setting defined here - if ( GetNumericIniSet ( IniXMLDocument, "client", "auddevidx", - 1, MAX_NUMBER_SOUND_CARDS, iValue ) ) - { - pClient->SetSndCrdDev ( iValue ); - } - else - { - // use "INVALID_SNC_CARD_DEVICE" to tell the sound card driver that no - // device selection was done previously - pClient->SetSndCrdDev ( INVALID_SNC_CARD_DEVICE ); - } - - // sound card channel mapping settings: make sure these settings are - // set AFTER the sound card device is set, otherwise the settings are - // overwritten by the defaults - // - // sound card left input channel mapping - if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdinlch", - 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) - { - pClient->SetSndCrdLeftInputChannel ( iValue ); - } - - // sound card right input channel mapping - if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdinrch", - 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) - { - pClient->SetSndCrdRightInputChannel ( iValue ); - } - - // sound card left output channel mapping - if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutlch", - 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) - { - pClient->SetSndCrdLeftOutputChannel ( iValue ); - } - - // sound card right output channel mapping - if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutrch", - 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) - { - pClient->SetSndCrdRightOutputChannel ( iValue ); - } - - // sound card preferred buffer size index - if ( GetNumericIniSet ( IniXMLDocument, "client", "prefsndcrdbufidx", - FRAME_SIZE_FACTOR_PREFERRED, FRAME_SIZE_FACTOR_SAFE, iValue ) ) - { - // additional check required since only a subset of factors are - // defined - if ( ( iValue == FRAME_SIZE_FACTOR_PREFERRED ) || - ( iValue == FRAME_SIZE_FACTOR_DEFAULT ) || - ( iValue == FRAME_SIZE_FACTOR_SAFE ) ) - { - pClient->SetSndCrdPrefFrameSizeFactor ( iValue ); - } - } - - // automatic network jitter buffer size setting - if ( GetFlagIniSet ( IniXMLDocument, "client", "autojitbuf", bValue ) ) - { - pClient->SetDoAutoSockBufSize ( bValue ); - } - - // network jitter buffer size - if ( GetNumericIniSet ( IniXMLDocument, "client", "jitbuf", - MIN_NET_BUF_SIZE_NUM_BL, MAX_NET_BUF_SIZE_NUM_BL, iValue ) ) - { - pClient->SetSockBufNumFrames ( iValue ); - } - - // flag whether the chat window shall be opened on a new chat message - if ( GetFlagIniSet ( IniXMLDocument, "client", "openchatonnewmessage", bValue ) ) - { - pClient->SetOpenChatOnNewMessage ( bValue ); - } - - // GUI design - if ( GetNumericIniSet ( IniXMLDocument, "client", "guidesign", - 0, 1 /* GD_ORIGINAL */, iValue ) ) - { - pClient->SetGUIDesign ( static_cast ( iValue ) ); - } - - // flag whether using high quality audio or not - if ( GetFlagIniSet ( IniXMLDocument, "client", "highqualityaudio", bValue ) ) - { - pClient->SetCELTHighQuality ( bValue ); - } - - // flag whether stereo mode is used - if ( GetFlagIniSet ( IniXMLDocument, "client", "stereoaudio", bValue ) ) - { - pClient->SetUseStereo ( bValue ); - } -} - -void CSettings::WriteIniFile ( const QString& sFileName ) -{ - // create XML document for storing initialization parameters - QDomDocument IniXMLDocument; - - - // Actual settings data --------------------------------------------------- - // IP addresses - for ( int iIPAddrIdx = 0; iIPAddrIdx < MAX_NUM_SERVER_ADDR_ITEMS; iIPAddrIdx++ ) - { - PutIniSetting ( IniXMLDocument, "client", - QString ( "ipaddress%1" ).arg ( iIPAddrIdx ), - pClient->vstrIPAddress[iIPAddrIdx] ); - } - - // name - PutIniSetting ( IniXMLDocument, "client", "name", - pClient->strName ); - - // audio fader - SetNumericIniSet ( IniXMLDocument, "client", "audfad", - pClient->GetAudioInFader() ); - - // reverberation level - SetNumericIniSet ( IniXMLDocument, "client", "revlev", - pClient->GetReverbLevel() ); - - // reverberation channel assignment - SetFlagIniSet ( IniXMLDocument, "client", "reverblchan", - pClient->IsReverbOnLeftChan() ); - - // sound card selection - SetNumericIniSet ( IniXMLDocument, "client", "auddevidx", - pClient->GetSndCrdDev() ); - - // sound card left input channel mapping - SetNumericIniSet ( IniXMLDocument, "client", "sndcrdinlch", - pClient->GetSndCrdLeftInputChannel() ); - - // sound card right input channel mapping - SetNumericIniSet ( IniXMLDocument, "client", "sndcrdinrch", - pClient->GetSndCrdRightInputChannel() ); - - // sound card left output channel mapping - SetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutlch", - pClient->GetSndCrdLeftOutputChannel() ); - - // sound card right output channel mapping - SetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutrch", - pClient->GetSndCrdRightOutputChannel() ); - - // sound card preferred buffer size index - SetNumericIniSet ( IniXMLDocument, "client", "prefsndcrdbufidx", - pClient->GetSndCrdPrefFrameSizeFactor() ); - - // automatic network jitter buffer size setting - SetFlagIniSet ( IniXMLDocument, "client", "autojitbuf", - pClient->GetDoAutoSockBufSize() ); - - // network jitter buffer size - SetNumericIniSet ( IniXMLDocument, "client", "jitbuf", - pClient->GetSockBufNumFrames() ); - - // flag whether the chat window shall be opened on a new chat message - SetFlagIniSet ( IniXMLDocument, "client", "openchatonnewmessage", - pClient->GetOpenChatOnNewMessage() ); - - // GUI design - SetNumericIniSet ( IniXMLDocument, "client", "guidesign", - static_cast ( pClient->GetGUIDesign() ) ); - - // flag whether using high quality audio or not - SetFlagIniSet ( IniXMLDocument, "client", "highqualityaudio", - pClient->GetCELTHighQuality() ); - - // flag whether stereo mode is used - SetFlagIniSet ( IniXMLDocument, "client", "stereoaudio", - pClient->GetUseStereo() ); - - // prepare file name for storing initialization data in XML file and store - // XML data in file - QFile file ( GetIniFileNameWithPath ( sFileName ) ); - if ( file.open ( QIODevice::WriteOnly ) ) - { - QTextStream out ( &file ); - out << IniXMLDocument.toString(); - } -} - -QString CSettings::GetIniFileNameWithPath ( const QString& sFileName ) -{ - // return the file name with complete path, take care if given file name is - // empty - QString sCurFileName = sFileName; - if ( sCurFileName.isEmpty() ) - { - // we use the Qt default setting file paths for the different OSs by - // utilizing the QSettings class - const QSettings TempSettingsObject ( - QSettings::IniFormat, QSettings::UserScope, APP_NAME, APP_NAME ); - - const QString sConfigDir = - QFileInfo ( TempSettingsObject.fileName() ).absolutePath(); - - // make sure the directory exists - if ( !QFile::exists ( sConfigDir ) ) - { - QDir TempDirectoryObject; - TempDirectoryObject.mkpath ( sConfigDir ); - } - - // append the actual file name - sCurFileName = sConfigDir + "/" + DEFAULT_INI_FILE_NAME; - } - - return sCurFileName; -} - -void CSettings::SetNumericIniSet ( QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const int iValue ) -{ - // convert input parameter which is an integer to string and store - PutIniSetting ( xmlFile, strSection, strKey, QString("%1").arg(iValue) ); -} - -bool CSettings::GetNumericIniSet ( const QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const int iRangeStart, - const int iRangeStop, int& iValue ) -{ - // init return value - bool bReturn = false; - - const QString strGetIni = GetIniSetting ( xmlFile, strSection, strKey ); - - // check if it is a valid parameter - if ( !strGetIni.isEmpty() ) - { - // convert string from init file to integer - iValue = strGetIni.toInt(); - - // check range - if ( ( iValue >= iRangeStart ) && ( iValue <= iRangeStop ) ) - { - bReturn = true; - } - } - - return bReturn; -} - -void CSettings::SetFlagIniSet ( QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const bool bValue ) -{ - // we encode true -> "1" and false -> "0" - if ( bValue == true ) - { - PutIniSetting ( xmlFile, strSection, strKey, "1" ); - } - else - { - PutIniSetting ( xmlFile, strSection, strKey, "0" ); - } -} - -bool CSettings::GetFlagIniSet ( const QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, bool& bValue ) -{ - // init return value - bool bReturn = false; - - const QString strGetIni = GetIniSetting ( xmlFile, strSection, strKey ); - - if ( !strGetIni.isEmpty() ) - { - if ( strGetIni.toInt() ) - { - bValue = true; - } - else - { - bValue = false; - } - - bReturn = true; - } - - return bReturn; -} - - -// Init-file routines using XML *********************************************** -QString CSettings::GetIniSetting ( const QDomDocument& xmlFile, const QString& sSection, - const QString& sKey, const QString& sDefaultVal ) -{ - // init return parameter with default value - QString sResult ( sDefaultVal ); - - // get section - QDomElement xmlSection = xmlFile.firstChildElement ( sSection ); - if ( !xmlSection.isNull() ) - { - // get key - QDomElement xmlKey = xmlSection.firstChildElement ( sKey ); - if ( !xmlKey.isNull() ) - { - // get value - sResult = xmlKey.text(); - } - } - - return sResult; -} - -void CSettings::PutIniSetting ( QDomDocument& xmlFile, const QString& sSection, - const QString& sKey, const QString& sValue ) -{ - // check if section is already there, if not then create it - QDomElement xmlSection = xmlFile.firstChildElement ( sSection ); - if ( xmlSection.isNull() ) - { - // create new root element and add to document - xmlSection = xmlFile.createElement ( sSection ); - xmlFile.appendChild ( xmlSection ); - } - - // check if key is already there, if not then create it - QDomElement xmlKey = xmlSection.firstChildElement ( sKey ); - if ( xmlKey.isNull() ) - { - xmlKey = xmlFile.createElement ( sKey ); - xmlSection.appendChild ( xmlKey ); - } - - // add actual data to the key - QDomText currentValue = xmlFile.createTextNode ( sValue ); - xmlKey.appendChild ( currentValue ); -} +/******************************************************************************\ + * Copyright (c) 2004-2011 + * + * Author(s): + * Volker Fischer + * + ****************************************************************************** + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * +\******************************************************************************/ + +#include "settings.h" + + +/* Implementation *************************************************************/ +void CSettings::ReadIniFile ( const QString& sFileName ) +{ + int iValue; + bool bValue; + QDomDocument IniXMLDocument; + + // prepare file name for loading initialization data from XML file and read + // data from file if possible + QFile file ( GetIniFileNameWithPath ( sFileName ) ); + if ( file.open ( QIODevice::ReadOnly ) ) + { + QTextStream in ( &file ); + IniXMLDocument.setContent ( in.readAll(), false ); + + file.close(); + } + + + // Actual settings data --------------------------------------------------- + if ( bIsClient ) + { + // client: + + // IP addresses + for ( int iIPAddrIdx = 0; iIPAddrIdx < MAX_NUM_SERVER_ADDR_ITEMS; iIPAddrIdx++ ) + { + QString sDefaultIP = ""; + + // use default only for first entry + if ( iIPAddrIdx == 0 ) + { + sDefaultIP = DEFAULT_SERVER_ADDRESS; + } + + pClient->vstrIPAddress[iIPAddrIdx] = + GetIniSetting ( IniXMLDocument, "client", + QString ( "ipaddress%1" ).arg ( iIPAddrIdx ), sDefaultIP ); + } + + // name + pClient->strName = GetIniSetting ( IniXMLDocument, "client", "name" ); + + // audio fader + if ( GetNumericIniSet ( IniXMLDocument, "client", "audfad", + AUD_FADER_IN_MIN, AUD_FADER_IN_MAX, iValue ) ) + { + pClient->SetAudioInFader ( iValue ); + } + + // reverberation level + if ( GetNumericIniSet ( IniXMLDocument, "client", "revlev", + 0, AUD_REVERB_MAX, iValue ) ) + { + pClient->SetReverbLevel ( iValue ); + } + + // reverberation channel assignment + if ( GetFlagIniSet ( IniXMLDocument, "client", "reverblchan", bValue ) ) + { + pClient->SetReverbOnLeftChan ( bValue ); + } + + // sound card selection + // special case with this setting: the sound card initialization depends + // on this setting call, therefore, if no setting file parameter could + // be retrieved, the sound card is initialized with a default setting + // defined here + if ( GetNumericIniSet ( IniXMLDocument, "client", "auddevidx", + 1, MAX_NUMBER_SOUND_CARDS, iValue ) ) + { + pClient->SetSndCrdDev ( iValue ); + } + else + { + // use "INVALID_SNC_CARD_DEVICE" to tell the sound card driver that + // no device selection was done previously + pClient->SetSndCrdDev ( INVALID_SNC_CARD_DEVICE ); + } + + // sound card channel mapping settings: make sure these settings are + // set AFTER the sound card device is set, otherwise the settings are + // overwritten by the defaults + // + // sound card left input channel mapping + if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdinlch", + 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) + { + pClient->SetSndCrdLeftInputChannel ( iValue ); + } + + // sound card right input channel mapping + if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdinrch", + 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) + { + pClient->SetSndCrdRightInputChannel ( iValue ); + } + + // sound card left output channel mapping + if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutlch", + 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) + { + pClient->SetSndCrdLeftOutputChannel ( iValue ); + } + + // sound card right output channel mapping + if ( GetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutrch", + 0, MAX_NUM_IN_OUT_CHANNELS - 1, iValue ) ) + { + pClient->SetSndCrdRightOutputChannel ( iValue ); + } + + // sound card preferred buffer size index + if ( GetNumericIniSet ( IniXMLDocument, "client", "prefsndcrdbufidx", + FRAME_SIZE_FACTOR_PREFERRED, FRAME_SIZE_FACTOR_SAFE, iValue ) ) + { + // additional check required since only a subset of factors are + // defined + if ( ( iValue == FRAME_SIZE_FACTOR_PREFERRED ) || + ( iValue == FRAME_SIZE_FACTOR_DEFAULT ) || + ( iValue == FRAME_SIZE_FACTOR_SAFE ) ) + { + pClient->SetSndCrdPrefFrameSizeFactor ( iValue ); + } + } + + // automatic network jitter buffer size setting + if ( GetFlagIniSet ( IniXMLDocument, "client", "autojitbuf", bValue ) ) + { + pClient->SetDoAutoSockBufSize ( bValue ); + } + + // network jitter buffer size + if ( GetNumericIniSet ( IniXMLDocument, "client", "jitbuf", + MIN_NET_BUF_SIZE_NUM_BL, MAX_NET_BUF_SIZE_NUM_BL, iValue ) ) + { + pClient->SetSockBufNumFrames ( iValue ); + } + + // flag whether the chat window shall be opened on a new chat message + if ( GetFlagIniSet ( IniXMLDocument, "client", "openchatonnewmessage", bValue ) ) + { + pClient->SetOpenChatOnNewMessage ( bValue ); + } + + // GUI design + if ( GetNumericIniSet ( IniXMLDocument, "client", "guidesign", + 0, 1 /* GD_ORIGINAL */, iValue ) ) + { + pClient->SetGUIDesign ( static_cast ( iValue ) ); + } + + // flag whether using high quality audio or not + if ( GetFlagIniSet ( IniXMLDocument, "client", "highqualityaudio", bValue ) ) + { + pClient->SetCELTHighQuality ( bValue ); + } + + // flag whether stereo mode is used + if ( GetFlagIniSet ( IniXMLDocument, "client", "stereoaudio", bValue ) ) + { + pClient->SetUseStereo ( bValue ); + } + } + else + { + // server: + + // name + pServer->SetServerName ( GetIniSetting ( IniXMLDocument, "server", "name" ) ); + + // city + pServer->SetServerCity ( GetIniSetting ( IniXMLDocument, "server", "name" ) ); + + // country + if ( GetNumericIniSet ( IniXMLDocument, "server", "country", + 0, static_cast ( QLocale::LastCountry ), iValue ) ) + { + pServer->SetServerCountry ( static_cast ( iValue ) ); + } + } +} + +void CSettings::WriteIniFile ( const QString& sFileName ) +{ + // create XML document for storing initialization parameters + QDomDocument IniXMLDocument; + + + // Actual settings data --------------------------------------------------- + if ( bIsClient ) + { + // client: + + // IP addresses + for ( int iIPAddrIdx = 0; iIPAddrIdx < MAX_NUM_SERVER_ADDR_ITEMS; iIPAddrIdx++ ) + { + PutIniSetting ( IniXMLDocument, "client", + QString ( "ipaddress%1" ).arg ( iIPAddrIdx ), + pClient->vstrIPAddress[iIPAddrIdx] ); + } + + // name + PutIniSetting ( IniXMLDocument, "client", "name", + pClient->strName ); + + // audio fader + SetNumericIniSet ( IniXMLDocument, "client", "audfad", + pClient->GetAudioInFader() ); + + // reverberation level + SetNumericIniSet ( IniXMLDocument, "client", "revlev", + pClient->GetReverbLevel() ); + + // reverberation channel assignment + SetFlagIniSet ( IniXMLDocument, "client", "reverblchan", + pClient->IsReverbOnLeftChan() ); + + // sound card selection + SetNumericIniSet ( IniXMLDocument, "client", "auddevidx", + pClient->GetSndCrdDev() ); + + // sound card left input channel mapping + SetNumericIniSet ( IniXMLDocument, "client", "sndcrdinlch", + pClient->GetSndCrdLeftInputChannel() ); + + // sound card right input channel mapping + SetNumericIniSet ( IniXMLDocument, "client", "sndcrdinrch", + pClient->GetSndCrdRightInputChannel() ); + + // sound card left output channel mapping + SetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutlch", + pClient->GetSndCrdLeftOutputChannel() ); + + // sound card right output channel mapping + SetNumericIniSet ( IniXMLDocument, "client", "sndcrdoutrch", + pClient->GetSndCrdRightOutputChannel() ); + + // sound card preferred buffer size index + SetNumericIniSet ( IniXMLDocument, "client", "prefsndcrdbufidx", + pClient->GetSndCrdPrefFrameSizeFactor() ); + + // automatic network jitter buffer size setting + SetFlagIniSet ( IniXMLDocument, "client", "autojitbuf", + pClient->GetDoAutoSockBufSize() ); + + // network jitter buffer size + SetNumericIniSet ( IniXMLDocument, "client", "jitbuf", + pClient->GetSockBufNumFrames() ); + + // flag whether the chat window shall be opened on a new chat message + SetFlagIniSet ( IniXMLDocument, "client", "openchatonnewmessage", + pClient->GetOpenChatOnNewMessage() ); + + // GUI design + SetNumericIniSet ( IniXMLDocument, "client", "guidesign", + static_cast ( pClient->GetGUIDesign() ) ); + + // flag whether using high quality audio or not + SetFlagIniSet ( IniXMLDocument, "client", "highqualityaudio", + pClient->GetCELTHighQuality() ); + + // flag whether stereo mode is used + SetFlagIniSet ( IniXMLDocument, "client", "stereoaudio", + pClient->GetUseStereo() ); + } + else + { + // server: + + // name + PutIniSetting ( IniXMLDocument, "server", "name", + pServer->GetServerName() ); + + // city + PutIniSetting ( IniXMLDocument, "server", "city", + pServer->GetServerCity() ); + + // country + SetNumericIniSet ( IniXMLDocument, "server", "country", + static_cast ( pServer->GetServerCountry() ) ); + } + + // prepare file name for storing initialization data in XML file and store + // XML data in file + QFile file ( GetIniFileNameWithPath ( sFileName ) ); + if ( file.open ( QIODevice::WriteOnly ) ) + { + QTextStream out ( &file ); + out << IniXMLDocument.toString(); + } +} + + +// Help functions ************************************************************** +QString CSettings::GetIniFileNameWithPath ( const QString& sFileName ) +{ + // return the file name with complete path, take care if given file name is + // empty + QString sCurFileName = sFileName; + if ( sCurFileName.isEmpty() ) + { + // we use the Qt default setting file paths for the different OSs by + // utilizing the QSettings class + const QSettings TempSettingsObject ( + QSettings::IniFormat, QSettings::UserScope, APP_NAME, APP_NAME ); + + const QString sConfigDir = + QFileInfo ( TempSettingsObject.fileName() ).absolutePath(); + + // make sure the directory exists + if ( !QFile::exists ( sConfigDir ) ) + { + QDir TempDirectoryObject; + TempDirectoryObject.mkpath ( sConfigDir ); + } + + // append the actual file name + if ( bIsClient ) + { + sCurFileName = sConfigDir + "/" + DEFAULT_INI_FILE_NAME; + } + else + { + sCurFileName = sConfigDir + "/" + DEFAULT_INI_FILE_NAME_SERVER; + } + } + + return sCurFileName; +} + +void CSettings::SetNumericIniSet ( QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const int iValue ) +{ + // convert input parameter which is an integer to string and store + PutIniSetting ( xmlFile, strSection, strKey, QString("%1").arg(iValue) ); +} + +bool CSettings::GetNumericIniSet ( const QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const int iRangeStart, + const int iRangeStop, int& iValue ) +{ + // init return value + bool bReturn = false; + + const QString strGetIni = GetIniSetting ( xmlFile, strSection, strKey ); + + // check if it is a valid parameter + if ( !strGetIni.isEmpty() ) + { + // convert string from init file to integer + iValue = strGetIni.toInt(); + + // check range + if ( ( iValue >= iRangeStart ) && ( iValue <= iRangeStop ) ) + { + bReturn = true; + } + } + + return bReturn; +} + +void CSettings::SetFlagIniSet ( QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const bool bValue ) +{ + // we encode true -> "1" and false -> "0" + if ( bValue == true ) + { + PutIniSetting ( xmlFile, strSection, strKey, "1" ); + } + else + { + PutIniSetting ( xmlFile, strSection, strKey, "0" ); + } +} + +bool CSettings::GetFlagIniSet ( const QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, bool& bValue ) +{ + // init return value + bool bReturn = false; + + const QString strGetIni = GetIniSetting ( xmlFile, strSection, strKey ); + + if ( !strGetIni.isEmpty() ) + { + if ( strGetIni.toInt() ) + { + bValue = true; + } + else + { + bValue = false; + } + + bReturn = true; + } + + return bReturn; +} + + +// Init-file routines using XML *********************************************** +QString CSettings::GetIniSetting ( const QDomDocument& xmlFile, const QString& sSection, + const QString& sKey, const QString& sDefaultVal ) +{ + // init return parameter with default value + QString sResult ( sDefaultVal ); + + // get section + QDomElement xmlSection = xmlFile.firstChildElement ( sSection ); + if ( !xmlSection.isNull() ) + { + // get key + QDomElement xmlKey = xmlSection.firstChildElement ( sKey ); + if ( !xmlKey.isNull() ) + { + // get value + sResult = xmlKey.text(); + } + } + + return sResult; +} + +void CSettings::PutIniSetting ( QDomDocument& xmlFile, const QString& sSection, + const QString& sKey, const QString& sValue ) +{ + // check if section is already there, if not then create it + QDomElement xmlSection = xmlFile.firstChildElement ( sSection ); + if ( xmlSection.isNull() ) + { + // create new root element and add to document + xmlSection = xmlFile.createElement ( sSection ); + xmlFile.appendChild ( xmlSection ); + } + + // check if key is already there, if not then create it + QDomElement xmlKey = xmlSection.firstChildElement ( sKey ); + if ( xmlKey.isNull() ) + { + xmlKey = xmlFile.createElement ( sKey ); + xmlSection.appendChild ( xmlKey ); + } + + // add actual data to the key + QDomText currentValue = xmlFile.createTextNode ( sValue ); + xmlKey.appendChild ( currentValue ); +} diff --git a/src/settings.h b/src/settings.h index 8fc600c8..7fbfd298 100755 --- a/src/settings.h +++ b/src/settings.h @@ -1,73 +1,78 @@ -/******************************************************************************\ - * Copyright (c) 2004-2007 - * - * Author(s): - * Volker Fischer - * - ****************************************************************************** - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * -\******************************************************************************/ - -#if !defined ( SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ ) -#define SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ - -#include -#include -#include -#include -#include -#include "global.h" -#include "client.h" - - -/* Classes ********************************************************************/ -class CSettings -{ -public: - CSettings ( CClient* pNCliP ) : pClient ( pNCliP ) {} - - void Load ( const QString& sFileName = "" ) { ReadIniFile ( sFileName ); } - void Save ( const QString& sFileName = "" ) { WriteIniFile ( sFileName ); } - -protected: - void ReadIniFile ( const QString& sFileName ); - void WriteIniFile ( const QString& sFileName ); - - QString GetIniFileNameWithPath ( const QString& sFileName ); - - // init file access function for read/write - void SetNumericIniSet ( QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const int iValue = 0 ); - bool GetNumericIniSet ( const QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const int iRangeStart, - const int iRangeStop, int& iValue ); - void SetFlagIniSet ( QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, const bool bValue = false ); - bool GetFlagIniSet ( const QDomDocument& xmlFile, const QString& strSection, - const QString& strKey, bool& bValue ); - - // actual working function for init-file access - QString GetIniSetting( const QDomDocument& xmlFile, const QString& sSection, - const QString& sKey, const QString& sDefaultVal = "" ); - void PutIniSetting ( QDomDocument& xmlFile, const QString& sSection, - const QString& sKey, const QString& sValue = "" ); - - // pointer to the client object needed for the various settings - CClient* pClient; -}; - -#endif // !defined ( SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ ) +/******************************************************************************\ + * Copyright (c) 2004-2007 + * + * Author(s): + * Volker Fischer + * + ****************************************************************************** + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * +\******************************************************************************/ + +#if !defined ( SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ ) +#define SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ + +#include +#include +#include +#include +#include +#include "global.h" +#include "client.h" +#include "server.h" + + +/* Classes ********************************************************************/ +class CSettings +{ +public: + CSettings ( CClient* pNCliP ) : pClient ( pNCliP ), bIsClient ( true ) {} + CSettings ( CServer* pNSerP ) : pServer ( pNSerP ), bIsClient ( false ) {} + + void Load ( const QString& sFileName = "" ) { ReadIniFile ( sFileName ); } + void Save ( const QString& sFileName = "" ) { WriteIniFile ( sFileName ); } + +protected: + void ReadIniFile ( const QString& sFileName ); + void WriteIniFile ( const QString& sFileName ); + + QString GetIniFileNameWithPath ( const QString& sFileName ); + + // init file access function for read/write + void SetNumericIniSet ( QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const int iValue = 0 ); + bool GetNumericIniSet ( const QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const int iRangeStart, + const int iRangeStop, int& iValue ); + void SetFlagIniSet ( QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, const bool bValue = false ); + bool GetFlagIniSet ( const QDomDocument& xmlFile, const QString& strSection, + const QString& strKey, bool& bValue ); + + // actual working function for init-file access + QString GetIniSetting( const QDomDocument& xmlFile, const QString& sSection, + const QString& sKey, const QString& sDefaultVal = "" ); + void PutIniSetting ( QDomDocument& xmlFile, const QString& sSection, + const QString& sKey, const QString& sValue = "" ); + + // pointer to the client/server object which stores the various settings + CClient* pClient; // for client + CServer* pServer; // for server + + bool bIsClient; +}; + +#endif // !defined ( SETTINGS_H__3B0BA660_DGEG56G456G9876D31912__INCLUDED_ )