/************************************************************************ ** VOXML.C -- Utility procedures for writing XML files, i.e. the raw ** VOTable output wrapped in a proprietary XML document. ** ** M. Fitzpatrick, NOAO, July 2007 */ #include #include #include #include #include #include #include "VOClient.h" #include "voAppsP.h" extern int format, debug, errno, extract; extern char *output; extern Service *svcList; extern Object *objList; extern char *vot_getSName (char *root); extern char *vot_getOName (char *root); extern char *vot_procTimestamp (void); void vot_concatXML (char *fname); int vot_copyXMLFile (char *root, char *sname, FILE *fd); void vot_cleanXML (void); /************************************************************************ ** CONCATXML -- Concatenate the XML file generated by the query into a ** single, hierarchical document grouped by the service. */ void vot_concatXML (char *fname) { FILE *fd = (FILE *) NULL; Service *svc = svcList; /* the service list */ Proc *proc; /* process list in each service */ int index = 0; char sname[SZ_LINE], oname[SZ_LINE]; if (fname[0] == '-') fd = stdout; else if ((fd = fopen (fname, "w+")) == (FILE *) NULL) { fprintf (stderr, "ERROR: Cannot open XML file: '%s'\n", fname); return; } fprintf (fd, "\n"); fprintf (fd, "\n", vot_procTimestamp()); for (svc=svcList; svc; svc=svc->next) { bzero (sname, SZ_FNAME); strcpy (sname, vot_getSName (svc->proc->root)); for (proc=svc->proc; proc; proc=proc->next) { bzero (oname, SZ_FNAME); strcpy (oname, vot_getOName (proc->root)); fprintf (fd, "name : sname)); if (!oname[0]) { fprintf (fd, "pos=\"(%f,%f)\" ", proc->obj->ra, proc->obj->dec); } fprintf (fd, "obj=\"%s\">\n", oname); vot_copyXMLFile (proc->root, oname, fd); fprintf (fd, "\n\n"); index++; } } fprintf (fd, "\n"); /* Clean up the intermediate files if needed. if (format & F_XML || (extract & EX_XML && extract & EX_COLLECT)) */ if (format & F_XML && (extract & EX_COLLECT)) vot_cleanXML (); /* Close the file descriptors. */ if (fd != stdout) fclose (fd); } /************************************************************************ ** COPYXMLFILE -- Copy a VOTable to the output XML file. */ int vot_copyXMLFile (char *root, char *name, FILE *fd) { char *ip, line[4096], fname[SZ_FNAME]; FILE *ifd; extern char *strcasestr(); bzero (fname, SZ_FNAME); sprintf (fname, "%s.xml", root); if (access (fname, R_OK) == 0) { if ((ifd = fopen (fname, "r")) == (FILE *) NULL) { fprintf (stderr, "Warning: Cannot open file '%s'\n", fname); return (ERR); } } else { return (OK); } /* Skip ahead to the start of the part we're interested in. */ bzero (line, 4096); while (fgets (line, 4096, ifd)) { if ((ip = strcasestr (line, "")) { fprintf (fd, "%s", line); break; } fprintf (fd, " %s", line); bzero (line, 4096); } fclose (ifd); return (OK); } /************************************************************************ ** CLEANXML -- Clean up the intermediate VOTable files when producing ** the compiled XML doc.. */ void vot_cleanXML () { Service *svc = svcList; /* the service list */ Proc *proc; /* process list in each service */ char fname[SZ_FNAME]; for (svc=svcList; svc; svc=svc->next) { for (proc=svc->proc; proc; proc=proc->next) { bzero (fname, SZ_FNAME); sprintf (fname, "%s.vot", proc->root); unlink (fname); } } }