From df539bdbc7708fb05eea22eec62d6e2f609c10b5 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Sun, 18 Aug 2013 05:16:06 +0200 Subject: common: Add helpers to read and write plist files --- common/utils.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/utils.h | 18 ++++++++++++ 2 files changed, 106 insertions(+) diff --git a/common/utils.c b/common/utils.c index bd2bf1f..5248c2c 100644 --- a/common/utils.c +++ b/common/utils.c @@ -106,3 +106,91 @@ char *string_concat(const char *str, ...) return result; } + +void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) +{ + FILE *f; + uint64_t size; + + *length = 0; + + f = fopen(filename, "rb"); + if (!f) { + return; + } + + fseek(f, 0, SEEK_END); + size = ftell(f); + rewind(f); + + if (size == 0) { + fclose(f); + return; + } + + *buffer = (char*)malloc(sizeof(char)*(size+1)); + fread(*buffer, sizeof(char), size, f); + fclose(f); + + *length = size; +} + +void buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length) +{ + FILE *f; + + f = fopen(filename, "ab"); + if (!f) + f = fopen(filename, "wb"); + if (f) { + fwrite(buffer, sizeof(char), length, f); + fclose(f); + } +} + +int plist_read_from_filename(plist_t *plist, const char *filename) +{ + char *buffer = NULL; + uint64_t length; + + if (!filename) + return 0; + + buffer_read_from_filename(filename, &buffer, &length); + + if (!buffer) { + return 0; + } + + if ((length > 8) && (memcmp(buffer, "bplist00", 8) == 0)) { + plist_from_bin(buffer, length, plist); + } else { + plist_from_xml(buffer, length, plist); + } + + free(buffer); + + return 1; +} + +int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format) +{ + char *buffer = NULL; + uint32_t length; + + if (!plist || !filename) + return 0; + + if (format == PLIST_FORMAT_XML) + plist_to_xml(plist, &buffer, &length); + else if (format == PLIST_FORMAT_BINARY) + plist_to_bin(plist, &buffer, &length); + else + return 0; + + buffer_write_to_filename(filename, buffer, length); + + free(buffer); + + return 1; +} diff --git a/common/utils.h b/common/utils.h index 441d188..8394272 100644 --- a/common/utils.h +++ b/common/utils.h @@ -22,9 +22,27 @@ #ifndef __UTILS_H #define __UTILS_H +#ifdef WIN32 +#include +#endif + +#include +#include + #ifndef HAVE_STPCPY char *stpcpy(char * s1, const char * s2); #endif char *string_concat(const char *str, ...); +void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length); +void buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length); + +enum plist_format_t { + PLIST_FORMAT_XML, + PLIST_FORMAT_BINARY +}; + +int plist_read_from_filename(plist_t *plist, const char *filename); +int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format); + #endif -- cgit v1.1-32-gdbae