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 68c494a..0000000 Binary files a/lib/libopc/libmce.a and /dev/null differ diff --git a/lib/libopc/libopc.a b/lib/libopc/libopc.a deleted file mode 100644 index 2e90a92..0000000 Binary files a/lib/libopc/libopc.a and /dev/null differ diff --git a/lib/libopc/libplib.a b/lib/libopc/libplib.a deleted file mode 100644 index fa1cb3f..0000000 Binary files a/lib/libopc/libplib.a and /dev/null differ 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