// rdmacro_event.cpp // // A container class for a list of RML macros. // // (C) Copyright 2002-2004 Fred Gleason // // $Id: rdmacro_event.cpp,v 1.22 2011/03/01 20:35:52 cvs Exp $ // // 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 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(QString str) { char buffer[RD_RML_MAX_LENGTH]; RDMacro cmd; int ptr=0; char c; for(unsigned i=0;ifirst()) { delete q; clear(); return false; } bool ret=load(q->value(0).toString()); delete q; return ret; } QString RDMacroEvent::save() { QString str; char buffer[RD_RML_MAX_LENGTH]; for(unsigned i=0;igenerateString(buffer,RD_RML_MAX_LENGTH-1); str+=QString(buffer); } 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).toString()); stationname=args[0]; if(args.size()==2) { port=args[1].toUInt(); } //stationname=event_cmds[line]->arg(0).toString(); sql= QString().sprintf("select VARVALUE from HOSTVARS \ where (STATION_NAME=\"%s\")&&(NAME=\"%s\")", (const char *)event_ripc->station(), (const char *)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.setArgQuantity(event_cmds[line]->argQuantity()-2); cmd= (RDMacro::Command)(256*event_cmds[line]->arg(1).toString().ascii()[0]+ event_cmds[line]->arg(1).toString().ascii()[1]); rml.setCommand(cmd); for(int i=0;iarg(i+2)); } 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; break; default: exec(i); break; } } event_whole_list=false; emit finished(); }