/* 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 "distrenjob.h" #include "slavefuncs.h" #include "asprintf.h" #include #include void distrenjob_free(struct distrenjob **distrenjob) { struct distrenjob *dj; dj = *distrenjob; xmlFree(dj->name); xmlFree(dj->submitter); xmlFree(dj->email); free(dj->frameset); free(dj); *distrenjob = NULL; } int distrenjob_new(struct distrenjob **distrenjob) { struct distrenjob *dj; dj = malloc(sizeof(struct distrenjob)); 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 distrenjob **distrenjob, char *pathtoxml) { struct distrenjob *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; }