diff --git a/src/server/distrenjob.c b/src/server/distrenjob.c new file mode 100644 --- /dev/null +++ b/src/server/distrenjob.c @@ -0,0 +1,151 @@ +/* + Copyright 2009 Nathan Phillip Brink + + This file is a part of DistRen. + + DistRen is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DistRen 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with DistRen. If not, see . +*/ + +#include "blendjob.h" +#include "slavefuncs.h" +#include "asprintf.h" + +#include +#include + +void distrenjob_free(struct blendjob **distrenjob) +{ + struct blendjob *dj; + + dj = *distrenjob; + xmlFree(dj->name); + xmlFree(dj->submitter); + xmlFree(dj->email); + + free(dj); + *distrenjob = NULL; +} + +int distrenjob_new(struct blendjob **distrenjob) +{ + struct blendjob *dj; + + dj = malloc(sizeof(struct blendjob)); + if(!dj) + { + /* try to catch code that doesn't respect return values + faster: */ + *distrenjob = NULL; + return 1; + } + *distrenjob = dj; + + dj->next = NULL; + dj->name = (char *)NULL; + dj->submitter = (char *)NULL; + dj->email = (char *)NULL; + dj->jobnum = 0; /*< @todo there should be a central jobnum allocator and a way to save the maximum jobnumber allocated */ + dj->priority = 0; + dj->percent_done = 0; + dj->completed_frames = 0; + dj->assigned_frames = 0; + dj->avg_render_time = 0; + dj->time_remaining = (unsigned int)-1; + dj->frameset = (struct frameset *)NULL; /*< @todo does frameset need to be initialized here? */ + + return 0; +} + +/** + writes struct from xml +*/ +int xml2distrenjob(struct blendjob **distrenjob, char *pathtoxml) +{ + struct blendjob *dj; + + xmlDocPtr xmldoc; + xmlNodePtr xmlnode; + xmlChar *xmlchar; + + xmlXPathContextPtr xmlxpathcontext; + + int tmp; + + if(distrenjob_new(distrenjob)) + return 1; + dj = *distrenjob; + + xmldoc = xmlReadFile(pathtoxml, NULL, XML_PARSE_PEDANTIC); + if(!xmldoc) + { + /** + @todo are we able to depend on libxml2's printed errors or + channel them into syslog output (eventually)? Currently, + this error is repetitious of a libxml2 error printed on stderr + for us. + */ + fprintf(stderr, "error reading XML file ``%s''\n", pathtoxml); + + distrenjob_free(distrenjob); + return 2; + } + + xmlxpathcontext = xmlXPathNewContext(xmldoc); + xmlnode = xml_quickxpath(xmlxpathcontext, (xmlChar *)"/distren/job"); + if(!xmlnode) + { + distrenjob_free(distrenjob); + return 3; + } + + /*< @todo should we use xmlChar everywhere too? */ + dj->name = (char *)xmlGetProp(xmlnode, (xmlChar *)"name"); + if(!dj->name) + { + distrenjob_free(distrenjob); + return 4; + } + + /*< @todo validation needs to be done on usernames. e.g., currently, they shouldn't contain the '"' char */ + dj->submitter = (char *)xmlGetProp(xmlnode, (xmlChar *)"submitter"); + if(!dj->submitter) + { + distrenjob_free(distrenjob); + return 5; + } + + tmp = _distren_asprintf((char **)&xmlchar, "/distren/submitters/submitter[attribute::name=\"%s\"]", dj->submitter); + if(tmp <= 0 + || !xmlchar) + { + fprintf(stderr, "error using _distren_asprintf\n"); + distrenjob_free(distrenjob); + return 6; + } + xmlnode = xml_quickxpath(xmlxpathcontext, xmlchar); + free(xmlchar); + dj->email = (char *)xmlGetProp(xmlnode, (xmlChar *)"email"); + if(!dj->email) + { + fprintf(stderr, "error getting email for user ``%s'' from ``%s''\n", + dj->submitter, pathtoxml); + distrenjob_free(distrenjob); + return 7; + } + + xmlXPathFreeContext(xmlxpathcontext); + xmlFreeDoc(xmldoc); + return 0; +} +