From 1abddabeecc0b9f83ab113a0ef51026f5864adcf Mon Sep 17 00:00:00 2001 From: simon987 Date: Thu, 5 Mar 2020 16:12:34 -0500 Subject: [PATCH] Rewrite doc.c module, fix bad error handling, fix pdf.c memory leaks --- CMakeLists.txt | 46 ++-- include/mce/config.h | 53 ----- include/mce/helper.h | 189 --------------- include/mce/textreader.h | 464 ------------------------------------- include/mce/textwriter.h | 176 -------------- include/opc/config.h | 189 --------------- include/opc/container.h | 300 ------------------------ include/opc/file.h | 200 ---------------- include/opc/helper.h | 60 ----- include/opc/inputstream.h | 74 ------ include/opc/opc.h | 73 ------ include/opc/outputstream.h | 71 ------ include/opc/part.h | 118 ---------- include/opc/properties.h | 121 ---------- include/opc/relation.h | 140 ----------- include/opc/xmlreader.h | 69 ------ include/opc/xmlwriter.h | 57 ----- include/opc/zip.h | 255 -------------------- include/plib/plib.h | 168 -------------- lib/libopc/libmce.a | Bin 32392 -> 0 bytes lib/libopc/libopc.a | Bin 141958 -> 0 bytes lib/libopc/libplib.a | Bin 1044 -> 0 bytes src/main.c | 3 +- src/parsing/doc.c | 134 +++++------ src/parsing/parse.c | 21 +- src/sist.h | 2 +- 26 files changed, 110 insertions(+), 2873 deletions(-) delete mode 100644 include/mce/config.h delete mode 100644 include/mce/helper.h delete mode 100644 include/mce/textreader.h delete mode 100644 include/mce/textwriter.h delete mode 100644 include/opc/config.h delete mode 100644 include/opc/container.h delete mode 100644 include/opc/file.h delete mode 100644 include/opc/helper.h delete mode 100644 include/opc/inputstream.h delete mode 100644 include/opc/opc.h delete mode 100644 include/opc/outputstream.h delete mode 100644 include/opc/part.h delete mode 100755 include/opc/properties.h delete mode 100644 include/opc/relation.h delete mode 100644 include/opc/xmlreader.h delete mode 100644 include/opc/xmlwriter.h delete mode 100644 include/opc/zip.h delete mode 100644 include/plib/plib.h delete mode 100644 lib/libopc/libmce.a delete mode 100644 lib/libopc/libopc.a delete mode 100644 lib/libopc/libplib.a diff --git a/CMakeLists.txt b/CMakeLists.txt index f96cb5c..951b6f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,8 @@ set(CMAKE_C_STANDARD 11) project(sist2 C) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules") +option(SIST_DEBUG "Build a debug executable" on) + add_executable( sist2 src/main.c @@ -84,18 +86,38 @@ target_link_directories( target_compile_options( sist2 PRIVATE - -fPIC - - -Ofast -# -fno-stack-protector -# -fomit-frame-pointer - - -g - -march=native - -fstack-protector ) +if (SIST_DEBUG) + target_compile_options( + sist2 + PRIVATE + -g + -fstack-protector + -fno-omit-frame-pointer + -fsanitize=address + ) + target_link_options( + sist2 + PRIVATE + -fsanitize=address + ) + set_target_properties( + sist2 + PROPERTIES + OUTPUT_NAME sist2_debug + ) +else () + target_compile_options( + sist2 + PRIVATE + -Ofast + -fno-stack-protector + -fomit-frame-pointer + ) +endif () + TARGET_LINK_LIBRARIES( sist2 @@ -121,16 +143,14 @@ TARGET_LINK_LIBRARIES( m bz2 - ${PROJECT_SOURCE_DIR}/lib/libmagic.a +# ${PROJECT_SOURCE_DIR}/lib/libmagic.a + magic ${PROJECT_SOURCE_DIR}/lib/libharfbuzz.a ${PROJECT_SOURCE_DIR}/lib/libopenjp2.a freetype archive xml2 - ${PROJECT_SOURCE_DIR}/lib/libopc/libmce.a - ${PROJECT_SOURCE_DIR}/lib/libopc/libopc.a - ${PROJECT_SOURCE_DIR}/lib/libopc/libplib.a ${PROJECT_SOURCE_DIR}/lib/libtesseract.a ${PROJECT_SOURCE_DIR}/lib/liblept.a diff --git a/include/mce/config.h b/include/mce/config.h deleted file mode 100644 index de50fab..0000000 --- a/include/mce/config.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/**@file config/mce/config.h - */ -#ifndef MCE_CONFIG_H -#define MCE_CONFIG_H - -#include -#include -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -#define MCE_NAMESPACE_SUBSUMPTION_ENABLED 0 - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MCE_CONFIG_H */ diff --git a/include/mce/helper.h b/include/mce/helper.h deleted file mode 100644 index d11fc49..0000000 --- a/include/mce/helper.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file mce/helper.h -Helper functions needed by mce/textreader.h and mce/textwriter.h to implement MCE: -- mceQNameLevelAdd(), mceQNameLevelLookup() and mceQNameLevelCleanup() maintain a set of mceQNameLevel_t tuples. -- mceQNameLevelPush() and mceQNameLevelPopIfMatch() maintain a stack of mceQNameLevel_t tuples. -- mceCtxInit(), mceCtxCleanup() and mceCtxUnderstandsNamespace() manage a context which holds all information needed to do MCE proprocessing. - */ -#include - -#ifndef MCE_HELPER_H -#define MCE_HELPER_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Tiple (ns, ln, level). - */ - typedef struct MCE_QNAME_LEVEL { - xmlChar *ns; - xmlChar *ln; - puint32_t level; - puint32_t flag; // used by mceTextWriter - } mceQNameLevel_t; - - /** - */ - typedef enum MCE_SKIP_STATE_ENUM { - MCE_SKIP_STATE_IGNORE, - MCE_SKIP_STATE_ALTERNATE_CONTENT, - MCE_SKIP_STATE_CHOICE_MATCHED - } mceSkipState_t; - - /** - Represents an intervall of levels which are "skipped" i.e. ignored. - */ - typedef struct MCE_SKIP_ITEM { - puint32_t level_start; - puint32_t level_end; - mceSkipState_t state; - } mceSkipItem_t; - - /** - Either represents a set of (ns, ln, level) triples. - */ - typedef struct MCE_QNAME_LEVEL_SET { - mceQNameLevel_t *list_array; - puint32_t list_items; - puint32_t max_level; - } mceQNameLevelSet_t; - - /** - The skip stack. - */ - typedef struct MCE_SKIP_STACK { - mceSkipItem_t *stack_array; - puint32_t stack_items; - } mceSkipStack_t; - - - typedef enum MCE_ERROR_ENUM { - MCE_ERROR_NONE, - MCE_ERROR_XML, - MCE_ERROR_MUST_UNDERSTAND, - MCE_ERROR_VALIDATION, - MCE_ERROR_MEMORY - } mceError_t; - - /** - Holds all information to do MCE preprocessing. - */ - typedef struct MCE_CONTEXT { - mceQNameLevelSet_t ignorable_set; - mceQNameLevelSet_t understands_set; - mceQNameLevelSet_t processcontent_set; - mceQNameLevelSet_t suspended_set; -#if (MCE_NAMESPACE_SUBSUMPTION_ENABLED) - mceQNameLevelSet_t subsume_namespace_set; - mceQNameLevelSet_t subsume_exclude_set; - mceQNameLevelSet_t subsume_prefix_set; -#endif - mceSkipStack_t skip_stack; - mceError_t error; - pbool_t mce_disabled; - puint32_t suspended_level; - } mceCtx_t; - - /** - Add a new tiple (ns, ln, level) to the triple set \c qname_level_set. - The \c ns_sub string is optional and will not be touched. - */ - pbool_t mceQNameLevelAdd(mceQNameLevelSet_t *qname_level_set, const xmlChar *ns, const xmlChar *ln, puint32_t level); - - /** - Lookup a tiple (ns, ln, level) via \c ns and \c ln. If \c ignore_ln is PTRUE then the first tiple matching \c ns will be returned. - */ - mceQNameLevel_t* mceQNameLevelLookup(mceQNameLevelSet_t *qname_level_set, const xmlChar *ns, const xmlChar *ln, pbool_t ignore_ln); - - /** - Remove all triples (ns, ln, level) where the level greater or equal to \c level. - */ - pbool_t mceQNameLevelCleanup(mceQNameLevelSet_t *qname_level_set, puint32_t level); - - /** - Push a new skip intervall (level_start, level_end, state) on the stack \c skip_stack. - */ - pbool_t mceSkipStackPush(mceSkipStack_t *skip_stack, puint32_t level_start, puint32_t level_end, mceSkipState_t state); - - /** - Pop the intervall (ns, ln, level) from the stack \c qname_level_array. - */ - void mceSkipStackPop(mceSkipStack_t *skip_stack); - - /** - Returns top item or NULL. - */ - mceSkipItem_t *mceSkipStackTop(mceSkipStack_t *skip_stack); - - /** - Returns TRUE, if the \c level is in the top skip intervall. - */ - pbool_t mceSkipStackSkip(mceSkipStack_t *skip_stack, puint32_t level); - - /** - Initialize the mceCtx_t \c ctx. - */ - pbool_t mceCtxInit(mceCtx_t *ctx); - - /** - Cleanup, i.e. release all resourced from the mceCtx_t \c ctx. - */ - pbool_t mceCtxCleanup(mceCtx_t *ctx); - - /** - Register the namespace \ns in \c ctx. - */ - pbool_t mceCtxUnderstandsNamespace(mceCtx_t *ctx, const xmlChar *ns); - - /** - Register the namespace \ns in \c ctx. - */ - pbool_t mceCtxSuspendProcessing(mceCtx_t *ctx, const xmlChar *ns, const xmlChar *ln); - - - -#if (MCE_NAMESPACE_SUBSUMPTION_ENABLED) - /** - Subsume namespace \c ns_new with \c ns_old. - */ - pbool_t mceCtxSubsumeNamespace(mceCtx_t *ctx, const xmlChar *prefix_new, const xmlChar *ns_new, const xmlChar *ns_old); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MCE_HELPER_H */ diff --git a/include/mce/textreader.h b/include/mce/textreader.h deleted file mode 100644 index 897c63f..0000000 --- a/include/mce/textreader.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file mce/textreader.h - - */ -#ifndef MCE_TEXTREADER_H -#define MCE_TEXTREADER_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - A handle to an MCE-aware libxml2 xmlTextReader. - */ - typedef struct MCE_TEXTREADER mceTextReader_t; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - -#include -#include -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - struct MCE_TEXTREADER { - xmlTextReaderPtr reader; - mceCtx_t mceCtx; - }; - - /** - Wrapper around an libxml2 xmlTextReaderRead function. - \see http://xmlsoft.org/html/libxml-xmlreader.html#xmlTextReaderRead - */ - int mceTextReaderRead(mceTextReader_t *mceTextReader); - - /** - Wrapper around a libxml2 xmlTextReaderNext function. - \see http://xmlsoft.org/html/libxml-xmlreader.html#xmlTextReaderNext - */ - int mceTextReaderNext(mceTextReader_t *mceTextReader); - - /** - Creates an mceTextReader from an XmlTextReader. - \code - mceTextReader reader; - mceTextReaderInit(&reader, xmlNewTextReaderFilename("sample.xml")); - // reader is ready to use. - mceTextReaderCleanup(&reader); - \endcode - \see http://xmlsoft.org/html/libxml-xmlreader.html#xmlNewTextReaderFilename - */ - int mceTextReaderInit(mceTextReader_t *mceTextReader, xmlTextReaderPtr reader); - - /** - Cleanup MCE reader, i.e. free all resources. Also calls xmlTextReaderClose and xmlFreeTextReader. - \see http://xmlsoft.org/html/libxml-xmlreader.html#xmlTextReaderClose - \see http://xmlsoft.org/html/libxml-xmlreader.html#xmlFreeTextReader - */ - int mceTextReaderCleanup(mceTextReader_t *mceTextReader); - - /** - Reads all events \c mceTextReader and pipes them to \writer. - \code - mceTextReader reader; - mceTextReaderInit(&reader, xmlNewTextReaderFilename("sample.xml")); - mceTextReaderUnderstandsNamespace(&reader, _X("http://myextension")); - xmlTextWriterPtr writer=xmlNewTextWriterFilename("out.xml", 0); - mceTextReaderDump(&reader, writer, P_FALSE); - xmlFreeTextWriter(writer); - mceTextReaderCleanup(&reader); - \endcode - */ - int mceTextReaderDump(mceTextReader_t *mceTextReader, xmlTextWriter *writer, pbool_t fragment); - - /** - Registers an MCE namespace. - \see mceTextReaderDump() - */ - int mceTextReaderUnderstandsNamespace(mceTextReader_t *mceTextReader, const xmlChar *ns); - - /** - Disable MCE processing. - \return Returns old value. - */ - pbool_t mceTextReaderDisableMCE(mceTextReader_t *mceTextReader, pbool_t flag); - - - /** - Signal an error to the MCE processor. - */ - void mceRaiseError(xmlTextReader *reader, mceCtx_t *ctx, mceError_t error, const xmlChar *str, ...); - - /** - Internal function which does the MCE postprocessing. E.g. mceTextReaderRead() is implemented as - \code - mceTextReaderPostprocess(mceTextReader->reader, &mceTextReader->mceCtx, xmlTextReaderRead(mceTextReader->reader)) - \endcode - This function is exposed to make existing libxm2 xmlTextReader MCE aware. - */ - int mceTextReaderPostprocess(xmlTextReader *reader, mceCtx_t *ctx, int ret); - - /** - Get the error code. - */ - mceError_t mceTextReaderGetError(mceTextReader_t *mceTextReader); - -/** - Helper macro to declare a start/end document block in a declarative way: - \code - mce_start_document(reader) { - } mce_end_document(reader); - \endcode - \hideinitializer -*/ -#define mce_start_document(_reader_) \ - if (NULL!=(_reader_)) { \ - mceTextReaderRead(_reader_); \ - if (0) - -/** - \see mce_start_document. - \hideinitializer -*/ -#define mce_end_document(_reader_) \ - } /* if (NULL!=reader) */ \ - - -/** - Container for mce_start_element and mce_start_attribute declarations. - \see mce_match_element - \see mce_match_attribute - \hideinitializer - */ -#define mce_start_choice(_reader_) \ - if (0) - -/** - \see mce_start_choice - \hideinitializer - */ -#define mce_end_choice(_reader_) - - -/** - Skips the attributes. - \see mce_match_element. - \hideinitializer -*/ -#define mce_skip_attributes(_reader_) \ - mce_start_attributes(_reader_) { \ - } mce_end_attributes(_reader_); - - -/** - Skips the attributes. - \see mce_match_attribute. - \hideinitializer -*/ -#define mce_skip_children(_reader_) \ - mce_start_children(_reader_) { \ - } mce_end_children(_reader_); - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_start_children(_reader_) \ -if (!xmlTextReaderIsEmptyElement((_reader_)->reader)) { \ - mceTextReaderRead(_reader_); do { \ - if (0) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_end_children(_reader_) \ - else { \ - if (XML_READER_TYPE_END_ELEMENT!=xmlTextReaderNodeType((_reader_)->reader)) { \ - mceTextReaderNext(_reader_); /*skip unhandled element */ \ - } \ - } \ - } while(XML_READER_TYPE_END_ELEMENT!=xmlTextReaderNodeType((_reader_)->reader) && \ - XML_READER_TYPE_NONE!=xmlTextReaderNodeType((_reader_)->reader)); \ -} /* if (!xmlTextReaderIsEmptyElement(reader->reader)) */ - - -/** - Helper macro to match an element. Usefull for calling code in a seperate function: - - \code - void handleElement(reader) { - mce_start_choice(reader) { - mce_start_element(reader, _X("ns"), _X("element")) { - - } mce_end_element(reader) - } mce_end_choice(reader); - } - - void parse(reader) { - mce_start_document(reader) { - mce_start_element(reader, _X("ns"), _X("ln")) { - mce_skip_attributes(reader); - mce_start_children(reader) { - mce_match_element(reader, _X("ns"), _X("element")) { - handleElement(reader); - } - } mce_end_children(reader); - } mce_end_element(); - } mce_end_document(reader); - } - \endcode - \hideinitializer -*/ -#define mce_match_element(_reader_, ns, ln) \ - } else if (XML_READER_TYPE_ELEMENT==xmlTextReaderNodeType((_reader_)->reader) \ - && (NULL==ns || 0==xmlStrcmp(ns, xmlTextReaderConstNamespaceUri((_reader_)->reader))) \ - && (NULL==ln || 0==xmlStrcmp(ln, xmlTextReaderConstLocalName((_reader_)->reader)))) { - - -/** - Helper macro to declare a element block in a declarative way: - \code - mce_start_element(reader) { - mce_start_attributes(reader) { - mce_start_attribute(reader, _X("ns"), _X("lnA")) { - // code for handling lnA. - } mce_end_attribute(reader); - mce_start_attribute(reader, _X("ns"), _X("lnB")) { - // code for handling lnB. - } mce_end_attribute(reader); - } mce_end_attributes(reader); - mce_start_children(reader) { - mce_start_element(reader, _X("ns"), _X("lnA")) { - // code for handling lnA. - } mce_end_element(reader); - mce_start_element(reader, _X("ns"), _X("lnB")) { - // code for handling lnB. - } mce_end_element(reader); - mce_start_text(reader) { - // code for handling text. - } mce_end_text(reader); - } mce_end_children(reader); - } mce_end_element(reader); - \endcode - \hideinitializer -*/ -#define mce_start_element(_reader_, ns, ln) \ - mce_match_element(_reader_, ns, ln) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_end_element(_reader_) \ - mceTextReaderNext(_reader_) - -/** - Matches #TEXT without consuming it. - \hideinitializer -*/ -#define mce_match_text(_reader_) \ - } else if (XML_READER_TYPE_TEXT==xmlTextReaderNodeType((_reader_)->reader) \ - || XML_READER_TYPE_SIGNIFICANT_WHITESPACE==xmlTextReaderNodeType((_reader_)->reader)) { - - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_start_text(_reader_) \ - mce_match_text(_reader_) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_end_text(_reader_) \ - mceTextReaderNext(_reader_) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_start_attributes(_reader_) \ - if (1==xmlTextReaderMoveToFirstAttribute((_reader_)->reader)) { \ - do { \ - if (0) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_end_attributes(_reader_) \ - else { /* skipped attribute */ } \ - } while(1==xmlTextReaderMoveToNextAttribute((_reader_)->reader)); \ - xmlTextReaderMoveToElement((_reader_)->reader); } - -/** - Helper macro to match an attribute. Usefull for calling code in a seperate function: - - \code - void handleA(reader) { - mce_start_choice(reader) { - mce_start_attribute(reader, _X("ns"), _X("attr")) { - - } mce_end_attribute(reader); - } mce_end_choice(reader); - } - - void parse(reader) { - mce_start_document(reader) { - mce_start_element(reader, _X("ns"), _X("ln")) { - mce_start_attributes(reader) { - mce_match_attribute(reader, _X("ns"), _X("attr")) { - handleA(reader); - } - } mce_end_attributes(reader); - mce_skip_children(reader); - } mce_end_element(); - } mce_end_document(reader); - } - \endcode - \hideinitializer -*/ -#define mce_match_attribute(_reader_, ns, ln) \ - } else if ((NULL==ns || 0==xmlStrcmp(ns, xmlTextReaderConstNamespaceUri((_reader_)->reader))) \ - && (NULL==ln || 0==xmlStrcmp(ln, xmlTextReaderConstLocalName((_reader_)->reader)))) { - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_start_attribute(_reader_, ns, ln) \ - mce_match_attribute(_reader_, ns, ln) - -/** - \see mce_start_element. - \hideinitializer -*/ -#define mce_end_attribute(_reader_) - - -/** - Error handling for MCE parsers. - \code - mce_start_element(&reader, NULL, _X("Default")) { - const xmlChar *ext=NULL; - const xmlChar *type=NULL; - mce_start_attributes(&reader) { - mce_start_attribute(&reader, NULL, _X("Extension")) { - ext=xmlTextReaderConstValue(reader.reader); - } mce_end_attribute(&reader); - mce_start_attribute(&reader, NULL, _X("ContentType")) { - type=xmlTextReaderConstValue(reader.reader); - } mce_end_attribute(&reader); - } mce_end_attributes(&reader); - mce_error_guard_start(&reader) { - mce_error(&reader, NULL==ext || ext[0]==0, MCE_ERROR_VALIDATION, "Missing @Extension attribute!"); - mce_error(&reader, NULL==type || type[0]==0, MCE_ERROR_VALIDATION, "Missing @ContentType attribute!"); - opcContainerType *ct=insertType(c, type, OPC_TRUE); - mce_error(&reader, NULL==ct, MCE_ERROR_MEMORY, NULL); - opcContainerExtension *ce=opcContainerInsertExtension(c, ext, OPC_TRUE); - mce_error(&reader, NULL==ce, MCE_ERROR_MEMORY, NULL); - mce_errorf(&reader, NULL!=ce->type && 0!=xmlStrcmp(ce->type, type), MCE_ERROR_VALIDATION, "Extension \"%s\" is mapped to type \"%s\" as well as \"%s\"", ext, type, ce->type); - ce->type=ct->type; - } mce_error_guard_end(&reader); - mce_skip_children(&reader); - } mce_end_element(&reader); - \endcode - \hideinitializer -*/ -#define mce_error_guard_start(_reader_) if (MCE_ERROR_NONE==(_reader_)->mceCtx.error) do { - -/** - \see mce_error_guard_start - \hideinitializer -*/ -#define mce_error_guard_end(_reader_) } while(0) - -/** - Signal an error if guard if false. - \hideinitializer -*/ -#define mce_error(_reader_, guard, err, msg) if (guard) { (_reader_)->mceCtx.error=(err); fprintf(stderr, (NULL!=msg?msg:#err)); continue; } - -/** - Signal an error if guard if false. - \hideinitializer -*/ -#if defined(__GNUC__) -#define mce_errorf(_reader_, guard, err, msg, ...) if (guard) { mceRaiseError((_reader_)->reader, &(_reader_)->mceCtx, err, _X((NULL!=msg?msg:#err)), ##__VA_ARGS__ ); continue; } -#else -#define mce_errorf(_reader_, guard, err, msg, ...) if (guard) { mceRaiseError((_reader_)->reader, &(_reader_)->mceCtx, err, _X((NULL!=msg?msg:#err)), __VA_ARGS__ ); continue; } -#endif - -/** - Only issues the error when in "strict mode". - \hideinitializer -*/ -#define mce_error_strict mce_error - -/** - \see mce_error_strict - \hideinitializer -*/ -#define mce_error_strictf mce_errorf - - -/** - Marker for a MCE defintion. - \hideinitializer -*/ -#define mce_def - -/** - Marker for a MCE reference. - \hideinitializer -*/ -#define mce_ref(r) (r) - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MCE_TEXTREADER_H */ diff --git a/include/mce/textwriter.h b/include/mce/textwriter.h deleted file mode 100644 index dc49ca4..0000000 --- a/include/mce/textwriter.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file mce/textwriter.h - -*/ -#include -#include -#include - -#ifndef MCE_TEXTWRITER_H -#define MCE_TEXTWRITER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Default flags for an MCE namespace declaration. - */ -#define MCE_DEFAULT 0x0 - -/** - Flags MCE namespace declaration "ignorable". - */ -#define MCE_IGNORABLE 0x1 - -/** - Flags MCE namespace declaration "must understand". - */ -#define MCE_MUSTUNDERSTAND 0x2 - - /** - The MCE text writer context. - */ - typedef struct MCE_TEXTWRITER_STRUCT mceTextWriter; - - /** - Create a new MCE text writer. - \see http://xmlsoft.org/html/libxml-xmlIO.html#xmlOutputBufferCreateIO - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlNewTextWriter - */ - mceTextWriter *mceTextWriterCreateIO(xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void *ioctx, xmlCharEncodingHandlerPtr encoder); - - /** - Helper which create a new MCE text writer for a FILE handle. - */ - mceTextWriter *mceNewTextWriterFile(FILE *file); - - /** - Free all resources for \w. - */ - int mceTextWriterFree(mceTextWriter *w); - - /** - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterStartDocument - */ - int mceTextWriterStartDocument(mceTextWriter *w); - - /** - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterEndDocument - */ - int mceTextWriterEndDocument(mceTextWriter *w); - - /** - Start a new XML element. If ns==NULL then there is no namespace and ""==ns means the default namespace. - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterStartElement - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterStartElementNS - */ - int mceTextWriterStartElement(mceTextWriter *w, const xmlChar *ns, const xmlChar *ln); - - /** - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterEndElement - */ - int mceTextWriterEndElement(mceTextWriter *w, const xmlChar *ns, const xmlChar *ln); - - /** - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterWriteString - */ - int mceTextWriterWriteString(mceTextWriter *w, const xmlChar *content); - - /** - Register a namespace. Must be called before mceTextWriterStartElement. - \see MCE_DEFAULT - \see MCE_IGNORABLE - \see MCE_MUSTUNDERSTAND - */ - const xmlChar *mceTextWriterRegisterNamespace(mceTextWriter *w, const xmlChar *ns, const xmlChar *prefix, int flags); - - /** - Register qname (ns, ln) as a "process content" element wrt. MCE. Must be called before mceTextWriterStartElement. - */ - int mceTextWriterProcessContent(mceTextWriter *w, const xmlChar *ns, const xmlChar *ln); - - /** - Writes a formatted attribute. - \see http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterWriteFormatAttribute - */ - int mceTextWriterAttributeF(mceTextWriter *w, const xmlChar *ns, const xmlChar *ln, const char *value, ...); - - /** - Starts an MCE alternate content section. - */ - int mceTextWriterStartAlternateContent(mceTextWriter *w); - - /** - Ends an MCE alternate content section. - */ - int mceTextWriterEndAlternateContent(mceTextWriter *w); - - /** - Start an MCE choice. - */ - int mceTextWriterStartChoice(mceTextWriter *w, const xmlChar *ns); - - /** - Ends an MCE choice. - */ - int mceTextWriterEndChoice(mceTextWriter *w); - - /** - Start an MCE fallback. - */ - int mceTextWriterStartFallback(mceTextWriter *w); - - /** - Ends an MCE fallback. - */ - int mceTextWriterEndFallback(mceTextWriter *w); - - - /** - Returns the underlying xmlTextWriter. - */ - xmlTextWriterPtr mceTextWriterIntern(mceTextWriter *w); - - /** - Helper which create a new xmlTextWriterPtr for a FILE handle. - */ - xmlTextWriterPtr xmlNewTextWriterFile(FILE *file); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MCE_TEXTWRITER_H */ diff --git a/include/opc/config.h b/include/opc/config.h deleted file mode 100644 index e5a62c9..0000000 --- a/include/opc/config.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/**@file config/opc/config.h - */ -#ifndef OPC_CONFIG_H -#define OPC_CONFIG_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - Assert expression e is true. Will be removed entirely in release mode. - \hideinitializer - */ -#define OPC_ASSERT(e) assert(e) - -/** - Assert expression e is true. Expression will be executed in release mode too. - \hideinitializer - */ -#ifdef NDEBUG -#define OPC_ENSURE(e) (void)(e) -#else -#define OPC_ENSURE(e) assert(e) -#endif - - -/** - Constant for boolean true. - \hideinitializer - */ -#define OPC_TRUE (0==0) - -/** - Constant for boolean false. - \hideinitializer - */ -#define OPC_FALSE (0==1) - - /** - Boolean type. - \hideinitializer - */ - typedef pbool_t opc_bool_t; - - /** - Type which represents an offset in e.g. a file. - \hideinitializer - */ - typedef pofs_t opc_ofs_t; - - /** - 8-bit unsigned integer. - \hideinitializer - */ - typedef puint8_t opc_uint8_t; - - /** - 16-bit unsigned integer. - \hideinitializer - */ - typedef puint16_t opc_uint16_t; - - /** - 32-bit unsigned integer. - \hideinitializer - */ - typedef puint32_t opc_uint32_t; - - /** - 64-bit unsigned integer. - \hideinitializer - */ - typedef puint64_t opc_uint64_t; - - /** - 8-bit signed integer. - \hideinitializer - */ - typedef pint8_t opc_int8_t; - - /** - 16-bit signed integer. - \hideinitializer - */ - typedef pint16_t opc_int16_t; - - /** - 32-bit signed integer. - \hideinitializer - */ - typedef pint32_t opc_int32_t; - - /** - 64-bit signed integer. - \hideinitializer - */ - typedef pint64_t opc_int64_t; - -/** - Default size fo the deflate buffer used by zlib. - */ -#define OPC_DEFLATE_BUFFER_SIZE 4096 - -/** - Max system path len. - */ -#define OPC_MAX_PATH 512 - - /** - Error codes for the OPC module. - */ - typedef enum OPC_ERROR_ENUM { - OPC_ERROR_NONE, - OPC_ERROR_STREAM, - OPC_ERROR_SEEK, // can't seek - OPC_ERROR_UNSUPPORTED_DATA_DESCRIPTOR, - OPC_ERROR_UNSUPPORTED_COMPRESSION, - OPC_ERROR_DEFLATE, - OPC_ERROR_HEADER, - OPC_ERROR_MEMORY, - OPC_ERROR_XML, - OPC_ERROR_USER // user triggered an abort - } opc_error_t; - - /** - Compression options for OPC streams. - */ - typedef enum OPC_COMPRESSIONOPTION_ENUM { - OPC_COMPRESSIONOPTION_NONE, - OPC_COMPRESSIONOPTION_NORMAL, - OPC_COMPRESSIONOPTION_MAXIMUM, - OPC_COMPRESSIONOPTION_FAST, - OPC_COMPRESSIONOPTION_SUPERFAST - } opcCompressionOption_t; - - -/** - Helper for debug logs. - \hideinitializer - */ -#define opc_logf printf - -/** - Abstraction for memset(m, 0, s). - \hideinitializer - */ -#define opc_bzero_mem(m,s) memset(m, 0, s) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_CONFIG_H */ diff --git a/include/opc/container.h b/include/opc/container.h deleted file mode 100644 index 16875b4..0000000 --- a/include/opc/container.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/container.h - - The container.h module has the fundamental methods for dealing with ZIP-based OPC container. - - OPC container can be opened in READ-ONLY mode, WRITE-ONLY mode, READ/WRITE mode, TEMPLATE mode and TRANSITION mode. - The most notable mode is the READ/WRITE mode, which gives you concurrent stream-based READ and WRITE access to a - single ZIP-based OPC container. This is achieved without the use of temporary files by taking advantage of the - OPC specific “interleave” mode. \see http://standards.iso.org/ittf/PubliclyAvailableStandards/c051459_ISOIEC_29500-2_2008(E).zip - - The TEMPLATE mode allows very fast customized "cloning" of ZIP-based OPC container by using "RAW access" to the ZIP streams. - The TRANSITION mode is a special version of the TEMPLATE mode, which allows transition-based READ/WRITE access to the - ZIP-based OPC container using a temporary file. - - */ -#include -#include - -#ifndef OPC_CONTAINER_H -#define OPC_CONTAINER_H - -#ifdef __cplusplus -extern "C" { -#endif - /** - Handle to an OPC container created by \ref opcContainerOpen. - \see opcContainerOpen. - */ - typedef struct OPC_CONTAINER_STRUCT opcContainer; - - /** - Modes for opcContainerOpen(); - \see opcContainerOpen - */ - typedef enum { - /** - Opens the OPC container denoted by \a fileName in READ-ONLY mode. The \a destName parameter must be \a NULL. - \hideinitializer - */ - OPC_OPEN_READ_ONLY=0, - /** - Opens the OPC container denoted by \a fileName in WRITE-ONLY mode. The \a destName parameter must be \a NULL. - \hideinitializer - */ - OPC_OPEN_WRITE_ONLY=1, - /** - Opens the OPC container denoted by \a fileName in READ/WRITE mode. The \a destName parameter must be \a NULL. - \hideinitializer - */ - OPC_OPEN_READ_WRITE=2, - /** - This mode will open the container denoted by \a fileName in READ-ONLY mode and the container denoted by - \a destName in write-only mode. Any modifications will be written to the container denoted by \a destName - and the unmodified streams from \a fileName will be written to \a destName on closing. - \warning Currently not implemented. - \hideinitializer - */ - OPC_OPEN_TEMPLATE=3, - /** - Like the OPC_OPEN_TEMPLATE mode, but the \a destName will be renamed to the \a fileName on closing. If \a destName - is \a NULL, then the name of the temporary file will be generated automatically. - \warning Currently not implemented. - \hideinitializer - */ - OPC_OPEN_TRANSITION=4 - } opcContainerOpenMode; - - /** Modes for opcContainerClose. - \see opcContainerClose. - */ - typedef enum { - /** - Close the OPC container without any further postprocessing. - \hideinitializer - */ - OPC_CLOSE_NOW = 0, - /** - Close the OPC container and trim the file by removing unused fragments like e.g. - deleted parts. - \hideinitializer - */ - OPC_CLOSE_TRIM = 1, - /** - Close the OPC container like in \a OPC_CLOSE_TRIM mode, but additionally remove any - "interleaved" parts by reordering them. - \warning Currently not implemented. Same semantic as OPC_CLOSE_TRIM. - \hideinitializer - */ - OPC_CLOSE_DEFRAG = 2 - } opcContainerCloseMode; - - /** - Opens a ZIP-based OPC container. - @param[in] fileName. For more details see \ref opcContainerOpenMode. - @param[in] mode. For more details see \ref opcContainerOpenMode. - @param[in] userContext. Will not be modified by libopc. Can be used to e.g. store the "this" pointer for C++ bindings. - @param[in] destName. For more details see \ref opcContainerOpenMode. - @return \a NULL if failed. - \see opcContainerOpenMode - \see opcContainerDump - */ - opcContainer* opcContainerOpen(const xmlChar *fileName, - opcContainerOpenMode mode, - void *userContext, - const xmlChar *destName); - - /** - Opens a ZIP-based OPC container from memory. - @param[in] data. - @param[in] data_len. - @param[in] userContext. Will not be modified by libopc. Can be used to e.g. store the "this" pointer for C++ bindings. - @param[in] mode. For more details see \ref opcContainerOpenMode. - @return \a NULL if failed. - */ - opcContainer* opcContainerOpenMem(const opc_uint8_t *data, opc_uint32_t data_len, - opcContainerOpenMode mode, - void *userContext); - - /** - Opens a ZIP-based OPC container from memory. - @param[in] ioread. - @param[in] iowrite. - @param[in] ioclose. - @param[in] ioseek. - @param[in] iotrim. - @param[in] ioflush. - @param[in] iocontext. - @param[in] file_size. - @param[in] userContext. Will not be modified by libopc. Can be used to e.g. store the "this" pointer for C++ bindings. - @param[in] mode. For more details see \ref opcContainerOpenMode. - @return \a NULL if failed. - */ - opcContainer* opcContainerOpenIO(opcFileReadCallback *ioread, - opcFileWriteCallback *iowrite, - opcFileCloseCallback *ioclose, - opcFileSeekCallback *ioseek, - opcFileTrimCallback *iotrim, - opcFileFlushCallback *ioflush, - void *iocontext, - pofs_t file_size, - opcContainerOpenMode mode, - void *userContext); - - /** - Close an OPC container. - @param[in] c. \ref opcContainer openered by \ref opcContainerOpen. - @param[in] mode. For more information see \ref opcContainerCloseMode. - @return Non-zero if successful. - \see opcContainerOpen - \see opcContainerCloseMode - */ - opc_error_t opcContainerClose(opcContainer *c, opcContainerCloseMode mode); - - /** - Returns the unmodified user context passed to \ref opcContainerOpen. - \see opcContainerOpen - */ - void *opcContainerGetUserContext(opcContainer *c); - - /** - List all types, relations and parts of the container \a c to \a out. - \par Sample: - \include opc_dump.c - */ - opc_error_t opcContainerDump(opcContainer *c, FILE *out); - - /** - Exports the OPC container to "Flat OPC" (http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/the-flat-opc-format.aspx). - The flat versions of an OPC file are very important when dealing with e.g XSL(T)-based or Javascript-based transformations. - \see opcContainerFlatImport. - \todo Implementation needed. - */ - int opcContainerFlatExport(opcContainer *c, const xmlChar *fileName); - - /** - Imports the flat version of an OPC container. - \see opcContainerFlatExport. - \todo Implementation needed. - */ - int opcContainerFlatImport(opcContainer *c, const xmlChar *fileName); - - /** - Iterate all types. - \code - for(xmlChar *type=opcContentTypeFirst(c); - NULL!=type; - type=opcContentTypeNext(c, type)) { - printf("%s\n", type); - } - \endcode - */ - const xmlChar *opcContentTypeFirst(opcContainer *container); - - /** - \see opcContentTypeNext() - */ - const xmlChar *opcContentTypeNext(opcContainer *container, const xmlChar *type); - - /** - Iterate extensions. - \code - for(const xmlChar *ext=opcExtensionFirst(c); - NULL!=ext; - ext=opcExtensionNext(ext)) { - printf("%s\n", ext); - } - \endcode - */ - const xmlChar *opcExtensionFirst(opcContainer *container); - - /** - \see opcExtensionFirst() - */ - const xmlChar *opcExtensionNext(opcContainer *container, const xmlChar *ext); - - /** - Get registered type for extension. - \see opcExtensionRegister() - */ - const xmlChar *opcExtensionGetType(opcContainer *container, const xmlChar *ext); - - /** - Register a mime-type and and extension. - \see opcExtensionGetType() - */ - const xmlChar *opcExtensionRegister(opcContainer *container, const xmlChar *ext, const xmlChar *type); - - - /** - Iterator through all relation types of the container: - \code - for(xmlChar *type=opcRelationTypeFirst(c); - NULL!=type; - type=opcRelationTypeNext(c, type)) { - printf("%s\n", type); - } - \endcode - */ - const xmlChar *opcRelationTypeFirst(opcContainer *container); - - /** - \see opcRelationTypeFirst() - */ - const xmlChar *opcRelationTypeNext(opcContainer *container, const xmlChar *type); - - - /** - Iterator through all relation types of the container: - \code - for(xmlChar *target=opcExternalTargetFirst(c); - NULL!=target; - type=opcExternalTargetNext(c, target)) { - printf("%s\n", target); - } - \endcode - */ - const xmlChar *opcExternalTargetFirst(opcContainer *container); - - /** - \see opcExternalTargetFirst() - */ - const xmlChar *opcExternalTargetNext(opcContainer *container, const xmlChar *target); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_CONTAINER_H */ diff --git a/include/opc/file.h b/include/opc/file.h deleted file mode 100644 index 760fc90..0000000 --- a/include/opc/file.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/file.h - The opc module contains the file library functions. -*/ -#include - -#ifndef OPC_FILE_H -#define OPC_FILE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Flag for READ access. - \hideinitializer -*/ -#define OPC_FILE_READ (1<<0) - -/** - Flag for WRITE access. - \hideinitializer -*/ -#define OPC_FILE_WRITE (1<<1) - -/** - Flag indicates that file will be truncated when opened. - \hideinitializer -*/ -#define OPC_FILE_TRUNC (1<<2) - - - /** - Abstraction for see modes. - */ - typedef enum OPC_FILESEEKMODE_ENUM { - opcFileSeekSet = SEEK_SET, - opcFileSeekCur = SEEK_CUR, - opcFileSeekEnd = SEEK_END - } opcFileSeekMode; - - /** - Callback to read a file. E.g. for a FILE * context this can be implemented as - \code - static int opcFileRead(void *iocontext, char *buffer, int len) { - return fread(buffer, sizeof(char), len, (FILE*)iocontext); - } - \endcode - */ - typedef int opcFileReadCallback(void *iocontext, char *buffer, int len); - - /** - Callback to write a file. E.g. for a FILE * context this can be implemented as - \code - static int opcFileWrite(void *iocontext, const char *buffer, int len) { - return fwrite(buffer, sizeof(char), len, (FILE*)iocontext); - } - \endcode - */ - typedef int opcFileWriteCallback(void *iocontext, const char *buffer, int len); - - /** - Callback to close a file. E.g. for a FILE * context this can be implemented as - \code - static int opcFileClose(void *iocontext) { - return fclose((FILE*)iocontext); - } - \endcode - */ - typedef int opcFileCloseCallback(void *iocontext); - - /** - Callback to seek a file. E.g. for a FILE * context this can be implemented as - \code - static opc_ofs_t opcFileSeek(void *iocontext, opc_ofs_t ofs) { - int ret=fseek((FILE*)iocontext, ofs, SEEK_SET); - if (ret>=0) { - return ftell((FILE*)iocontext); - } else { - return ret; - } - } - \endcode - */ - typedef opc_ofs_t opcFileSeekCallback(void *iocontext, opc_ofs_t ofs); - - /** - Callback to trim a file. E.g. for a FILE * context this can be implemented as - \code - static int opcFileTrim(void *iocontext, opc_ofs_t new_size) { - #ifdef WIN32 - return _chsize(fileno((FILE*)iocontext), new_size); - #else - return ftruncate(fileno((FILE*)iocontext), new_size); - #endif - } - \endcode - */ - typedef int opcFileTrimCallback(void *iocontext, opc_ofs_t new_size); - - /** - Callback to flush a file. E.g. for a FILE * context this can be implemented as - \code - static int opcFileFlush(void *iocontext) { - return fflush((FILE*)iocontext); - } - \endcode - */ - typedef int opcFileFlushCallback(void *iocontext); - - /** - Represents a state of a file, i.e. file position (buf_pos) and error status (err). - */ - typedef struct OPC_FILERAWSTATE_STRUCT { - opc_error_t err; - opc_ofs_t buf_pos; // current pos in file - } opcFileRawState; - - /** - File IO context. - */ - typedef struct OPC_IO_STRUCT { - opcFileReadCallback *_ioread; - opcFileWriteCallback *_iowrite; - opcFileCloseCallback *_ioclose; - opcFileSeekCallback *_ioseek; - opcFileTrimCallback *_iotrim; - opcFileFlushCallback *_ioflush; - void *iocontext; - int flags; - opcFileRawState state; - opc_ofs_t file_size; - } opcIO_t; - - /** - Initialize an IO context. - */ - opc_error_t opcFileInitIO(opcIO_t *io, - opcFileReadCallback *ioread, - opcFileWriteCallback *iowrite, - opcFileCloseCallback *ioclose, - opcFileSeekCallback *ioseek, - opcFileTrimCallback *iotrim, - opcFileFlushCallback *ioflush, - void *iocontext, - pofs_t file_size, - int flags); - - /** - Initialize an IO context for a file. - */ - opc_error_t opcFileInitIOFile(opcIO_t *io, const xmlChar *filename, int flags); - - /** - Initialize an IO for memory. - \warning Currently supports READ-ONLY file access. - */ - opc_error_t opcFileInitIOMemory(opcIO_t *io, const opc_uint8_t *data, opc_uint32_t data_len, int flags); - - /** - Cleanup an IO context, i.e. release all system resources. - */ - opc_error_t opcFileCleanupIO(opcIO_t *io); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_FILE_H */ diff --git a/include/opc/helper.h b/include/opc/helper.h deleted file mode 100644 index ba639ac..0000000 --- a/include/opc/helper.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/helper.h - Contains helper functions for the opc module. -*/ -#include - -#ifndef OPC_HELPER_H -#define OPC_HELPER_H - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - /** - Constructs a segment name. - */ - opc_uint16_t opcHelperAssembleSegmentName(char *out, opc_uint16_t out_size, const xmlChar *name, opc_uint32_t segment_number, opc_uint32_t next_segment_id, opc_bool_t rels_segment, opc_uint16_t *out_max); - - /** - Splits a filename into the segment informations. - */ - opc_error_t opcHelperSplitFilename(opc_uint8_t *filename, opc_uint32_t filename_length, opc_uint32_t *segment_number, opc_bool_t *last_segment, opc_bool_t *rel_segment); - -#endif /* OPC_HELPER_H */ diff --git a/include/opc/inputstream.h b/include/opc/inputstream.h deleted file mode 100644 index 35ef028..0000000 --- a/include/opc/inputstream.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/inputstream.h - - */ -#include - -#ifndef OPC_INPUTSTREAM_H -#define OPC_INPUTSTREAM_H - -#ifdef __cplusplus -extern "C" { -#endif - /** - Internal type which represents a binary input stream. - */ - typedef struct OPC_CONTAINER_INPUTSTREAM_STRUCT opcContainerInputStream; - - /** - Opens the part \c name of the \c container for reading. - */ - opcContainerInputStream* opcContainerOpenInputStream(opcContainer *container, const xmlChar *name); - - /** - Reads maximal \c buffer_len bytes from the input \c stream to \c buffer. - \return The number of byes read or "0" in case of an error or end-of-stream. - */ - opc_uint32_t opcContainerReadInputStream(opcContainerInputStream* stream, opc_uint8_t *buffer, opc_uint32_t buffer_len); - - /** - Closes the input stream and releases all system resources. - */ - opc_error_t opcContainerCloseInputStream(opcContainerInputStream* stream); - - /** - Returns the type of compression used for the stream. - */ - opcCompressionOption_t opcContainerGetInputStreamCompressionOption(opcContainerInputStream* stream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_INPUTSTREAM_H */ diff --git a/include/opc/opc.h b/include/opc/opc.h deleted file mode 100644 index 0e52222..0000000 --- a/include/opc/opc.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/opc.h - The opc module contains the basic library functions. -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef OPC_OPC_H -#define OPC_OPC_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * Initialize libopc. - * Sample: - * \include opc_helloworld.c - * @return Non-zero if successful. - */ - opc_error_t opcInitLibrary(); - - /** - * Free libopc. Clean up all resources. - * @return Non-zero if successful. - * \see opcInitLibrary. - */ - opc_error_t opcFreeLibrary(); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_OPC_H */ diff --git a/include/opc/outputstream.h b/include/opc/outputstream.h deleted file mode 100644 index 7143209..0000000 --- a/include/opc/outputstream.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/outputstream.h - - */ -#include - -#ifndef OPC_OUTPUTSTREAM_H -#define OPC_OUTPUTSTREAM_H - -#ifdef __cplusplus -extern "C" { -#endif - /** - Internal type which represents a binary output stream. - */ - typedef struct OPC_CONTAINER_OUTPUTSTREAM_STRUCT opcContainerOutputStream; - - /** - Open the part \c name or writing in \c container with compression \c compression_option. - \note Make sure the part exists! - \see opcPartCreate. - */ - opcContainerOutputStream* opcContainerCreateOutputStream(opcContainer *container, const xmlChar *name, opcCompressionOption_t compression_option); - - /** - Write \c buffer_len bytes from \c buffer to \c stream. - \return Returns the number of bytes written. - */ - opc_uint32_t opcContainerWriteOutputStream(opcContainerOutputStream* stream, const opc_uint8_t *buffer, opc_uint32_t buffer_len); - - /** - Close the \c stream and free all associated resources. - */ - opc_error_t opcContainerCloseOutputStream(opcContainerOutputStream* stream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_OUTPUTSTREAM_H */ diff --git a/include/opc/part.h b/include/opc/part.h deleted file mode 100644 index bb1de5f..0000000 --- a/include/opc/part.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/part.h - - */ -#include - -#ifndef OPC_PART_H -#define OPC_PART_H - -#ifdef __cplusplus -extern "C" { -#endif - /** - Handle to an OPC part created by \ref opcPartOpen. - \see opcPartOpen. - */ - typedef xmlChar* opcPart; - -/** - Represents an invalid (resp. NULL) part. - In releations OPC_PART_INVALID also represents the root part. - \hideinitializer - */ -#define OPC_PART_INVALID NULL - - /** - Find a part in a \ container by \c absolutePath and/or \c type. - Currently no flags are supported. - */ - opcPart opcPartFind(opcContainer *container, - const xmlChar *absolutePath, - const xmlChar *type, - int flags); - - /** - Creates a part in a \ container with \c absolutePath and \c type. - Currently no flags are supported. - */ - opcPart opcPartCreate(opcContainer *container, - const xmlChar *absolutePath, - const xmlChar *type, - int flags); - - /** - Returns the type of the container. - The string is interned and must not be freed. - */ - const xmlChar *opcPartGetType(opcContainer *c, opcPart part); - - /** - Returns the type of the container. - If \c override_only then the return value will be NULL for parts not having an override type. - The string is interned and must not be freed. - */ - const xmlChar *opcPartGetTypeEx(opcContainer *c, opcPart part, opc_bool_t override_only); - - /** - Deleted that part \c absolutePath in the \c container. - */ - opc_error_t opcPartDelete(opcContainer *container, const xmlChar *absolutePath); - - /** - Get the first part. - \code - for(opcPart part=opcPartGetFirst(c);OPC_PART_INVALID!=part;part=opcPartGetNext(c, part)) { - printf("%s; \n", part, opcPartGetType(c, part)); - } - \endcode - */ - opcPart opcPartGetFirst(opcContainer *container); - - /** - Get the next part. - \see opcPartGetFirst - */ - opcPart opcPartGetNext(opcContainer *container, opcPart part); - - /** - Returns the size in bytes of the \c part. - */ - opc_ofs_t opcPartGetSize(opcContainer *c, opcPart part); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_PART_H */ diff --git a/include/opc/properties.h b/include/opc/properties.h deleted file mode 100755 index 27b5b1f..0000000 --- a/include/opc/properties.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/properties.h - - */ -#include -#include - -#ifndef OPC_PROPERTIES_H -#define OPC_PROPERTIES_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Represents a simple Dublin Core type. - */ - typedef struct OPC_DC_SIMPLE_TYPE { - xmlChar *str; - xmlChar *lang; - } opcDCSimpleType_t; - - /** - Represents the core properties of an OPC container. - */ - typedef struct OPC_PROPERTIES_STRUCT { - xmlChar *category; /* xsd:string */ - xmlChar *contentStatus; /* xsd:string */ - xmlChar *created; /* dc:date */ - opcDCSimpleType_t creator; /* dc:any */ - opcDCSimpleType_t description; /* dc:any */ - opcDCSimpleType_t identifier; /* dc:any */ - opcDCSimpleType_t *keyword_array; /* cp:CT_Keywords */ - opc_uint32_t keyword_items; - opcDCSimpleType_t language; /* dc:any */ - xmlChar *lastModifiedBy; /* xsd:string */ - xmlChar *lastPrinted; /* xsd:dateTime */ - xmlChar *modified; /* dc:date */ - xmlChar *revision; /* xsd:string */ - opcDCSimpleType_t subject; /* dc:any */ - opcDCSimpleType_t title; /* dc:any */ - xmlChar *version; /* xsd:string */ - } opcProperties_t; - - /** - Initialize the core properties \c cp. - \see opcCorePropertiesSetString - */ - opc_error_t opcCorePropertiesInit(opcProperties_t *cp); - - /** - Cleanup the core properties \c cp, i.e. release all resources. - \see opcCorePropertiesSetString - */ - opc_error_t opcCorePropertiesCleanup(opcProperties_t *cp); - - /** - Rease the core properties \c cp from the container \c. - */ - opc_error_t opcCorePropertiesRead(opcProperties_t *cp, opcContainer *c); - - - /** - Write/Update the core properties \c cp in the container \c. - */ - opc_error_t opcCorePropertiesWrite(opcProperties_t *cp, opcContainer *c); - - /** - Update a string in the core properties the right way. - \code - opcProperties_t cp; - opcCorePropertiesInit(&cp); - opcCorePropertiesSetString(&cp.revision, "1"); - opcCorePropertiesSetStringLang(&cp.creator, "Florian Reuter", NULL); - opcCorePropertiesCleanup(&cp); - \endcode - */ - opc_error_t opcCorePropertiesSetString(xmlChar **prop, const xmlChar *str); - - /** - Update a core properties the right way. - \see opcCorePropertiesSetString - */ - opc_error_t opcCorePropertiesSetStringLang(opcDCSimpleType_t *prop, const xmlChar *str, const xmlChar *lang); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_PROPERTIES_H */ diff --git a/include/opc/relation.h b/include/opc/relation.h deleted file mode 100644 index 3d52d0c..0000000 --- a/include/opc/relation.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/relation.h - - */ -#include - -#ifndef OPC_RELATION_H -#define OPC_RELATION_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Indentifier for an OPC relation. - */ - typedef opc_uint32_t opcRelation; - -/** - Constant which represents an invalid relation. -*/ -#define OPC_RELATION_INVALID (-1) - - /** - Find a relation originating from \c part in \c container with \c relationId and/or \c mimeType. - If \c part is OPC_PART_INVALID then part represents the root part. - @param[in] relationId The relationId (e.g. "rId1") or NULL. - @param[in] mimeType The mimeType or NULL. - */ - opcRelation opcRelationFind(opcContainer *container, opcPart part, const xmlChar *relationId, const xmlChar *mimeType); - - /** - Deleted the relation from the container. - \see opcRelationFind. - */ - opc_error_t opcRelationDelete(opcContainer *container, opcPart part, const xmlChar *relationId, const xmlChar *mimeType); - - /** - Returns the first relation. - The following code will dump all relations: - \code - for(opcPart part=opcPartGetFirst(c);OPC_PART_INVALID!=part;part=opcPartGetNext(c, part)) { - for(opcRelation rel=opcRelationFirst(part, c); - OPC_PART_INVALID!=rel; - rel=opcRelationNext(c, rel)) { - opcPart internal_target=opcRelationGetInternalTarget(c, part, rel); - const xmlChar *external_target=opcRelationGetExternalTarget(c, part, rel); - const xmlChar *target=(NULL!=internal_target?internal_target:external_target); - const xmlChar *prefix=NULL; - opc_uint32_t counter=-1; - const xmlChar *type=NULL; - opcRelationGetInformation(c, part, rel, &prefix, &counter, &type); - if (-1==counter) { // no counter after prefix - printf("%s;%s;%s;%s\n", part, prefix, target, type); - } else { - printf("%s;%s%i;%s;%s\n", part, prefix, counter, target, type); - } - } - } - \endcode - */ - opcRelation opcRelationFirst(opcContainer *container, opcPart part); - - /** - \see opcRelationFirst - */ - opcRelation opcRelationNext(opcContainer *container, opcPart part, opcRelation relation); - - /** - Returns the internal target. - \note To test for an external target use opcRelationGetExternalTarget. - \see opcRelationGetExternalTarget - */ - opcPart opcRelationGetInternalTarget(opcContainer *container, opcPart part, opcRelation relation); - - /** - Returns the external target or NULL if it is an internal target. - The string is interned. Must not be freed. - \see opcRelationGetExternalTarget - */ - const xmlChar *opcRelationGetExternalTarget(opcContainer *container, opcPart part, opcRelation relation); - - /** - Returns the relations type. - The string is interned. Must not be freed. - */ - const xmlChar *opcRelationGetType(opcContainer *container, opcPart part, opcRelation relation); - - /** - Get information about a relation. - \see opcRelationFirst - */ - void opcRelationGetInformation(opcContainer *container, opcPart part, opcRelation relation, const xmlChar **prefix, opc_uint32_t *counter, const xmlChar **type); - - /** - Add a relation to \c container from \c src part to \c dest part with id \c rid and type \c type. - */ - opc_uint32_t opcRelationAdd(opcContainer *container, opcPart src, const xmlChar *rid, opcPart dest, const xmlChar *type); - - /** - Add an external relation to \c container from \c src part to \c target URL with id \c rid and type \c type. - */ - opc_uint32_t opcRelationAddExternal(opcContainer *container, opcPart src, const xmlChar *rid, const xmlChar *target, const xmlChar *type); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_RELATION_H */ diff --git a/include/opc/xmlreader.h b/include/opc/xmlreader.h deleted file mode 100644 index 7c13ec1..0000000 --- a/include/opc/xmlreader.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/xmlreader.h - - */ - -#ifndef OPC_XMLREADER_H -#define OPC_XMLREADER_H - -#include -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Open an MCE reader for \c partName. Parameters \c URL, \c encoding and \c options will be passed unmodified to - http://xmlsoft.org/html/libxml-xmlreader.html#xmlReaderForIO and they can we NULL, NULL, 0. - \note Make sure the part exists. - \see opcPartFind - */ - opc_error_t opcXmlReaderOpen(opcContainer *container, mceTextReader_t *mceTextReader, const xmlChar *partName, const char * URL, const char * encoding, int options); - - /** - Returns an libxml DOM document. Parameters \c URL, \c encoding and \c options will be passed unmodified to - http://xmlsoft.org/html/libxml-parser.html#xmlReadIO and they can we NULL, NULL, 0. - \note Make sure the part exists. - \see opcPartFind - */ - xmlDocPtr opcXmlReaderReadDoc(opcContainer *container, const xmlChar *partName, const char * URL, const char * encoding, int options); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_XMLREADER_H */ diff --git a/include/opc/xmlwriter.h b/include/opc/xmlwriter.h deleted file mode 100644 index 9445cd4..0000000 --- a/include/opc/xmlwriter.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/xmlwriter.h - - */ -#include -#include - -#ifndef OPC_XMLWRITER_H -#define OPC_XMLWRITER_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Create an MCE text writer for \c part in \c container with compression \c compression_option. - \note Make sure the part exists. - \see opcPartFind - */ - mceTextWriter *mceTextWriterOpen(opcContainer *c, opcPart part, opcCompressionOption_t compression_option); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_XMLWRITER_H */ diff --git a/include/opc/zip.h b/include/opc/zip.h deleted file mode 100644 index 6dc85f1..0000000 --- a/include/opc/zip.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -/** @file opc/zip.h - The ZIP file backend of an OPC container. - */ -#include -#include -#include - -#ifndef OPC_ZIP_H -#define OPC_ZIP_H - -#ifdef __cplusplus -extern "C" { -#endif - - /** - Default growth hint of an OPC stream. - */ - #define OPC_DEFAULT_GROWTH_HINT 512 - - /** - Handle to a ZIP archive. - \see internal.h - */ - typedef struct OPC_ZIP_STRUCT opcZip; - - /** - Handle to a raw ZIP input stream. - \see internal.h - */ - typedef struct OPC_ZIPINPUTSTREAM_STRUCT opcZipInputStream; - - /** - Handle to a raw ZIP output stream. - \see internal.h - */ - typedef struct OPC_ZIPOUTPUTSTREAM_STRUCT opcZipOutputStream; - - /** - Holds all information of a ZIP segment. - */ - typedef struct OPC_ZIP_SEGMENT_INFO_STRUCT { - xmlChar name[OPC_MAX_PATH]; - opc_uint32_t name_len; - opc_uint32_t segment_number; - opc_bool_t last_segment; - opc_bool_t rels_segment; - opc_uint32_t header_size; - opc_uint32_t min_header_size; - opc_uint32_t trailing_bytes; - opc_uint32_t compressed_size; - opc_uint32_t uncompressed_size; - opc_uint16_t bit_flag; - opc_uint32_t data_crc; - opc_uint16_t compression_method; - opc_ofs_t stream_ofs; - opc_uint16_t growth_hint; - } opcZipSegmentInfo_t; - - /** - \see opcZipLoader - */ - typedef int opcZipLoaderOpenCallback(void *iocontext); - /** - \see opcZipLoader - */ - typedef int opcZipLoaderSkipCallback(void *iocontext); - /** - \see opcZipLoader - */ - typedef int opcZipLoaderReadCallback(void *iocontext, char *buffer, int len); - /** - \see opcZipLoader - */ - typedef int opcZipLoaderCloseCallback(void *iocontext); - - /** - \see opcZipLoader - */ - typedef opc_error_t (opcZipLoaderSegmentCallback_t)(void *iocontext, void *userctx, opcZipSegmentInfo_t *info, opcZipLoaderOpenCallback *open, opcZipLoaderReadCallback *read, opcZipLoaderCloseCallback *close, opcZipLoaderSkipCallback *skip); - - /** - Walks every segment in a ZIP archive and calls the \c segmentCallback callback method. - The implementer \c segmentCallback method must then eiher use the passed \c open, \c read and \c close methods - to read the stream or the passed \c skip methods to skip the stream. - This method can be used to e.g. read ZIP file in stream mode. - */ - opc_error_t opcZipLoader(opcIO_t *io, void *userctx, opcZipLoaderSegmentCallback_t *segmentCallback); - - /** - \see opcZipClose - */ - typedef opc_error_t (opcZipSegmentReleaseCallback)(opcZip *zip, opc_uint32_t segment_id); - - /** - Closes the ZIP archive \c zip and will call \c releaseCallback for every segment to give the implementer a chance - to free user resources. - */ - void opcZipClose(opcZip *zip, opcZipSegmentReleaseCallback* releaseCallback); - - /** - Creates an empty ZIP archive with the given \c io. - */ - opcZip *opcZipCreate(opcIO_t *io); - - /** - Commits all buffers and writes the ZIP archives local header directories. - if \c trim is true then padding bytes will be removed, i.e. the ZIP file size fill be minimalized. - */ - opc_error_t opcZipCommit(opcZip *zip, opc_bool_t trim); - - /** - Garbage collection on the passed \c zip archive. This will e.g. make deleted files available as free space. - */ - opc_error_t opcZipGC(opcZip *zip); - - /** - Load segment information into \c info. - If \c rels_segment is -1 then load the info for part with name \c partName. - Otherwise load the segment information for the ".rels." segment of \c partName. - \return Returns the segment_id. - */ - opc_uint32_t opcZipLoadSegment(opcZip *zip, const xmlChar *partName, opc_bool_t rels_segment, opcZipSegmentInfo_t *info); - - /** - Create a segment with the given parameters. - \return Returns the segment_id. - */ - opc_uint32_t opcZipCreateSegment(opcZip *zip, - const xmlChar *partName, - opc_bool_t relsSegment, - opc_uint32_t segment_size, - opc_uint32_t growth_hint, - opc_uint16_t compression_method, - opc_uint16_t bit_flag); - - /** - Creates an input stream for the segment with \c segment_id. - \see opcZipLoadSegment - \see opcZipCreateSegment - */ - opcZipInputStream *opcZipOpenInputStream(opcZip *zip, opc_uint32_t segment_id); - - /** - Free all resources of the input stream. - */ - opc_error_t opcZipCloseInputStream(opcZip *zip, opcZipInputStream *stream); - - /** - Read maximal \c buf_len bytes from the input stream into \buf. - \return Returns the number of bytes read. - */ - opc_uint32_t opcZipReadInputStream(opcZip *zip, opcZipInputStream *stream, opc_uint8_t *buf, opc_uint32_t buf_len); - - - /** - Creates an output stream for the segment with \c segment_id. - If \c *segment_id is -1 then a new segment will be created. - Otherwise the segment with \c *segment_id will be overwritten. - */ - opcZipOutputStream *opcZipCreateOutputStream(opcZip *zip, - opc_uint32_t *segment_id, - const xmlChar *partName, - opc_bool_t relsSegment, - opc_uint32_t segment_size, - opc_uint32_t growth_hint, - opc_uint16_t compression_method, - opc_uint16_t bit_flag); - - /** - Opens an existing ouput stream for reading. - The \c *segment_id will be set to -1 and reset on opcZipCloseOutputStream. - \see opcZipCloseOutputStream - */ - opcZipOutputStream *opcZipOpenOutputStream(opcZip *zip, opc_uint32_t *segment_id); - - /** - Will close the stream and free all resources. Additionally the new segment id will be stored in \c *segment_id. - \see opcZipOpenOutputStream - */ - opc_error_t opcZipCloseOutputStream(opcZip *zip, opcZipOutputStream *stream, opc_uint32_t *segment_id); - - /** - Write \c buf_len bytes to \c buf. - \return Returns the number of bytes written. - */ - opc_uint32_t opcZipWriteOutputStream(opcZip *zip, opcZipOutputStream *stream, const opc_uint8_t *buf, opc_uint32_t buf_len); - - /** - Returns the first segment id or -1. - Use the following code to iterarte through all segments. - \code - for(opc_uint32_t segment_id=opcZipGetFirstSegmentId(zip); - -1!=segment_id; - segment_id=opcZipGetNextSegmentId(zip, segment_id) { - ... - } - \endcode - \see opcZipGetNextSegmentId - */ - opc_uint32_t opcZipGetFirstSegmentId(opcZip *zip); - - /** - Returns the next segment id or -1. - \see opcZipGetFirstSegmentId - */ - opc_uint32_t opcZipGetNextSegmentId(opcZip *zip, opc_uint32_t segment_id); - - /** - Returns info about the given segment id. - */ - opc_error_t opcZipGetSegmentInfo(opcZip *zip, opc_uint32_t segment_id, const xmlChar **name, opc_bool_t *rels_segment, opc_uint32_t *crc); - - /** - Marks a given segments as deleted. - \see opcZipGC - */ - opc_bool_t opcZipSegmentDelete(opcZip *zip, opc_uint32_t *first_segment, opc_uint32_t *last_segment, opcZipSegmentReleaseCallback* releaseCallback); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* OPC_ZIP_H */ diff --git a/include/plib/plib.h b/include/plib/plib.h deleted file mode 100644 index b742ffb..0000000 --- a/include/plib/plib.h +++ /dev/null @@ -1,168 +0,0 @@ -/* include/plib/plib.h. Generated from plib.h by configure. */ -/* - Copyright (c) 2010, Florian Reuter - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Florian Reuter nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -#ifndef _PLIB_PLIB_H_ -#define _PLIB_PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define HAVE_STDINT_H 1 -#define HAVE_STDDEF_H 1 -#define HAVE_STDIO_H 1 -#define HAVE_STRING_H 1 -#define HAVE_LIMITS_H 1 -#define HAVE_STDLIB_H 1 -/* #undef HAVE_IO_H */ -#define HAVE_UNISTD_H 1 -#define HAVE_SYS_TYPES_H 1 -#define IS_CONFIGURED 1 - -#if !defined(IS_CONFIGURED) -#if defined(WIN32) -#define HAVE_STRING_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_LIMITS_H 1 -#define HAVE_STDDEF_H 1 -#define HAVE_STDIO_H 1 -#define HAVE_STDLIB_H 1 -#define HAVE_IO_H -#define snprintf _snprintf -#else -#error "configure not executed and we are not on a win32 machine? please run configure or define WIN32 is you are on a WIN32 platform." -#endif -#endif - -#ifdef HAVE_STDDEF_H -#include -typedef size_t pofs_t; // maximum file offset for eg. read write ops -#else -#error "system types can not be determined" -#endif - -#ifdef HAVE_STDIO_H -#include -#else -#error "system io can not be determined" -#endif - -#ifdef HAVE_STDINT_H -#include - -typedef int8_t pint8_t; -typedef uint8_t puint8_t; - -typedef int16_t pint16_t; -typedef uint16_t puint16_t; - -typedef int32_t pint32_t; -typedef uint32_t puint32_t; - -typedef int64_t pint64_t; -typedef uint64_t puint64_t; - -typedef int pbool_t; - -typedef size_t psize_t; - -// INTN_MAX, INTN_MIN, UINTN_MAX -#else -#error "system types can not be determined" -#endif - -#ifdef HAVE_STRING_H -#include -#endif - -#ifdef HAVE_LIMITS_H -#include -#define PUINT8_MAX UCHAR_MAX -#define PINT32_MAX INT_MAX -#define PINT32_MIN INT_MIN -#define PUINT32_MAX UINT_MAX -#define PUINT32_MIN 0 -#define PUINT16_MAX USHRT_MAX -#define PUINT16_MIN 0 -#else -#error "limits can not be determined" -#endif - -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifdef HAVE_IO_H -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -/** - Converts an ASCII string to a xmlChar string. This only works for ASCII strings. - */ -#ifndef _X -#define _X(s) BAD_CAST(s) -#endif - - -/** - Converts an xmlChar string to an ASCII string. This only works for ASCII charsets. - */ -#ifndef _X2C -#define _X2C(s) ((char*)(s)) -#endif - - -#define PASSERT(e) assert(e) -#ifdef NDEBUG -#define PENSURE(e) (void)(e) -#else -#define PENSURE(e) assert(e) -#endif -#define PTRUE (0==0) -#define PFALSE (0==1) - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - -#endif /* _PLIB_PLIB_H_ */ diff --git a/lib/libopc/libmce.a b/lib/libopc/libmce.a deleted file mode 100644 index 68c494a4d368b7d8f5943aa26cbf4aa201ae9c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32392 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 diff --git a/lib/libopc/libopc.a b/lib/libopc/libopc.a deleted file mode 100644 index 2e90a925a5fa1997791ffcc2e5fab947bb057456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141958 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 TbWvXG?P4*3oj6hAaJ-oJ@(T%y=CA|33tPl! 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 On67jW*41ow{l5TSiZgrw diff --git a/lib/libopc/libplib.a b/lib/libopc/libplib.a deleted file mode 100644 index fa1cb3f9b19f1b98535ca5333967423e3e72bc75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044 zcmbVKO-sW-5S=ttYi@cHyrd@;bgiWdl~NW;?L|Zc!DEvcsAw8#_Fzx`9si!cpw4b~ zlXZ7<(1FaGc{6V|`_Uamt7I__&col<)6z25eHad^`aA%%_qUgrkiPNd-+|7dim5$>cgbp4~m3ghSFNy;|ao_?R|)Z(K#+ zxiWwcEmu48egnVNz_)E)99{xIigm`K7?G_?T&Rep9}LKI#3CSZQ2n9m6%|)a7(D2S7Ms01cfFP;sriz)gUCO=S8fL-;G4GhE=qDC)i2wvf8A@) Nccgx*gc8mF{{bT|IX(aY diff --git a/src/main.c b/src/main.c index c5f7e02..b9fd1eb 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ #define EPILOG "Made by simon987 . Released under GPL-3.0" -static const char *const Version = "1.3.0"; +static const char *const Version = "1.3.1"; static const char *const usage[] = { "sist2 scan [OPTION]... PATH", "sist2 index [OPTION]... INDEX", @@ -17,7 +17,6 @@ static const char *const usage[] = { void global_init() { curl_global_init(CURL_GLOBAL_NOTHING); av_log_set_level(AV_LOG_QUIET); - opcInitLibrary(); } void init_dir(const char *dirpath) { diff --git a/src/parsing/doc.c b/src/parsing/doc.c index ce96098..7f7de90 100644 --- a/src/parsing/doc.c +++ b/src/parsing/doc.c @@ -1,27 +1,31 @@ #include "doc.h" #include "src/ctx.h" + +#define STR_STARTS_WITH(x, y) (strncmp(y, x, sizeof(y) - 1) == 0) + __always_inline -static int should_read_part(char *part) { +static int should_read_part(const char *part) { LOG_DEBUGF("doc.c", "Got part : %s", part) - char *part_name = (char *) part; if (part == NULL) { return FALSE; } if ( // Word - strcmp(part_name, "word/document.xml") == 0 - || strncmp(part_name, "word/footer", sizeof("word/footer") - 1) == 0 - || strncmp(part_name, "word/header", sizeof("word/header") - 1) == 0 + STR_STARTS_WITH(part, "word/document.xml") + || STR_STARTS_WITH(part, "word/footnotes.xml") + || STR_STARTS_WITH(part, "word/endnotes.xml") + || STR_STARTS_WITH(part, "word/footer") + || STR_STARTS_WITH(part, "word/header") // PowerPoint - || strncmp(part_name, "ppt/slides/slide", sizeof("ppt/slides/slide") - 1) == 0 - || strncmp(part_name, "ppt/notesSlides/notesSlide", sizeof("ppt/notesSlides/notesSlide") - 1) == 0 + || STR_STARTS_WITH(part, "ppt/slides/slide") + || STR_STARTS_WITH(part, "ppt/notesSlides/slide") // Excel - || strncmp(part_name, "xl/worksheets/sheet", sizeof("xl/worksheets/sheet") - 1) == 0 - || strcmp(part_name, "xl/sharedStrings.xml") == 0 - || strcmp(part_name, "xl/workbook.xml") == 0 + || STR_STARTS_WITH(part, "xl/worksheets/sheet") + || STR_STARTS_WITH(part, "xl/sharedStrings.xml") + || STR_STARTS_WITH(part, "xl/workbook.xml") ) { return TRUE; } @@ -29,78 +33,64 @@ static int should_read_part(char *part) { return FALSE; } -typedef int (XMLCALL *xmlInputReadCallback)(void *context, char *buffer, int len); +int extract_text(xmlDoc *xml, xmlNode *node, text_buffer_t *buf) { + //TODO: Check which nodes are likely to have a 't' child, and ignore nodes that aren't + xmlErrorPtr err = xmlGetLastError(); + if (err != NULL) { + if (err->level == XML_ERR_FATAL) { + LOG_ERRORF("doc.c", "Got fatal XML error while parsing document: %s", err->message) + return -1; + } else { + LOG_ERRORF("doc.c", "Got recoverable XML error while parsing document: %s", err->message) + } + } -typedef struct { - struct archive *a; -} xml_io_ctx; + for (xmlNode *child = node; child; child = child->next) { + if (*child->name == 't' && *(child->name + 1) == '\0') { + xmlChar *text = xmlNodeListGetString(xml, child->xmlChildrenNode, 1); -int xml_io_read(void *context, char *buffer, int len) { - xml_io_ctx *ctx = context; + if (text) { + text_buffer_append_string0(buf, (char *) text); + text_buffer_append_char(buf, ' '); + xmlFree(text); + } + } - //TODO: return value ? - return archive_read_data(ctx->a, buffer, len); + extract_text(xml, child->children, buf); + } } -int xml_io_close(void *context) { +int xml_io_read(void *context, char *buffer, int len) { + struct archive *a = context; + return archive_read_data(a, buffer, len); +} + +int xml_io_close(UNUSED(void *context)) { //noop return 0; } __always_inline -static int read_part(struct archive *a, dyn_buffer_t *buf, document_t *doc) { +static int read_part(struct archive *a, text_buffer_t *buf, document_t *doc) { - xmlNode *root, *first_child, *node1, *node2, *node3, *node4; + xmlDoc *xml = xmlReadIO(xml_io_read, xml_io_close, a, "/", NULL, XML_PARSE_RECOVER | XML_PARSE_NOWARNING | XML_PARSE_NOERROR | XML_PARSE_NONET); - xml_io_ctx ctx = {a}; - - /* do actual parsing of document */ - xmlDoc *xml = xmlReadIO(xml_io_read, xml_io_close, &ctx, "/", NULL, 0); - - /* error checking! */ if (xml == NULL) { - fprintf(stderr, "Document not parsed successfully. \n"); + LOG_ERROR(doc->filepath, "Could not parse XML") return -1; } - root = xmlDocGetRootElement(xml); + + xmlNode *root = xmlDocGetRootElement(xml); if (root == NULL) { - fprintf(stderr, "empty document\n"); - xmlFreeDoc(xml); - return -1; - } - if (xmlStrcmp(root->name, (const xmlChar *) "document") != 0) { - fprintf(stderr, "document of the wrong type, root node != document"); + LOG_ERROR(doc->filepath, "Empty document") xmlFreeDoc(xml); return -1; } - /* init a few more variables */ - xmlChar *key; + extract_text(xml, root, buf); + xmlFreeDoc(xml); - first_child = root->children; - for (node1 = first_child; node1; node1 = node1->next) { - if ((xmlStrcmp(node1->name, (const xmlChar *) "body")) == 0) { - for (node2 = node1->children; node2; node2 = node2->next) { - if ((xmlStrcmp(node2->name, (const xmlChar *) "p")) == 0) { - - dyn_buffer_write_char(buf, ' '); - - for (node3 = node2->children; node3; node3 = node3->next) { - if ((xmlStrcmp(node3->name, (const xmlChar *) "r")) == 0) { - for (node4 = node3->children; node4; node4 = node4->next) { - if ((!xmlStrcmp(node4->name, (const xmlChar *) "t"))) { - key = xmlNodeListGetString(xml, node4->xmlChildrenNode, 1); - - dyn_buffer_append_string(buf, (char *) key); - dyn_buffer_write_char(buf, ' '); - } - } - } - } - } - } - } - } + return 0; } void parse_doc(void *mem, size_t mem_len, document_t *doc) { @@ -114,17 +104,17 @@ void parse_doc(void *mem, size_t mem_len, document_t *doc) { int ret = archive_read_open_memory(a, mem, mem_len); if (ret != ARCHIVE_OK) { - LOG_ERRORF(doc->filepath, "Could not read archive: %s", archive_error_string(a)); + LOG_ERRORF(doc->filepath, "Could not read archive: %s", archive_error_string(a)) archive_read_free(a); return; } - dyn_buffer_t buf = dyn_buffer_create(); + text_buffer_t buf = text_buffer_create(ScanCtx.content_size); struct archive_entry *entry; while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { if (S_ISREG(archive_entry_stat(entry)->st_mode)) { - char *path = (char *) archive_entry_pathname(entry); + const char *path = archive_entry_pathname(entry); if (should_read_part(path)) { ret = read_part(a, &buf, doc); @@ -132,21 +122,19 @@ void parse_doc(void *mem, size_t mem_len, document_t *doc) { break; } } - } } + if (buf.dyn_buffer.cur > 0) { + text_buffer_terminate_string(&buf); - // close - - if (buf.cur > 0) { - dyn_buffer_write_char(&buf, '\0'); - - meta_line_t *meta = malloc(sizeof(meta_line_t) + buf.cur); + meta_line_t *meta = malloc(sizeof(meta_line_t) + buf.dyn_buffer.cur); meta->key = MetaContent; - strcpy(meta->strval, buf.buf); + strcpy(meta->strval, buf.dyn_buffer.buf); APPEND_META(doc, meta) } - dyn_buffer_destroy(&buf); + archive_read_close(a); + archive_read_free(a); + text_buffer_destroy(&buf); } diff --git a/src/parsing/parse.c b/src/parsing/parse.c index 819b015..bebd3c1 100644 --- a/src/parsing/parse.c +++ b/src/parsing/parse.c @@ -36,7 +36,7 @@ void *read_all(parse_job_t *job, const char *buf, int bytes_read) { memcpy(full_buf, buf, bytes_read); int ret = job->vfile.read(&job->vfile, full_buf + bytes_read, job->info.st_size - bytes_read); - if (ret == -1) { + if (ret < 0) { LOG_ERRORF(job->filepath, "read(): [%d] %s", errno, strerror(errno)) return NULL; } @@ -58,6 +58,7 @@ void parse(void *arg) { if (Magic == NULL) { Magic = magic_open(MAGIC_MIME_TYPE); + magic_load(Magic, NULL); } doc.filepath = job->filepath; @@ -90,7 +91,7 @@ void parse(void *arg) { if (doc.mime == 0 && !ScanCtx.fast) { // Get mime type with libmagic bytes_read = job->vfile.read(&job->vfile, buf, PARSE_BUF_SIZE); - if (bytes_read == -1) { + if (bytes_read < 0) { LOG_WARNINGF(job->filepath, "read() Error: %s", strerror(errno)) CLOSE_FILE(job->vfile) return; @@ -99,10 +100,16 @@ void parse(void *arg) { const char *magic_mime_str = magic_buffer(Magic, buf, bytes_read); if (magic_mime_str != NULL) { doc.mime = mime_get_mime_by_string(ScanCtx.mime_table, magic_mime_str); + + LOG_DEBUGF(job->filepath, "libmagic: %s", magic_mime_str); + if (doc.mime == 0) { LOG_WARNINGF(job->filepath, "Couldn't find mime %s", magic_mime_str); } } + + magic_close(Magic); + Magic = NULL; } int mmime = MAJOR_MIME(doc.mime); @@ -112,11 +119,11 @@ void parse(void *arg) { } else if ((mmime == MimeVideo && doc.size >= MIN_VIDEO_SIZE) || (mmime == MimeImage && doc.size >= MIN_IMAGE_SIZE) || mmime == MimeAudio) { - if (job->vfile.is_fs_file) { - parse_media_filename(job->filepath, &doc); - } else { - parse_media_vfile(&job->vfile, &doc); - } +// if (job->vfile.is_fs_file) { +// parse_media_filename(job->filepath, &doc); +// } else { +// parse_media_vfile(&job->vfile, &doc); +// } } else if (IS_PDF(doc.mime)) { void *pdf_buf = read_all(job, (char *) buf, bytes_read); diff --git a/src/sist.h b/src/sist.h index 221b6e4..21eb897 100644 --- a/src/sist.h +++ b/src/sist.h @@ -31,8 +31,8 @@ #include "freetype/freetype.h" #include #include -#include #include +#include #define BOOL int #include #include