void Xport::AddCut() { RDCart *cart; RDCut *cut; int cart_number; int cut_number; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!rda->user()->editAudio()) { XmlExit("Unauthorized",401); } // // Process Request // cart=new RDCart(cart_number); if(!cart->exists()) { delete cart; XmlExit("No such cart",404); } if((cut_number=cart->addCut(0,0,2))<0) { delete cart; XmlExit("No new cuts available",500); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cutAdd>\n"); cut=new RDCut(cart_number,cut_number); if(cut->exists()) { printf("%s",(const char *)cut->xml(true)); } delete cut; delete cart; printf("</cutAdd>\n"); Exit(0); }
void Xport::ListCuts() { RDCut *cut; int cart_number; QString sql; RDSqlQuery *q; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Process Request // sql=QString("select CUT_NAME from CUTS where ")+ QString().sprintf("CART_NUMBER=%u ",cart_number)+ "order by CUT_NAME"; q=new RDSqlQuery(sql); printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cutList>\n"); while(q->next()) { cut=new RDCut(q->value(0).toString()); if(cut->exists()) { printf("%s",(const char *)cut->xml(true)); } delete cut; } delete q; printf("</cutList>\n"); Exit(0); }
void Xport::ListCartSchedCodes() { int cart_number; RDCart *cart; QStringList codes; RDSchedCode *schedcode; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Generate Scheduler Code List // cart=new RDCart(cart_number); codes=cart->schedCodesList(); // // Process Request // printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<schedCodeList>\n"); for(int i=0;i<codes.size();i++) { schedcode=new RDSchedCode(codes[i]); printf("%s",(const char *)schedcode->xml().utf8()); delete schedcode; } printf("</schedCodeList>\n"); Exit(0); }
void Xport::ExportPeaks() { // // Verify Post // int cartnum=0; if(!xport_post->getValue("CART_NUMBER",&cartnum)) { XmlExit("Missing CART_NUMBER",400); } int cutnum=0; if(!xport_post->getValue("CUT_NUMBER",&cutnum)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!rdcgi->user()->cartAuthorized(cartnum)) { XmlExit("No such cart",404); } // // Open Audio File // RDWaveFile *wave=new RDWaveFile(RDCut::pathName(cartnum,cutnum)); if(!wave->openWave()) { XmlExit("No such audio",404); } if(!wave->hasEnergy()) { XmlExit("No peak data available",400); } // // Send Data // printf("Content-type: application/octet-stream\n\n"); fflush(NULL); unsigned short *peaks=new unsigned short[wave->energySize()]; wave->readEnergy(peaks,wave->energySize()); write(1,peaks,sizeof(unsigned short)*wave->energySize()); Exit(0); }
void Xport::ListCut() { RDCut *cut; int cart_number; int cut_number; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CUT_NUMBER",&cut_number)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Process Request // cut=new RDCut(cart_number,cut_number); if(!cut->exists()) { delete cut; XmlExit("No such cut",404); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cutList>\n"); printf("%s",(const char *)cut->xml(true)); printf("</cutList>\n"); delete cut; Exit(0); }
void Xport::CopyAudio() { // // Verify Post // int source_cartnum=0; if(!xport_post->getValue("SOURCE_CART_NUMBER",&source_cartnum)) { XmlExit("Missing SOURCE_CART_NUMBER",400); } int source_cutnum=0; if(!xport_post->getValue("SOURCE_CUT_NUMBER",&source_cutnum)) { XmlExit("Missing SOURCE_CUT_NUMBER",400); } int destination_cartnum=0; if(!xport_post->getValue("DESTINATION_CART_NUMBER",&destination_cartnum)) { XmlExit("Missing DESTINATION_CART_NUMBER",400); } int destination_cutnum=0; if(!xport_post->getValue("DESTINATION_CUT_NUMBER",&destination_cutnum)) { XmlExit("Missing DESTINATION_CUT_NUMBER",400); } // // Verify User Perms // if(!rdcgi->user()->cartAuthorized(source_cartnum)) { XmlExit("No such cart",404); } if(!rdcgi->user()->cartAuthorized(destination_cartnum)) { XmlExit("No such cart",404); } // // Make the copy // unlink(RDCut::pathName(destination_cartnum,destination_cutnum)); if(link(RDCut::pathName(source_cartnum,source_cutnum), RDCut::pathName(destination_cartnum,destination_cutnum))!=0) { XmlExit("dst: "+RDCut::pathName(source_cartnum,source_cutnum)+" src: "+ RDCut::pathName(destination_cartnum,destination_cutnum),400); XmlExit(strerror(errno),400); } XmlExit("OK",200); }
void Xport::ListGroup() { QString sql; RDSqlQuery *q; RDGroup *group; // // Verify Post // QString group_name; if(!xport_post->getValue("GROUP_NAME",&group_name)) { XmlExit("Missing GROUP_NAME",400); } // // Check Group Accessibility // sql=QString().sprintf("select GROUP_NAME from USER_PERMS \ where (USER_NAME=\"%s\")&&(GROUP_NAME=\"%s\")", (const char *)RDEscapeString(rdcgi->user()->name()), (const char *)RDEscapeString(group_name)); q=new RDSqlQuery(sql); if(!q->first()) { delete q; XmlExit("No such group",404); } // // Process Request // printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); group=new RDGroup(q->value(0).toString()); printf("%s",(const char *)group->xml()); delete group; delete q; Exit(0); }
void Xport::UnassignSchedCode() { int cart_number; QString sched_code; QStringList codes; RDCart *cart=NULL; RDSchedCode *code; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CODE",&sched_code)) { XmlExit("Missing CODE",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Process Request // cart=new RDCart(cart_number); code=new RDSchedCode(sched_code); if(!code->exists()) { XmlExit("No such scheduler code",404); } cart->removeSchedCode(sched_code); delete cart; delete code; XmlExit("OK",200); }
void Xport::ListCart() { QString where=""; RDCart *cart; int cart_number; int include_cuts; QString value; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } xport_post->getValue("INCLUDE_CUTS",&include_cuts); // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Process Request // printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cartList>\n"); cart=new RDCart(cart_number); printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; printf("</cartList>\n"); Exit(0); }
void Xport::AudioStore() { struct statvfs stat; memset(&stat,0,sizeof(stat)); if(statvfs(xport_config->audioRoot(),&stat)<0) { XmlExit("Internal Error",400); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<audioStore>\n"); printf(" <freeBytes>%lu</freeBytes>\n",stat.f_bfree*stat.f_bsize); printf(" <totalBytes>%lu</totalBytes>\n",stat.f_blocks*stat.f_bsize); printf("</audioStore>\n"); Exit(0); }
void Xport::CheckPointerValidity(int ptr_values[2],bool use_ptrs[2], const QString &type,unsigned max_value) { bool start_ok=false; bool end_ok=false; use_ptrs[0]=xport_post->getValue(type+"START_POINT",&ptr_values[0],&start_ok); use_ptrs[1]=xport_post->getValue(type+"END_POINT",&ptr_values[1],&end_ok); if((!use_ptrs[0])&&(!use_ptrs[1])) { return; } if(!start_ok) { XmlExit("invalid "+type+"START_POINT",400); } if(!end_ok) { XmlExit("invalid "+type+"END_POINT",400); } if(use_ptrs[0]!=use_ptrs[1]) { XmlExit("both "+type+"*_POINT values must be set together",400); } if(use_ptrs[0]) { if(((ptr_values[0]<0)&&(ptr_values[1]>=0))|| ((ptr_values[0]>=0)&&(ptr_values[1]<0))) { XmlExit("inconsistent "+type+"*_POINT values",400); } } if(ptr_values[0]>=0) { if(ptr_values[0]>ptr_values[1]) { XmlExit(type+"START_POINT greater than "+type+"END_POINT",400); } if((max_value>0)&&((unsigned)ptr_values[1]>max_value)) { XmlExit(type+"END_POINT exceeds length of cut",400); } } else { if(max_value==0) { XmlExit("End markers cannot be removed",400); } else { ptr_values[0]=-1; ptr_values[1]=-1; } } }
void Xport::RemoveCut() { RDCart *cart; int cart_number; int cut_number; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CUT_NUMBER",&cut_number)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!xport_user->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!xport_user->editAudio()) { XmlExit("Unauthorized",401); } // // Process Request // cart=new RDCart(cart_number); if(!cart->exists()) { delete cart; XmlExit("No such cart",404); } if(!cart->removeCut(NULL,NULL,RDCut::cutName(cart_number,cut_number), xport_config)) { delete cart; XmlExit("No such cut",404); } delete cart; XmlExit("OK",200); }
void Xport::AssignSchedCode() { int cart_number; QString sched_code; QStringList codes; RDCart *cart=NULL; RDSchedCode *code; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CODE",&sched_code)) { XmlExit("Missing CODE",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } // // Process Request // cart=new RDCart(cart_number); code=new RDSchedCode(sched_code); if(!code->exists()) { XmlExit("No such scheduler code",404); } codes=cart->schedCodesList(); for(int i=0;i<codes.size();i++) { if(codes[i]==sched_code) { delete cart; XmlExit("OK",200); } } cart->addSchedCode(sched_code); XmlExit("OK",200); }
void Xport::RemoveCart() { RDCart *cart; int cart_number; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!rda->user()->deleteCarts()) { XmlExit("Unauthorized",401); } // // Process Request // cart=new RDCart(cart_number); if(!cart->exists()) { delete cart; XmlExit("No such cart",404); } if(!cart->remove(true)) { delete cart; XmlExit("Unable to delete cart",500); } delete cart; XmlExit("OK",200); }
void Xport::AudioInfo() { RDWaveFile::Format format=RDWaveFile::Pcm16;; // // Verify Post // int cartnum=0; if(!xport_post->getValue("CART_NUMBER",&cartnum)) { XmlExit("Missing CART_NUMBER",400); } int cutnum=0; if(!xport_post->getValue("CUT_NUMBER",&cutnum)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!xport_user->cartAuthorized(cartnum)) { XmlExit("No such cart",404); } // // Open Audio File // RDWaveFile *wave=new RDWaveFile(RDCut::pathName(cartnum,cutnum)); if(!wave->openWave()) { XmlExit("No such audio",404); } // // Send Data // printf("Content-type: application/xml\n\n"); switch(wave->getFormatTag()) { case WAVE_FORMAT_PCM: format=RDWaveFile::Pcm16; break; case WAVE_FORMAT_IEEE_FLOAT: format=RDWaveFile::Float32; break; case WAVE_FORMAT_MPEG: switch(wave->getHeadLayer()) { case 1: format=RDWaveFile::MpegL1; break; case 2: format=RDWaveFile::MpegL2; break; case 3: format=RDWaveFile::MpegL3; break; } break; default: XmlExit("Unknown audio format",400); break; } printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<audioInfo>\n"); printf(" <cartNumber>%u</cartNumber>\n",cartnum); printf(" <cutNumber>%u</cutNumber>\n",cutnum); printf(" <format>%d</format>\n",format); printf(" <channels>%d</channels>\n",wave->getChannels()); printf(" <sampleRate>%d</sampleRate>\n",wave->getSamplesPerSec()); printf(" <frames>%u</frames>\n",wave->getSampleLength()); printf(" <length>%u</length>\n",wave->getExtTimeLength()); printf("</audioInfo>\n"); delete wave; Exit(0); }
void Xport::EditCut() { RDCut *cut; int cart_number; int cut_number; QString str; int num; QDateTime datetime; QTime time; bool rotation_changed=false; bool length_changed=false; QDateTime start_datetime; bool use_start_datetime=false; QDateTime end_datetime; bool use_end_datetime=false; QTime start_daypart; bool use_start_daypart=false; QTime end_daypart; bool use_end_daypart=false; int talk_points[2]; bool use_end_points[2]={false,false}; int end_points[2]; bool use_talk_points[2]={false,false}; int segue_points[2]; bool use_segue_points[2]={false,false}; int hook_points[2]; bool use_hook_points[2]={false,false}; int fadeup_point; bool use_fadeup_point=false; int fadedown_point; bool use_fadedown_point=false; bool use_weight=false; int weight; bool ok=false; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CUT_NUMBER",&cut_number)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!rda->user()->editAudio()) { XmlExit("Unauthorized",401); } // // Check Date/Time Values for Validity // if((use_start_datetime=xport_post-> getValue("START_DATETIME",&start_datetime,&ok))) { if(!ok) { XmlExit("invalid START_DATETIME",400); } } if((use_end_datetime=xport_post-> getValue("END_DATETIME",&end_datetime,&ok))) { if(!ok) { XmlExit("invalid END_DATETIME",400); } } if(use_start_datetime!=use_end_datetime) { XmlExit("both DATETIME values must be set together",400); } if(use_start_datetime&&(start_datetime>end_datetime)) { XmlExit("START_DATETIME is later than END_DATETIME",400); } if((use_start_daypart=xport_post-> getValue("START_DAYPART",&start_daypart,&ok))) { if(!ok) { XmlExit("invalid START_DAYPART",400); } } if((use_end_daypart=xport_post-> getValue("END_DAYPART",&end_daypart,&ok))) { if(!ok) { XmlExit("invalid END_DAYPART",400); } } if(use_start_daypart!=use_end_daypart) { XmlExit("both DAYPART values must be set together",400); } cut=new RDCut(cart_number,cut_number); if(!cut->exists()) { delete cut; XmlExit("No such cut",404); } // // Check pointers for validity // end_points[0]=cut->startPoint(); end_points[1]=cut->endPoint(); fadeup_point=cut->fadeupPoint(); fadedown_point=cut->fadedownPoint(); CheckPointerValidity(end_points,use_end_points,"",0); CheckPointerValidity(talk_points,use_talk_points,"TALK_",end_points[1]); CheckPointerValidity(segue_points,use_segue_points,"SEGUE_",end_points[1]); CheckPointerValidity(hook_points,use_hook_points,"HOOK_",end_points[1]); if((use_fadeup_point=xport_post-> getValue("FADEUP_POINT",&fadeup_point,&ok))) { if(!ok) { XmlExit("invalid FADEUP_POINT",400); } if(fadeup_point>end_points[1]) { XmlExit("FADEUP_POINT exceeds length of cart",400); } } if((use_fadedown_point=xport_post-> getValue("FADEDOWN_POINT",&fadedown_point,&ok))) { if(!ok) { XmlExit("invalid FADEDOWN_POINT",400); } if(fadeup_point>end_points[1]) { XmlExit("FADEDOWN_POINT exceeds length of cart",400); } } if(use_fadeup_point&&use_fadedown_point&& (fadeup_point>=0)&&(fadedown_point>=0)&&(fadeup_point>fadedown_point)) { XmlExit("FADEUP_POINT is greater than FADEDOWN_POINT",400); } // // Check Weight // if((use_weight=xport_post->getValue("WEIGHT",&weight,&ok))) { if((!ok)||(weight<0)) { XmlExit("invalid WEIGHT",400); } } // // Process Request // if(xport_post->getValue("EVERGREEN",&num)) { cut->setEvergreen(num); rotation_changed=true; } if(xport_post->getValue("DESCRIPTION",&str)) { cut->setDescription(str); } if(xport_post->getValue("OUTCUE",&str)) { cut->setOutcue(str); } if(xport_post->getValue("ISRC",&str)) { cut->setIsrc(str); } if(xport_post->getValue("ISCI",&str)) { cut->setIsci(str); } if(use_start_datetime) { cut->setStartDatetime(start_datetime,!start_datetime.isNull()); length_changed=true; rotation_changed=true; } if(use_end_datetime) { cut->setEndDatetime(end_datetime,!end_datetime.isNull()); length_changed=true; rotation_changed=true; } if(xport_post->getValue("MON",&num)) { cut->setWeekPart(1,num); rotation_changed=true; } if(xport_post->getValue("TUE",&num)) { cut->setWeekPart(2,num); rotation_changed=true; } if(xport_post->getValue("WED",&num)) { cut->setWeekPart(3,num); rotation_changed=true; } if(xport_post->getValue("THU",&num)) { cut->setWeekPart(4,num); rotation_changed=true; } if(xport_post->getValue("FRI",&num)) { cut->setWeekPart(5,num); rotation_changed=true; } if(xport_post->getValue("SAT",&num)) { cut->setWeekPart(6,num); rotation_changed=true; } if(xport_post->getValue("SUN",&num)) { cut->setWeekPart(7,num); rotation_changed=true; } if(use_start_daypart) { cut->setStartDaypart(start_daypart,!start_daypart.isNull()); rotation_changed=true; } if(use_end_daypart) { cut->setEndDaypart(end_daypart,!end_daypart.isNull()); rotation_changed=true; } if(use_weight) { cut->setWeight(weight); rotation_changed=true; } if(use_end_points[0]) { cut->setStartPoint(end_points[0]); length_changed=true; } if(use_end_points[1]) { cut->setEndPoint(end_points[1]); length_changed=true; } if(use_fadeup_point) { cut->setFadeupPoint(fadeup_point); length_changed=true; } if(use_fadedown_point) { cut->setFadedownPoint(fadedown_point); length_changed=true; } if(use_segue_points[0]) { cut->setSegueStartPoint(segue_points[0]); length_changed=true; } if(use_segue_points[1]) { cut->setSegueEndPoint(segue_points[1]); length_changed=true; } if(use_hook_points[0]) { cut->setHookStartPoint(hook_points[0]); length_changed=true; } if(use_hook_points[1]) { cut->setHookEndPoint(hook_points[1]); length_changed=true; } if(use_talk_points[0]) { cut->setTalkStartPoint(talk_points[0]); length_changed=true; } if(use_talk_points[1]) { cut->setTalkEndPoint(talk_points[1]); length_changed=true; } if(length_changed||rotation_changed) { RDCart *cart=new RDCart(cut->cartNumber()); if(length_changed) { cart->updateLength(); } if(rotation_changed) { cart->resetRotation(); } delete cart; } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cutList>\n"); printf("%s",(const char *)cut->xml(true)); printf("</cutList>\n"); delete cut; Exit(0); }
void Xport::TrimAudio() { int point; // // Verify Post // int cartnum=0; if(!xport_post->getValue("CART_NUMBER",&cartnum)) { XmlExit("Missing CART_NUMBER",400); } int cutnum=0; if(!xport_post->getValue("CUT_NUMBER",&cutnum)) { XmlExit("Missing CUT_NUMBER",400); } int trim_level=0; if(!xport_post->getValue("TRIM_LEVEL",&trim_level)) { XmlExit("Missing TRIM_LEVEL",400); } // // Verify User Perms // if(!rda->user()->cartAuthorized(cartnum)) { XmlExit("No such cart",404); } // // Open Audio File // RDWaveFile *wave=new RDWaveFile(RDCut::pathName(cartnum,cutnum)); if(!wave->openWave()) { XmlExit("No such audio",404); } if(!wave->hasEnergy()) { XmlExit("No peak data available",400); } // // Send Data // printf("Content-type: application/xml\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<trimPoint>\n"); printf(" <cartNumber>%u</cartNumber>\n",cartnum); printf(" <cutNumber>%d</cutNumber>\n",cutnum); printf(" <trimLevel>%d</trimLevel>\n",trim_level); point=wave->startTrim(REFERENCE_LEVEL-trim_level); if(point>=0) { point=(double)point*1000.0/(double)wave->getSamplesPerSec(); } printf(" <startTrimPoint>%d</startTrimPoint>\n",point); point=wave->endTrim(REFERENCE_LEVEL-trim_level); if(point>=0) { point=(double)point*1000.0/(double)wave->getSamplesPerSec(); } printf(" <endTrimPoint>%d</endTrimPoint>\n",point); printf("</trimPoint>\n"); Exit(0); }
void Xport::AddCart() { RDCart *cart; RDGroup *group; QString group_name; QString type; RDCart::Type cart_type=RDCart::All; int cart_number=0; // // Verify Post // if(!xport_post->getValue("GROUP_NAME",&group_name)) { XmlExit("Missing GROUP_NAME",400); } if(!xport_post->getValue("TYPE",&type)) { XmlExit("Missing TYPE",400); } if(type.lower()=="audio") { cart_type=RDCart::Audio; } else { if(type.lower()=="macro") { cart_type=RDCart::Macro; } else { XmlExit("Invalid TYPE",400); } } xport_post->getValue("CART_NUMBER",&cart_number); // // Verify User Perms // if(!rda->user()->groupAuthorized(group_name)) { XmlExit("No such group",404); } group=new RDGroup(group_name); if(cart_number==0) { if((cart_number=group->nextFreeCart())==0) { delete group; XmlExit("No free carts in group",500); } } if(!group->cartNumberValid(cart_number)) { delete group; XmlExit("Cart number out of range for group",401); } delete group; if(!rda->user()->createCarts()) { XmlExit("Unauthorized",401); } // // Process Request // cart=new RDCart(cart_number); if(cart->exists()) { delete cart; XmlExit("Cart already exists",403); } if(!cart->create(group_name,cart_type)) { delete cart; XmlExit("Unable to create cart",500); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cartAdd>\n"); if(cart->exists()) { printf("%s",(const char *)cart->xml(false,true)); } delete cart; printf("</cartAdd>\n"); Exit(0); }
void Xport::EditCart() { QString where=""; RDCart *cart; RDGroup *group; int cart_number; int include_cuts=0; QString group_name; QString value; int number; bool ok; int line; QString macro; bool length_changed=false; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } xport_post->getValue("INCLUDE_CUTS",&include_cuts); // // Verify User Perms // if(!rda->user()->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!rda->user()->modifyCarts()) { XmlExit("Unauthorized",401); } if(xport_post->getValue("GROUP_NAME",&group_name)) { if(!rda->user()->groupAuthorized(group_name)) { XmlExit("No such group",404); } group=new RDGroup(group_name); if(!group->exists()) { delete group; XmlExit("No such group",404); } if(group->enforceCartRange()) { if(((unsigned)cart_number<group->defaultLowCart())|| ((unsigned)cart_number>group->defaultHighCart())) { delete group; XmlExit("Invalid cart number for group",409); } } delete group; } // // Process Request // cart=new RDCart(cart_number); if(!cart->exists()) { delete cart; XmlExit("No such cart",404); } if(xport_post->getValue("FORCED_LENGTH",&value)) { number=RDSetTimeLength(value); if(cart->type()==RDCart::Macro) { delete cart; XmlExit("Unsupported operation for cart type",403); } if(!cart->validateLengths(number)) { delete cart; XmlExit("Forced length out of range",403); } } switch(cart->type()) { case RDCart::Audio: break; case RDCart::Macro: line=0; while(xport_post->getValue(QString().sprintf("MACRO%d",line++),&value)) { value.stripWhiteSpace(); if(value.right(1)!="!") { delete cart; XmlExit("Invalid macro data",400); } macro+=value; } cart->setMacros(macro); break; case RDCart::All: break; } if(!group_name.isEmpty()) { cart->setGroupName(group_name); } if(xport_post->getValue("TITLE",&value)) { cart->setTitle(value); } if(xport_post->getValue("ARTIST",&value)) { cart->setArtist(value); } if(xport_post->getValue("ALBUM",&value)) { cart->setAlbum(value); } if(xport_post->getValue("YEAR",&value)) { number=value.toInt(&ok); if((ok)&&(number>0)) { cart->setYear(number); } } if(xport_post->getValue("LABEL",&value)) { cart->setLabel(value); } if(xport_post->getValue("CLIENT",&value)) { cart->setClient(value); } if(xport_post->getValue("AGENCY",&value)) { cart->setAgency(value); } if(xport_post->getValue("PUBLISHER",&value)) { cart->setPublisher(value); } if(xport_post->getValue("COMPOSER",&value)) { cart->setComposer(value); } if(xport_post->getValue("USER_DEFINED",&value)) { cart->setUserDefined(value); } if(xport_post->getValue("USAGE_CODE",&value)) { number=value.toInt(&ok); if((ok)&&(number>0)) { cart->setUsageCode((RDCart::UsageCode)number); } } if(xport_post->getValue("ENFORCE_LENGTH",&value)) { number=value.toInt(&ok); if((ok)&&(number>=0)&&(number<2)) { cart->setEnforceLength(number); length_changed=true; } } if(xport_post->getValue("FORCED_LENGTH",&value)) { cart->setForcedLength(RDSetTimeLength(value)); length_changed=true; } if(xport_post->getValue("ASYNCRONOUS",&value)) { number=value.toInt(&ok); if((ok)&&(number>=0)&&(number<2)) { cart->setAsyncronous(number); length_changed=true; } } if(xport_post->getValue("OWNER",&value)) { cart->setOwner(value); } if(xport_post->getValue("NOTES",&value)) { cart->setNotes(value); } if(xport_post->getValue("SCHED_CODES",&value)) { cart->setSchedCodes(value); } if(length_changed) { cart->updateLength(); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cartList>\n"); printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; printf("</cartList>\n"); Exit(0); }
void Xport::ListCarts() { QString sql; RDSqlQuery *q; QString where=""; RDCart *cart; QString group_name; QString filter; int include_cuts; RDCart::Type cart_type=RDCart::All; QString type; // // Verify Post // xport_post->getValue("GROUP_NAME",&group_name); xport_post->getValue("FILTER",&filter); xport_post->getValue("INCLUDE_CUTS",&include_cuts); xport_post->getValue("TYPE",&type); if(type.lower()=="audio") { cart_type=RDCart::Audio; } if(type.lower()=="macro") { cart_type=RDCart::Macro; } // // Generate Cart List // if(group_name.isEmpty()||(group_name==tr("ALL"))) { where=RDAllCartSearchText(filter,"",rda->user()->name(),false); } else { sql=QString("select GROUP_NAME from USER_PERMS where ")+ "(GROUP_NAME=\""+RDEscapeString(group_name)+"\")&&"+ "(USER_NAME=\""+RDEscapeString(rda->user()->name())+"\")"; q=new RDSqlQuery(sql); if(!q->first()) { delete q; XmlExit("No such group",404); } where=RDCartSearchText(filter,group_name,"",false); } if(cart_type!=RDCart::All) { where+=QString().sprintf("&&(TYPE=%u)",cart_type); } sql="select NUMBER from CART where "+where+"order by NUMBER"; q=new RDSqlQuery(sql); // // Process Request // printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); printf("<cartList>\n"); while(q->next()) { cart=new RDCart(q->value(0).toUInt()); printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; } printf("</cartList>\n"); delete q; Exit(0); }
void Xport::Export() { RDAudioConvert::ErrorCode conv_err=RDAudioConvert::ErrorOk; int resp_code=0; // // Verify Post // int cartnum=0; if(!xport_post->getValue("CART_NUMBER",&cartnum)) { XmlExit("Missing CART_NUMBER",400); } int cutnum=0; if(!xport_post->getValue("CUT_NUMBER",&cutnum)) { XmlExit("Missing CUT_NUMBER",400); } int format=0; if(!xport_post->getValue("FORMAT",&format)) { XmlExit("Missing FORMAT",400); } int channels=0; if(!xport_post->getValue("CHANNELS",&channels)) { XmlExit("Missing CHANNELS",400); } int sample_rate=0; if(!xport_post->getValue("SAMPLE_RATE",&sample_rate)) { XmlExit("Missing SAMPLE_RATE",400); } int bit_rate=0; if(!xport_post->getValue("BIT_RATE",&bit_rate)) { XmlExit("Missing BIT_RATE",400); } int quality=0; if(!xport_post->getValue("QUALITY",&quality)) { XmlExit("Missing QUALITY",400); } int start_point=-1; if(!xport_post->getValue("START_POINT",&start_point)) { XmlExit("Missing START_POINT",400); } int end_point=-1; if(!xport_post->getValue("END_POINT",&end_point)) { XmlExit("Missing END_POINT",400); } int normalization_level=0; if(!xport_post->getValue("NORMALIZATION_LEVEL",&normalization_level)) { XmlExit("Missing NORMALIZATION_LEVEL",400); } int enable_metadata=false; if(!xport_post->getValue("ENABLE_METADATA",&enable_metadata)) { XmlExit("Missing ENABLE_METADATA",400); } if(!RDCart::exists(cartnum)) { XmlExit("No such cart",404); } if(!RDCut::exists(cartnum,cutnum)) { XmlExit("No such cut",404); } // // Verify User Perms // if(!xport_user->cartAuthorized(cartnum)) { XmlExit("No such cart",404); } // // Generate Metadata // RDWaveData *wavedata=NULL; float speed_ratio=1.0; if(enable_metadata!=0) { wavedata=new RDWaveData(); } if(wavedata!=NULL) { RDCart *cart=new RDCart(cartnum); RDCut *cut=new RDCut(cartnum,cutnum); cart->getMetadata(wavedata); cut->getMetadata(wavedata); if(cart->enforceLength()) { speed_ratio=(float)cut->length()/(float)cart->forcedLength(); } delete cut; delete cart; } // // Export Cut // int fd; ssize_t n; uint8_t data[2048]; QString tmpdir=RDTempDir(); QString tmpfile=tmpdir+"/exported_audio"; RDSettings *settings=new RDSettings(); settings->setFormat((RDSettings::Format)format); settings->setChannels(channels); settings->setSampleRate(sample_rate); settings->setBitRate(bit_rate); settings->setQuality(quality); settings->setNormalizationLevel(normalization_level); RDAudioConvert *conv=new RDAudioConvert(xport_config->stationName()); conv->setSourceFile(RDCut::pathName(cartnum,cutnum)); conv->setDestinationFile(tmpfile); conv->setDestinationSettings(settings); conv->setDestinationWaveData(wavedata); conv->setRange(start_point,end_point); conv->setSpeedRatio(speed_ratio); switch(conv_err=conv->convert()) { case RDAudioConvert::ErrorOk: switch(settings->format()) { case RDSettings::Pcm16: case RDSettings::Pcm24: printf("Content-type: audio/x-wav\n\n"); break; case RDSettings::MpegL1: case RDSettings::MpegL2: case RDSettings::MpegL2Wav: case RDSettings::MpegL3: printf("Content-type: audio/x-mpeg\n\n"); break; case RDSettings::OggVorbis: printf("Content-type: audio/ogg\n\n"); break; case RDSettings::Flac: printf("Content-type: audio/flac\n\n"); break; } fflush(NULL); if((fd=open(tmpfile,O_RDONLY))>=0) { while((n=read(fd,data,2048))>0) { write(1,data,n); } } close(fd); unlink(tmpfile); rmdir(tmpdir); Exit(0); break; case RDAudioConvert::ErrorFormatNotSupported: case RDAudioConvert::ErrorInvalidSettings: resp_code=415; break; case RDAudioConvert::ErrorNoSource: case RDAudioConvert::ErrorNoDestination: case RDAudioConvert::ErrorInvalidSource: case RDAudioConvert::ErrorNoSpace: case RDAudioConvert::ErrorInternal: case RDAudioConvert::ErrorNoDisc: case RDAudioConvert::ErrorNoTrack: case RDAudioConvert::ErrorInvalidSpeed: case RDAudioConvert::ErrorFormatError: resp_code=500; break; } delete conv; delete settings; if(wavedata!=NULL) { delete wavedata; } unlink(tmpfile); rmdir(tmpdir); Exit(resp_code); }
void Xport::Import() { unsigned length_deviation=0; unsigned msecs; int resp_code=0; // // Verify Post // int cartnum=0; if(!xport_post->getValue("CART_NUMBER",&cartnum)) { XmlExit("Missing CART_NUMBER",400); } int cutnum=0; if(!xport_post->getValue("CUT_NUMBER",&cutnum)) { XmlExit("Missing CUT_NUMBER",400); } int channels=0; if(!xport_post->getValue("CHANNELS",&channels)) { XmlExit("Missing CHANNELS",400); } int normalization_level=0; if(!xport_post->getValue("NORMALIZATION_LEVEL",&normalization_level)) { XmlExit("Missing NORMALIZATION_LEVEL",400); } int autotrim_level=0; if(!xport_post->getValue("AUTOTRIM_LEVEL",&autotrim_level)) { XmlExit("Missing AUTOTRIM_LEVEL",400); } int use_metadata=0; if(!xport_post->getValue("USE_METADATA",&use_metadata)) { XmlExit("Missing USE_METADATA",400); } QString filename; if(!xport_post->getValue("FILENAME",&filename)) { XmlExit("Missing FILENAME",400); } if(!RDCart::exists(cartnum)) { XmlExit("No such cart",404); } if(!RDCut::exists(cartnum,cutnum)) { XmlExit("No such cut",404); } if(!xport_post->isFile("FILENAME")) { XmlExit("Missing file data",400); } // // Verify User Perms // if(!xport_user->cartAuthorized(cartnum)) { XmlExit("No such cart",404); } if(!xport_user->editAudio()) { XmlExit("Unauthorized",401); } // // Load Configuration // RDCart *cart=new RDCart(cartnum); RDCut *cut=new RDCut(cartnum,cutnum); RDLibraryConf *conf=new RDLibraryConf(xport_config->stationName(),0); RDSettings *settings=new RDSettings(); switch(conf->defaultFormat()) { case 0: settings->setFormat(RDSettings::Pcm16); break; case 1: settings->setFormat(RDSettings::MpegL2Wav); break; case 2: settings->setFormat(RDSettings::Pcm24); break; } settings->setChannels(channels); settings->setSampleRate(xport_system->sampleRate()); settings->setBitRate(channels*conf->defaultBitrate()); settings->setNormalizationLevel(normalization_level); RDWaveFile *wave=new RDWaveFile(filename); if(!wave->openWave()) { delete wave; XmlExit("Format Not Supported",415); } msecs=wave->getExtTimeLength(); delete wave; RDAudioConvert *conv=new RDAudioConvert(xport_config->stationName()); conv->setSourceFile(filename); conv->setDestinationFile(RDCut::pathName(cartnum,cutnum)); conv->setDestinationSettings(settings); RDAudioConvert::ErrorCode conv_err=conv->convert(); switch(conv_err) { case RDAudioConvert::ErrorOk: cut->checkInRecording(xport_config->stationName(),settings,msecs); if(use_metadata>0) { cart->setMetadata(conv->sourceWaveData()); cut->setMetadata(conv->sourceWaveData()); } if(autotrim_level!=0) { cut->autoTrim(RDCut::AudioBoth,100*autotrim_level); } cart->updateLength(); cart->resetRotation(); cart->calculateAverageLength(&length_deviation); cart->setLengthDeviation(length_deviation); resp_code=200; break; case RDAudioConvert::ErrorFormatNotSupported: case RDAudioConvert::ErrorInvalidSettings: resp_code=415; break; case RDAudioConvert::ErrorNoSource: case RDAudioConvert::ErrorNoDestination: case RDAudioConvert::ErrorInvalidSource: case RDAudioConvert::ErrorInternal: case RDAudioConvert::ErrorNoSpace: case RDAudioConvert::ErrorNoDisc: case RDAudioConvert::ErrorNoTrack: case RDAudioConvert::ErrorInvalidSpeed: resp_code=500; break; case RDAudioConvert::ErrorFormatError: resp_code=400; break; } delete conv; delete settings; delete conf; delete cut; delete cart; XmlExit(RDAudioConvert::errorText(conv_err),resp_code,conv_err); }
void Xport::EditCut() { RDCut *cut; int cart_number; int cut_number; QString str; int num; QDateTime datetime; QTime time; bool rotation_changed=false; bool length_changed=false; // // Verify Post // if(!xport_post->getValue("CART_NUMBER",&cart_number)) { XmlExit("Missing CART_NUMBER",400); } if(!xport_post->getValue("CUT_NUMBER",&cut_number)) { XmlExit("Missing CUT_NUMBER",400); } // // Verify User Perms // if(!xport_user->cartAuthorized(cart_number)) { XmlExit("No such cart",404); } if(!xport_user->editAudio()) { XmlExit("Unauthorized",401); } // // Process Request // cut=new RDCut(cart_number,cut_number); if(!cut->exists()) { delete cut; XmlExit("No such cut",404); } if(xport_post->getValue("EVERGREEN",&num)) { cut->setEvergreen(num); rotation_changed=true; } if(xport_post->getValue("DESCRIPTION",&str)) { cut->setDescription(str); } if(xport_post->getValue("OUTCUE",&str)) { cut->setOutcue(str); } if(xport_post->getValue("ISRC",&str)) { cut->setIsrc(str); } if(xport_post->getValue("ISCI",&str)) { cut->setIsci(str); } if(xport_post->getValue("START_DATETIME",&datetime)) { cut->setStartDatetime(datetime,!datetime.isNull()); length_changed=true; rotation_changed=true; } if(xport_post->getValue("END_DATETIME",&datetime)) { cut->setEndDatetime(datetime,!datetime.isNull()); length_changed=true; rotation_changed=true; } if(xport_post->getValue("MON",&num)) { cut->setWeekPart(1,num); rotation_changed=true; } if(xport_post->getValue("TUE",&num)) { cut->setWeekPart(2,num); rotation_changed=true; } if(xport_post->getValue("WED",&num)) { cut->setWeekPart(3,num); rotation_changed=true; } if(xport_post->getValue("THU",&num)) { cut->setWeekPart(4,num); rotation_changed=true; } if(xport_post->getValue("FRI",&num)) { cut->setWeekPart(5,num); rotation_changed=true; } if(xport_post->getValue("SAT",&num)) { cut->setWeekPart(6,num); rotation_changed=true; } if(xport_post->getValue("SUN",&num)) { cut->setWeekPart(7,num); rotation_changed=true; } if(xport_post->getValue("START_DAYPART",&time)) { cut->setStartDaypart(time,!time.isNull()); rotation_changed=true; } if(xport_post->getValue("END_DAYPART",&time)) { cut->setEndDaypart(time,!time.isNull()); rotation_changed=true; } if(xport_post->getValue("WEIGHT",&num)) { cut->setWeight(num); rotation_changed=true; } if(xport_post->getValue("START_POINT",&num)) { cut->setStartPoint(num); length_changed=true; } if(xport_post->getValue("END_POINT",&num)) { cut->setEndPoint(num); length_changed=true; } if(xport_post->getValue("FADEUP_POINT",&num)) { cut->setFadeupPoint(num); length_changed=true; } if(xport_post->getValue("FADEDOWN_POINT",&num)) { cut->setFadedownPoint(num); length_changed=true; } if(xport_post->getValue("SEGUE_START_POINT",&num)) { cut->setSegueStartPoint(num); length_changed=true; } if(xport_post->getValue("SEGUE_END_POINT",&num)) { cut->setSegueEndPoint(num); length_changed=true; } if(xport_post->getValue("HOOK_START_POINT",&num)) { cut->setHookStartPoint(num); length_changed=true; } if(xport_post->getValue("HOOK_END_POINT",&num)) { cut->setHookEndPoint(num); length_changed=true; } if(xport_post->getValue("TALK_START_POINT",&num)) { cut->setTalkStartPoint(num); length_changed=true; } if(xport_post->getValue("TALK_END_POINT",&num)) { cut->setTalkEndPoint(num); length_changed=true; } if(length_changed||rotation_changed) { RDCart *cart=new RDCart(cut->cartNumber()); if(length_changed) { cart->updateLength(); } if(rotation_changed) { cart->resetRotation(); } delete cart; } delete cut; XmlExit("OK",200); }