summaryrefslogtreecommitdiffabout
path: root/kalarmd/alarmdialog.cpp
Unidiff
Diffstat (limited to 'kalarmd/alarmdialog.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kalarmd/alarmdialog.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/kalarmd/alarmdialog.cpp b/kalarmd/alarmdialog.cpp
index 17d4afa..ddb125a 100644
--- a/kalarmd/alarmdialog.cpp
+++ b/kalarmd/alarmdialog.cpp
@@ -1,335 +1,340 @@
1/* 1/*
2 This file is part of the KDE alarm daemon. 2 This file is part of the KDE alarm daemon.
3 Copyright (c) 2000 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2000 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 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 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 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24// $Id$ 24// $Id$
25 25
26#include <qhbox.h> 26#include <qhbox.h>
27#include <qvbox.h> 27#include <qvbox.h>
28#include <qapp.h> 28#include <qapp.h>
29#include <qlabel.h> 29#include <qlabel.h>
30#include <qlayout.h> 30#include <qlayout.h>
31#include <qfile.h> 31#include <qfile.h>
32#include <qtimer.h> 32#include <qtimer.h>
33#include <qsound.h> 33#include <qsound.h>
34#include <qpushbutton.h> 34#include <qpushbutton.h>
35#include <qregexp.h> 35#include <qregexp.h>
36#ifndef DESKTOP_VERSION 36#ifndef DESKTOP_VERSION
37#define protected public 37#define protected public
38#include <qspinbox.h> 38#include <qspinbox.h>
39#undef protected 39#undef protected
40#else 40#else
41#include <qspinbox.h> 41#include <qspinbox.h>
42#endif 42#endif
43#include <stdlib.h> 43#include <stdlib.h>
44#ifndef _WIN32_ 44#ifndef _WIN32_
45#include <unistd.h> 45#include <unistd.h>
46#include <sys/ioctl.h> 46#include <sys/ioctl.h>
47#endif 47#endif
48#include <stdio.h> 48#include <stdio.h>
49#include <fcntl.h> 49#include <fcntl.h>
50 50
51#ifndef DESKTOP_VERSION 51#ifndef DESKTOP_VERSION
52#include <qtopia/alarmserver.h> 52#include <qtopia/alarmserver.h>
53#include <qpe/resource.h> 53#include <qpe/resource.h>
54#include <qtopia/sound.h> 54#include <qtopia/sound.h>
55 55
56#endif 56#endif
57 57
58#include "alarmdialog.h" 58#include "alarmdialog.h"
59 59
60 60
61AlarmDialog::AlarmDialog(QWidget *parent,const char *name) 61AlarmDialog::AlarmDialog(QWidget *parent,const char *name)
62 : QDialog (parent, name ,false, Qt::WStyle_StaysOnTop ) 62 : QDialog (parent, name ,false, Qt::WStyle_StaysOnTop )
63{ 63{
64 setCaption( "KO/Pi Alarm!" ); 64 setCaption( "KO/Pi Alarm!" );
65 QVBoxLayout* layout = new QVBoxLayout( this); 65 QVBoxLayout* layout = new QVBoxLayout( this);
66 QLabel* l = new QLabel("The following event triggered alarm:",this); 66 QLabel* l = new QLabel("The following event triggered alarm:",this);
67 layout->addWidget ( l ); 67 layout->addWidget ( l );
68 l->setAlignment( AlignCenter); 68 l->setAlignment( AlignCenter);
69 mMessage = new QLabel ( " ", this ); 69 mMessage = new QLabel ( " ", this );
70 int fs = 18; 70 int fs = 18;
71 int fs2 = 12; 71 int fs2 = 12;
72 int baseSize = 6; 72 int baseSize = 6;
73 if ( QApplication::desktop()->width() < 480 ) { 73 if ( QApplication::desktop()->width() < 480 ) {
74 fs2 = 10; 74 fs2 = 10;
75 fs = 12; 75 fs = 12;
76 baseSize = 4; 76 baseSize = 4;
77 } 77 }
78 layout->setSpacing( 3 ); 78 layout->setSpacing( 3 );
79 layout->setMargin( 3 ); 79 layout->setMargin( 3 );
80 QFont fo = QApplication::font(); 80 QFont fo = QApplication::font();
81 fo.setBold( true ); 81 fo.setBold( true );
82 fo.setPointSize( fs2 ); 82 fo.setPointSize( fs2 );
83 l->setFont( fo ); 83 l->setFont( fo );
84 fo.setPointSize( fs ); 84 fo.setPointSize( fs );
85 mMessage->setFont(fo ); 85 mMessage->setFont(fo );
86 mMessage->setAlignment( AlignCenter); 86 mMessage->setAlignment( AlignCenter);
87 layout->addWidget ( mMessage ); 87 layout->addWidget ( mMessage );
88 mMissedAlarms= new QLabel ( "(No missed Alarms)", this ); 88 mMissedAlarms= new QLabel ( "(No missed Alarms)", this );
89 mMissedAlarms->setAlignment( AlignCenter); 89 mMissedAlarms->setAlignment( AlignCenter);
90 90
91 playSoundTimer = new QTimer( this ); 91 playSoundTimer = new QTimer( this );
92 connect ( playSoundTimer, SIGNAL( timeout() ), this, SLOT (playSound() ) ); 92 connect ( playSoundTimer, SIGNAL( timeout() ), this, SLOT (playSound() ) );
93 93
94 playSoundTimer->stop(); 94 playSoundTimer->stop();
95 95
96 layout->addWidget ( mMissedAlarms ); 96 layout->addWidget ( mMissedAlarms );
97 mMissedAlarmsCombo = new QComboBox ( this ); 97 mMissedAlarmsCombo = new QComboBox ( this );
98 layout->addWidget ( mMissedAlarmsCombo ); 98 layout->addWidget ( mMissedAlarmsCombo );
99 99
100 QLabel* labb = new QLabel("Suspend\nduration\n(minutes):",this); 100 QLabel* labb = new QLabel("Suspend\nduration\n(minutes):",this);
101#ifdef DESKTOP_VERSION
102 fo = font();
103 fo.setPointSize( 12 );
104 labb->setFont ( fo );
105#endif
101 labb->setAlignment(AlignCenter); 106 labb->setAlignment(AlignCenter);
102 //layout->addWidget ( labb ); 107 //layout->addWidget ( labb );
103 fo = font(); 108 fo = font();
104 int pointSize = 36; 109 int pointSize = 36;
105 if ( QApplication::desktop()->width() <= 320 ) 110 if ( QApplication::desktop()->width() <= 320 )
106 pointSize = 18; 111 pointSize = 18;
107 fo.setPointSize( pointSize ); 112 fo.setPointSize( pointSize );
108 mSuspendSpin = new QSpinBox(1,1440,1,this); 113 mSuspendSpin = new QSpinBox(1,1440,1,this);
109 mSuspendSpin->setFont( fo ); 114 mSuspendSpin->setFont( fo );
110 mSuspendSpin->setValue(7); // default suspend duration 115 mSuspendSpin->setValue(7); // default suspend duration
111 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus ); 116 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus );
112 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus ); 117 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus );
113 118
114#if QT_VERSION < 0x030000 119#if QT_VERSION < 0x030000
115 mSuspendSpin->upButton ()->setFixedSize( QSize( 8*baseSize, 5*baseSize )); 120 mSuspendSpin->upButton ()->setFixedSize( QSize( 8*baseSize, 5*baseSize ));
116 mSuspendSpin->downButton ()->setFixedSize( QSize( 8*baseSize, 5*baseSize )); 121 mSuspendSpin->downButton ()->setFixedSize( QSize( 8*baseSize, 5*baseSize ));
117#endif 122#endif
118 mSuspendSpin->setFixedSize( 18*baseSize, 10*baseSize+2 ); 123 mSuspendSpin->setFixedSize( 18*baseSize, 10*baseSize+2 );
119 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus ); 124 mSuspendSpin->setButtonSymbols( QSpinBox::PlusMinus );
120 QHBoxLayout* layoutSpin = new QHBoxLayout( layout ); 125 QHBoxLayout* layoutSpin = new QHBoxLayout( layout );
121 layoutSpin->addStretch (); 126 layoutSpin->addStretch ();
122 layoutSpin->addWidget ( labb ); 127 layoutSpin->addWidget ( labb );
123 layoutSpin->addWidget ( mSuspendSpin ); 128 layoutSpin->addWidget ( mSuspendSpin );
124 layoutSpin->addStretch (); 129 layoutSpin->addStretch ();
125 130
126 QVBox * bbox = new QVBox ( this ); 131 QVBox * bbox = new QVBox ( this );
127 layout->addWidget ( bbox ); 132 layout->addWidget ( bbox );
128 bbox->layout()->setSpacing( 2 ); 133 bbox->layout()->setSpacing( 2 );
129 labb = new QLabel("Press \"Cancel\" or \"Esc\" to suspend!",bbox); 134 labb = new QLabel("Press \"Cancel\" or \"Esc\" to suspend!",bbox);
130 labb->setAlignment(AlignCenter); 135 labb->setAlignment(AlignCenter);
131 mSuspendButton = new QPushButton( "Suspend", bbox); 136 mSuspendButton = new QPushButton( "Suspend", bbox);
132 QPushButton* silen = new QPushButton( " Stop sound ", bbox); 137 QPushButton* silen = new QPushButton( " Stop sound ", bbox);
133 okbut = new QPushButton( "Ok", bbox); 138 okbut = new QPushButton( "Ok", bbox);
134 mSuspendButton->setFont( fo ); 139 mSuspendButton->setFont( fo );
135 silen->setFont( fo ); 140 silen->setFont( fo );
136 okbut->setFont( fo ); 141 okbut->setFont( fo );
137 okbut->setDefault( true ); 142 okbut->setDefault( true );
138 connect (silen , SIGNAL( clicked() ), this, SLOT (silent() ) ); 143 connect (silen , SIGNAL( clicked() ), this, SLOT (silent() ) );
139 connect (mSuspendButton, SIGNAL( clicked() ), this, SLOT (slotSuspend() ) ); 144 connect (mSuspendButton, SIGNAL( clicked() ), this, SLOT (slotSuspend() ) );
140 connect (okbut , SIGNAL( clicked() ), this, SLOT (slotOk() ) ); 145 connect (okbut , SIGNAL( clicked() ), this, SLOT (slotOk() ) );
141 connect (mSuspendSpin , SIGNAL( valueChanged ( int ) ), this, SLOT ( spinBoxChanged( int ) ) ); 146 connect (mSuspendSpin , SIGNAL( valueChanged ( int ) ), this, SLOT ( spinBoxChanged( int ) ) );
142#ifndef _WIN32_ 147#ifndef _WIN32_
143 if ( QFile::exists ( "/dev/sharp_led" ) ) 148 if ( QFile::exists ( "/dev/sharp_led" ) )
144 fd_led = open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK ); 149 fd_led = open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
145 else 150 else
146#endif 151#endif
147 fd_led = 0; 152 fd_led = 0;
148 statusLED.which = SHARP_LED_SALARM; 153 statusLED.which = SHARP_LED_SALARM;
149 mSilent = false; 154 mSilent = false;
150 mSuspendCounter = 0; 155 mSuspendCounter = 0;
151 setServerNotification( true ); 156 setServerNotification( true );
152} 157}
153void AlarmDialog::reject () 158void AlarmDialog::reject ()
154{ 159{
155 QTimer::singleShot ( 3000, this, SLOT (suspend()) ); 160 QTimer::singleShot ( 3000, this, SLOT (suspend()) );
156 slotSuspend(); 161 slotSuspend();
157} 162}
158AlarmDialog::~AlarmDialog() 163AlarmDialog::~AlarmDialog()
159{ 164{
160} 165}
161void AlarmDialog::silent () 166void AlarmDialog::silent ()
162{ 167{
163 mSilent = true; 168 mSilent = true;
164} 169}
165void AlarmDialog::accept() 170void AlarmDialog::accept()
166{ 171{
167 slotOk(); 172 slotOk();
168} 173}
169 174
170void AlarmDialog::suspend() 175void AlarmDialog::suspend()
171{ 176{
172#ifdef DESKTOP_VERSION 177#ifdef DESKTOP_VERSION
173 178
174#else 179#else
175 Sound::soundAlarm (); 180 Sound::soundAlarm ();
176#endif 181#endif
177} 182}
178void AlarmDialog::slotOk() 183void AlarmDialog::slotOk()
179{ 184{
180 mStopAlarm = true; 185 mStopAlarm = true;
181 mMissedAlarms->setText("(No missed Alarms)"); 186 mMissedAlarms->setText("(No missed Alarms)");
182 mMessage->setText(""); 187 mMessage->setText("");
183 mMissedAlarmsCombo->clear(); 188 mMissedAlarmsCombo->clear();
184#ifndef _WIN32_ 189#ifndef _WIN32_
185 if ( fd_led > 0 ) { 190 if ( fd_led > 0 ) {
186 statusLED.status = LED_SALARM_OFF ; 191 statusLED.status = LED_SALARM_OFF ;
187 ioctl (fd_led, SHARP_LED_SETSTATUS, &statusLED); 192 ioctl (fd_led, SHARP_LED_SETSTATUS, &statusLED);
188 } 193 }
189#endif 194#endif
190 QDialog::accept(); 195 QDialog::accept();
191} 196}
192 197
193void AlarmDialog::slotSuspend() 198void AlarmDialog::slotSuspend()
194{ 199{
195 //qDebug("AlarmDialog::suspend() "); // emit suspendSignal(mSuspendSpin->value()); 200 //qDebug("AlarmDialog::suspend() "); // emit suspendSignal(mSuspendSpin->value());
196 mStopAlarm = true; 201 mStopAlarm = true;
197 QDateTime nextA = QDateTime::currentDateTime().addSecs( mSuspendSpin->value() * 60 ); 202 QDateTime nextA = QDateTime::currentDateTime().addSecs( mSuspendSpin->value() * 60 );
198 QString mess = "suspend_alarm" +mFileName+"+++" ; 203 QString mess = "suspend_alarm" +mFileName+"+++" ;
199 if ( mMessage->text().left( 10 ) !="Suspended:" ) 204 if ( mMessage->text().left( 10 ) !="Suspended:" )
200 mess += "Suspended:\n"; 205 mess += "Suspended:\n";
201 mess +=mMessage->text(); 206 mess +=mMessage->text();
202#ifndef DESKTOP_VERSION 207#ifndef DESKTOP_VERSION
203 if ( mServerNotification ) 208 if ( mServerNotification )
204 AlarmServer::addAlarm ( nextA,"koalarm",mess.latin1()); 209 AlarmServer::addAlarm ( nextA,"koalarm",mess.latin1());
205#endif 210#endif
206 emit addAlarm( nextA , mess ); 211 emit addAlarm( nextA , mess );
207 slotOk(); 212 slotOk();
208} 213}
209 214
210void AlarmDialog::setServerNotification( bool b ) 215void AlarmDialog::setServerNotification( bool b )
211{ 216{
212 mServerNotification = b; 217 mServerNotification = b;
213} 218}
214int AlarmDialog::getSuspendTime( ) 219int AlarmDialog::getSuspendTime( )
215{ 220{
216 return mSuspendSpin->value(); 221 return mSuspendSpin->value();
217 222
218} 223}
219void AlarmDialog::setSuspendTime( int val ) 224void AlarmDialog::setSuspendTime( int val )
220{ 225{
221 mSuspendSpin->setValue( val ); 226 mSuspendSpin->setValue( val );
222} 227}
223bool AlarmDialog::eventNotification( QString mess, int replay , QString fn, bool playwav, int pause , int suspendtimes) 228bool AlarmDialog::eventNotification( QString mess, int replay , QString fn, bool playwav, int pause , int suspendtimes)
224{ 229{
225 if ( mess.left( 9) != "Suspended" ) 230 if ( mess.left( 9) != "Suspended" )
226 mSuspendCounter = suspendtimes; 231 mSuspendCounter = suspendtimes;
227 mPauseCount = pause; 232 mPauseCount = pause;
228 mFileName = fn; 233 mFileName = fn;
229 mPlayWav = playwav; 234 mPlayWav = playwav;
230 if ( !QFile::exists( fn ) ) 235 if ( !QFile::exists( fn ) )
231 mFileName = ""; 236 mFileName = "";
232 alarmCounter = 0 ; 237 alarmCounter = 0 ;
233 maxAlarmReplay = replay ; 238 maxAlarmReplay = replay ;
234 mStopAlarm = false; 239 mStopAlarm = false;
235 mSilent = false; 240 mSilent = false;
236 if ( !mMessage->text().stripWhiteSpace().isEmpty() ) { 241 if ( !mMessage->text().stripWhiteSpace().isEmpty() ) {
237 mMissedAlarmsCombo->show(); 242 mMissedAlarmsCombo->show();
238 QString newItem = mMessage->text().stripWhiteSpace(); 243 QString newItem = mMessage->text().stripWhiteSpace();
239 newItem.replace( QRegExp("\n"), QString(" ") ); 244 newItem.replace( QRegExp("\n"), QString(" ") );
240 mMissedAlarmsCombo->insertItem( newItem ); 245 mMissedAlarmsCombo->insertItem( newItem );
241 mMissedAlarms->setText( "Missed alarms:"); 246 mMissedAlarms->setText( "Missed alarms:");
242 } else 247 } else
243 mMissedAlarmsCombo->hide(); 248 mMissedAlarmsCombo->hide();
244 mMessage->setText(mess); 249 mMessage->setText(mess);
245 int w = minimumSizeHint().width() ; 250 int w = minimumSizeHint().width() ;
246 int h = minimumSizeHint().height() ; 251 int h = minimumSizeHint().height() ;
247 int dw = QApplication::desktop()->width(); 252 int dw = QApplication::desktop()->width();
248 int dh = QApplication::desktop()->height(); 253 int dh = QApplication::desktop()->height();
249 setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 254 setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
250 hide(); 255 hide();
251 256
252#ifndef _WIN32_ 257#ifndef _WIN32_
253 if ( fd_led > 0 ) { 258 if ( fd_led > 0 ) {
254 statusLED.status = LED_SALARM_ON ; 259 statusLED.status = LED_SALARM_ON ;
255 ioctl (fd_led, SHARP_LED_SETSTATUS, &statusLED); 260 ioctl (fd_led, SHARP_LED_SETSTATUS, &statusLED);
256 } 261 }
257#endif 262#endif
258 okbut->setDefault( true ); 263 okbut->setDefault( true );
259 QTimer::singleShot( 1, this, SLOT ( forceRepaint() ) ); 264 QTimer::singleShot( 1, this, SLOT ( forceRepaint() ) );
260 // playSoundTimer->start( 1000, true ); 265 // playSoundTimer->start( 1000, true );
261 return true; 266 return true;
262 267
263} 268}
264 269
265void AlarmDialog::forceRepaint() 270void AlarmDialog::forceRepaint()
266{ 271{
267 272
268 showNormal(); 273 showNormal();
269 setActiveWindow(); 274 setActiveWindow();
270 raise(); 275 raise();
271 mSuspendSpin->setFocus(); 276 mSuspendSpin->setFocus();
272 playSoundTimer->start( 1000, true ); 277 playSoundTimer->start( 1000, true );
273 278
274} 279}
275void AlarmDialog::spinBoxChanged( int v ) 280void AlarmDialog::spinBoxChanged( int v )
276{ 281{
277 okbut->setDefault( false ); 282 okbut->setDefault( false );
278 mSilent = true; 283 mSilent = true;
279} 284}
280 285
281void AlarmDialog::playSound () 286void AlarmDialog::playSound ()
282{ 287{
283 288
284 if (mStopAlarm ) 289 if (mStopAlarm )
285 return; 290 return;
286 if ( mSilent ) 291 if ( mSilent )
287 return; 292 return;
288 //showNormal(); 293 //showNormal();
289 setActiveWindow(); 294 setActiveWindow();
290 //raise(); 295 //raise();
291 mSuspendSpin->setFocus(); 296 mSuspendSpin->setFocus();
292 if ( alarmCounter < maxAlarmReplay && ! mSilent) { 297 if ( alarmCounter < maxAlarmReplay && ! mSilent) {
293 ++alarmCounter; 298 ++alarmCounter;
294#ifdef DESKTOP_VERSION 299#ifdef DESKTOP_VERSION
295 mPlayWav = true; 300 mPlayWav = true;
296#endif 301#endif
297 if ( !mPlayWav || mFileName.length() < 2 ) { 302 if ( !mPlayWav || mFileName.length() < 2 ) {
298 303
299#ifdef DESKTOP_VERSION 304#ifdef DESKTOP_VERSION
300 qDebug("Sound play not possible - file not found"); 305 qDebug("Sound play not possible - file not found");
301#else 306#else
302 Sound::soundAlarm (); 307 Sound::soundAlarm ();
303#endif 308#endif
304 } else 309 } else
305 310
306 { 311 {
307#ifdef DESKTOP_VERSION 312#ifdef DESKTOP_VERSION
308#ifdef _WIN32_ 313#ifdef _WIN32_
309 QSound::play ( mFileName ); 314 QSound::play ( mFileName );
310#else 315#else
311 316
312 QString command = "playwave -r 22050 " + mFileName; 317 QString command = "playwave -r 22050 " + mFileName;
313 qDebug("KO: Playing file %s with 22kHz",mFileName.latin1() ); 318 qDebug("KO: Playing file %s with 22kHz",mFileName.latin1() );
314 int ret = system ( command.latin1() ); 319 int ret = system ( command.latin1() );
315 if ( ret != 0 ) { 320 if ( ret != 0 ) {
316 qDebug("Sound play command failed: %s ",command.latin1() ); 321 qDebug("Sound play command failed: %s ",command.latin1() );
317 } 322 }
318 323
319#endif 324#endif
320 325
321#else 326#else
322 QSound::play ( mFileName ); 327 QSound::play ( mFileName );
323#endif 328#endif
324 qDebug("BEEP!"); 329 qDebug("BEEP!");
325 } 330 }
326 } else { 331 } else {
327 if ( ! mSilent && mSuspendCounter > 0 ) { 332 if ( ! mSilent && mSuspendCounter > 0 ) {
328 --mSuspendCounter; 333 --mSuspendCounter;
329 reject (); 334 reject ();
330 hide(); 335 hide();
331 return; 336 return;
332 } 337 }
333 } 338 }
334 playSoundTimer->start( mPauseCount * 1000, true ); 339 playSoundTimer->start( mPauseCount * 1000, true );
335} 340}