All pastes #358594 Raw Edit

Stuff

public text v1 · immutable
·published 2007-02-16 09:49 UTC
rendered paste body
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>

#define MY_ENCODING "ISO-8859-1"

int id_generator()
{
     static int rand = 0;
     if (!rand)
          rand = random();
     return rand+1;
}

xmlChar *ConvertInput(const char *in, const char *encoding)
{
    xmlChar *out;
    int ret;
    int size;
    int out_size;
    int temp;
    xmlCharEncodingHandlerPtr handler;
    LIBXML_TEST_VERSION;
    if (in == 0)
        return 0;

    handler = xmlFindCharEncodingHandler(encoding);

    if (!handler) {
        printf("ConvertInput: no encoding handler found for '%s'\n",
               encoding ? encoding : "");
        return 0;
    }

    size = (int) strlen(in) + 1;
    out_size = size * 2 - 1;
    out = (unsigned char *) xmlMalloc((size_t) out_size);

    if (out != 0) {
        temp = size - 1;
        ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);
        if ((ret < 0) || (temp - size + 1)) {
            if (ret < 0) {
                printf("ConvertInput: conversion wasn't successful.\n");
            } else {
                printf
                    ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",
                     temp);
            }

            xmlFree(out);
            out = 0;
        } else {
            out = (unsigned char *) xmlRealloc(out, out_size + 1);
            out[out_size] = 0;  /*null terminating out */
        }
    } else {
        printf("ConvertInput: no mem\n");
    }

    return out;
}

int start_xml_document(xmlTextWriterPtr *writer, xmlBufferPtr *buf)
{
    int rc;
    *buf = xmlBufferCreate();
    if (*buf == NULL) {
        fprintf(stderr, "initialise_connection: Error creating the xml buffer\n");
        return 0;
    }
    *writer = xmlNewTextWriterMemory(*buf, 0);
    if (*writer == NULL) {
        printf("initialise_connection: Error creating the xml writer\n");
        return 0;
    }
    rc = xmlTextWriterStartDocument(*writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterStartDocument\n");
        // Return error here
        return 0;
    }
    rc = xmlTextWriterStartElement(*writer, BAD_CAST "semfs");
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterStartElement\n");
        return 0;
    }     
    rc = xmlTextWriterStartElement(*writer, BAD_CAST "event");
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterStartElement\n");
        return 0;
    }
    return 1;
}

char *close_xml_document(xmlTextWriterPtr *writer, xmlBufferPtr *buf)
{
    char *ret;
    int rc;
    rc = xmlTextWriterEndElement(*writer);
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterEndElement\n");
        return NULL;
    }
    rc = xmlTextWriterEndDocument(*writer);
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterEndDocument\n");
        return NULL;
    }
    xmlFreeTextWriter(*writer);
    // printf("%s", (*buf)->content);
    ret = strdup((*buf)->content);
    xmlBufferFree(*buf);
    return ret;
}

char *initialise_connection(char *uuid, char *mnt_point)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlBufferPtr buf;
    xmlChar *tmp;
    if (!start_xml_document(&writer, &buf))
         return NULL;
    
    tmp = ConvertInput(uuid, MY_ENCODING);
    printf ("UUID: %s\n", tmp);
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "uid",
                                     BAD_CAST uuid);
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n");
        return NULL;
    }
    if (tmp != NULL)
         xmlFree(tmp);
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "mountPoint",
                                     BAD_CAST mnt_point);
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n");
        return NULL;
    }
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "action",
                                     BAD_CAST "start");
    if (rc < 0) {
        printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n");
        return NULL;
    }
    return close_xml_document(&writer, &buf);
}

int notify_create(semfs_ino_t parent, semfs_ino_t child)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlBufferPtr buf;
    xmlChar *tmp;
    char **path;
    char *xml_doc;
    if (!start_xml_document(&writer, &buf))
         return 0;
    if (xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "id",
                                          "%d", id_generator()) < 0)
         return 0;
    if (xmlTextWriterWriteAttribute(writer, BAD_CAST "action",
                                    BAD_CAST "create") < 0)
         return 0;
    if (ext2fs_get_pathname (semfs.fs, parent, ino, path))
         return 0;
    tmp = ConvertInput(*path, MY_ENCODING);
    if (xmlTextWriterWriteElement(writer, BAD_CAST "file",
                                  BAD_CAST tmp) < 0) {
         free(*path);
         xmlFree(tmp);
         return 0;
    }
    xml_doc = close_xml_document(&writer, &buf);
    printf ("XML DOCUMENT:\n%s\n", xml_doc);
    return 1;
}