diff --git a/src/llconserverdlg.cpp b/src/llconserverdlg.cpp index e0157331..5b047e9e 100755 --- a/src/llconserverdlg.cpp +++ b/src/llconserverdlg.cpp @@ -1,596 +1,600 @@ -/******************************************************************************\ - * 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 "llconserverdlg.h" - - -/* Implementation *************************************************************/ -CLlconServerDlg::CLlconServerDlg ( CServer* pNServP, - const bool bStartMinimized, - QWidget* parent, - Qt::WindowFlags f ) - : QDialog ( parent, f ), - pServer ( pNServP ), - BitmapSystemTrayInactive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreyArrow.png" ) ), - BitmapSystemTrayActive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreenArrow.png" ) ) -{ - setupUi ( this ); - - - // Add help text to controls ----------------------------------------------- - // client list - lvwClients->setWhatsThis ( tr ( "Client List: The client list " - "shows all clients which are currently connected to this server. Some " - "informations about the clients like the IP address, name, buffer " - "state are given for each connected client." ) ); - - lvwClients->setAccessibleName ( tr ( "Connected clients list view" ) ); - - // start minimized on operating system start - chbStartOnOSStart->setWhatsThis ( tr ( "Start Minimized on Operating " - "System Start: If the start minimized on operating system start " - "check box is checked, the " ) + APP_NAME + tr ( " server will be " - "started when the operating system starts up and is automatically " - "minimized to a system task bar icon." ) ); - - // register server flag - chbRegisterServer->setWhatsThis ( tr ( "Register Server Status: If " - "the register server check box is checked, this server registers " - "itself at the central server so that all " ) + APP_NAME + - tr ( " users can see the server in the connect dialog server list and " - "connect to it. The registering of the server is renewed periodically " - "to make sure that all servers in the connect dialog server list are " - "actually available." ) ); - - // central server address - QString strCentrServAddr = tr ( "Central Server Address: The " - "Central server address is the IP address or URL of the central server " - "at which this server is registered. If the Default check box is " - "checked, the default central server address is shown read-only." ); - - lblCentralServerAddress->setWhatsThis ( strCentrServAddr ); - chbDefaultCentralServer->setWhatsThis ( strCentrServAddr ); - edtCentralServerAddress->setWhatsThis ( strCentrServAddr ); - - chbDefaultCentralServer->setAccessibleName ( - tr ( "Default central server check box" ) ); - - edtCentralServerAddress->setAccessibleName ( - tr ( "Central server address line edit" ) ); - - // server name - QString strServName = tr ( "Server Name: The server name identifies " - "your server in the connect dialog server list at the clients. If no " - "name is given, the IP address is shown instead." ); - - lblServerName->setWhatsThis ( strServName ); - edtServerName->setWhatsThis ( strServName ); - - edtServerName->setAccessibleName ( tr ( "Server name line edit" ) ); - - // location city - QString strLocCity = tr ( "Location City: The city in which this " - "server is located can be set here. If a city name is entered, it " - "will be shown in the connect dialog server list at the clients." ); - - lblLocationCity->setWhatsThis ( strLocCity ); - edtLocationCity->setWhatsThis ( strLocCity ); - - edtLocationCity->setAccessibleName ( tr ( - "City where the server is located line edit" ) ); - - // location country - QString strLocCountry = tr ( "Location country: The country in " - "which this server is located can be set here. If a country is " - "entered, it will be shown in the connect dialog server list at the " - "clients." ); - - lblLocationCountry->setWhatsThis ( strLocCountry ); - cbxLocationCountry->setWhatsThis ( strLocCountry ); - - cbxLocationCountry->setAccessibleName ( tr ( - "Country where the server is located combo box" ) ); - - - // act on "start minimized" flag - if ( bStartMinimized ) - { - showMinimized(); - } - - // check if system tray icon can be used - bSystemTrayIconAvaialbe = SystemTrayIcon.isSystemTrayAvailable(); - - // init system tray icon - if ( bSystemTrayIconAvaialbe ) - { - // prepare context menu to be added to the system tray icon - pSystemTrayIconMenu = new QMenu ( this ); - - pSystemTrayIconMenu->addAction ( tr ( "E&xit" ), - this, SLOT ( OnSysTrayMenuExit() ) ); - - pSystemTrayIconMenu->addSeparator(); - - pSystemTrayIconMenu->setDefaultAction ( pSystemTrayIconMenu->addAction ( - tr ( "&Open " ) + APP_NAME + tr ( " server" ), - this, SLOT ( OnSysTrayMenuOpen() ) ) ); - - SystemTrayIcon.setContextMenu ( pSystemTrayIconMenu ); - - // set tool text - SystemTrayIcon.setToolTip ( QString ( APP_NAME ) + tr ( " server" ) ); - - // show icon of state "inactive" - SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayInactive ) ); - SystemTrayIcon.show(); - } - - // set text for version and application name - lblNameVersion->setText ( QString ( APP_NAME ) + - tr ( " server " ) + QString ( VERSION ) ); - - // set up list view for connected clients - lvwClients->setColumnWidth ( 0, 170 ); - lvwClients->setColumnWidth ( 1, 130 ); - lvwClients->setColumnWidth ( 2, 60 ); - lvwClients->clear(); - - -// TEST workaround for resize problem of window after iconize in task bar -lvwClients->setMinimumWidth ( 170 + 130 + 60 + 205 ); -lvwClients->setMinimumHeight ( 140 ); - - - // insert items in reverse order because in Windows all of them are - // always visible -> put first item on the top - vecpListViewItems.Init ( MAX_NUM_CHANNELS ); - for ( int i = MAX_NUM_CHANNELS - 1; i >= 0; i-- ) - { - vecpListViewItems[i] = new CServerListViewItem ( lvwClients ); - vecpListViewItems[i]->setHidden ( true ); - } - - // update default central server address check box - if ( pServer->GetUseDefaultCentralServerAddress() ) - { - chbDefaultCentralServer->setCheckState ( Qt::Checked ); - } - else - { - chbDefaultCentralServer->setCheckState ( Qt::Unchecked ); - } - - // update server name line edit - edtServerName->setText ( pServer->GetServerName() ); - - // update server city line edit - edtLocationCity->setText ( pServer->GetServerCity() ); - - // load country combo box with all available countries - cbxLocationCountry->setInsertPolicy ( QComboBox::NoInsert ); - cbxLocationCountry->clear(); - - for ( int iCurCntry = static_cast ( QLocale::AnyCountry ); - iCurCntry < static_cast ( QLocale::LastCountry ); iCurCntry++ ) - { - // add all countries except of the "Default" country - if ( static_cast ( iCurCntry ) != QLocale::AnyCountry ) - { - // store the country enum index together with the string (this is - // important since we sort the combo box items later on) - cbxLocationCountry->addItem ( QLocale::countryToString ( - static_cast ( iCurCntry ) ), iCurCntry ); - } - } - - // sort country combo box items in alphabetical order - cbxLocationCountry->model()->sort ( 0, Qt::AscendingOrder ); - - // select current country - cbxLocationCountry->setCurrentIndex ( - cbxLocationCountry->findData ( - static_cast ( pServer->GetServerCountry() ) ) ); - - // update register server check box - if ( pServer->GetServerListEnabled() ) - { - chbRegisterServer->setCheckState ( Qt::Checked ); - } - else - { - chbRegisterServer->setCheckState ( Qt::Unchecked ); - } - - // update start minimized check box (only available for Windows) -#ifndef _WIN32 - chbStartOnOSStart->setVisible ( false ); -#else - const bool bCurAutoStartMinState = pServer->GetAutoRunMinimized(); - - if ( bCurAutoStartMinState ) - { - chbStartOnOSStart->setCheckState ( Qt::Checked ); - } - else - { - chbStartOnOSStart->setCheckState ( Qt::Unchecked ); - } - - // modify registry according to setting (this is just required in case a - // user has changed the registry by hand) - ModifyAutoStartEntry ( bCurAutoStartMinState ); -#endif - - // update GUI dependencies - UpdateGUIDependencies(); - - - // View menu -------------------------------------------------------------- - QMenu* pViewMenu = new QMenu ( "&Window", this ); - - pViewMenu->addAction ( tr ( "E&xit" ), this, - SLOT ( close() ), QKeySequence ( Qt::CTRL + Qt::Key_Q ) ); - - - // Main menu bar ----------------------------------------------------------- - pMenu = new QMenuBar ( this ); - - pMenu->addMenu ( pViewMenu ); - pMenu->addMenu ( new CLlconHelpMenu ( this ) ); - - // Now tell the layout about the menu - layout()->setMenuBar ( pMenu ); - - - // Connections ------------------------------------------------------------- - // check boxes - QObject::connect ( chbRegisterServer, SIGNAL ( stateChanged ( int ) ), - this, SLOT ( OnRegisterServerStateChanged ( int ) ) ); - - QObject::connect ( chbDefaultCentralServer, SIGNAL ( stateChanged ( int ) ), - this, SLOT ( OnDefaultCentralServerStateChanged ( int ) ) ); - - QObject::connect ( chbStartOnOSStart, SIGNAL ( stateChanged ( int ) ), - this, SLOT ( OnStartOnOSStartStateChanged ( int ) ) ); - - // line edits - QObject::connect ( edtCentralServerAddress, SIGNAL ( editingFinished() ), - this, SLOT ( OnCentralServerAddressEditingFinished() ) ); - - QObject::connect ( edtServerName, SIGNAL ( textChanged ( const QString& ) ), - this, SLOT ( OnServerNameTextChanged ( const QString& ) ) ); - - QObject::connect ( edtLocationCity, SIGNAL ( textChanged ( const QString& ) ), - this, SLOT ( OnLocationCityTextChanged ( const QString& ) ) ); - - // combo boxes - QObject::connect ( cbxLocationCountry, SIGNAL ( activated ( int ) ), - this, SLOT ( OnLocationCountryActivated ( int ) ) ); - - // timers - QObject::connect ( &Timer, SIGNAL ( timeout() ), this, SLOT ( OnTimer() ) ); - - // other - QObject::connect ( pServer, SIGNAL ( Started() ), - this, SLOT ( OnServerStarted() ) ); - - QObject::connect ( pServer, SIGNAL ( Stopped() ), - this, SLOT ( OnServerStopped() ) ); - - QObject::connect ( &SystemTrayIcon, - SIGNAL ( activated ( QSystemTrayIcon::ActivationReason ) ), - this, SLOT ( OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ) ) ); - - - // Timers ------------------------------------------------------------------ - // start timer for GUI controls - Timer.start ( GUI_CONTRL_UPDATE_TIME ); -} - -void CLlconServerDlg::closeEvent ( QCloseEvent* Event ) -{ - // if server was registered at the central server, unregister on shutdown - if ( pServer->GetServerListEnabled() ) - { - pServer->UnregisterSlaveServer(); - } - - // default implementation of this event handler routine - Event->accept(); -} - -void CLlconServerDlg::OnStartOnOSStartStateChanged ( int value ) -{ - const bool bCurAutoStartMinState = ( value == Qt::Checked ); - - // update registry and server setting (for ini file) - pServer->SetAutoRunMinimized ( bCurAutoStartMinState ); - ModifyAutoStartEntry ( bCurAutoStartMinState ); -} - -void CLlconServerDlg::OnDefaultCentralServerStateChanged ( int value ) -{ - // apply new setting to the server and update it - pServer->SetUseDefaultCentralServerAddress ( value == Qt::Checked ); - pServer->UpdateServerList(); - - // update GUI dependencies - UpdateGUIDependencies(); -} - -void CLlconServerDlg::OnRegisterServerStateChanged ( int value ) -{ - const bool bRegState = ( value == Qt::Checked ); - - // apply new setting to the server and update it - pServer->SetServerListEnabled ( bRegState ); - - // If registering is enabled, update data. If registering is disabled, - // unregister slave server - if ( bRegState ) - { - pServer->UpdateServerList(); - } - else - { - pServer->UnregisterSlaveServer(); - } - - // update GUI dependencies - UpdateGUIDependencies(); -} - -void CLlconServerDlg::OnCentralServerAddressEditingFinished() -{ - // apply new setting to the server and update it - pServer->SetServerListCentralServerAddress ( - edtCentralServerAddress->text() ); - - pServer->UpdateServerList(); -} - -void CLlconServerDlg::OnServerNameTextChanged ( const QString& strNewName ) -{ - // check length - if ( strNewName.length() <= MAX_LEN_SERVER_NAME ) - { - // apply new setting to the server and update it - pServer->SetServerName ( strNewName ); - pServer->UpdateServerList(); - } - else - { - // text is too long, update control with shortend text - edtServerName->setText ( strNewName.left ( MAX_LEN_SERVER_NAME ) ); - } -} - -void CLlconServerDlg::OnLocationCityTextChanged ( const QString& strNewCity ) -{ - // check length - if ( strNewCity.length() <= MAX_LEN_SERVER_CITY ) - { - // apply new setting to the server and update it - pServer->SetServerCity ( strNewCity ); - pServer->UpdateServerList(); - } - else - { - // text is too long, update control with shortend text - edtLocationCity->setText ( strNewCity.left ( MAX_LEN_SERVER_CITY ) ); - } -} - -void CLlconServerDlg::OnLocationCountryActivated ( int iCntryListItem ) -{ - // apply new setting to the server and update it - pServer->SetServerCountry ( static_cast ( - cbxLocationCountry->itemData ( iCntryListItem ).toInt() ) ); - - pServer->UpdateServerList(); -} - -void CLlconServerDlg::OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ActReason ) -{ - // on double click on the icon, show window in fore ground - if ( ActReason == QSystemTrayIcon::DoubleClick ) - { - ShowWindowInForeground(); - } -} - -void CLlconServerDlg::OnTimer() -{ - CVector vecHostAddresses; - CVector vecsName; - CVector veciJitBufNumFrames; - CVector veciNetwFrameSizeFact; - - ListViewMutex.lock(); - { - pServer->GetConCliParam ( vecHostAddresses, - vecsName, - veciJitBufNumFrames, - veciNetwFrameSizeFact ); - - // we assume that all vectors have the same length - const int iNumChannels = vecHostAddresses.Size(); - - // fill list with connected clients - for ( int i = 0; i < iNumChannels; i++ ) - { - if ( !( vecHostAddresses[i].InetAddr == QHostAddress ( (quint32) 0 ) ) ) - { - // IP, port number - vecpListViewItems[i]->setText ( 0, - vecHostAddresses[i].toString ( CHostAddress::SM_IP_PORT ) ); - - // name - vecpListViewItems[i]->setText ( 1, vecsName[i] ); - - // jitter buffer size (polling for updates) - vecpListViewItems[i]->setText ( 3, - QString().setNum ( veciJitBufNumFrames[i] ) ); - - // out network block size - vecpListViewItems[i]->setText ( 4, - QString().setNum ( static_cast ( - veciNetwFrameSizeFact[i] * SYSTEM_BLOCK_DURATION_MS_FLOAT - ), 'f', 2 ) ); - - vecpListViewItems[i]->setHidden ( false ); - } - else - { - vecpListViewItems[i]->setHidden ( true ); - } - } - } - ListViewMutex.unlock(); -} - -void CLlconServerDlg::UpdateGUIDependencies() -{ - // get the states which define the GUI dependencies from the server - const bool bCurSerListEnabled = pServer->GetServerListEnabled(); - - const bool bCurUseDefCentServAddr = - pServer->GetUseDefaultCentralServerAddress(); - - // if register server is not enabled, we disable all the configuration - // controls for the server list - chbDefaultCentralServer->setEnabled ( bCurSerListEnabled ); - grbServerInfo->setEnabled ( bCurSerListEnabled ); - - // If the default central server address is enabled, the line edit shows - // the default server and is not editable. Make sure the line edit does not - // fire signals when we update the text. - edtCentralServerAddress->blockSignals ( true ); - { - edtCentralServerAddress->setText ( - SELECT_SERVER_ADDRESS ( bCurUseDefCentServAddr, - pServer->GetServerListCentralServerAddress() ) ); - } - edtCentralServerAddress->blockSignals ( false ); - - // the line edit of the central server address is only enabled, if the - // server list is enabled and not the default address is used - edtCentralServerAddress->setEnabled ( - !bCurUseDefCentServAddr && bCurSerListEnabled ); -} - -void CLlconServerDlg::UpdateSystemTrayIcon ( const bool bIsActive ) -{ - if ( bSystemTrayIconAvaialbe ) - { - if ( bIsActive ) - { - SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayActive ) ); - } - else - { - SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayInactive ) ); - } - } -} - -void CLlconServerDlg::ModifyAutoStartEntry ( const bool bDoAutoStart ) -{ -// auto start is currently only supported for Windows -#ifdef _WIN32 - // init settings object so that it points to the correct place in the - // Windows registry for the auto run entry - QSettings RegSettings ( "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", - QSettings::NativeFormat ); - - // create start string of auto run entry - QString strRegValue = - QCoreApplication::applicationFilePath().replace ( "/", "\\" ) + - " -s --startminimized"; -#endif - - if ( bDoAutoStart ) - { -#ifdef _WIN32 - // ckeck if registry entry is correctly present, if not, correct - const bool bWriteRegValue = strRegValue.compare ( - RegSettings.value ( AUTORUN_SERVER_REG_NAME ).toString() ); - - if ( bWriteRegValue ) - { - // write reg key in the registry - RegSettings.setValue ( AUTORUN_SERVER_REG_NAME, strRegValue ); - } -#endif - } - else - { -#ifdef _WIN32 - // delete reg key if present - if ( RegSettings.contains ( AUTORUN_SERVER_REG_NAME ) ) - { - RegSettings.remove ( AUTORUN_SERVER_REG_NAME ); - } -#endif - } -} - -void CLlconServerDlg::changeEvent ( QEvent* pEvent ) -{ - // if we have a system tray icon, we make the window invisible if it is - // minimized - if ( bSystemTrayIconAvaialbe && - ( pEvent->type() == QEvent::WindowStateChange ) ) - { - if ( isMinimized() ) - { - // we have to call the hide function from another thread -> use - // the timer for this purpose - QTimer::singleShot ( 0, this, SLOT ( hide() ) ); - } - } -} - -void CLlconServerDlg::customEvent ( QEvent* pEvent ) -{ - if ( pEvent->type() == QEvent::User + 11 ) - { - ListViewMutex.lock(); - { - const int iMessType = ( (CLlconEvent*) pEvent )->iMessType; - const int iStatus = ( (CLlconEvent*) pEvent )->iStatus; - const int iChanNum = ( (CLlconEvent*) pEvent )->iChanNum; - - switch(iMessType) - { - case MS_JIT_BUF_PUT: - case MS_JIT_BUF_GET: - vecpListViewItems[iChanNum]->SetLight ( iStatus ); - break; - } - } - ListViewMutex.unlock(); - } -} +/******************************************************************************\ + * 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 "llconserverdlg.h" + + +/* Implementation *************************************************************/ +CLlconServerDlg::CLlconServerDlg ( CServer* pNServP, + const bool bStartMinimized, + QWidget* parent, + Qt::WindowFlags f ) + : QDialog ( parent, f ), + pServer ( pNServP ), + BitmapSystemTrayInactive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreyArrow.png" ) ), + BitmapSystemTrayActive ( QString::fromUtf8 ( ":/png/LEDs/res/CLEDGreenArrow.png" ) ) +{ + setupUi ( this ); + + + // Add help text to controls ----------------------------------------------- + // client list + lvwClients->setWhatsThis ( tr ( "Client List: The client list " + "shows all clients which are currently connected to this server. Some " + "informations about the clients like the IP address, name, buffer " + "state are given for each connected client." ) ); + + lvwClients->setAccessibleName ( tr ( "Connected clients list view" ) ); + + // start minimized on operating system start + chbStartOnOSStart->setWhatsThis ( tr ( "Start Minimized on Operating " + "System Start: If the start minimized on operating system start " + "check box is checked, the " ) + APP_NAME + tr ( " server will be " + "started when the operating system starts up and is automatically " + "minimized to a system task bar icon." ) ); + + // register server flag + chbRegisterServer->setWhatsThis ( tr ( "Register Server Status: If " + "the register server check box is checked, this server registers " + "itself at the central server so that all " ) + APP_NAME + + tr ( " users can see the server in the connect dialog server list and " + "connect to it. The registering of the server is renewed periodically " + "to make sure that all servers in the connect dialog server list are " + "actually available." ) ); + + // central server address + QString strCentrServAddr = tr ( "Central Server Address: The " + "Central server address is the IP address or URL of the central server " + "at which this server is registered. If the Default check box is " + "checked, the default central server address is shown read-only." ); + + lblCentralServerAddress->setWhatsThis ( strCentrServAddr ); + chbDefaultCentralServer->setWhatsThis ( strCentrServAddr ); + edtCentralServerAddress->setWhatsThis ( strCentrServAddr ); + + chbDefaultCentralServer->setAccessibleName ( + tr ( "Default central server check box" ) ); + + edtCentralServerAddress->setAccessibleName ( + tr ( "Central server address line edit" ) ); + + // server name + QString strServName = tr ( "Server Name: The server name identifies " + "your server in the connect dialog server list at the clients. If no " + "name is given, the IP address is shown instead." ); + + lblServerName->setWhatsThis ( strServName ); + edtServerName->setWhatsThis ( strServName ); + + edtServerName->setAccessibleName ( tr ( "Server name line edit" ) ); + + // location city + QString strLocCity = tr ( "Location City: The city in which this " + "server is located can be set here. If a city name is entered, it " + "will be shown in the connect dialog server list at the clients." ); + + lblLocationCity->setWhatsThis ( strLocCity ); + edtLocationCity->setWhatsThis ( strLocCity ); + + edtLocationCity->setAccessibleName ( tr ( + "City where the server is located line edit" ) ); + + // location country + QString strLocCountry = tr ( "Location country: The country in " + "which this server is located can be set here. If a country is " + "entered, it will be shown in the connect dialog server list at the " + "clients." ); + + lblLocationCountry->setWhatsThis ( strLocCountry ); + cbxLocationCountry->setWhatsThis ( strLocCountry ); + + cbxLocationCountry->setAccessibleName ( tr ( + "Country where the server is located combo box" ) ); + + + // act on "start minimized" flag + if ( bStartMinimized ) + { + showMinimized(); + } + + // check if system tray icon can be used + bSystemTrayIconAvaialbe = SystemTrayIcon.isSystemTrayAvailable(); + + // init system tray icon + if ( bSystemTrayIconAvaialbe ) + { + // prepare context menu to be added to the system tray icon + pSystemTrayIconMenu = new QMenu ( this ); + + pSystemTrayIconMenu->addAction ( tr ( "E&xit" ), + this, SLOT ( OnSysTrayMenuExit() ) ); + + pSystemTrayIconMenu->addSeparator(); + + pSystemTrayIconMenu->addAction ( + tr ( "&Hide " ) + APP_NAME + tr ( " server" ), + this, SLOT ( OnSysTrayMenuHide() ) ); + + pSystemTrayIconMenu->setDefaultAction ( pSystemTrayIconMenu->addAction ( + tr ( "&Open " ) + APP_NAME + tr ( " server" ), + this, SLOT ( OnSysTrayMenuOpen() ) ) ); + + SystemTrayIcon.setContextMenu ( pSystemTrayIconMenu ); + + // set tool text + SystemTrayIcon.setToolTip ( QString ( APP_NAME ) + tr ( " server" ) ); + + // show icon of state "inactive" + SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayInactive ) ); + SystemTrayIcon.show(); + } + + // set text for version and application name + lblNameVersion->setText ( QString ( APP_NAME ) + + tr ( " server " ) + QString ( VERSION ) ); + + // set up list view for connected clients + lvwClients->setColumnWidth ( 0, 170 ); + lvwClients->setColumnWidth ( 1, 130 ); + lvwClients->setColumnWidth ( 2, 60 ); + lvwClients->clear(); + + +// TEST workaround for resize problem of window after iconize in task bar +lvwClients->setMinimumWidth ( 170 + 130 + 60 + 205 ); +lvwClients->setMinimumHeight ( 140 ); + + + // insert items in reverse order because in Windows all of them are + // always visible -> put first item on the top + vecpListViewItems.Init ( MAX_NUM_CHANNELS ); + for ( int i = MAX_NUM_CHANNELS - 1; i >= 0; i-- ) + { + vecpListViewItems[i] = new CServerListViewItem ( lvwClients ); + vecpListViewItems[i]->setHidden ( true ); + } + + // update default central server address check box + if ( pServer->GetUseDefaultCentralServerAddress() ) + { + chbDefaultCentralServer->setCheckState ( Qt::Checked ); + } + else + { + chbDefaultCentralServer->setCheckState ( Qt::Unchecked ); + } + + // update server name line edit + edtServerName->setText ( pServer->GetServerName() ); + + // update server city line edit + edtLocationCity->setText ( pServer->GetServerCity() ); + + // load country combo box with all available countries + cbxLocationCountry->setInsertPolicy ( QComboBox::NoInsert ); + cbxLocationCountry->clear(); + + for ( int iCurCntry = static_cast ( QLocale::AnyCountry ); + iCurCntry < static_cast ( QLocale::LastCountry ); iCurCntry++ ) + { + // add all countries except of the "Default" country + if ( static_cast ( iCurCntry ) != QLocale::AnyCountry ) + { + // store the country enum index together with the string (this is + // important since we sort the combo box items later on) + cbxLocationCountry->addItem ( QLocale::countryToString ( + static_cast ( iCurCntry ) ), iCurCntry ); + } + } + + // sort country combo box items in alphabetical order + cbxLocationCountry->model()->sort ( 0, Qt::AscendingOrder ); + + // select current country + cbxLocationCountry->setCurrentIndex ( + cbxLocationCountry->findData ( + static_cast ( pServer->GetServerCountry() ) ) ); + + // update register server check box + if ( pServer->GetServerListEnabled() ) + { + chbRegisterServer->setCheckState ( Qt::Checked ); + } + else + { + chbRegisterServer->setCheckState ( Qt::Unchecked ); + } + + // update start minimized check box (only available for Windows) +#ifndef _WIN32 + chbStartOnOSStart->setVisible ( false ); +#else + const bool bCurAutoStartMinState = pServer->GetAutoRunMinimized(); + + if ( bCurAutoStartMinState ) + { + chbStartOnOSStart->setCheckState ( Qt::Checked ); + } + else + { + chbStartOnOSStart->setCheckState ( Qt::Unchecked ); + } + + // modify registry according to setting (this is just required in case a + // user has changed the registry by hand) + ModifyAutoStartEntry ( bCurAutoStartMinState ); +#endif + + // update GUI dependencies + UpdateGUIDependencies(); + + + // View menu -------------------------------------------------------------- + QMenu* pViewMenu = new QMenu ( "&Window", this ); + + pViewMenu->addAction ( tr ( "E&xit" ), this, + SLOT ( close() ), QKeySequence ( Qt::CTRL + Qt::Key_Q ) ); + + + // Main menu bar ----------------------------------------------------------- + pMenu = new QMenuBar ( this ); + + pMenu->addMenu ( pViewMenu ); + pMenu->addMenu ( new CLlconHelpMenu ( this ) ); + + // Now tell the layout about the menu + layout()->setMenuBar ( pMenu ); + + + // Connections ------------------------------------------------------------- + // check boxes + QObject::connect ( chbRegisterServer, SIGNAL ( stateChanged ( int ) ), + this, SLOT ( OnRegisterServerStateChanged ( int ) ) ); + + QObject::connect ( chbDefaultCentralServer, SIGNAL ( stateChanged ( int ) ), + this, SLOT ( OnDefaultCentralServerStateChanged ( int ) ) ); + + QObject::connect ( chbStartOnOSStart, SIGNAL ( stateChanged ( int ) ), + this, SLOT ( OnStartOnOSStartStateChanged ( int ) ) ); + + // line edits + QObject::connect ( edtCentralServerAddress, SIGNAL ( editingFinished() ), + this, SLOT ( OnCentralServerAddressEditingFinished() ) ); + + QObject::connect ( edtServerName, SIGNAL ( textChanged ( const QString& ) ), + this, SLOT ( OnServerNameTextChanged ( const QString& ) ) ); + + QObject::connect ( edtLocationCity, SIGNAL ( textChanged ( const QString& ) ), + this, SLOT ( OnLocationCityTextChanged ( const QString& ) ) ); + + // combo boxes + QObject::connect ( cbxLocationCountry, SIGNAL ( activated ( int ) ), + this, SLOT ( OnLocationCountryActivated ( int ) ) ); + + // timers + QObject::connect ( &Timer, SIGNAL ( timeout() ), this, SLOT ( OnTimer() ) ); + + // other + QObject::connect ( pServer, SIGNAL ( Started() ), + this, SLOT ( OnServerStarted() ) ); + + QObject::connect ( pServer, SIGNAL ( Stopped() ), + this, SLOT ( OnServerStopped() ) ); + + QObject::connect ( &SystemTrayIcon, + SIGNAL ( activated ( QSystemTrayIcon::ActivationReason ) ), + this, SLOT ( OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ) ) ); + + + // Timers ------------------------------------------------------------------ + // start timer for GUI controls + Timer.start ( GUI_CONTRL_UPDATE_TIME ); +} + +void CLlconServerDlg::closeEvent ( QCloseEvent* Event ) +{ + // if server was registered at the central server, unregister on shutdown + if ( pServer->GetServerListEnabled() ) + { + pServer->UnregisterSlaveServer(); + } + + // default implementation of this event handler routine + Event->accept(); +} + +void CLlconServerDlg::OnStartOnOSStartStateChanged ( int value ) +{ + const bool bCurAutoStartMinState = ( value == Qt::Checked ); + + // update registry and server setting (for ini file) + pServer->SetAutoRunMinimized ( bCurAutoStartMinState ); + ModifyAutoStartEntry ( bCurAutoStartMinState ); +} + +void CLlconServerDlg::OnDefaultCentralServerStateChanged ( int value ) +{ + // apply new setting to the server and update it + pServer->SetUseDefaultCentralServerAddress ( value == Qt::Checked ); + pServer->UpdateServerList(); + + // update GUI dependencies + UpdateGUIDependencies(); +} + +void CLlconServerDlg::OnRegisterServerStateChanged ( int value ) +{ + const bool bRegState = ( value == Qt::Checked ); + + // apply new setting to the server and update it + pServer->SetServerListEnabled ( bRegState ); + + // If registering is enabled, update data. If registering is disabled, + // unregister slave server + if ( bRegState ) + { + pServer->UpdateServerList(); + } + else + { + pServer->UnregisterSlaveServer(); + } + + // update GUI dependencies + UpdateGUIDependencies(); +} + +void CLlconServerDlg::OnCentralServerAddressEditingFinished() +{ + // apply new setting to the server and update it + pServer->SetServerListCentralServerAddress ( + edtCentralServerAddress->text() ); + + pServer->UpdateServerList(); +} + +void CLlconServerDlg::OnServerNameTextChanged ( const QString& strNewName ) +{ + // check length + if ( strNewName.length() <= MAX_LEN_SERVER_NAME ) + { + // apply new setting to the server and update it + pServer->SetServerName ( strNewName ); + pServer->UpdateServerList(); + } + else + { + // text is too long, update control with shortend text + edtServerName->setText ( strNewName.left ( MAX_LEN_SERVER_NAME ) ); + } +} + +void CLlconServerDlg::OnLocationCityTextChanged ( const QString& strNewCity ) +{ + // check length + if ( strNewCity.length() <= MAX_LEN_SERVER_CITY ) + { + // apply new setting to the server and update it + pServer->SetServerCity ( strNewCity ); + pServer->UpdateServerList(); + } + else + { + // text is too long, update control with shortend text + edtLocationCity->setText ( strNewCity.left ( MAX_LEN_SERVER_CITY ) ); + } +} + +void CLlconServerDlg::OnLocationCountryActivated ( int iCntryListItem ) +{ + // apply new setting to the server and update it + pServer->SetServerCountry ( static_cast ( + cbxLocationCountry->itemData ( iCntryListItem ).toInt() ) ); + + pServer->UpdateServerList(); +} + +void CLlconServerDlg::OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ActReason ) +{ + // on double click on the icon, show window in fore ground + if ( ActReason == QSystemTrayIcon::DoubleClick ) + { + ShowWindowInForeground(); + } +} + +void CLlconServerDlg::OnTimer() +{ + CVector vecHostAddresses; + CVector vecsName; + CVector veciJitBufNumFrames; + CVector veciNetwFrameSizeFact; + + ListViewMutex.lock(); + { + pServer->GetConCliParam ( vecHostAddresses, + vecsName, + veciJitBufNumFrames, + veciNetwFrameSizeFact ); + + // we assume that all vectors have the same length + const int iNumChannels = vecHostAddresses.Size(); + + // fill list with connected clients + for ( int i = 0; i < iNumChannels; i++ ) + { + if ( !( vecHostAddresses[i].InetAddr == QHostAddress ( (quint32) 0 ) ) ) + { + // IP, port number + vecpListViewItems[i]->setText ( 0, + vecHostAddresses[i].toString ( CHostAddress::SM_IP_PORT ) ); + + // name + vecpListViewItems[i]->setText ( 1, vecsName[i] ); + + // jitter buffer size (polling for updates) + vecpListViewItems[i]->setText ( 3, + QString().setNum ( veciJitBufNumFrames[i] ) ); + + // out network block size + vecpListViewItems[i]->setText ( 4, + QString().setNum ( static_cast ( + veciNetwFrameSizeFact[i] * SYSTEM_BLOCK_DURATION_MS_FLOAT + ), 'f', 2 ) ); + + vecpListViewItems[i]->setHidden ( false ); + } + else + { + vecpListViewItems[i]->setHidden ( true ); + } + } + } + ListViewMutex.unlock(); +} + +void CLlconServerDlg::UpdateGUIDependencies() +{ + // get the states which define the GUI dependencies from the server + const bool bCurSerListEnabled = pServer->GetServerListEnabled(); + + const bool bCurUseDefCentServAddr = + pServer->GetUseDefaultCentralServerAddress(); + + // if register server is not enabled, we disable all the configuration + // controls for the server list + chbDefaultCentralServer->setEnabled ( bCurSerListEnabled ); + grbServerInfo->setEnabled ( bCurSerListEnabled ); + + // If the default central server address is enabled, the line edit shows + // the default server and is not editable. Make sure the line edit does not + // fire signals when we update the text. + edtCentralServerAddress->blockSignals ( true ); + { + edtCentralServerAddress->setText ( + SELECT_SERVER_ADDRESS ( bCurUseDefCentServAddr, + pServer->GetServerListCentralServerAddress() ) ); + } + edtCentralServerAddress->blockSignals ( false ); + + // the line edit of the central server address is only enabled, if the + // server list is enabled and not the default address is used + edtCentralServerAddress->setEnabled ( + !bCurUseDefCentServAddr && bCurSerListEnabled ); +} + +void CLlconServerDlg::UpdateSystemTrayIcon ( const bool bIsActive ) +{ + if ( bSystemTrayIconAvaialbe ) + { + if ( bIsActive ) + { + SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayActive ) ); + } + else + { + SystemTrayIcon.setIcon ( QIcon ( BitmapSystemTrayInactive ) ); + } + } +} + +void CLlconServerDlg::ModifyAutoStartEntry ( const bool bDoAutoStart ) +{ +// auto start is currently only supported for Windows +#ifdef _WIN32 + // init settings object so that it points to the correct place in the + // Windows registry for the auto run entry + QSettings RegSettings ( "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", + QSettings::NativeFormat ); + + // create start string of auto run entry + QString strRegValue = + QCoreApplication::applicationFilePath().replace ( "/", "\\" ) + + " -s --startminimized"; +#endif + + if ( bDoAutoStart ) + { +#ifdef _WIN32 + // ckeck if registry entry is correctly present, if not, correct + const bool bWriteRegValue = strRegValue.compare ( + RegSettings.value ( AUTORUN_SERVER_REG_NAME ).toString() ); + + if ( bWriteRegValue ) + { + // write reg key in the registry + RegSettings.setValue ( AUTORUN_SERVER_REG_NAME, strRegValue ); + } +#endif + } + else + { +#ifdef _WIN32 + // delete reg key if present + if ( RegSettings.contains ( AUTORUN_SERVER_REG_NAME ) ) + { + RegSettings.remove ( AUTORUN_SERVER_REG_NAME ); + } +#endif + } +} + +void CLlconServerDlg::changeEvent ( QEvent* pEvent ) +{ + // if we have a system tray icon, we make the window invisible if it is + // minimized + if ( bSystemTrayIconAvaialbe && + ( pEvent->type() == QEvent::WindowStateChange ) ) + { + if ( isMinimized() ) + { + // we have to call the hide function from another thread -> use + // the timer for this purpose + QTimer::singleShot ( 0, this, SLOT ( hide() ) ); + } + } +} + +void CLlconServerDlg::customEvent ( QEvent* pEvent ) +{ + if ( pEvent->type() == QEvent::User + 11 ) + { + ListViewMutex.lock(); + { + const int iMessType = ( (CLlconEvent*) pEvent )->iMessType; + const int iStatus = ( (CLlconEvent*) pEvent )->iStatus; + const int iChanNum = ( (CLlconEvent*) pEvent )->iChanNum; + + switch(iMessType) + { + case MS_JIT_BUF_PUT: + case MS_JIT_BUF_GET: + vecpListViewItems[iChanNum]->SetLight ( iStatus ); + break; + } + } + ListViewMutex.unlock(); + } +} diff --git a/src/llconserverdlg.h b/src/llconserverdlg.h index 29bf6c2a..34b309bc 100755 --- a/src/llconserverdlg.h +++ b/src/llconserverdlg.h @@ -1,103 +1,104 @@ -/******************************************************************************\ - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "global.h" -#include "server.h" -#include "multicolorled.h" -#ifdef _WIN32 -# include "../windows/moc/llconserverdlgbase.h" -#else -# ifdef _IS_QMAKE_CONFIG -# include "ui_llconserverdlgbase.h" -# else -# include "moc/llconserverdlgbase.h" -# endif -#endif - - -/* Definitions ****************************************************************/ -// update time for GUI controls -#define GUI_CONTRL_UPDATE_TIME 1000 // ms - - -/* Classes ********************************************************************/ -class CLlconServerDlg : public QDialog, private Ui_CLlconServerDlgBase -{ - Q_OBJECT - -public: - CLlconServerDlg ( CServer* pNServP, - const bool bStartMinimized, - QWidget* parent = 0, - Qt::WindowFlags f = 0 ); - -protected: - virtual void customEvent ( QEvent* pEvent ); - virtual void changeEvent ( QEvent* pEvent ); - virtual void closeEvent ( QCloseEvent* Event ); - - void UpdateGUIDependencies(); - void UpdateSystemTrayIcon ( const bool bIsActive ); - void ShowWindowInForeground() { showNormal(); raise(); } - void ModifyAutoStartEntry ( const bool bDoAutoStart ); - - QTimer Timer; - CServer* pServer; - - CVector vecpListViewItems; - QMutex ListViewMutex; - - QMenuBar* pMenu; - - bool bSystemTrayIconAvaialbe; - QSystemTrayIcon SystemTrayIcon; - QPixmap BitmapSystemTrayInactive; - QPixmap BitmapSystemTrayActive; - QMenu* pSystemTrayIconMenu; - -public slots: - void OnRegisterServerStateChanged ( int value ); - void OnDefaultCentralServerStateChanged ( int value ); - void OnStartOnOSStartStateChanged ( int value ); - void OnCentralServerAddressEditingFinished(); - void OnServerNameTextChanged ( const QString& strNewName ); - void OnLocationCityTextChanged ( const QString& strNewCity ); - void OnLocationCountryActivated ( int iCntryListItem ); - void OnTimer(); - void OnServerStarted() { UpdateSystemTrayIcon ( true ); } - void OnServerStopped() { UpdateSystemTrayIcon ( false ); } - void OnSysTrayMenuOpen() { ShowWindowInForeground(); } - void OnSysTrayMenuExit() { close(); } - void OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ActReason ); -}; +/******************************************************************************\ + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "global.h" +#include "server.h" +#include "multicolorled.h" +#ifdef _WIN32 +# include "../windows/moc/llconserverdlgbase.h" +#else +# ifdef _IS_QMAKE_CONFIG +# include "ui_llconserverdlgbase.h" +# else +# include "moc/llconserverdlgbase.h" +# endif +#endif + + +/* Definitions ****************************************************************/ +// update time for GUI controls +#define GUI_CONTRL_UPDATE_TIME 1000 // ms + + +/* Classes ********************************************************************/ +class CLlconServerDlg : public QDialog, private Ui_CLlconServerDlgBase +{ + Q_OBJECT + +public: + CLlconServerDlg ( CServer* pNServP, + const bool bStartMinimized, + QWidget* parent = 0, + Qt::WindowFlags f = 0 ); + +protected: + virtual void customEvent ( QEvent* pEvent ); + virtual void changeEvent ( QEvent* pEvent ); + virtual void closeEvent ( QCloseEvent* Event ); + + void UpdateGUIDependencies(); + void UpdateSystemTrayIcon ( const bool bIsActive ); + void ShowWindowInForeground() { showNormal(); raise(); } + void ModifyAutoStartEntry ( const bool bDoAutoStart ); + + QTimer Timer; + CServer* pServer; + + CVector vecpListViewItems; + QMutex ListViewMutex; + + QMenuBar* pMenu; + + bool bSystemTrayIconAvaialbe; + QSystemTrayIcon SystemTrayIcon; + QPixmap BitmapSystemTrayInactive; + QPixmap BitmapSystemTrayActive; + QMenu* pSystemTrayIconMenu; + +public slots: + void OnRegisterServerStateChanged ( int value ); + void OnDefaultCentralServerStateChanged ( int value ); + void OnStartOnOSStartStateChanged ( int value ); + void OnCentralServerAddressEditingFinished(); + void OnServerNameTextChanged ( const QString& strNewName ); + void OnLocationCityTextChanged ( const QString& strNewCity ); + void OnLocationCountryActivated ( int iCntryListItem ); + void OnTimer(); + void OnServerStarted() { UpdateSystemTrayIcon ( true ); } + void OnServerStopped() { UpdateSystemTrayIcon ( false ); } + void OnSysTrayMenuOpen() { ShowWindowInForeground(); } + void OnSysTrayMenuHide() { hide(); } + void OnSysTrayMenuExit() { close(); } + void OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ActReason ); +};