Use e_xml_save_file(). (xml_doc_save): Removed this code and added it to
2002-08-06 Jeffrey Stedfast <fejj@ximian.com> * rule-context.c (save): Use e_xml_save_file(). (xml_doc_save): Removed this code and added it to gal so that e-table and all other parts of evolution and so forth could use it. svn path=/trunk/; revision=17720
This commit is contained in:
committed by
Jeffrey Stedfast
parent
cbb7e95fcf
commit
b91558e435
@ -1,3 +1,10 @@
|
||||
2002-08-06 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* rule-context.c (save): Use e_xml_save_file().
|
||||
(xml_doc_save): Removed this code and added it to gal so that
|
||||
e-table and all other parts of evolution and so forth could use
|
||||
it.
|
||||
|
||||
2002-08-05 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* rule-context.c (xml_doc_save): New internal function to replace
|
||||
|
||||
@ -39,6 +39,8 @@
|
||||
#include <libgnomeui/gnome-dialog.h>
|
||||
#include <libgnomeui/gnome-stock.h>
|
||||
|
||||
#include <gal/util/e-xml-utils.h>
|
||||
|
||||
#include "rule-context.h"
|
||||
|
||||
#define d(x)
|
||||
@ -381,304 +383,6 @@ rule_context_save (RuleContext *f, const char *user)
|
||||
return ((RuleContextClass *) ((GtkObject *) f)->klass)->save(f, user);
|
||||
}
|
||||
|
||||
|
||||
static void xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format);
|
||||
|
||||
|
||||
static void
|
||||
xmlAttrDump (xmlBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur)
|
||||
{
|
||||
xmlChar *value;
|
||||
|
||||
if (cur == NULL) {
|
||||
#ifdef DEBUG_TREE
|
||||
fprintf(stderr, "xmlAttrDump : property == NULL\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
xmlBufferWriteChar (buf, " ");
|
||||
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
|
||||
xmlBufferWriteCHAR (buf, cur->ns->prefix);
|
||||
xmlBufferWriteChar (buf, ":");
|
||||
}
|
||||
|
||||
xmlBufferWriteCHAR (buf, cur->name);
|
||||
value = xmlNodeListGetString (doc, cur->val, 0);
|
||||
if (value) {
|
||||
xmlBufferWriteChar (buf, "=");
|
||||
xmlBufferWriteQuotedString (buf, value);
|
||||
xmlFree (value);
|
||||
} else {
|
||||
xmlBufferWriteChar (buf, "=\"\"");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xmlAttrListDump (xmlBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur)
|
||||
{
|
||||
if (cur == NULL) {
|
||||
#ifdef DEBUG_TREE
|
||||
fprintf(stderr, "xmlAttrListDump : property == NULL\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
while (cur != NULL) {
|
||||
xmlAttrDump (buf, doc, cur);
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xmlNodeListDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cur == NULL) {
|
||||
#ifdef DEBUG_TREE
|
||||
fprintf(stderr, "xmlNodeListDump : node == NULL\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
while (cur != NULL) {
|
||||
if ((format) && (xmlIndentTreeOutput) &&
|
||||
(cur->type == XML_ELEMENT_NODE))
|
||||
for (i = 0; i < level; i++)
|
||||
xmlBufferWriteChar (buf, " ");
|
||||
xmlNodeDump (buf, doc, cur, level, format);
|
||||
if (format) {
|
||||
xmlBufferWriteChar (buf, "\n");
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format)
|
||||
{
|
||||
int i;
|
||||
xmlNodePtr tmp;
|
||||
|
||||
if (cur == NULL) {
|
||||
#ifdef DEBUG_TREE
|
||||
fprintf(stderr, "xmlNodeDump : node == NULL\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
if (cur->type == XML_TEXT_NODE) {
|
||||
if (cur->content != NULL) {
|
||||
xmlChar *buffer;
|
||||
|
||||
#ifndef XML_USE_BUFFER_CONTENT
|
||||
buffer = xmlEncodeEntitiesReentrant (doc, cur->content);
|
||||
#else
|
||||
buffer = xmlEncodeEntitiesReentrant (doc, xmlBufferContent (cur->content));
|
||||
#endif
|
||||
if (buffer != NULL) {
|
||||
xmlBufferWriteCHAR (buf, buffer);
|
||||
xmlFree (buffer);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (cur->type == XML_PI_NODE) {
|
||||
if (cur->content != NULL) {
|
||||
xmlBufferWriteChar (buf, "<?");
|
||||
xmlBufferWriteCHAR (buf, cur->name);
|
||||
if (cur->content != NULL) {
|
||||
xmlBufferWriteChar (buf, " ");
|
||||
#ifndef XML_USE_BUFFER_CONTENT
|
||||
xmlBufferWriteCHAR (buf, cur->content);
|
||||
#else
|
||||
xmlBufferWriteCHAR (buf, xmlBufferContent (cur->content));
|
||||
#endif
|
||||
}
|
||||
xmlBufferWriteChar (buf, "?>");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (cur->type == XML_COMMENT_NODE) {
|
||||
if (cur->content != NULL) {
|
||||
xmlBufferWriteChar (buf, "<!--");
|
||||
#ifndef XML_USE_BUFFER_CONTENT
|
||||
xmlBufferWriteCHAR (buf, cur->content);
|
||||
#else
|
||||
xmlBufferWriteCHAR (buf, xmlBufferContent (cur->content));
|
||||
#endif
|
||||
xmlBufferWriteChar (buf, "-->");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (cur->type == XML_ENTITY_REF_NODE) {
|
||||
xmlBufferWriteChar (buf, "&");
|
||||
xmlBufferWriteCHAR (buf, cur->name);
|
||||
xmlBufferWriteChar (buf, ";");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cur->type == XML_CDATA_SECTION_NODE) {
|
||||
xmlBufferWriteChar (buf, "<![CDATA[");
|
||||
if (cur->content != NULL)
|
||||
#ifndef XML_USE_BUFFER_CONTENT
|
||||
xmlBufferWriteCHAR (buf, cur->content);
|
||||
#else
|
||||
xmlBufferWriteCHAR (buf, xmlBufferContent(cur->content));
|
||||
#endif
|
||||
xmlBufferWriteChar (buf, "]]>");
|
||||
return;
|
||||
}
|
||||
|
||||
if (format == 1) {
|
||||
tmp = cur->childs;
|
||||
while (tmp != NULL) {
|
||||
if ((tmp->type == XML_TEXT_NODE) ||
|
||||
(tmp->type == XML_ENTITY_REF_NODE)) {
|
||||
format = 0;
|
||||
break;
|
||||
}
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
|
||||
xmlBufferWriteChar (buf, "<");
|
||||
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
|
||||
xmlBufferWriteCHAR (buf, cur->ns->prefix);
|
||||
xmlBufferWriteChar (buf, ":");
|
||||
}
|
||||
|
||||
xmlBufferWriteCHAR (buf, cur->name);
|
||||
|
||||
if (cur->properties != NULL)
|
||||
xmlAttrListDump (buf, doc, cur->properties);
|
||||
|
||||
if ((cur->content == NULL) && (cur->childs == NULL) &&
|
||||
(!xmlSaveNoEmptyTags)) {
|
||||
xmlBufferWriteChar (buf, "/>");
|
||||
return;
|
||||
}
|
||||
|
||||
xmlBufferWriteChar (buf, ">");
|
||||
if (cur->content != NULL) {
|
||||
xmlChar *buffer;
|
||||
|
||||
#ifndef XML_USE_BUFFER_CONTENT
|
||||
buffer = xmlEncodeEntitiesReentrant (doc, cur->content);
|
||||
#else
|
||||
buffer = xmlEncodeEntitiesReentrant (doc, xmlBufferContent (cur->content));
|
||||
#endif
|
||||
if (buffer != NULL) {
|
||||
xmlBufferWriteCHAR (buf, buffer);
|
||||
xmlFree (buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if (cur->childs != NULL) {
|
||||
if (format)
|
||||
xmlBufferWriteChar (buf, "\n");
|
||||
|
||||
xmlNodeListDump (buf, doc, cur->childs, (level >= 0 ? level + 1 : -1), format);
|
||||
if ((xmlIndentTreeOutput) && (format))
|
||||
for (i = 0; i < level; i++)
|
||||
xmlBufferWriteChar (buf, " ");
|
||||
}
|
||||
|
||||
xmlBufferWriteChar (buf, "</");
|
||||
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
|
||||
xmlBufferWriteCHAR (buf, cur->ns->prefix);
|
||||
xmlBufferWriteChar (buf, ":");
|
||||
}
|
||||
|
||||
xmlBufferWriteCHAR (buf, cur->name);
|
||||
xmlBufferWriteChar (buf, ">");
|
||||
}
|
||||
|
||||
static void
|
||||
xmlDocContentDump (xmlBufferPtr buf, xmlDocPtr cur)
|
||||
{
|
||||
xmlBufferWriteChar (buf, "<?xml version=");
|
||||
|
||||
if (cur->version != NULL)
|
||||
xmlBufferWriteQuotedString (buf, cur->version);
|
||||
else
|
||||
xmlBufferWriteChar (buf, "\"1.0\"");
|
||||
|
||||
if ((cur->encoding != NULL) &&
|
||||
(strcasecmp (cur->encoding, "UTF-8") != 0)) {
|
||||
xmlBufferWriteChar (buf, " encoding=");
|
||||
xmlBufferWriteQuotedString (buf, cur->encoding);
|
||||
}
|
||||
|
||||
switch (cur->standalone) {
|
||||
case 1:
|
||||
xmlBufferWriteChar (buf, " standalone=\"yes\"");
|
||||
break;
|
||||
}
|
||||
|
||||
xmlBufferWriteChar (buf, "?>\n");
|
||||
if (cur->root != NULL) {
|
||||
xmlNodePtr child = cur->root;
|
||||
|
||||
while (child != NULL) {
|
||||
xmlNodeDump (buf, cur, child, 0, 1);
|
||||
xmlBufferWriteChar (buf, "\n");
|
||||
child = child->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
xml_doc_save (xmlDocPtr doc, const char *filename)
|
||||
{
|
||||
size_t n, written = 0;
|
||||
xmlBufferPtr buf;
|
||||
int errnosave;
|
||||
ssize_t w;
|
||||
int fd;
|
||||
|
||||
fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
if (!(buf = xmlBufferCreate ())) {
|
||||
close (fd);
|
||||
unlink (filename);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
xmlDocContentDump (buf, doc);
|
||||
|
||||
n = buf->use;
|
||||
do {
|
||||
do {
|
||||
w = write (fd, buf->content + written, n - written);
|
||||
} while (w == -1 && errno == EINTR);
|
||||
|
||||
if (w > 0)
|
||||
written += w;
|
||||
} while (w != -1 && written < n);
|
||||
|
||||
xmlBufferFree (buf);
|
||||
|
||||
if (written < n || fsync (fd) == -1) {
|
||||
errnosave = errno;
|
||||
close (fd);
|
||||
unlink (filename);
|
||||
errno = errnosave;
|
||||
return -1;
|
||||
}
|
||||
|
||||
close (fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
save (RuleContext *f, const char *user)
|
||||
{
|
||||
@ -715,8 +419,8 @@ save (RuleContext *f, const char *user)
|
||||
else
|
||||
sprintf(usersav, ".#%s", user);
|
||||
sprintf(userbak, "%s~", user);
|
||||
printf("saving rules to '%s' then backup '%s'\n", usersav, userbak);
|
||||
ret = xml_doc_save (doc, usersav);
|
||||
d(printf("saving rules to '%s' then backup '%s'\n", usersav, userbak));
|
||||
ret = e_xml_save_file (usersav, doc);
|
||||
if (ret != -1) {
|
||||
rename(user, userbak);
|
||||
ret = rename(usersav, user);
|
||||
|
||||
Reference in New Issue
Block a user