mirror of
				https://github.com/ElvishArtisan/rivendell.git
				synced 2025-10-31 22:24:02 +01:00 
			
		
		
		
	* Refactored logging system to use syslog(3) exclusively. * Removed the 'Facility=', 'LogDirectory=', 'CoreDumpDirectory=' and 'LogPattern=' directives from rd.conf(5).
		
			
				
	
	
		
			240 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // local_macros.cpp
 | |
| //
 | |
| // Local macros for the Rivendell netcatcher daemon
 | |
| //
 | |
| //   (C) Copyright 2002-2009,2016-2018 Fred Gleason <fredg@paravelsystems.com>
 | |
| //
 | |
| //   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 <syslog.h>
 | |
| 
 | |
| #include <rdapplication.h>
 | |
| #include <rdcart.h>
 | |
| #include <rduser.h>
 | |
| 
 | |
| #include "rdcatchd.h"
 | |
| 
 | |
| void MainObject::RunLocalMacros(RDMacro *rml)
 | |
| {
 | |
|   RDCart *cart;
 | |
|   RDCut *cut;
 | |
|   RDDeck *deck;
 | |
|   int chan;
 | |
|   unsigned cartnum;
 | |
|   unsigned cutnum;
 | |
|   unsigned dst_cartnum;
 | |
|   unsigned dst_cutnum;
 | |
|   unsigned len;
 | |
|   unsigned decknum;
 | |
|   unsigned eventnum;
 | |
|   QDateTime dt;
 | |
|   RDUser *user;
 | |
|   bool ok=false;
 | |
|   CatchEvent e(rda->station(),RDConfiguration());
 | |
|   unsigned event_ptr=0;
 | |
|   QString sql;
 | |
|   RDSqlQuery *q;
 | |
| 
 | |
|   switch(rml->command()) {
 | |
|   case RDMacro::CE:
 | |
|     if(rml->argQuantity()==2) {
 | |
|       decknum=rml->arg(0).toUInt()-1;
 | |
|       if(decknum<MAX_DECKS) {
 | |
| 	eventnum=rml->arg(1).toUInt();
 | |
| 	if((eventnum>0)&&(eventnum<=RD_CUT_EVENT_ID_QUAN)) {
 | |
| 	  if(catch_record_deck_status[decknum]==RDDeck::Recording) {
 | |
| 	    if((event_ptr=GetEvent(catch_record_id[decknum]))<
 | |
| 	       catch_events.size()) {
 | |
| 	      e=catch_events[event_ptr];
 | |
| 	      sql=QString("insert into CUT_EVENTS set ")+
 | |
| 		"CUT_NAME=\""+e.cutName()+"\","+
 | |
| 		QString().sprintf("NUMBER=%u,",eventnum)+
 | |
| 		QString().sprintf("POINT=%u",e.startTime().
 | |
| 				  msecsTo(QTime::currentTime()));
 | |
| 	      q=new RDSqlQuery(sql);
 | |
| 	      delete q;
 | |
| 	      SendDeckEvent(decknum+1,eventnum);
 | |
| 	    }
 | |
| 	  }
 | |
| 	  if(rml->echoRequested()) {
 | |
| 	    rml->acknowledge(true);
 | |
| 	    rda->ripc()->sendRml(rml);
 | |
| 	  }
 | |
| 	  return;
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
|     if(rml->echoRequested()) {
 | |
|       rml->acknowledge(false);
 | |
|       rda->ripc()->sendRml(rml);
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   case RDMacro::CP:
 | |
|     cartnum=rml->arg(0).toUInt();
 | |
|     cutnum=rml->arg(1).toUInt();
 | |
|     dst_cartnum=rml->arg(2).toUInt();
 | |
|     dst_cutnum=rml->arg(3).toUInt();
 | |
|     if((cartnum<1)||(cartnum>RD_MAX_CART_NUMBER)||
 | |
|        (dst_cartnum<1)||(dst_cartnum>RD_MAX_CART_NUMBER)||
 | |
|        (cutnum<1)||(cutnum>RD_MAX_CUT_NUMBER)||
 | |
|        (dst_cutnum<1)||(dst_cutnum>RD_MAX_CUT_NUMBER)||
 | |
|        (rda->ripc()->user().isEmpty())) {
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|       return;
 | |
|     }
 | |
|     user=new RDUser(rda->ripc()->user());
 | |
|     cut=new RDCut(cartnum,cutnum);
 | |
|     ok=cut->copyTo(rda->station(),user,RDCut::cutName(dst_cartnum,dst_cutnum),
 | |
| 		   rda->config());
 | |
|     delete cut;
 | |
|     delete user;
 | |
|     if(rml->echoRequested()) {
 | |
|       rml->acknowledge(ok);
 | |
|       rda->ripc()->sendRml(rml);
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   case RDMacro::EX:
 | |
|     cart=new RDCart(rml->arg(0).toUInt());
 | |
|     if(cart->exists()) {
 | |
|       if(ExecuteMacroCart(cart)) {
 | |
| 	if(rml->echoRequested()) {
 | |
| 	  rml->acknowledge(true);
 | |
| 	  rda->ripc()->sendRml(rml);
 | |
| 	}
 | |
| 	delete cart;
 | |
| 	return;
 | |
|       }
 | |
|     }
 | |
|     else {
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|     }
 | |
|     delete cart;
 | |
|     return;
 | |
|     break;
 | |
| 
 | |
|   case RDMacro::RS:
 | |
|     //
 | |
|     // Validate Parameters
 | |
|     //
 | |
|     if(rml->argQuantity()!=4) {
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|       return;
 | |
|     }
 | |
|     chan=rml->arg(0).toInt();
 | |
|     cartnum=rml->arg(1).toUInt();
 | |
|     cutnum=rml->arg(2).toUInt();
 | |
|     len=rml->arg(3).toUInt();
 | |
|     if((chan<=0)||(chan>MAX_DECKS)||(cartnum>999999)||(cutnum>999)
 | |
|        ||len==0) {
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|       return;
 | |
|     }
 | |
|     cut=new RDCut(cartnum,cutnum);
 | |
|     deck=new RDDeck(rda->config()->stationName(),chan);
 | |
|     if((!cut->exists())||(!deck->isActive())) {
 | |
|       delete cut;
 | |
|       delete deck;
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|       return;
 | |
|     }
 | |
|     delete cut;
 | |
|     delete deck;
 | |
|     if(catch_record_deck_status[chan-1]!=RDDeck::Idle) {
 | |
|       if(catch_record_aborting[chan-1]&&
 | |
| 	 (catch_record_pending_cartnum[chan-1]==0)) {
 | |
| 	// Cache Event
 | |
| 	catch_record_pending_cartnum[chan-1]=cartnum;
 | |
| 	catch_record_pending_cutnum[chan-1]=cutnum;
 | |
| 	catch_record_pending_maxlen[chan-1]=len;
 | |
| 	if(rml->echoRequested()) {
 | |
| 	  rml->acknowledge(true);
 | |
| 	  rda->ripc()->sendRml(rml);
 | |
| 	}
 | |
| 	return;
 | |
|       }
 | |
|       else {
 | |
| 	syslog(LOG_WARNING,"unable to handle RS macro for deck %d: device busy",
 | |
| 	       chan);
 | |
| 	if(rml->echoRequested()) {
 | |
| 	  rml->acknowledge(false);
 | |
| 	  rda->ripc()->sendRml(rml);
 | |
| 	}
 | |
| 	return;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Create Event
 | |
|     //
 | |
|     StartRmlRecording(chan,cartnum,cutnum,len);
 | |
|     if(rml->echoRequested()) {
 | |
|       rml->acknowledge(true);
 | |
|       rda->ripc()->sendRml(rml);
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   case RDMacro::RR:
 | |
|     if(rml->argQuantity()!=1) {
 | |
|       if(rml->echoRequested()) {
 | |
| 	rml->acknowledge(false);
 | |
| 	rda->ripc()->sendRml(rml);
 | |
|       }
 | |
|       return;
 | |
|     }
 | |
|     chan=rml->arg(0).toInt();
 | |
|     if((chan>0)&&(chan<(MAX_DECKS+1))) {
 | |
|       switch(catch_record_deck_status[chan-1]) {
 | |
|       case RDDeck::Recording:
 | |
| 	catch_record_aborting[chan-1]=true;
 | |
| 	rda->cae()->stopRecord(catch_record_card[chan-1],
 | |
| 			       catch_record_stream[chan-1]);
 | |
| 	break;
 | |
| 	
 | |
|       case RDDeck::Waiting:
 | |
| 	startTimerData(catch_record_id[chan-1]);
 | |
| 	break;
 | |
| 	
 | |
|       default:
 | |
| 	break;
 | |
|       }
 | |
|     }
 | |
|     if(rml->echoRequested()) {
 | |
|       rml->acknowledge(true);
 | |
|       rda->ripc()->sendRml(rml);
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
| }
 |