1 /**************************************************************************
2 *   Copyright (C) 2005-2020 by Oleksandr Shneyder                         *
3 *                              <o.shneyder@phoca-gmbh.de>                 *
4 *                                                                         *
5 *   This program is free software; you can redistribute it and/or modify  *
6 *   it under the terms of the GNU General Public License as published by  *
7 *   the Free Software Foundation; either version 2 of the License, or     *
8 *   (at your option) any later version.                                   *
9 *   This program is distributed in the hope that it will be useful,       *
10 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12 *   GNU General Public License for more details.                          *
13 *                                                                         *
14 *   You should have received a copy of the GNU General Public License     *
15 *   along with this program.  If not, see <https://www.gnu.org/licenses/>. *
16 ***************************************************************************/
17 
18 #include "mediawidget.h"
19 #include "onmainwindow.h"
20 #include <QBoxLayout>
21 #include <QRadioButton>
22 #include <QLineEdit>
23 #include <QCheckBox>
24 #include <QSpinBox>
25 #include <QGroupBox>
26 #include <QButtonGroup>
27 #include <QLabel>
28 #include "x2gosettings.h"
29 #include <QDir>
30 #include <QApplication>
31 #include <QDesktopWidget>
32 #include <QTimer>
33 #include <QSplashScreen>
34 #include "x2gologdebug.h"
35 #include <QGridLayout>
36 
MediaWidget(QString id,ONMainWindow * mw,QWidget * parent,Qt::WindowFlags f)37 MediaWidget::MediaWidget ( QString id, ONMainWindow * mw,
38                            QWidget * parent, Qt::WindowFlags f )
39     : ConfigWidget ( id,mw,parent,f )
40 {
41 #ifdef Q_WS_HILDON
42     QTabWidget* tabSettings=new QTabWidget ( this );
43     QFrame* sbgr=new QFrame();
44     tabSettings->addTab ( sbgr,tr ( "Sound" ) );
45 #else
46     sbgr=new QGroupBox ( tr ( "Sound" ),this );
47 #endif
48     QVBoxLayout *sndLay=new QVBoxLayout ( sbgr );
49     QHBoxLayout* sLay=new QHBoxLayout ( );
50     QVBoxLayout* sLay_sys=new QVBoxLayout ( );
51     QVBoxLayout* sLay_opt=new QVBoxLayout ( );
52     sLay->addLayout ( sLay_sys );
53     sLay->addLayout ( sLay_opt );
54     QVBoxLayout* setLay=new QVBoxLayout ( this );
55 
56     sound=new QCheckBox ( tr ( "Enable sound support" ),sbgr );
57     QButtonGroup* sndsys=new QButtonGroup;
58     pulse=new QRadioButton ( "PulseAudio",sbgr );
59     arts=new QRadioButton ( "arts",sbgr );
60     esd=new QRadioButton ( "esd",sbgr );
61     sndsys->addButton ( pulse,PULSE );
62     sndsys->addButton ( arts,ARTS );
63     sndsys->addButton ( esd,ESD );
64     sndsys->setExclusive ( true );
65     rbStartSnd=new QRadioButton ( tr ( "Start sound daemon" ),sbgr );
66     rbNotStartSnd=new QRadioButton (
67         tr ( "Use running sound daemon" ),sbgr );
68     cbSndSshTun=new QCheckBox (
69         tr ( "Use SSH port forwarding to tunnel\n"
70              "sound system connections through firewalls" ),sbgr );
71     cbDefSndPort=new QCheckBox ( tr ( "Use default sound port" ),sbgr );
72     sbSndPort=new QSpinBox ( sbgr );
73     sbSndPort->setMinimum ( 1 );
74     sbSndPort->setMaximum ( 65535 );
75 
76 
77     QHBoxLayout *sndPortLay = new QHBoxLayout();
78     lSndPort=new QLabel ( tr ( "Sound port:" ),sbgr );
79     sndPortLay->addWidget ( lSndPort );
80     sndPortLay->addWidget ( sbSndPort );
81 
82     sLay_sys->addWidget ( pulse );
83     sLay_sys->addWidget ( arts );
84     sLay_sys->addWidget ( esd );
85 
86     sLay_opt->addWidget ( rbStartSnd );
87     sLay_opt->addWidget ( rbNotStartSnd );
88     sLay_opt->addWidget ( cbSndSshTun );
89     QFrame* hl=new QFrame ( sbgr );
90     hl->setFrameStyle ( QFrame::HLine | QFrame::Sunken );
91     sLay_opt->addWidget ( hl );
92     sLay_opt->addWidget ( cbDefSndPort );
93     sLay_opt->addLayout ( sndPortLay );
94     sndLay->addWidget ( sound );
95     sndLay->addLayout ( sLay );
96 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
97     arts->hide();
98     hl->hide();
99     cbDefSndPort->hide();
100     lSndPort->hide();
101     sbSndPort->hide();
102 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
103 
104 
105     cbClientPrint=new QCheckBox ( tr ( "Client side printing support" ),
106                                   this );
107     setLay->addWidget(sbgr);
108     setLay->addWidget ( cbClientPrint );
109     setLay->addStretch();
110 
111     connect ( sound,SIGNAL ( toggled ( bool ) ),this,
112               SLOT ( slot_sndToggled ( bool ) ) );
113     connect ( sndsys,SIGNAL ( buttonClicked ( int ) ),this,
114               SLOT ( slot_sndSysSelected ( int ) ) );
115     connect ( rbStartSnd,SIGNAL ( clicked ( ) ),this,
116               SLOT ( slot_sndStartClicked() ) );
117     connect ( rbNotStartSnd,SIGNAL ( clicked ( ) ),this,
118               SLOT ( slot_sndStartClicked() ) );
119     connect ( cbDefSndPort,SIGNAL ( toggled ( bool ) ),this,
120               SLOT ( slot_sndDefPortChecked ( bool ) ) );
121 
122     setDefaults();
123     readConfig();
124 }
125 
126 
~MediaWidget()127 MediaWidget::~MediaWidget()
128 {
129 }
130 
slot_sndSysSelected(int system)131 void MediaWidget::slot_sndSysSelected ( int system )
132 {
133     rbStartSnd->show();
134     rbNotStartSnd->show();
135     cbSndSshTun->hide();
136     cbDefSndPort->setChecked ( true );
137     cbDefSndPort->setEnabled ( true );
138 
139     switch ( system )
140     {
141     case PULSE:
142     {
143         rbStartSnd->hide();
144         rbNotStartSnd->hide();
145         cbSndSshTun->show();
146         cbSndSshTun->setEnabled ( true );
147         break;
148     }
149     case ARTS:
150     {
151         cbDefSndPort->setChecked ( false );
152         cbDefSndPort->setEnabled ( false );
153         sbSndPort->setValue ( 20221 );
154         QMessageBox::warning (NULL, tr ("Deprecation Warning"),
155                               tr ("ARTS support is scheduled to be removed soon.\n\n"
156 
157                                   "Please upgrade to PulseAudio."),
158                               QMessageBox::Ok, QMessageBox::NoButton);
159         break;
160     }
161     case ESD:
162     {
163         rbStartSnd->hide ();
164         rbNotStartSnd->hide ();
165         cbSndSshTun->show ();
166 #ifdef Q_OS_WIN
167         cbSndSshTun->setEnabled ( false );
168         cbSndSshTun->setChecked ( true );
169 #elif defined (Q_OS_DARWIN)
170         cbSndSshTun->setEnabled (true);
171 #endif /* defined (Q_OS_WIN) */
172 
173 #if !defined (Q_OS_WIN) && !defined (Q_OS_DARWIN)
174         QMessageBox::warning (NULL, tr ("Deprecation Warning"),
175                               tr ("ESounD support is scheduled to be removed soon.\n\n"
176 
177                                   "Please upgrade to PulseAudio."),
178                               QMessageBox::Ok, QMessageBox::NoButton);
179 #endif
180         sbSndPort->setValue ( 16001 );
181         break;
182     }
183     }
184     slot_sndStartClicked();
185 }
186 
slot_sndToggled(bool val)187 void MediaWidget::slot_sndToggled ( bool val )
188 {
189     arts->setEnabled ( val );
190     pulse->setEnabled ( val );
191     esd->setEnabled ( val );
192 
193     rbStartSnd->setEnabled ( val );
194     rbNotStartSnd->setEnabled ( val );
195 
196     cbSndSshTun->setEnabled ( false );
197     /* ESD is also handled by PA on Windows and OS X. */
198 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
199     if ((pulse->isChecked ()) || (esd->isChecked ())) {
200         cbSndSshTun->setEnabled (val);
201     }
202 #else
203     if (pulse->isChecked ()) {
204         cbSndSshTun->setEnabled ( val );
205     }
206 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
207     lSndPort->setEnabled ( val );
208     if ( !arts->isChecked() )
209         cbDefSndPort->setEnabled ( val );
210     sbSndPort->setEnabled ( val );
211     if ( val )
212         slot_sndStartClicked();
213 
214 }
215 
slot_sndStartClicked()216 void MediaWidget::slot_sndStartClicked()
217 {
218     bool start=rbStartSnd->isChecked();
219 #ifdef Q_OS_WIN
220     start=false;
221 #endif
222     if ( pulse->isChecked() )
223     {
224         lSndPort->setEnabled ( true );
225         sbSndPort->setEnabled ( true );
226         cbDefSndPort->setEnabled (sound->isChecked());
227     }
228     else
229     {
230         lSndPort->setEnabled ( !start );
231         sbSndPort->setEnabled ( !start );
232         cbDefSndPort->setEnabled ( !start );
233     }
234     if ( arts->isChecked() )
235         cbDefSndPort->setEnabled ( false );
236     if ( ( !start  && esd->isChecked() ) ||pulse->isChecked() )
237         slot_sndDefPortChecked ( cbDefSndPort->isChecked() );
238 
239 }
240 
slot_sndDefPortChecked(bool val)241 void MediaWidget::slot_sndDefPortChecked ( bool val )
242 {
243     sbSndPort->setEnabled ( !val );
244     lSndPort->setEnabled ( !val );
245     if ( val )
246     {
247         if ( pulse->isChecked() )
248             sbSndPort->setValue ( 4713 );
249         if ( arts->isChecked() )
250             sbSndPort->setValue ( 20221 );
251         if ( esd->isChecked() )
252             sbSndPort->setValue ( 16001 );
253     }
254 
255 }
256 
readConfig()257 void MediaWidget::readConfig()
258 {
259 
260     X2goSettings st ( "sessions" );
261 
262     bool snd=st.setting()->value (
263                  sessionId+"/sound",
264                  ( QVariant ) mainWindow->getDefaultUseSound()
265              ).toBool();
266     QString sndsys=st.setting()->value ( sessionId+"/soundsystem",
267                                          "pulse" ).toString();
268     bool startServ=st.setting()->value ( sessionId+"/startsoundsystem",
269                                          true ).toBool();
270     bool sndInTun=st.setting()->value ( sessionId+"/soundtunnel",
271                                         true ).toBool();
272     bool defSndPort=st.setting()->value ( sessionId+"/defsndport",
273                                           true ).toBool();
274     int sndPort= st.setting()->value ( sessionId+"/sndport",4713 ).toInt();
275     if ( startServ )
276         rbStartSnd->setChecked ( true );
277     else
278         rbNotStartSnd->setChecked ( true );
279 
280     pulse->setChecked ( true );
281     slot_sndSysSelected ( PULSE );
282 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
283     if ( sndsys=="arts" )
284     {
285         sndsys="pulse";
286     }
287 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
288     if ( sndsys=="arts" )
289     {
290         arts->setChecked ( true );
291         slot_sndSysSelected ( ARTS );
292     }
293     if ( sndsys=="esd" )
294     {
295         esd->setChecked ( true );
296         slot_sndSysSelected ( ESD );
297     }
298     cbSndSshTun->setChecked ( sndInTun );
299     sound->setChecked ( snd );
300     if ( !defSndPort )
301         sbSndPort->setValue ( sndPort );
302     cbDefSndPort->setChecked ( defSndPort );
303     if ( sndsys=="arts" )
304         cbDefSndPort->setChecked ( false );
305     slot_sndToggled ( snd );
306     slot_sndStartClicked();
307 
308     if(!sound)
309         cbDefSndPort->setEnabled(false);
310 
311     cbClientPrint->setChecked ( st.setting()->value ( sessionId+"/print",
312                                 true ).toBool() );
313 }
314 
setDefaults()315 void MediaWidget::setDefaults()
316 {
317     sound->setChecked ( true );
318     pulse->setChecked ( true );
319     slot_sndToggled ( true );
320     slot_sndSysSelected ( PULSE );
321     cbSndSshTun->setChecked ( true );
322     rbStartSnd->setChecked ( true );
323     cbClientPrint->setChecked ( true );
324 }
325 
saveSettings()326 void MediaWidget::saveSettings()
327 {
328     X2goSettings st ( "sessions" );
329 
330     st.setting()->setValue ( sessionId+"/sound",
331                              ( QVariant ) sound->isChecked() );
332     if ( arts->isChecked() )
333         st.setting()->setValue ( sessionId+"/soundsystem",
334                                  ( QVariant ) "arts" );
335     if ( esd->isChecked() )
336         st.setting()->setValue ( sessionId+"/soundsystem",
337                                  ( QVariant ) "esd" );
338     if ( pulse->isChecked() )
339         st.setting()->setValue ( sessionId+"/soundsystem",
340                                  ( QVariant ) "pulse" );
341 
342     st.setting()->setValue ( sessionId+"/startsoundsystem",
343                              ( QVariant ) rbStartSnd->isChecked() );
344     st.setting()->setValue ( sessionId+"/soundtunnel",
345                              ( QVariant ) cbSndSshTun->isChecked() );
346     st.setting()->setValue ( sessionId+"/defsndport",
347                              ( QVariant ) cbDefSndPort->isChecked() );
348     st.setting()->setValue ( sessionId+"/sndport",
349                              ( QVariant ) sbSndPort->value() );
350     st.setting()->setValue ( sessionId+"/print",
351                              ( QVariant ) cbClientPrint->isChecked() );
352     st.setting()->sync();
353 }
354