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"