File indexing completed on 2024-04-28 04:50:48
0001 /* 0002 * dbusobjects.cpp 0003 * 0004 * Copyright (C) 2009-2011 Christoph Pfister <christophpfister@gmail.com> 0005 * 0006 * This program is free software; you can redistribute it and/or modify 0007 * it under the terms of the GNU General Public License as published by 0008 * the Free Software Foundation; either version 2 of the License, or 0009 * (at your option) any later version. 0010 * 0011 * This program is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0014 * GNU General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU General Public License along 0017 * with this program; if not, write to the Free Software Foundation, Inc., 0018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 0019 */ 0020 0021 #include <KAboutData> 0022 #include <QApplication> 0023 #include <QDBusMetaType> 0024 0025 #include "dbusobjects.h" 0026 #include "dvb/dvbmanager.h" 0027 #include "dvb/dvbtab.h" 0028 #include "playlist/playlisttab.h" 0029 0030 static QDBusArgument &operator<<(QDBusArgument &argument, const MprisStatusStruct &statusStruct) 0031 { 0032 argument.beginStructure(); 0033 argument << statusStruct.state << statusStruct.random << statusStruct.repeatTrack << 0034 statusStruct.repeatPlaylist; 0035 argument.endStructure(); 0036 return argument; 0037 } 0038 0039 static const QDBusArgument &operator>>(const QDBusArgument &argument, MprisStatusStruct &statusStruct) 0040 { 0041 argument.beginStructure(); 0042 argument >> statusStruct.state >> statusStruct.random >> statusStruct.repeatTrack >> 0043 statusStruct.repeatPlaylist; 0044 argument.endStructure(); 0045 return argument; 0046 } 0047 0048 static QDBusArgument &operator<<(QDBusArgument &argument, const MprisVersionStruct &versionStruct) 0049 { 0050 argument.beginStructure(); 0051 argument << versionStruct.major << versionStruct.minor; 0052 argument.endStructure(); 0053 return argument; 0054 } 0055 0056 static const QDBusArgument &operator>>(const QDBusArgument &argument, MprisVersionStruct &versionStruct) 0057 { 0058 argument.beginStructure(); 0059 argument >> versionStruct.major >> versionStruct.minor; 0060 argument.endStructure(); 0061 return argument; 0062 } 0063 0064 #if HAVE_DVB == 1 0065 static QDBusArgument &operator<<(QDBusArgument &argument, const TelevisionScheduleEntryStruct &entry) 0066 { 0067 argument.beginStructure(); 0068 argument << entry.key << entry.name << entry.channel << entry.begin << entry.duration << 0069 entry.repeat << entry.isRunning; 0070 argument.endStructure(); 0071 return argument; 0072 } 0073 0074 static const QDBusArgument &operator>>(const QDBusArgument &argument, 0075 TelevisionScheduleEntryStruct &entry) 0076 { 0077 argument.beginStructure(); 0078 argument >> entry.key >> entry.name >> entry.channel >> entry.begin >> entry.duration >> 0079 entry.repeat >> entry.isRunning; 0080 argument.endStructure(); 0081 return argument; 0082 } 0083 #endif 0084 0085 MprisRootObject::MprisRootObject(QObject *parent) : QObject(parent) 0086 { 0087 qDBusRegisterMetaType<MprisVersionStruct>(); 0088 } 0089 0090 MprisRootObject::~MprisRootObject() 0091 { 0092 } 0093 0094 QString MprisRootObject::Identity() 0095 { 0096 KAboutData aboutData = KAboutData::applicationData(); 0097 return aboutData.internalProgramName() + QLatin1Char(' ' )+ aboutData.internalVersion(); 0098 } 0099 0100 void MprisRootObject::Quit() 0101 { 0102 QApplication::quit(); 0103 } 0104 0105 MprisVersionStruct MprisRootObject::MprisVersion() 0106 { 0107 MprisVersionStruct versionStruct; 0108 versionStruct.major = 1; 0109 versionStruct.minor = 0; 0110 return versionStruct; 0111 } 0112 0113 MprisPlayerObject::MprisPlayerObject(MainWindow *mainWindow_, MediaWidget *mediaWidget_, 0114 PlaylistTab *playlistTab_, QObject *parent) : QObject(parent), mainWindow(mainWindow_), 0115 mediaWidget(mediaWidget_), playlistTab(playlistTab_) 0116 { 0117 qDBusRegisterMetaType<MprisStatusStruct>(); 0118 } 0119 0120 MprisPlayerObject::~MprisPlayerObject() 0121 { 0122 } 0123 0124 void MprisPlayerObject::Next() 0125 { 0126 mediaWidget->next(); 0127 } 0128 0129 void MprisPlayerObject::Prev() 0130 { 0131 mediaWidget->previous(); 0132 } 0133 0134 void MprisPlayerObject::Pause() 0135 { 0136 mediaWidget->togglePause(); 0137 } 0138 0139 void MprisPlayerObject::Stop() 0140 { 0141 mediaWidget->stop(); 0142 } 0143 0144 void MprisPlayerObject::Play() 0145 { 0146 mediaWidget->play(); 0147 } 0148 0149 void MprisPlayerObject::Repeat(bool repeat) 0150 { 0151 Q_UNUSED(repeat) 0152 // FIXME track repeat not implemented yet 0153 } 0154 0155 MprisStatusStruct MprisPlayerObject::GetStatus() 0156 { 0157 MprisStatusStruct statusStruct; 0158 statusStruct.state = 0; 0159 0160 switch (mediaWidget->getPlaybackStatus()) { 0161 case MediaWidget::Idle: 0162 statusStruct.state = 2; 0163 break; 0164 case MediaWidget::Playing: 0165 statusStruct.state = 0; 0166 break; 0167 case MediaWidget::Paused: 0168 statusStruct.state = 1; 0169 break; 0170 } 0171 0172 if (playlistTab->getRandom()) { 0173 statusStruct.random = 1; 0174 } else { 0175 statusStruct.random = 0; 0176 } 0177 0178 statusStruct.repeatTrack = 0; // FIXME track repeat not implemented yet 0179 0180 if (playlistTab->getRepeat()) { 0181 statusStruct.repeatPlaylist = 1; 0182 } else { 0183 statusStruct.repeatPlaylist = 0; 0184 } 0185 0186 return statusStruct; 0187 } 0188 0189 QVariantMap MprisPlayerObject::GetMetadata() 0190 { 0191 return QVariantMap(); // FIXME metadata handling not implemented yet 0192 } 0193 0194 int MprisPlayerObject::GetCaps() 0195 { 0196 int capabilities = (1 << 0) | // CAN_GO_NEXT // FIXME check availability 0197 (1 << 1) | // CAN_GO_PREV // FIXME check availability 0198 (1 << 3) | // CAN_PLAY // FIXME check availability 0199 (1 << 4) | // CAN_SEEK // FIXME check availability 0200 (1 << 6); // CAN_HAS_TRACKLIST 0201 0202 switch (mediaWidget->getPlaybackStatus()) { 0203 case MediaWidget::Idle: 0204 break; 0205 case MediaWidget::Playing: 0206 case MediaWidget::Paused: 0207 capabilities |= (1 << 2); // CAN_PAUSE 0208 break; 0209 } 0210 0211 return capabilities; // FIXME metadata handling not implemented yet 0212 } 0213 0214 void MprisPlayerObject::VolumeSet(int volume) 0215 { 0216 mediaWidget->setVolume(volume); 0217 } 0218 0219 int MprisPlayerObject::VolumeGet() 0220 { 0221 return mediaWidget->getVolume(); 0222 } 0223 0224 void MprisPlayerObject::PositionSet(int position) 0225 { 0226 mediaWidget->setPosition(position); 0227 } 0228 0229 int MprisPlayerObject::PositionGet() 0230 { 0231 return mediaWidget->getPosition(); 0232 } 0233 0234 void MprisPlayerObject::IncreaseVolume() 0235 { 0236 mediaWidget->increaseVolume(); 0237 } 0238 0239 void MprisPlayerObject::DecreaseVolume() 0240 { 0241 mediaWidget->decreaseVolume(); 0242 } 0243 0244 void MprisPlayerObject::ToggleMuted() 0245 { 0246 mediaWidget->toggleMuted(); 0247 } 0248 0249 void MprisPlayerObject::ToggleFullScreen() 0250 { 0251 mediaWidget->toggleFullScreen(); 0252 } 0253 0254 void MprisPlayerObject::ShortSkipBackward() 0255 { 0256 mediaWidget->shortSkipBackward(); 0257 } 0258 0259 void MprisPlayerObject::ShortSkipForward() 0260 { 0261 mediaWidget->shortSkipForward(); 0262 } 0263 0264 void MprisPlayerObject::LongSkipBackward() 0265 { 0266 mediaWidget->longSkipBackward(); 0267 } 0268 0269 void MprisPlayerObject::LongSkipForward() 0270 { 0271 mediaWidget->longSkipForward(); 0272 } 0273 0274 MprisTrackListObject::MprisTrackListObject(PlaylistTab *playlistTab_, QObject *parent) : 0275 QObject(parent), playlistTab(playlistTab_) 0276 { 0277 } 0278 0279 MprisTrackListObject::~MprisTrackListObject() 0280 { 0281 } 0282 0283 QVariantMap MprisTrackListObject::GetMetadata(int index) 0284 { 0285 Q_UNUSED(index) 0286 return QVariantMap(); // FIXME metadata handling not implemented yet 0287 } 0288 0289 int MprisTrackListObject::GetCurrentTrack() 0290 { 0291 return playlistTab->getCurrentTrack(); 0292 } 0293 0294 int MprisTrackListObject::GetLength() 0295 { 0296 return playlistTab->getTrackCount(); 0297 } 0298 0299 int MprisTrackListObject::AddTrack(const QString &url, bool playImmediately) 0300 { 0301 playlistTab->appendToCurrentPlaylist(QList<QUrl>() << url, playImmediately); 0302 return 0; 0303 } 0304 0305 void MprisTrackListObject::DelTrack(int index) 0306 { 0307 playlistTab->removeTrack(index); 0308 } 0309 0310 void MprisTrackListObject::SetLoop(bool loop) 0311 { 0312 playlistTab->setRepeat(loop); 0313 } 0314 0315 void MprisTrackListObject::SetRandom(bool random) 0316 { 0317 playlistTab->setRandom(random); 0318 } 0319 0320 #if HAVE_DVB == 1 0321 0322 DBusTelevisionObject::DBusTelevisionObject(DvbTab *dvbTab_, QObject *parent) : QObject(parent), 0323 dvbTab(dvbTab_) 0324 { 0325 qDBusRegisterMetaType<TelevisionScheduleEntryStruct>(); 0326 qDBusRegisterMetaType<QList<TelevisionScheduleEntryStruct> >(); 0327 } 0328 0329 DBusTelevisionObject::~DBusTelevisionObject() 0330 { 0331 } 0332 0333 void DBusTelevisionObject::DigitPressed(int digit) 0334 { 0335 if ((digit >= 0) && (digit <= 9)) { 0336 dvbTab->osdKeyPressed(Qt::Key_0 + digit); 0337 } 0338 } 0339 0340 void DBusTelevisionObject::PlayChannel(const QString &nameOrNumber) 0341 { 0342 dvbTab->playChannel(nameOrNumber); 0343 } 0344 0345 void DBusTelevisionObject::PlayLastChannel() 0346 { 0347 dvbTab->playLastChannel(); 0348 } 0349 0350 void DBusTelevisionObject::ToggleInstantRecord() 0351 { 0352 dvbTab->toggleInstantRecord(); 0353 } 0354 0355 void DBusTelevisionObject::ToggleOsd() 0356 { 0357 dvbTab->toggleOsd(); 0358 } 0359 0360 QList<TelevisionScheduleEntryStruct> DBusTelevisionObject::ListProgramSchedule() 0361 { 0362 QList<TelevisionScheduleEntryStruct> entries; 0363 DvbRecordingModel *recordingModel = dvbTab->getManager()->getRecordingModel(); 0364 0365 foreach (const DvbSharedRecording &recording, recordingModel->getRecordings()) { 0366 TelevisionScheduleEntryStruct entry; 0367 entry.key = recording->sqlKey; 0368 entry.name = recording->name; 0369 entry.channel = recording->channel->name; 0370 entry.begin = (recording->begin.toString(Qt::ISODate) + QLatin1Char('Z')); 0371 entry.duration = recording->duration.toString(Qt::ISODate); 0372 entry.repeat = recording->repeat; 0373 entry.isRunning = (recording->status != DvbRecording::Inactive); 0374 entries.append(entry); 0375 } 0376 0377 return entries; 0378 } 0379 0380 quint32 DBusTelevisionObject::ScheduleProgram(const QString &name, const QString &channel, 0381 const QString &begin, const QString &duration, int repeat) 0382 { 0383 DvbRecording recording; 0384 recording.name = name; 0385 recording.channel = dvbTab->getManager()->getChannelModel()->findChannelByName(channel); 0386 recording.begin = QDateTime::fromString(begin, Qt::ISODate).toUTC(); 0387 recording.duration = QTime::fromString(duration, Qt::ISODate); 0388 recording.repeat = (repeat & ((1 << 7) - 1)); 0389 recording.disabled = false; 0390 DvbSharedRecording newRecording = 0391 dvbTab->getManager()->getRecordingModel()->addRecording(recording); 0392 0393 if (newRecording.isValid()) { 0394 return newRecording->sqlKey; 0395 } 0396 0397 return 0; 0398 } 0399 0400 void DBusTelevisionObject::RemoveProgram(quint32 key) 0401 { 0402 DvbRecordingModel *recordingModel = dvbTab->getManager()->getRecordingModel(); 0403 SqlKey sqlKey; 0404 sqlKey.sqlKey = key; 0405 DvbSharedRecording recording = recordingModel->getRecordings().value(sqlKey); 0406 0407 if (recording.isValid()) { 0408 recordingModel->removeRecording(recording); 0409 } 0410 } 0411 0412 #endif /* HAVE_DVB == 1 */ 0413 0414 #include "moc_dbusobjects.cpp"