#include #include "XmmsQT4.h" #include "XMMSHandler.h" #include #include #include #include #include XMMSHandler *XMMSHandler::singleton = NULL; XMMSHandler *XMMSHandler::getInstance (void) { if (!singleton) { singleton = new XMMSHandler (); #ifndef HAVE_SERVERBROWSER singleton->connect (getenv ("XMMS_PATH")); #endif } return singleton; } XMMSHandler::XMMSHandler () : sigc::trackable () { m_xmmsc = new XMMSClient ("promoe"); } bool XMMSHandler::connect (const char *path) { if (!m_xmmsc->connect (path)) { QErrorMessage *err = new QErrorMessage (); err->showMessage ("Couldn't connect to XMMS2, please try again."); err->exec (); return false; } m_qt4 = new XmmsQT4 (m_xmmsc->getConn (), qApp); XMMSResultValueList *l = m_xmmsc->playlist_list (); l->connect (sigc::mem_fun (this, &XMMSHandler::playlist_list)); XMMSResultDict *p = m_xmmsc->broadcast_playlist_changed (); p->connect (sigc::mem_fun (this, &XMMSHandler::playlist_changed)); XMMSResultValue *r = m_xmmsc->signal_playback_playtime (); r->connect (sigc::mem_fun (this, &XMMSHandler::playback_playtime)); r = m_xmmsc->playback_current_id (); r->connect (sigc::mem_fun (this, &XMMSHandler::playback_current_id)); r = m_xmmsc->broadcast_playback_current_id (); r->connect (sigc::mem_fun (this, &XMMSHandler::playback_current_id)); r = m_xmmsc->playback_status (); r->connect (sigc::mem_fun (this, &XMMSHandler::playback_status)); r = m_xmmsc->broadcast_playback_status (); r->connect (sigc::mem_fun (this, &XMMSHandler::playback_status)); r = m_xmmsc->broadcast_medialib_entry_changed (); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_entry_changed)); XMMSResult *xr = m_xmmsc->broadcast_playback_volume_changed (); xr->connect (sigc::mem_fun (this, &XMMSHandler::volume_changed)); return true; } void XMMSHandler::medialib_entry_changed (XMMSResultValue *res) { uint i; res->getValue (&i); if (i > 0) { XMMSResultDict *r = m_xmmsc->medialib_get_info (i); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_info)); } if (res->getClass() == XMMSC_RESULT_CLASS_DEFAULT) { delete res; } } void XMMSHandler::playlistAddURL (QString s) { delete m_xmmsc->playlist_add (s.toAscii ().constData ()); } void XMMSHandler::requestMediainfo (uint id) { XMMSResultDict *r = m_xmmsc->medialib_get_info (id); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_info)); } void XMMSHandler::requestPlaylistList (void) { XMMSResultValueList *r = m_xmmsc->playlist_list (); r->connect (sigc::mem_fun (this, &XMMSHandler::playlist_list)); } void XMMSHandler::requestTrackChange (int pos) { XMMSResult *r = m_xmmsc->playlist_set_next (pos); delete r; XMMSResult *r2 = m_xmmsc->playback_tickle (); delete r2; } void XMMSHandler::playlist_list (XMMSResultValueList *res) { QList list; for (;res->listValid (); res->listNext()) { uint i; if (res->getValue (&i)) { list.append (i); } } emit playlistList (list); delete res; } void XMMSHandler::playback_status (XMMSResultValue *res) { uint status; res->getValue (&status); emit playbackStatusChanged (status); if (res->getClass() == XMMSC_RESULT_CLASS_DEFAULT) { delete res; } } void XMMSHandler::playback_playtime (XMMSResultValue *res) { uint i; res->getValue (&i); emit playtimeChanged (i); res->restart (); } void XMMSHandler::playback_current_id (XMMSResultValue *res) { uint i; res->getValue (&i); m_currentid = i; if (i > 0) { XMMSResultDict *r = m_xmmsc->medialib_get_info (i); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_info)); } emit currentID(i); if (res->getClass() == XMMSC_RESULT_CLASS_DEFAULT) { delete res; } } void XMMSHandler::setPlaytime (uint pos) { delete m_xmmsc->playback_seek_ms (pos); } QHash XMMSHandler::DictToQHash (XMMSResultDict *res) { QHash h; std::list l = res->getDictKeys (); std::list::const_iterator it; for(it=l.begin(); it!=l.end(); ++it) { if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_UINT32) { uint i; res->getValue (*it, &i); QString t; t.setNum (i); h.insert (QString::fromLatin1(*it), t); } else if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_INT32) { int i; res->getValue (*it, &i); QString t; t.setNum (i); h.insert (QString::fromLatin1(*it), t); } else if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_STRING) { char *c; res->getValue (*it, &c); h.insert (QString::fromLatin1(*it), QString::fromUtf8 (c)); } } return h; } QHash XMMSHandler::PropDictToQHash (XMMSResultDict *res) { QHash h; std::list l = res->getPropDictKeys (); std::list::const_iterator it; for(it=l.begin(); it!=l.end(); ++it) { if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_UINT32) { uint i; res->getValue (*it, &i); QString t; t.setNum (i); h.insert (QString::fromLatin1(*it), t); } else if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_INT32) { int i; res->getValue (*it, &i); QString t; t.setNum (i); h.insert (QString::fromLatin1(*it), t); } else if (res->getDictValueType (*it) == XMMSC_RESULT_VALUE_TYPE_STRING) { char *c; res->getValue (*it, &c); h.insert (QString::fromLatin1(*it), QString::fromUtf8 (c)); } } return h; } uint XMMSHandler::medialibQuery (QString q) { XMMSResultDictList *r = m_xmmsc->medialib_select (q.toUtf8 ()); r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_select)); return r->getCID (); } void XMMSHandler::medialib_select (XMMSResultDictList *res) { QList > l; for (;res->listValid (); res->listNext()) { QHash h(DictToQHash (static_cast(res))); l.append (h); } emit medialibResponse (res->getCID (), l); } void XMMSHandler::playlist_changed (XMMSResultDict *res) { QHash h(DictToQHash (res)); emit playlistChanged (h); } void XMMSHandler::medialib_info (XMMSResultDict *res) { int id; QHash h(PropDictToQHash (res)); res->getValue ("id", &id); emit mediainfoChanged (id, h); if (id == m_currentid) { emit currentSong (h); } delete res; } void XMMSHandler::volumeGet (void) { XMMSResultDict *p = m_xmmsc->playback_volume_get (); p->connect (sigc::mem_fun (this, &XMMSHandler::volume_get)); } void XMMSHandler::volume_changed (XMMSResult *res) { volumeGet (); } void XMMSHandler::volume_get (XMMSResultDict *res) { QHash h (DictToQHash (res)); QList Values = h.values(); QListIterator vol (Values); uint right = atol (vol.next().toAscii()); uint left = atol (vol.next().toAscii()); if(left > right) emit getVolume (left); else emit getVolume (right); } XMMSHandler::~XMMSHandler () { delete m_xmmsc; }