// rdmacro_event.cpp // // A container class for a list of RML macros. // // (C) Copyright 2002-2004,2016 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // #include #include #include #include #include RDMacroEvent::RDMacroEvent(RDRipc *ripc,QObject *parent,const char *name) : QObject(parent,name) { QHostAddress addr; addr.setAddress("127.0.0.1"); event_ripc=ripc; event_address=addr; event_whole_list=false; event_line=-1; event_sleep_timer=new QTimer(this,"event_sleep_timer"); connect(event_sleep_timer,SIGNAL(timeout()),this,SLOT(sleepTimerData())); } RDMacroEvent::RDMacroEvent(QHostAddress addr,RDRipc *ripc, QObject *parent,const char *name) : QObject(parent,name) { event_ripc=ripc; event_address=addr; event_whole_list=false; event_line=-1; event_sleep_timer=new QTimer(this,"event_sleep_timer"); connect(event_sleep_timer,SIGNAL(timeout()),this,SLOT(sleepTimerData())); } RDMacroEvent::~RDMacroEvent() { for(unsigned i=0;ilength(); } return length; } bool RDMacroEvent::load(const QString &str) { RDMacro cmd; QString rmlstr=""; for(int i=0;ifirst()) { delete q; clear(); return false; } bool ret=load(q->value(0).toString()); delete q; return ret; } QString RDMacroEvent::save() { QString str=""; for(unsigned i=0;itoString(); } return str; } void RDMacroEvent::insert(int line,const RDMacro *cmd) { std::vector::iterator it=event_cmds.begin()+line; event_cmds.insert(it,1,new RDMacro(*cmd)); } void RDMacroEvent::remove(int line) { std::vector::iterator it=event_cmds.begin()+line; delete event_cmds[line]; event_cmds.erase(it,it+1); } void RDMacroEvent::move(int from_line,int to_line) { int src_offset=0; if(to_linecommand()) { case RDMacro::SP: // Sleep event_sleeping_line=line; event_sleep_timer->start(event_cmds[line]->arg(0).toInt(),true); break; case RDMacro::CC: // Send Command args=args.split(":",event_cmds[line]->arg(0)); stationname=args[0]; if(args.size()==2) { port=args[1].toUInt(); } if(stationname.lower()=="localhost") { addr.setAddress("127.0.0.2"); rml.setAddress(addr); } else { sql=QString("select VARVALUE from HOSTVARS where ")+ "(STATION_NAME=\""+RDEscapeString(event_ripc->station())+"\")&&"+ "(NAME=\""+RDEscapeString(stationname)+"\")"; q=new RDSqlQuery(sql); if(q->first()) { stationname=q->value(0).toString(); } delete q; station=new RDStation(stationname); if(station->exists()) { rml.setAddress(station->address()); } else { addr.setAddress(stationname); if(addr.isNull()) { emit finished(line); delete station; return; } rml.setAddress(addr); } delete station; } rml.setCommand(event_cmds[line]->arg(1)); for(int i=2;iargQuantity();i++) { rml.addArg(event_cmds[line]->arg(i)); } rml.setRole(RDMacro::Cmd); rml.setPort(port); rml.setEchoRequested(event_cmds[line]->echoRequested()); event_ripc->sendRml(&rml); emit finished(line); break; default: event_ripc->sendRml(event_cmds[line]); emit finished(line); break; } } void RDMacroEvent::stop() { // // This will work only for 'Sleep' [SP] macros -- all others are // assumed to execute 'instaneously', and hence trying to 'stop' // them would make no sense. // if(event_sleep_timer->isActive()) { event_sleep_timer->stop(); emit stopped(); } } void RDMacroEvent::sleepTimerData() { emit finished(event_sleeping_line); if(event_whole_list) { ExecList(event_sleeping_line+1); } } void RDMacroEvent::ExecList(int line) { if(line==0) { event_whole_list=true; emit started(); } for(unsigned i=line;icommand()) { case RDMacro::SP: // Sleep exec(i); return; default: exec(i); break; } } event_whole_list=false; emit finished(); }