void MainObject::DispatchCommand(int ch) { QString default_name; char str[RD_RML_MAX_LENGTH]; RDMacro macro; char buffer[RD_RML_MAX_LENGTH]; char cmd[RD_RML_MAX_LENGTH+4]; int echo=0; QHostAddress addr; // // Common Commands // Authentication not required to execute these! // if(!strcmp(args[ch][0],"DC")) { // Drop Connection socket[ch]->close(); KillSocket(ch); return; } if(!strcmp(args[ch][0],"PW")) { // Password Authenticate if(!strcmp(args[ch][1],ripcd_config->password())) { auth[ch]=true; EchoCommand(ch,"PW +!"); return; } else { auth[ch]=false; EchoCommand(ch,"PW -!"); return; } } // // Priviledged Commands // Authentication required to execute these! // if(!auth[ch]) { EchoArgs(ch,'-'); return; } if(!strcmp(args[ch][0],"RU")) { // Request User EchoCommand(ch,(const char *)QString(). sprintf("RU %s!",(const char *)rdstation->userName())); return; } if(!strcmp(args[ch][0],"SU")) { // Set User SetUser(args[ch][1]); } if(!strcmp(args[ch][0],"MS")) { // Send RML Command if(argnum[ch]<4) { return; } strcpy(str,args[ch][3]); for(int i=4;i<argnum[ch];i++) { strcat(str," "); strcat(str,args[ch][i]); } strcat(str,"!"); } if(macro.parseString(str,strlen(str))) { addr.setAddress(args[ch][1]); macro.setAddress(addr); macro.setRole(RDMacro::Cmd); /* char temp[RD_RML_MAX_LENGTH]; macro.generateString(temp,RD_RML_MAX_LENGTH); LogLine(QString().sprintf("RECEIVED: %s ADDR: %s\n",temp,(const char *)macro.address().toString())); */ if(!macro.address().isNull()) { if(macro.address()==rdstation->address()) { // Local Loopback macro.generateString(buffer,RD_RML_MAX_LENGTH); if(macro.echoRequested()) { echo=1; } sprintf(cmd,"MS %s %d %s",(const char *)macro.address().toString(), echo,buffer); RunLocalMacros(¯o); BroadcastCommand(cmd); } else { sendRml(¯o); } } } if(!strcmp(args[ch][0],"ME")) { // Send RML Reply if(argnum[ch]<4) { return; } strcpy(str,args[ch][3]); for(int i=4;i<argnum[ch];i++) { strcat(str," "); strcat(str,args[ch][i]); } strcat(str,"!"); } if(macro.parseString(str,strlen(str))) { QHostAddress addr; addr.setAddress(args[ch][1]); macro.setAddress(addr); macro.setRole(RDMacro::Reply); if(macro.address()==rdstation->address()) { // Local Loopback macro.generateString(buffer,RD_RML_MAX_LENGTH); sprintf(cmd,"ME %s 0 %s",(const char *)macro.address().toString(), buffer); BroadcastCommand(cmd); } else { sendRml(¯o); } } if(!strcmp(args[ch][0],"RG")) { // Reload the GPI Table LoadGpiTable(); } if(!strcmp(args[ch][0],"GI")) { // Send Complete GPI Status int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpi(ch,matrix); } if(!strcmp(args[ch][0],"GO")) { // Send Complete GPO Status int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpo(ch,matrix); } if(!strcmp(args[ch][0],"GM")) { // Send Complete GPI Mask States int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpiMask(ch,matrix); } if(!strcmp(args[ch][0],"GN")) { // Send Complete GPI Mask States int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpoMask(ch,matrix); } if(!strcmp(args[ch][0],"GC")) { // Send Complete GPI Cart Assignments int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpiCart(ch,matrix); } if(!strcmp(args[ch][0],"GD")) { // Send Complete GPO Cart Assignments int matrix; sscanf(args[ch][1],"%d",&matrix); SendGpoCart(ch,matrix); } if(!strcmp(args[ch][0],"TA")) { // Send Onair Flag State EchoCommand(ch,QString().sprintf("TA %d!",ripc_onair_flag)); } }
void MainObject::ParseLine(int fd) { // printf("RECV: %s LEN: %u\n",(const char *)mld_connections[fd]->buffer, // strlen(mld_connections[fd]->buffer)); bool esc=false; QString sql; QSqlQuery *q; std::vector<QString> args; args.push_back(QString()); for(unsigned i=0;i<(strlen(mld_connections[fd]->buffer)-1);i++) { switch(mld_connections[fd]->buffer[i]) { case '\\': args.back()+=mld_connections[fd]->buffer[i]; esc=!esc; break; case ' ': if(esc) { args.back()+=mld_connections[fd]->buffer[i]; esc=false; } else { args.push_back(QString()); } break; default: args.back()+=mld_connections[fd]->buffer[i]; esc=false; break; } } mld_connections[fd]->ptr=0; if(args.size()<1) { return; } args.back().stripWhiteSpace(); // // Unprivileged Commands // if((args[0]=="LH")&&(args.size()==3)) { // Login to Host sql=QString().sprintf("select LOGIN_NAME from USERS where \ (LOGIN_NAME=\"%s\")&&\ (PASSWORD=\"%s\")&&\ (SCREENER_PRIV=\"Y\")", (const char *)VirtualDriver::restoreString(args[1]), (const char *)VirtualDriver:: stripQuotes(VirtualDriver::restoreString(args[2]))); q=new QSqlQuery(sql); if(q->first()) { mld_connections[fd]->setUserName(VirtualDriver::restoreString(args[1])); mld_connections[fd]->setAuthenticated(true); EchoArgs(fd,&args,true); } else { EchoArgs(fd,&args,false); } delete q; return; }