Files @ 12f4253fa8db
Branch filter:

Location: DistRen/src/server/distrenjob.c

binki
s/blendjob/distrenjob/
/*
  Copyright 2009 Nathan Phillip Brink <ohnobinki@ohnopublishing.net>
  
  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 <http://www.gnu.org/licenses/>.
*/

#include "distrenjob.h"
#include "slavefuncs.h"
#include "asprintf.h"

#include <libxml/tree.h>
#include <libxml/parser.h>

void distrenjob_free(struct distrenjob **distrenjob)
{
  struct distrenjob *dj;

  dj = *distrenjob;
  xmlFree(dj->name);
  xmlFree(dj->submitter);
  xmlFree(dj->email);

  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;
}