/******************************************************************************\ * Copyright (c) 2004-2006 * * 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, QWidget* parent, const char* name, bool modal, WFlags f ) : pServer ( pNServP ), CLlconServerDlgBase ( parent, name, modal, f ) { /* set text for version and application name */ TextLabelNameVersion->setText ( QString ( APP_NAME ) + tr ( " server " ) + QString ( VERSION ) ); /* Create bitmaps */ /* Define size of the bitmaps */ const int iXSize = 13; const int iYSize = 13; BitmCubeGreen.resize ( iXSize, iYSize ); BitmCubeGreen.fill ( QColor ( 0, 255, 0 ) ); BitmCubeRed.resize ( iXSize, iYSize ); BitmCubeRed.fill ( QColor ( 255, 0, 0 ) ); BitmCubeYellow.resize ( iXSize, iYSize ); BitmCubeYellow.fill ( QColor ( 255, 255, 0 ) ); /* set up list view for connected clients (We assume that one column is already there) */ ListViewClients->setColumnText ( 0, tr ( "Client IP : Port" ) ); ListViewClients->setColumnWidth ( 0, 170 ); ListViewClients->addColumn ( tr ( "Name" ) ); ListViewClients->setColumnAlignment ( 1, Qt::AlignLeft ); ListViewClients->setColumnWidth ( 1, 150 ); ListViewClients->addColumn ( tr ( "Put" ) ); ListViewClients->setColumnAlignment ( 2, Qt::AlignCenter ); ListViewClients->addColumn ( tr ( "Get" ) ); ListViewClients->setColumnAlignment ( 3, Qt::AlignCenter ); ListViewClients->addColumn ( tr ( "Jitter buffer size" ) ); ListViewClients->setColumnAlignment ( 4, Qt::AlignRight ); ListViewClients->addColumn ( tr ( "Block Size In" ) ); ListViewClients->setColumnAlignment ( 5, Qt::AlignRight ); ListViewClients->addColumn ( tr ( "Block Size Out" ) ); ListViewClients->setColumnAlignment ( 6, Qt::AlignRight ); ListViewClients->clear(); /* 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 ( ListViewClients ); #ifndef _WIN32 vecpListViewItems[i]->setVisible ( false ); #endif } /* Init timing jitter text label */ TextLabelResponseTime->setText ( "" ); /* Main menu bar -------------------------------------------------------- */ pMenu = new QMenuBar ( this ); CHECK_PTR ( pMenu ); pMenu->insertItem ( tr ( "&?" ), new CLlconHelpMenu ( this ) ); pMenu->setSeparator ( QMenuBar::InWindowsStyle ); /* Now tell the layout about the menu */ CLlconServerDlgBaseLayout->setMenuBar ( pMenu ); /* connections ---------------------------------------------------------- */ /* timers */ QObject::connect ( &Timer, SIGNAL ( timeout() ), this, SLOT ( OnTimer() ) ); /* timers --------------------------------------------------------------- */ /* start timer for GUI controls */ Timer.start ( GUI_CONTRL_UPDATE_TIME ); } void CLlconServerDlg::OnTimer() { CVector vecHostAddresses; CVector vecsName; CVector veciJitBufSize; CVector veciNetwOutBlSiFact; CVector veciNetwInBlSiFact; double dCurTiStdDev; ListViewMutex.lock(); pServer->GetConCliParam ( vecHostAddresses, vecsName, veciJitBufSize, veciNetwOutBlSiFact, veciNetwInBlSiFact ); /* fill list with connected clients */ for ( int i = 0; i < MAX_NUM_CHANNELS; i++ ) { if ( ! ( vecHostAddresses[i].InetAddr == QHostAddress ( (Q_UINT32) 0 ) ) ) { // IP, port number vecpListViewItems[i]->setText ( 0, QString().sprintf ( "%s : %d", vecHostAddresses[i].InetAddr.toString().latin1(), vecHostAddresses[i].iPort ) /* IP, port */); // name vecpListViewItems[i]->setText ( 1, vecsName[i].c_str() ); // jitter buffer size (polling for updates) vecpListViewItems[i]->setText ( 4, QString().setNum ( veciJitBufSize[i] ) ); // in/out network block sizes vecpListViewItems[i]->setText ( 5, QString().setNum ( double ( veciNetwInBlSiFact[i] * MIN_BLOCK_DURATION_MS), 'f', 2 ) ); vecpListViewItems[i]->setText(6, QString().setNum ( double ( veciNetwOutBlSiFact[i] * MIN_BLOCK_DURATION_MS), 'f', 2 ) ); #ifndef _WIN32 vecpListViewItems[i]->setVisible ( true ); #endif } else { #ifdef _WIN32 // remove text for Windows version vecpListViewItems[i]->setText ( 0, "" ); vecpListViewItems[i]->setText ( 1, "" ); vecpListViewItems[i]->setText ( 4, "" ); vecpListViewItems[i]->setText ( 5, "" ); #else vecpListViewItems[i]->setVisible ( false ); #endif } } ListViewMutex.unlock(); // response time (if available) if ( pServer->GetTimingStdDev ( dCurTiStdDev ) ) { TextLabelResponseTime->setText ( QString(). setNum ( dCurTiStdDev, 'f', 2 ) + " ms" ); } else { TextLabelResponseTime->setText ( "---" ); } } void CLlconServerDlg::customEvent ( QCustomEvent* Event ) { if ( Event->type() == QEvent::User + 11 ) { ListViewMutex.lock(); const int iMessType = ( (CLlconEvent*) Event )->iMessType; const int iStatus = ( (CLlconEvent*) Event )->iStatus; const int iChanNum = ( (CLlconEvent*) Event )->iChanNum; switch(iMessType) { case MS_JIT_BUF_PUT: vecpListViewItems[iChanNum]->SetLight ( 0, iStatus ); break; case MS_JIT_BUF_GET: vecpListViewItems[iChanNum]->SetLight ( 1, iStatus ); break; } ListViewMutex.unlock(); } }