This is a sample for testing libmobi project.

Libmobi features:

- reading and parsing:

- some older text Palmdoc formats (pdb),

- Mobipocket files (prc, mobi),

- newer MOBI files including KF8 format (azw, azw3),

- Replica Print files (azw4)

- recreating source files using indices

- reconstructing references (links and embedded) in html files

- reconstructing source structure that can be fed back to kindlegen

- reconstructing dictionary markup (orth, infl tags)

- writing back loaded documents

- metadata editing

- handling encrypted documents

This is libmobi public header.

Libmobi's author is Bartek Fabiszewski

The source code is available on github repo. Libmobi is distributed under LGPL-3+ license.

/** @file mobi.h * @brief Libmobi main header file * * This file is installed with the library. * Include it in your project with "#include <mobi.h>". * See example of usage in mobitool.c. * * Copyright (c) 2014 Bartek Fabiszewski * http://www.fabiszewski.net * * This file is part of libmobi. * Licensed under LGPL, either version 3, or any later. * See <http://www.gnu.org/licenses/> */ #ifndef libmobi_mobi_h #define libmobi_mobi_h #include <stdio.h> #include <stdint.h> #include <stdbool.h> #include <time.h> /** @brief Visibility attributes for symbol export */ #if defined (__CYGWIN__) || defined (__MINGW32__) #define MOBI_EXPORT __attribute__((visibility("default"))) __declspec(dllexport) extern #elif defined (_WIN32) #define MOBI_EXPORT __declspec(dllexport) #else #define MOBI_EXPORT __attribute__((__visibility__("default"))) #endif /** @brief Usually 32-bit values in mobi records with value 0xffffffff mean "value not set" */ #define MOBI_NOTSET UINT32_MAX #ifdef __cplusplus extern "C" { #endif /** @defgroup mobi_enums Exported enums @{ */ /** @brief Error codes returned by functions */ typedef enum { MOBI_SUCCESS = 0, /**< Generic success return value */ MOBI_ERROR = 1, /**< Generic error return value */ MOBI_PARAM_ERR = 2, /**< Wrong function parameter */ MOBI_DATA_CORRUPT = 3, /**< Corrupted data */ MOBI_FILE_NOT_FOUND = 4, /**< File not found */ MOBI_FILE_ENCRYPTED = 5, /**< Unsupported encrypted data */ MOBI_FILE_UNSUPPORTED = 6, /**< Unsupported document type */ MOBI_MALLOC_FAILED = 7, /**< Memory allocation error */ MOBI_INIT_FAILED = 8, /**< Initialization error */ MOBI_BUFFER_END = 9, /**< Out of buffer error */ MOBI_XML_ERR = 10, /**< XMLwriter error */ MOBI_DRM_PIDINV = 11, /**< Invalid DRM PID */ MOBI_DRM_KEYNOTFOUND = 12, /**< Key not found */ MOBI_DRM_UNSUPPORTED = 13, /**< DRM support not included */ MOBI_WRITE_FAILED = 14, /**< Writing to file failed */ } MOBI_RET; /** @brief EXTH record types */ typedef enum { EXTH_NUMERIC = 0, EXTH_STRING = 1, EXTH_BINARY = 2 } MOBIExthType; /** @brief EXTH record tags */ typedef enum { EXTH_DRMSERVER = 1, EXTH_DRMCOMMERCE = 2, EXTH_DRMEBOOKBASE = 3, EXTH_TITLE = 99, /**< <dc:title> */ EXTH_AUTHOR = 100, /**< <dc:creator> */ EXTH_PUBLISHER = 101, /**< <dc:publisher> */ EXTH_IMPRINT = 102, /**< <imprint> */ EXTH_DESCRIPTION = 103, /**< <dc:description> */ EXTH_ISBN = 104, /**< <dc:identifier opf:scheme="ISBN"> */ EXTH_SUBJECT = 105, /**< <dc:subject> */ EXTH_PUBLISHINGDATE = 106, /**< <dc:date> */ EXTH_REVIEW = 107, /**< <review> */ EXTH_CONTRIBUTOR = 108, /**< <dc:contributor> */ EXTH_RIGHTS = 109, /**< <dc:rights> */ EXTH_SUBJECTCODE = 110, /**< <dc:subject BASICCode="subjectcode"> */ EXTH_TYPE = 111, /**< <dc:type> */ EXTH_SOURCE = 112, /**< <dc:source> */ EXTH_ASIN = 113, EXTH_VERSION = 114, EXTH_SAMPLE = 115, EXTH_STARTREADING = 116, /**< Start reading */ EXTH_ADULT = 117, /**< <adult> */ EXTH_PRICE = 118, /**< <srp> */ EXTH_CURRENCY = 119, /**< <srp currency="currency"> */ EXTH_KF8BOUNDARY = 121, EXTH_FIXEDLAYOUT = 122, /**< <fixed-layout> */ EXTH_BOOKTYPE = 123, /**< <book-type> */ EXTH_ORIENTATIONLOCK = 124, /**< <orientation-lock> */ EXTH_COUNTRESOURCES = 125, EXTH_ORIGRESOLUTION = 126, /**< <original-resolution> */ EXTH_ZEROGUTTER = 127, /**< <zero-gutter> */ EXTH_ZEROMARGIN = 128, /**< <zero-margin> */ EXTH_KF8COVERURI = 129, EXTH_RESCOFFSET = 131, EXTH_REGIONMAGNI = 132, /**< <region-mag> */ EXTH_DICTNAME = 200, /**< <DictionaryVeryShortName> */ EXTH_COVEROFFSET = 201, /**< <EmbeddedCover> */ EXTH_THUMBOFFSET = 202, EXTH_HASFAKECOVER = 203, EXTH_CREATORSOFT = 204, EXTH_CREATORMAJOR = 205, EXTH_CREATORMINOR = 206, EXTH_CREATORBUILD = 207, EXTH_WATERMARK = 208, EXTH_TAMPERKEYS = 209, EXTH_FONTSIGNATURE = 300, EXTH_CLIPPINGLIMIT = 401, EXTH_PUBLISHERLIMIT = 402, EXTH_UNK403 = 403, EXTH_TTSDISABLE = 404, EXTH_UNK405 = 405, EXTH_RENTAL = 406, EXTH_UNK407 = 407, EXTH_UNK450 = 450, EXTH_UNK451 = 451, EXTH_UNK452 = 452, EXTH_UNK453 = 453, EXTH_DOCTYPE = 501, /**< PDOC - Personal Doc; EBOK - ebook; EBSP - ebook sample; */ EXTH_LASTUPDATE = 502, EXTH_UPDATEDTITLE = 503, EXTH_ASIN504 = 504, EXTH_TITLEFILEAS = 508, EXTH_CREATORFILEAS = 517, EXTH_PUBLISHERFILEAS = 522, EXTH_LANGUAGE = 524, /**< <dc:language> */ EXTH_ALIGNMENT = 525, /**< <primary-writing-mode> */ EXTH_CREATORSTRING = 526, EXTH_PAGEDIR = 527, EXTH_OVERRIDEFONTS = 528, /**< <override-kindle-fonts> */ EXTH_SORCEDESC = 529, EXTH_DICTLANGIN = 531, EXTH_DICTLANGOUT = 532, EXTH_INPUTSOURCE = 534, EXTH_CREATORBUILDREV = 535, } MOBIExthTag; /** @brief Types of files stored in database records */ typedef enum { T_UNKNOWN, /**< unknown */ /* markup */ T_HTML, /**< html */ T_CSS, /**< css */ T_SVG, /**< svg */ T_OPF, /**< opf */ T_NCX, /**< ncx */ /* images */ T_JPG, /**< jpg */ T_GIF, /**< gif */ T_PNG, /**< png */ T_BMP, /**< bmp */ /* fonts */ T_OTF, /**< otf */ T_TTF, /**< ttf */ /* media */ T_MP3, /**< mp3 */ T_MPG, /**< mp3 */ T_PDF, /**< pdf */ /* generic types */ T_FONT, /**< encoded font */ T_AUDIO, /**< audio resource */ T_VIDEO, /**< video resource */ T_BREAK /**< end of file */ } MOBIFiletype; /** @brief Metadata of file types */ typedef struct { MOBIFiletype type; /**< MOBIFiletype type */ char extension[5]; /**< file extension */ char mime_type[30]; /**< mime-type */ } MOBIFileMeta; /** @} */ /** @defgroup mobi_enc Encoding types in MOBI header (offset 28) @{ */ typedef enum { MOBI_CP1252 = 1252, /**< cp-1252 encoding */ MOBI_UTF8 = 65001, /**< utf-8 encoding */ MOBI_UTF16 = 65002, /**< utf-16 encoding */ } MOBIEncoding; /** @} */ /** @defgroup raw_structs Exported structures for the raw, unparsed records metadata and data @{ */ /** @brief Header of palmdoc database file */ typedef struct { char name[33]; /**< 0: Database name, zero terminated, trimmed title (+author) */ uint16_t attributes; /**< 32: Attributes bitfield, PALMDB_ATTRIBUTE_DEFAULT */ uint16_t version; /**< 34: File version, PALMDB_VERSION_DEFAULT */ uint32_t ctime; /**< 36: Creation time */ uint32_t mtime; /**< 40: Modification time */ uint32_t btime; /**< 44: Backup time */ uint32_t mod_num; /**< 48: Modification number, PALMDB_MODNUM_DEFAULT */ uint32_t appinfo_offset; /**< 52: Offset to application info (if present) or zero, PALMDB_APPINFO_DEFAULT */ uint32_t sortinfo_offset; /**< 56: Offset to sort info (if present) or zero, PALMDB_SORTINFO_DEFAULT */ char type[5]; /**< 60: Database type, zero terminated, PALMDB_TYPE_DEFAULT */ char creator[5]; /**< 64: Creator type, zero terminated, PALMDB_CREATOR_DEFAULT */ uint32_t uid; /**< 68: Used internally to identify record */ uint32_t next_rec; /**< 72: Used only when database is loaded into memory, PALMDB_NEXTREC_DEFAULT */ uint16_t rec_count; /**< 76: Number of records in the file */ } MOBIPdbHeader; /** @brief Metadata and data of a record. All records form a linked list. */ typedef struct MOBIPdbRecord { uint32_t offset; /**< Offset of the record data from the start of the database */ size_t size; /**< Calculated size of the record data */ uint8_t attributes; /**< Record attributes */ uint32_t uid; /**< Record unique id, usually sequential even numbers */ unsigned char *data; /**< Record data */ struct MOBIPdbRecord *next; /**< Pointer to the next record or NULL */ } MOBIPdbRecord; /** @brief Metadata and data of a EXTH record. All records form a linked list. */ typedef struct MOBIExthHeader { uint32_t tag; /**< Record tag */ uint32_t size; /**< Data size */ void *data; /**< Record data */ struct MOBIExthHeader *next; /**< Pointer to the next record or NULL */ } MOBIExthHeader; /** @brief EXTH tag metadata */ typedef struct { MOBIExthTag tag; /**< Record tag id */ MOBIExthType type; /**< EXTH_NUMERIC, EXTH_STRING or EXTH_BINARY */ char *name; /**< Tag name */ } MOBIExthMeta; /** @brief Header of the Record 0 meta-record */ typedef struct { /* PalmDOC header (extended), offset 0, length 16 */ uint16_t compression_type; /**< 0; 1 == no compression, 2 = PalmDOC compression, 17480 = HUFF/CDIC compression */ /* uint16_t unused; // 2; 0 */ uint32_t text_length; /**< 4; uncompressed length of the entire text of the book */ uint16_t text_record_count; /**< 8; number of PDB records used for the text of the book */ uint16_t text_record_size; /**< 10; maximum size of each record containing text, always 4096 */ uint16_t encryption_type; /**< 12; 0 == no encryption, 1 = Old Mobipocket Encryption, 2 = Mobipocket Encryption */ uint16_t unknown1; /**< 14; usually 0 */ } MOBIRecord0Header; /** @brief MOBI header which follows Record 0 header All MOBI header fields are pointers. Some fields are not present in the header, then the pointer is NULL. */ typedef struct { /* MOBI header, offset 16 */ char mobi_magic[5]; /**< 16: M O B I { 77, 79, 66, 73 }, zero terminated */ uint32_t *header_length; /**< 20: the length of the MOBI header, including the previous 4 bytes */ uint32_t *mobi_type; /**< 24: mobipocket file type */ MOBIEncoding *text_encoding; /**< 28: 1252 = CP1252, 65001 = UTF-8 */ uint32_t *uid; /**< 32: unique id */ uint32_t *version; /**< 36: mobipocket format */ uint32_t *orth_index; /**< 40: section number of orthographic meta index. MOBI_NOTSET if index is not available. */ uint32_t *infl_index; /**< 44: section number of inflection meta index. MOBI_NOTSET if index is not available. */ uint32_t *names_index; /**< 48: section number of names meta index. MOBI_NOTSET if index is not available. */ uint32_t *keys_index; /**< 52: section number of keys meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra0_index; /**< 56: section number of extra 0 meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra1_index; /**< 60: section number of extra 1 meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra2_index; /**< 64: section number of extra 2 meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra3_index; /**< 68: section number of extra 3 meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra4_index; /**< 72: section number of extra 4 meta index. MOBI_NOTSET if index is not available. */ uint32_t *extra5_index; /**< 76: section number of extra 5 meta index. MOBI_NOTSET if index is not available. */ uint32_t *non_text_index; /**< 80: first record number (starting with 0) that's not the book's text */ uint32_t *full_name_offset; /**< 84: offset in record 0 (not from start of file) of the full name of the book */ uint32_t *full_name_length; /**< 88: length of the full name */ uint32_t *locale; /**< 92: first byte is main language: 09 = English, next byte is dialect, 08 = British, 04 = US */ uint32_t *dict_input_lang; /**< 96: input language for a dictionary */ uint32_t *dict_output_lang; /**< 100: output language for a dictionary */ uint32_t *min_version; /**< 104: minimum mobipocket version support needed to read this file. */ uint32_t *image_index; /**< 108: first record number (starting with 0) that contains an image (sequential) */ uint32_t *huff_rec_index; /**< 112: first huffman compression record */ uint32_t *huff_rec_count; /**< 116: huffman compression records count */ uint32_t *datp_rec_index; /**< 120: section number of DATP record */ uint32_t *datp_rec_count; /**< 124: DATP records count */ uint32_t *exth_flags; /**< 128: bitfield. if bit 6 (0x40) is set, then there's an EXTH record */ /* 32 unknown bytes 0? */ /* unknown2 */ /* unknown3 */ /* unknown4 */ /* unknown5 */ uint32_t *unknown6; /**< 164: use MOBI_NOTSET */ uint32_t *drm_offset; /**< 168: offset to DRM key info in DRMed files. MOBI_NOTSET if no DRM */ uint32_t *drm_count; /**< 172: number of entries in DRM info */ uint32_t *drm_size; /**< 176: number of bytes in DRM info */ uint32_t *drm_flags; /**< 180: some flags concerning DRM info */ /* 8 unknown bytes 0? */ /* unknown7 */ /* unknown8 */ uint16_t *first_text_index; /**< 192: section number of first text record */ uint16_t *last_text_index; /**< 194: */ uint32_t *fdst_index; /**< 192 (KF8) section number of FDST record */ //uint32_t *unknown9; /**< 196: */ uint32_t *fdst_section_count; /**< 196 (KF8) */ uint32_t *fcis_index; /**< 200: section number of FCIS record */ uint32_t *fcis_count; /**< 204: FCIS records count */ uint32_t *flis_index; /**< 208: section number of FLIS record */ uint32_t *flis_count; /**< 212: FLIS records count */ uint32_t *unknown10; /**< 216: */ uint32_t *unknown11; /**< 220: */ uint32_t *srcs_index; /**< 224: section number of SRCS record */ uint32_t *srcs_count; /**< 228: SRCS records count */ uint32_t *unknown12; /**< 232: */ uint32_t *unknown13; /**< 236: */ /* uint16_t fill 0 */ uint16_t *extra_flags; /**< 242: extra flags */ uint32_t *ncx_index; /**< 244: section number of NCX record */ uint32_t *unknown14; /**< 248: */ uint32_t *fragment_index; /**< 248 (KF8) section number of fragments record */ uint32_t *unknown15; /**< 252: */ uint32_t *skeleton_index; /**< 252 (KF8) section number of SKEL record */ uint32_t *datp_index; /**< 256: section number of DATP record */ uint32_t *unknown16; /**< 260: */ uint32_t *guide_index; /**< 260 (KF8) section number of guide record */ uint32_t *unknown17; /**< 264: */ uint32_t *unknown18; /**< 268: */ uint32_t *unknown19; /**< 272: */ uint32_t *unknown20; /**< 276: */ char *full_name; /**< variable offset (full_name_offset): full name */ } MOBIMobiHeader; /** @brief Main structure holding all metadata and unparsed records data In case of hybrid KF7/KF8 file there are two Records 0. In such case MOBIData is a circular linked list of two independent records, one structure per each Record 0 header. Records data (MOBIPdbRecord structure) is not duplicated in such case - each struct holds same pointers to all records data. */ typedef struct MOBIData { bool use_kf8; /**< Flag: if set to true (default), KF8 part of hybrid file is parsed, if false - KF7 part will be parsed */ uint32_t kf8_boundary_offset; /**< Set to KF8 boundary rec number if present, otherwise: MOBI_NOTSET */ unsigned char *drm_key; /**< key for decryption, NULL if not set */ MOBIPdbHeader *ph; /**< Palmdoc database header structure or NULL if not loaded */ MOBIRecord0Header *rh; /**< Record0 header structure or NULL if not loaded */ MOBIMobiHeader *mh; /**< MOBI header structure or NULL if not loaded */ MOBIExthHeader *eh; /**< Linked list of EXTH records or NULL if not loaded */ MOBIPdbRecord *rec; /**< Linked list of palmdoc database records or NULL if not loaded */ struct MOBIData *next; /**< Pointer to the other part of hybrid file or NULL if not a hybrid file */ } MOBIData; /** @} */ // end of raw_structs group /** @defgroup parsed_structs Exported structures for the parsed records metadata and data @{ */ /** @brief Parsed FDST record FDST record contains offsets of main sections in RAWML - raw text data. The sections are usually html part, css parts, svg part. */ typedef struct { size_t fdst_section_count; /**< Number of main sections */ uint32_t *fdst_section_starts; /**< Array of section start offsets */ uint32_t *fdst_section_ends; /**< Array of section end offsets */ } MOBIFdst; /** @brief Parsed tag for an index entry */ typedef struct { size_t tagid; /**< Tag id */ size_t tagvalues_count; /**< Number of tag values */ uint32_t *tagvalues; /**< Array of tag values */ } MOBIIndexTag; /** @brief Parsed INDX index entry */ typedef struct { char *label; /**< Entry string, zero terminated */ size_t tags_count; /**< Number of tags */ MOBIIndexTag *tags; /**< Array of tags */ } MOBIIndexEntry; /** @brief Parsed INDX record */ typedef struct { size_t type; /**< Index type: 0 - normal, 2 - inflection */ size_t entries_count; /**< Index entries count */ MOBIEncoding encoding; /**< Index encoding */ size_t total_entries_count; /**< Total index entries count */ size_t ordt_offset; /**< ORDT offset */ size_t ligt_offset; /**< LIGT offset */ size_t ligt_entries_count; /**< LIGT index entries count */ size_t cncx_records_count; /**< Number of compiled NCX records */ MOBIPdbRecord *cncx_record; /**< Link to CNCX record */ MOBIIndexEntry *entries; /**< Index entries array */ char *orth_index_name; /**< Orth index name */ } MOBIIndx; /** @brief Reconstructed source file. All file parts are organized in a linked list. */ typedef struct MOBIPart { size_t uid; /**< Unique id */ MOBIFiletype type; /**< File type */ size_t size; /**< File size */ unsigned char *data; /**< File data */ struct MOBIPart *next; /**< Pointer to next part or NULL */ } MOBIPart; /** @brief Main structure containing reconstructed source parts and indices */ typedef struct { size_t version; /**< Version of Mobipocket document */ MOBIFdst *fdst; /**< Parsed FDST record or NULL if not present */ MOBIIndx *skel; /**< Parsed skeleton index or NULL if not present */ MOBIIndx *frag; /**< Parsed fragments index or NULL if not present */ MOBIIndx *guide; /**< Parsed guide index or NULL if not present */ MOBIIndx *ncx; /**< Parsed NCX index or NULL if not present */ MOBIIndx *orth; /**< Parsed orth index or NULL if not present */ MOBIIndx *infl; /**< Parsed infl index or NULL if not present */ MOBIPart *flow; /**< Linked list of reconstructed main flow parts or NULL if not present */ MOBIPart *markup; /**< Linked list of reconstructed markup files or NULL if not present */ MOBIPart *resources; /**< Linked list of reconstructed resources files or NULL if not present */ } MOBIRawml; /** @} */ // end of parsed_structs group /** @defgroup mobi_export Functions exported by the library @{ */ MOBI_EXPORT const char * mobi_version(void); MOBI_EXPORT MOBI_RET mobi_load_file(MOBIData *m, FILE *file); MOBI_EXPORT MOBI_RET mobi_load_filename(MOBIData *m, const char *path); MOBI_EXPORT MOBIData * mobi_init(void); MOBI_EXPORT void mobi_free(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_parse_kf7(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_parse_kf8(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_parse_rawml(MOBIRawml *rawml, const MOBIData *m); MOBI_EXPORT MOBI_RET mobi_parse_rawml_opt(MOBIRawml *rawml, const MOBIData *m, bool parse_toc, bool parse_dict, bool reconstruct); MOBI_EXPORT MOBI_RET mobi_get_rawml(const MOBIData *m, char *text, size_t *len); MOBI_EXPORT MOBI_RET mobi_dump_rawml(const MOBIData *m, FILE *file); MOBI_EXPORT MOBI_RET mobi_decode_font_resource(unsigned char **decoded_font, size_t *decoded_size, MOBIPart *part); MOBI_EXPORT MOBI_RET mobi_decode_audio_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part); MOBI_EXPORT MOBI_RET mobi_decode_video_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part); MOBI_EXPORT MOBI_RET mobi_get_embedded_source(unsigned char **data, size_t *size, const MOBIData *m); MOBI_EXPORT MOBI_RET mobi_get_embedded_log(unsigned char **data, size_t *size, const MOBIData *m); MOBI_EXPORT MOBIPdbRecord * mobi_get_record_by_uid(const MOBIData *m, const size_t uid); MOBI_EXPORT MOBIPdbRecord * mobi_get_record_by_seqnumber(const MOBIData *m, const size_t uid); MOBI_EXPORT MOBIPart * mobi_get_flow_by_uid(const MOBIRawml *rawml, const size_t uid); MOBI_EXPORT MOBIPart * mobi_get_flow_by_fid(const MOBIRawml *rawml, const char *fid); MOBI_EXPORT MOBIPart * mobi_get_resource_by_uid(const MOBIRawml *rawml, const size_t uid); MOBI_EXPORT MOBIPart * mobi_get_resource_by_fid(const MOBIRawml *rawml, const char *fid); MOBI_EXPORT MOBIPart * mobi_get_part_by_uid(const MOBIRawml *rawml, const size_t uid); MOBI_EXPORT MOBI_RET mobi_get_fullname(const MOBIData *m, char *fullname, const size_t len); MOBI_EXPORT size_t mobi_get_first_resource_record(const MOBIData *m); MOBI_EXPORT size_t mobi_get_text_maxsize(const MOBIData *m); MOBI_EXPORT uint16_t mobi_get_textrecord_maxsize(const MOBIData *m); MOBI_EXPORT size_t mobi_get_kf8offset(const MOBIData *m); MOBI_EXPORT size_t mobi_get_kf8boundary_seqnumber(const MOBIData *m); MOBI_EXPORT size_t mobi_get_record_extrasize(const MOBIPdbRecord *record, const uint16_t flags); MOBI_EXPORT size_t mobi_get_record_mb_extrasize(const MOBIPdbRecord *record, const uint16_t flags); MOBI_EXPORT size_t mobi_get_fileversion(const MOBIData *m); MOBI_EXPORT size_t mobi_get_fdst_record_number(const MOBIData *m); MOBI_EXPORT MOBIExthHeader * mobi_get_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag); MOBI_EXPORT MOBIExthHeader * mobi_next_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag, MOBIExthHeader **start); MOBI_EXPORT MOBI_RET mobi_delete_exthrecord_by_tag(MOBIData *m, const MOBIExthTag tag); MOBI_EXPORT MOBI_RET mobi_add_exthrecord(MOBIData *m, const MOBIExthTag tag, const uint32_t size, const void *value); MOBI_EXPORT MOBIExthMeta mobi_get_exthtagmeta_by_tag(const MOBIExthTag tag); MOBI_EXPORT MOBIFileMeta mobi_get_filemeta_by_type(const MOBIFiletype type); MOBI_EXPORT uint32_t mobi_decode_exthvalue(const unsigned char *data, const size_t size); MOBI_EXPORT char * mobi_decode_exthstring(const MOBIData *m, const unsigned char *data, const size_t size); MOBI_EXPORT struct tm * mobi_pdbtime_to_time(const long pdb_time); MOBI_EXPORT const char * mobi_get_locale_string(const uint32_t locale); MOBI_EXPORT size_t mobi_get_locale_number(const char *locale_string); MOBI_EXPORT bool mobi_exists_mobiheader(const MOBIData *m); MOBI_EXPORT bool mobi_exists_fdst(const MOBIData *m); MOBI_EXPORT bool mobi_exists_skel_indx(const MOBIData *m); MOBI_EXPORT bool mobi_exists_frag_indx(const MOBIData *m); MOBI_EXPORT bool mobi_exists_guide_indx(const MOBIData *m); MOBI_EXPORT bool mobi_exists_ncx(const MOBIData *m); MOBI_EXPORT bool mobi_exists_orth(const MOBIData *m); MOBI_EXPORT bool mobi_exists_infl(const MOBIData *m); MOBI_EXPORT bool mobi_is_hybrid(const MOBIData *m); MOBI_EXPORT bool mobi_is_encrypted(const MOBIData *m); MOBI_EXPORT bool mobi_is_mobipocket(const MOBIData *m); MOBI_EXPORT bool mobi_is_dictionary(const MOBIData *m); MOBI_EXPORT bool mobi_is_kf8(const MOBIData *m); MOBI_EXPORT bool mobi_is_replica(const MOBIData *m); MOBI_EXPORT bool mobi_is_rawml_kf8(const MOBIRawml *rawml); MOBI_EXPORT MOBIRawml * mobi_init_rawml(const MOBIData *m); MOBI_EXPORT void mobi_free_rawml(MOBIRawml *rawml); MOBI_EXPORT char * mobi_meta_get_title(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_author(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_publisher(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_imprint(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_description(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_isbn(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_subject(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_publishdate(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_review(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_contributor(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_copyright(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_asin(const MOBIData *m); MOBI_EXPORT char * mobi_meta_get_language(const MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_title(MOBIData *m, const char *title); MOBI_EXPORT MOBI_RET mobi_meta_add_title(MOBIData *m, const char *title); MOBI_EXPORT MOBI_RET mobi_meta_delete_title(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_author(MOBIData *m, const char *author); MOBI_EXPORT MOBI_RET mobi_meta_add_author(MOBIData *m, const char *author); MOBI_EXPORT MOBI_RET mobi_meta_delete_author(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_publisher(MOBIData *m, const char *publisher); MOBI_EXPORT MOBI_RET mobi_meta_add_publisher(MOBIData *m, const char *publisher); MOBI_EXPORT MOBI_RET mobi_meta_delete_publisher(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_imprint(MOBIData *m, const char *imprint); MOBI_EXPORT MOBI_RET mobi_meta_add_imprint(MOBIData *m, const char *imprint); MOBI_EXPORT MOBI_RET mobi_meta_delete_imprint(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_description(MOBIData *m, const char *description); MOBI_EXPORT MOBI_RET mobi_meta_add_description(MOBIData *m, const char *description); MOBI_EXPORT MOBI_RET mobi_meta_delete_description(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_isbn(MOBIData *m, const char *isbn); MOBI_EXPORT MOBI_RET mobi_meta_add_isbn(MOBIData *m, const char *isbn); MOBI_EXPORT MOBI_RET mobi_meta_delete_isbn(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_subject(MOBIData *m, const char *subject); MOBI_EXPORT MOBI_RET mobi_meta_add_subject(MOBIData *m, const char *subject); MOBI_EXPORT MOBI_RET mobi_meta_delete_subject(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_publishdate(MOBIData *m, const char *publishdate); MOBI_EXPORT MOBI_RET mobi_meta_add_publishdate(MOBIData *m, const char *publishdate); MOBI_EXPORT MOBI_RET mobi_meta_delete_publishdate(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_review(MOBIData *m, const char *review); MOBI_EXPORT MOBI_RET mobi_meta_add_review(MOBIData *m, const char *review); MOBI_EXPORT MOBI_RET mobi_meta_delete_review(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_contributor(MOBIData *m, const char *contributor); MOBI_EXPORT MOBI_RET mobi_meta_add_contributor(MOBIData *m, const char *contributor); MOBI_EXPORT MOBI_RET mobi_meta_delete_contributor(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_copyright(MOBIData *m, const char *copyright); MOBI_EXPORT MOBI_RET mobi_meta_add_copyright(MOBIData *m, const char *copyright); MOBI_EXPORT MOBI_RET mobi_meta_delete_copyright(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_asin(MOBIData *m, const char *asin); MOBI_EXPORT MOBI_RET mobi_meta_add_asin(MOBIData *m, const char *asin); MOBI_EXPORT MOBI_RET mobi_meta_delete_asin(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_meta_set_language(MOBIData *m, const char *language); MOBI_EXPORT MOBI_RET mobi_meta_add_language(MOBIData *m, const char *language); MOBI_EXPORT MOBI_RET mobi_meta_delete_language(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_drm_setkey(MOBIData *m, const char *pid); MOBI_EXPORT MOBI_RET mobi_drm_setkey_serial(MOBIData *m, const char *serial); MOBI_EXPORT MOBI_RET mobi_drm_delkey(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_drm_decrypt(MOBIData *m); MOBI_EXPORT MOBI_RET mobi_write_file(FILE *file, MOBIData *m); /** @} */ // end of mobi_export group #ifdef __cplusplus } #endif #endif