/* rd_trimaudio.c * * Implementation of the TrimAudio Rivendell Access Library * * (C) Copyright 2015 Todd Baker * (C) Copyright 2018 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 "rd_trimaudio.h" #include "rd_getuseragent.h" #include "rd_common.h" struct xml_data { char elem_name[256]; char strbuf[1024]; struct rd_trimaudio *trimaudio; }; static void XMLCALL __TrimAudioElementStart(void *data, const char *el, const char **attr) { struct xml_data *xml_data=(struct xml_data *)data; if(strcasecmp(el,"trimPoint")==0) { // Allocate a new trimaudio entry xml_data->trimaudio=realloc(xml_data->trimaudio, sizeof(struct rd_trimaudio)); } strlcpy(xml_data->elem_name,el,256); memset(xml_data->strbuf,0,1024); } static void XMLCALL __TrimAudioElementData(void *data,const XML_Char *s, int len) { struct xml_data *xml_data=(struct xml_data *)data; memcpy(xml_data->strbuf+strlen(xml_data->strbuf),s,len); } static void XMLCALL __TrimAudioElementEnd(void *data, const char *el) { struct xml_data *xml_data=(struct xml_data *)data; struct rd_trimaudio *trimaudio=xml_data->trimaudio; if(strcasecmp(el,"cartNumber")==0) { sscanf(xml_data->strbuf,"%u",&trimaudio->cart_number); } if(strcasecmp(el,"cutNumber")==0){ sscanf(xml_data->strbuf,"%u",&trimaudio->cut_number); } if(strcasecmp(el,"trimLevel")==0) { sscanf(xml_data->strbuf,"%d",&trimaudio->trimlevel); } if(strcasecmp(el,"startTrimPoint")==0){ sscanf(xml_data->strbuf,"%d",&trimaudio->starttrimpoint); } if(strcasecmp(el,"endTrimPoint")==0){ sscanf(xml_data->strbuf,"%d",&trimaudio->endtrimpoint); } } size_t __TrimAudioCallback(void *ptr, size_t size, size_t nmemb, void *userdata) { XML_Parser p=(XML_Parser)userdata; XML_Parse(p,ptr,size*nmemb,0); return size*nmemb; } int RD_TrimAudio(struct rd_trimaudio *trimaudio[], const char hostname[], const char username[], const char passwd[], const char ticket[], const unsigned cartnumber, const unsigned cutnumber, const int trimlevel, const char user_agent[], unsigned *numrecs) { char url[1500]; CURL *curl=NULL; XML_Parser parser; struct xml_data xml_data; long response_code; char errbuf[CURL_ERROR_SIZE]; CURLcode res; char user_agent_string[255]; char buffer[1024]; struct curl_httppost *first=NULL; struct curl_httppost *last=NULL; if((curl=curl_easy_init())==NULL) { curl_easy_cleanup(curl); return -1; } /* Set number of recs so if fail already set */ *numrecs = 0; /* * Setup the CURL call */ memset(&xml_data,0,sizeof(xml_data)); parser=XML_ParserCreate(NULL); XML_SetUserData(parser,&xml_data); XML_SetElementHandler(parser,__TrimAudioElementStart, __TrimAudioElementEnd); XML_SetCharacterDataHandler(parser,__TrimAudioElementData); snprintf(url,1500,"http://%s/rd-bin/rdxport.cgi",hostname); curl_formadd(&first, &last, CURLFORM_PTRNAME, "COMMAND", CURLFORM_COPYCONTENTS, "17", CURLFORM_END); curl_formadd(&first, &last, CURLFORM_PTRNAME, "LOGIN_NAME", CURLFORM_COPYCONTENTS, username, CURLFORM_END); curl_formadd(&first, &last, CURLFORM_PTRNAME, "PASSWORD", CURLFORM_COPYCONTENTS, passwd, CURLFORM_END); curl_formadd(&first, &last, CURLFORM_PTRNAME, "TICKET", CURLFORM_COPYCONTENTS, ticket, CURLFORM_END); snprintf(buffer,1024,"%u",cartnumber); curl_formadd(&first, &last, CURLFORM_PTRNAME, "CART_NUMBER", CURLFORM_COPYCONTENTS, buffer, CURLFORM_END); snprintf(buffer,1024,"%u",cutnumber); curl_formadd(&first, &last, CURLFORM_PTRNAME, "CUT_NUMBER", CURLFORM_COPYCONTENTS, buffer, CURLFORM_END); snprintf(buffer,1024,"%d",trimlevel); curl_formadd(&first, &last, CURLFORM_PTRNAME, "CART_NUMBER", CURLFORM_COPYCONTENTS, buffer, CURLFORM_END); curl_easy_setopt(curl,CURLOPT_WRITEDATA,parser); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,__TrimAudioCallback); curl_easy_setopt(curl,CURLOPT_URL,url); curl_easy_setopt(curl,CURLOPT_POST,1); curl_easy_setopt(curl,CURLOPT_HTTPPOST,first); curl_easy_setopt(curl,CURLOPT_NOPROGRESS,1); curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errbuf); // Check if User Agent Present otherwise set to default if (strlen(user_agent)> 0){ curl_easy_setopt(curl, CURLOPT_USERAGENT,user_agent); } else { strcpy(user_agent_string, RD_GetUserAgent()); strcat(user_agent_string,VERSION); curl_easy_setopt(curl, CURLOPT_USERAGENT,user_agent_string); } res = curl_easy_perform(curl); if(res != CURLE_OK) { #ifdef RIVC_DEBUG_OUT size_t len = strlen(errbuf); fprintf(stderr, "\nlibcurl error: (%d)", res); if (len) fprintf(stderr, "%s%s", errbuf, ((errbuf[len-1] != '\n') ? "\n" : "")); else fprintf(stderr, "%s\n", curl_easy_strerror(res)); #endif curl_formfree(first); curl_easy_cleanup(curl); return -1; } /* The response OK - so figure out if we got what we wanted.. */ curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&response_code); curl_formfree(first); curl_easy_cleanup(curl); if (response_code > 199 && response_code < 300) { *trimaudio=xml_data.trimaudio; *numrecs = 1; return 0; } else { #ifdef RIVC_DEBUG_OUT fprintf(stderr," rd_trimaudio Call Returned Error: %s\n",xml_data.strbuf); #endif return (int)response_code; } }