diff --git a/ChangeLog b/ChangeLog index f3e863ea..ff52a887 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16725,3 +16725,6 @@ * Added an 'RDRipc::notificationReceived()' signal. 2018-03-21 Fred Gleason * Added support for notifications to rdlibrary(1). +2018-03-21 Fred Gleason + * Added support for cart notifications to the RDXport service. + * Added support for notifications to rdimport(1). diff --git a/lib/rdnotification.cpp b/lib/rdnotification.cpp index 03d4725e..7e3e9e03 100644 --- a/lib/rdnotification.cpp +++ b/lib/rdnotification.cpp @@ -29,6 +29,14 @@ RDNotification::RDNotification(RDNotification::Type type, } +RDNotification::RDNotification(Type type,Action action,const QVariant &id) +{ + notify_type=type; + notify_action=action; + notify_id=id; +} + + RDNotification::RDNotification() { notify_type=RDNotification::NullType; diff --git a/lib/rdnotification.h b/lib/rdnotification.h index 93317a48..5057cb2e 100644 --- a/lib/rdnotification.h +++ b/lib/rdnotification.h @@ -31,6 +31,7 @@ class RDNotification enum Action {NoAction=0,AddAction=1,DeleteAction=2,ModifyAction=3, LastAction=4}; RDNotification(Type type,Action action,unsigned cartnum); + RDNotification(Type type,Action action,const QVariant &id); RDNotification(); Type type() const; void setType(Type type); diff --git a/utils/rdimport/rdimport.cpp b/utils/rdimport/rdimport.cpp index a5a534ae..57e44163 100644 --- a/utils/rdimport/rdimport.cpp +++ b/utils/rdimport/rdimport.cpp @@ -1339,6 +1339,12 @@ MainObject::Result MainObject::ImportFile(const QString &filename, cut->setFadeupPoint(import_fadeup_marker->fadeValue(lo,hi)); } cart->updateLength(); + if(cart_created) { + SendNotification(RDNotification::AddAction,cart->number()); + } + else { + SendNotification(RDNotification::ModifyAction,cart->number()); + } delete settings; delete conv; delete cut; @@ -2018,6 +2024,17 @@ void MainObject::ReadXmlFile(const QString &basename,RDWaveData *wavedata) const } +void MainObject::SendNotification(RDNotification::Action action, + unsigned cartnum) +{ + RDNotification *notify= + new RDNotification(RDNotification::CartType,action,QVariant(cartnum)); + rda->ripc()->sendNotification(*notify); + qApp->processEvents(); + delete notify; +} + + int main(int argc,char *argv[]) { QApplication a(argc,argv,false); diff --git a/utils/rdimport/rdimport.h b/utils/rdimport/rdimport.h index 8c4bf5d3..67761a47 100644 --- a/utils/rdimport/rdimport.h +++ b/utils/rdimport/rdimport.h @@ -29,11 +29,12 @@ #include #include -#include -#include -#include #include #include +#include +#include +#include +#include #include "markerset.h" @@ -73,6 +74,7 @@ class MainObject : public QObject void WriteTimestampCache(const QString &filename,const QDateTime &dt); bool SchedulerCodeExists(const QString &code) const; void ReadXmlFile(const QString &basename,RDWaveData *wavedata) const; + void SendNotification(RDNotification::Action action,unsigned cartnum); unsigned import_file_key; RDGroup *import_group; bool import_verbose; diff --git a/web/rdxport/Makefile.am b/web/rdxport/Makefile.am index 42a0c282..ba94dedb 100644 --- a/web/rdxport/Makefile.am +++ b/web/rdxport/Makefile.am @@ -23,6 +23,10 @@ AM_CPPFLAGS = -Wall -DPREFIX=\"$(prefix)\" -DQTDIR=\"@QT_DIR@\" @QT_CXXFLAGS@ -I LIBS = @QT_LIBS@ -L$(top_srcdir)/lib MOC = @QT_MOC@ +# The dependency for qt's Meta Object Compiler (moc) +moc_%.cpp: %.h + $(MOC) $< -o $@ + libexec_PROGRAMS = rdxport.cgi install-exec-hook: @@ -45,6 +49,8 @@ dist_rdxport_cgi_SOURCES = audioinfo.cpp\ systemsettings.cpp\ trimaudio.cpp +nodist_rdxport_cgi_SOURCES = moc_rdxport.cpp + rdxport_cgi_LDADD = @LIB_RDLIBS@ -lsndfile @LIBVORBIS@ EXTRA_DIST = rdxport.pro diff --git a/web/rdxport/carts.cpp b/web/rdxport/carts.cpp index e0931131..12daefca 100644 --- a/web/rdxport/carts.cpp +++ b/web/rdxport/carts.cpp @@ -108,6 +108,8 @@ void Xport::AddCart() printf("\n"); if(cart->exists()) { printf("%s",(const char *)cart->xml(false,true)); + SendNotification(RDNotification::CartType,RDNotification::AddAction, + QVariant(cart->number())); } delete cart; printf("\n"); @@ -394,6 +396,8 @@ void Xport::EditCart() printf("\n"); printf("\n"); printf("%s",(const char *)cart->xml(include_cuts,true)); + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cart->number())); delete cart; printf("\n"); @@ -435,6 +439,8 @@ void Xport::RemoveCart() delete cart; XmlExit("Unable to delete cart",500,"carts.cpp",LINE_NUMBER); } + SendNotification(RDNotification::CartType,RDNotification::DeleteAction, + QVariant(cart->number())); delete cart; XmlExit("OK",200,"carts.cpp",LINE_NUMBER); } @@ -483,6 +489,8 @@ void Xport::AddCut() cut=new RDCut(cart_number,cut_number); if(cut->exists()) { printf("%s",(const char *)RDCart::cutXml(cart_number,cut_number,true)); + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cart->number())); } delete cut; delete cart; @@ -843,6 +851,8 @@ void Xport::EditCut() printf("\n"); printf("%s",(const char *)RDCart::cutXml(cart_number,cut_number,true)); printf("\n"); + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cut->cartNumber())); delete cut; Exit(0); @@ -934,6 +944,8 @@ void Xport::RemoveCut() delete cart; XmlExit("No such cut",404); } + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cart->number())); delete cart; XmlExit("OK",200); } diff --git a/web/rdxport/copyaudio.cpp b/web/rdxport/copyaudio.cpp index 0008be98..9f488c3e 100644 --- a/web/rdxport/copyaudio.cpp +++ b/web/rdxport/copyaudio.cpp @@ -77,5 +77,7 @@ void Xport::CopyAudio() RDCut::pathName(destination_cartnum,destination_cutnum))!=0) { XmlExit(strerror(errno),400,"copyaudio.cpp",LINE_NUMBER); } + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(destination_cartnum)); XmlExit("OK",200,"copyaudio.cpp",LINE_NUMBER); } diff --git a/web/rdxport/deleteaudio.cpp b/web/rdxport/deleteaudio.cpp index a176fd3f..e39d9a80 100644 --- a/web/rdxport/deleteaudio.cpp +++ b/web/rdxport/deleteaudio.cpp @@ -63,6 +63,8 @@ void Xport::DeleteAudio() "CUT_NAME=\""+RDCut::cutName(cartnum,cutnum)+"\""; RDSqlQuery *q=new RDSqlQuery(sql); delete q; + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cartnum)); syslog(LOG_NOTICE,"unlink(%s): %s",(const char *)RDCut::pathName(cartnum,cutnum),strerror(errno)); delete cut; XmlExit("OK",200,"deleteaudio.cpp",LINE_NUMBER); diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index 6ba1c419..71300f19 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -154,6 +154,8 @@ void Xport::Import() XmlExit("Unable to create cart ["+err_msg+"]",500,"import.cpp", LINE_NUMBER); } + SendNotification(RDNotification::CartType,RDNotification::AddAction, + QVariant(cartnum)); cutnum=1; cut=new RDCut(cartnum,cutnum,true); delete group; @@ -267,6 +269,8 @@ void Xport::Import() printf(" %d\r\n",cartnum); printf(" %d\r\n",cutnum); printf("\r\n"); + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cartnum)); unlink(filename); rmdir(xport_post->tempDir()); exit(0); diff --git a/web/rdxport/rdxport.cpp b/web/rdxport/rdxport.cpp index 6293b8cc..787834b4 100644 --- a/web/rdxport/rdxport.cpp +++ b/web/rdxport/rdxport.cpp @@ -128,6 +128,23 @@ Xport::Xport(QObject *parent) XmlExit("Invalid User",403,"rdxport.cpp",LINE_NUMBER); } + // + // Connect to ripcd(8) + // + connect(rda->ripc(),SIGNAL(connected(bool)), + this,SLOT(ripcConnectedData(bool))); + rda->ripc()-> + connectHost("localhost",RIPCD_TCP_PORT,rda->config()->password()); +} + + +void Xport::ripcConnectedData(bool state) +{ + if(!state) { + XmlExit("unable to connect to ripc service",500,"rdxport.cpp",LINE_NUMBER); + Exit(0); + } + // // Read Command Variable and Dispatch // @@ -393,6 +410,16 @@ void Xport::TryCreateTicket(const QString &name) } +void Xport::SendNotification(RDNotification::Type type, + RDNotification::Action action,const QVariant &id) +{ + RDNotification *notify=new RDNotification(type,action,id); + rda->ripc()->sendNotification(*notify); + qApp->processEvents(); + delete notify; +} + + void Xport::Exit(int code) { if(xport_post!=NULL) { diff --git a/web/rdxport/rdxport.h b/web/rdxport/rdxport.h index 6b99089b..4765f7d5 100644 --- a/web/rdxport/rdxport.h +++ b/web/rdxport/rdxport.h @@ -25,6 +25,7 @@ #include #include +#include #include #define RDXPORT_CGI_USAGE "\n" @@ -34,10 +35,14 @@ class Xport : public QObject { + Q_OBJECT; public: enum LockLogOperation {LockLogCreate=0,LockLogUpdate=1,LockLogClear=2}; Xport(QObject *parent=0); + private slots: + void ripcConnectedData(bool state); + private: bool Authenticate(); void TryCreateTicket(const QString &name); @@ -81,6 +86,8 @@ class Xport : public QObject QString LogLockXml(bool result,const QString &log_name,const QString &guid, const QString &username,const QString &stationname, const QHostAddress addr) const; + void SendNotification(RDNotification::Type type,RDNotification::Action action, + const QVariant &id); void Exit(int code); void XmlExit(const QString &msg,int code, const QString &srcfile="",int line=-1, diff --git a/web/rdxport/trimaudio.cpp b/web/rdxport/trimaudio.cpp index ec8e4e42..b952f695 100644 --- a/web/rdxport/trimaudio.cpp +++ b/web/rdxport/trimaudio.cpp @@ -93,5 +93,7 @@ void Xport::TrimAudio() } printf(" %d\n",point); printf("\n"); + SendNotification(RDNotification::CartType,RDNotification::ModifyAction, + QVariant(cartnum)); Exit(0); }