/*
* rdf.c : implementation for the RDF encoding/decoding of RPM informations.
*/
#include "config.h"
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include "rpm2html.h"
#include "rpmdata.h"
#include "parser.h"
#include "tree.h"
#include "rdf.h"
#include "html.h"
/*
* Open an RDF file call the parser to create a XML tree
* Then walk the tree and build an rpmData structure for
* the corresponding package.
*/
rpmDataPtr rpmOpenRdf(char *nameRpm, rpmDirPtr dir, rpmSubdirPtr tree) {
return(NULL);
}
/*
* Create and RDF file containing the description for the
* given RPM data.
*/
void dumpRpmRdf(rpmDataPtr rpm, rpmSubdirPtr tree) {
struct tm * tstruct;
rpmDirPtr dir = rpm->dir;
char *base = dir->dir;
FILE *rdf;
int i;
char buf[1000];
if (rpm2html_rdf_dir != NULL) base = rpm2html_rdf_dir;
if ((dir->subdir != NULL) && (dir->subdir[0] != '\0')) {
if ((rpm->subdir != NULL) && (rpm->subdir[0] != '\0'))
sprintf(buf, "%s/%s/%s/%s.rdf", base, dir->subdir,
rpm->subdir, rpmName(rpm));
else
sprintf(buf, "%s/%s/%s.rdf", base, dir->subdir, rpmName(rpm));
} else {
if ((rpm->subdir != NULL) && (rpm->subdir[0] != '\0'))
sprintf(buf, "%s/%s/%s.rdf", base, rpm->subdir, rpmName(rpm));
else
sprintf(buf, "%s/%s.rdf", base, rpmName(rpm));
}
if (checkDate(buf, rpm->stamp)) return;
if (verbose > 1) {
printf("Dumping %s\n", buf);
}
rdf = fopen(buf, "w");
if (rdf == NULL) {
fprintf(stderr, "Couldn't save to file %s: %s\n",
buf, strerror(errno));
return;
}
fprintf(rdf, "<?XML version=\"1.0\">\n");
fprintf(rdf, "<?namespace href =\"http://www.w3.org/TR/WD-rdf-syntax#/\" AS = \"RDF\"?>\n");
fprintf(rdf, "<?namespace href =\"http://www.rpm.org/\" AS = \"RPM\"?>\n");
fprintf(rdf, "<RDF:RDF>\n");
fprintf(rdf, "<RDF:Description RDF:HREF=\"");
if ((rpm->subdir != NULL) && (rpm->subdir[0] != '\0')) {
if (dir->mirrors[0] != NULL)
fprintf(rdf, "%s/%s/%s\">\n",
dir->mirrors[0], rpm->subdir, rpm->filename);
else
fprintf(rdf, "%s/%s/%s\">\n",
dir->ftp, rpm->subdir, rpm->filename);
} else {
if (dir->mirrors[0] != NULL)
fprintf(rdf, "%s/%s\">\n",
dir->mirrors[0], rpm->filename);
else
fprintf(rdf, "%s/%s\">\n",
dir->ftp, rpm->filename);
}
fprintf(rdf, "<RPM:Name>%s</RPM:Name>\n", rpm->name);
fprintf(rdf, "<RPM:Version>%s</RPM:Version>\n", rpm->version);
fprintf(rdf, "<RPM:Release>%s</RPM:Release>\n", rpm->release);
if (rpm->distribution)
fprintf(rdf, "<RPM:Distribution>%s</RPM:Distribution>\n",
rpm->distribution);
if (rpm->vendor)
fprintf(rdf, "<RPM:Vendor>%s</RPM:Vendor>\n", rpm->vendor);
fprintf(rdf, "<RPM:Size>%d</RPM:Size>\n", rpm->size);
if (rpm->url)
fprintf(rdf, "<RPM:URL>%s</RPM:URL>\n", rpm->url);
tstruct = localtime(&(rpm->date));
#ifdef HAVE_STRFTIME
strftime(buf, sizeof(buf) - 1, "%c", tstruct);
#else
#error "no strftime, please check !"
#endif
fprintf(rdf, "<RPM:BuildDate>%s</RPM:BuildDate>\n", buf);
if (rpm->host)
fprintf(rdf, "<RPM:BuildHost>%s</RPM:BuildHost>\n", rpm->host);
if (rpm->group)
fprintf(rdf, "<RPM:Group>%s</RPM:Group>\n", rpm->group);
if (rpm->packager)
fprintf(rdf, "<RPM:Packager>%s</RPM:Packager>\n", rpm->packager);
if (dir->ftpsrc) {
fprintf(rdf, "<RPM:Sources>%s/%s</RPM:Sources>\n",
dir->ftpsrc, rpm->srcrpm);
} else {
fprintf(rdf, "<RPM:Sources>%s</RPM:Sources>\n",
rpm->srcrpm);
}
if (rpm->summary)
fprintf(rdf, "<RPM:Summary>%s</RPM:Summary>\n", rpm->summary);
if (rpm->description)
fprintf(rdf, "<RPM:Description>\n%s\n</RPM:Description>\n",
rpm->description);
if (rpm->copyright)
fprintf(rdf, "<RPM:Copyright>%s</RPM:Copyright>\n",
rpm->copyright);
if (rpm->nb_resources > 0) {
fprintf(rdf, "<RPM:Provides>\n");
fprintf(rdf, "<RDF:Bag>\n");
for (i = 0;i < rpm->nb_resources;i++) {
fprintf(rdf, "<RPM:Resource>%s</RPM:Resource>\n",
rpm->resources[i]->name);
}
fprintf(rdf, "</RDF:Bag>\n");
fprintf(rdf, "</RPM:Provides>\n");
}
if (rpm->nb_requires > 0) {
fprintf(rdf, "<RPM:Requires>\n");
fprintf(rdf, "<RDF:Bag>\n");
for (i = 0;i < rpm->nb_requires;i++) {
fprintf(rdf, "<RPM:Resource>%s</RPM:Resource>\n",
rpm->requires[i]->name);
}
fprintf(rdf, "</RDF:Bag>\n");
fprintf(rdf, "</RPM:Requires>\n");
}
if (rpm->filelist)
fprintf(rdf, "<RPM:Files>\n%s\n</RPM:Files>\n", rpm->filelist);
fprintf(rdf, "</RDF:Description>\n");
fprintf(rdf, "</RDF:RDF>\n");
fclose(rdf);
}
Webmaster