"Fossies" - the Fresh Open Source Software Archive

Member "file-5.35/src/cdf.h" (11 Sep 2018, 11679 Bytes) of package /linux/misc/file-5.35.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "cdf.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 5.30_vs_5.31.

    1 /*-
    2  * Copyright (c) 2008 Christos Zoulas
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   15  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   16  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   24  * POSSIBILITY OF SUCH DAMAGE.
   25  */
   26 /*
   27  * Parse Composite Document Files, the format used in Microsoft Office
   28  * document files before they switched to zipped XML.
   29  * Info from: http://sc.openoffice.org/compdocfileformat.pdf
   30  *
   31  * N.B. This is the "Composite Document File" format, and not the
   32  * "Compound Document Format", nor the "Channel Definition Format".
   33  */
   34 
   35 #ifndef _H_CDF_
   36 #define _H_CDF_
   37 
   38 #ifdef WIN32
   39 #include <winsock2.h>
   40 #define timespec timeval
   41 #define tv_nsec tv_usec
   42 #endif
   43 #ifdef __DJGPP__
   44 #define timespec timeval
   45 #define tv_nsec tv_usec
   46 #endif
   47 
   48 typedef int32_t cdf_secid_t;
   49 
   50 #define CDF_LOOP_LIMIT                  10000
   51 
   52 #define CDF_SECID_NULL                  0
   53 #define CDF_SECID_FREE                  -1
   54 #define CDF_SECID_END_OF_CHAIN              -2
   55 #define CDF_SECID_SECTOR_ALLOCATION_TABLE       -3
   56 #define CDF_SECID_MASTER_SECTOR_ALLOCATION_TABLE    -4
   57 
   58 typedef struct {
   59     uint64_t    h_magic;
   60 #define CDF_MAGIC   0xE11AB1A1E011CFD0LL
   61     uint64_t    h_uuid[2];
   62     uint16_t    h_revision;
   63     uint16_t    h_version;
   64     uint16_t    h_byte_order;
   65     uint16_t    h_sec_size_p2;
   66     uint16_t    h_short_sec_size_p2;
   67     uint8_t     h_unused0[10];
   68     uint32_t    h_num_sectors_in_sat;
   69     uint32_t    h_secid_first_directory;
   70     uint8_t     h_unused1[4];
   71     uint32_t    h_min_size_standard_stream;
   72     cdf_secid_t h_secid_first_sector_in_short_sat;
   73     uint32_t    h_num_sectors_in_short_sat;
   74     cdf_secid_t h_secid_first_sector_in_master_sat;
   75     uint32_t    h_num_sectors_in_master_sat;
   76     cdf_secid_t h_master_sat[436/4];
   77 } cdf_header_t;
   78 
   79 #define CDF_SEC_SIZE(h) ((size_t)(1 << (h)->h_sec_size_p2))
   80 #define CDF_SEC_POS(h, secid) (CDF_SEC_SIZE(h) + (secid) * CDF_SEC_SIZE(h))
   81 #define CDF_SHORT_SEC_SIZE(h)   ((size_t)(1 << (h)->h_short_sec_size_p2))
   82 #define CDF_SHORT_SEC_POS(h, secid) ((secid) * CDF_SHORT_SEC_SIZE(h))
   83 
   84 typedef int32_t cdf_dirid_t;
   85 #define CDF_DIRID_NULL  -1
   86 
   87 typedef int64_t cdf_timestamp_t;
   88 #define CDF_BASE_YEAR   1601
   89 #define CDF_TIME_PREC   10000000
   90 
   91 typedef struct {
   92     uint16_t    d_name[32];
   93     uint16_t    d_namelen;
   94     uint8_t     d_type;
   95 #define CDF_DIR_TYPE_EMPTY      0
   96 #define CDF_DIR_TYPE_USER_STORAGE   1
   97 #define CDF_DIR_TYPE_USER_STREAM    2
   98 #define CDF_DIR_TYPE_LOCKBYTES      3
   99 #define CDF_DIR_TYPE_PROPERTY       4
  100 #define CDF_DIR_TYPE_ROOT_STORAGE   5
  101     uint8_t     d_color;
  102 #define CDF_DIR_COLOR_READ  0
  103 #define CDF_DIR_COLOR_BLACK 1
  104     cdf_dirid_t d_left_child;
  105     cdf_dirid_t d_right_child;
  106     cdf_dirid_t d_storage;
  107     uint64_t    d_storage_uuid[2];
  108     uint32_t    d_flags;
  109     cdf_timestamp_t d_created;
  110     cdf_timestamp_t d_modified;
  111     cdf_secid_t d_stream_first_sector;
  112     uint32_t    d_size;
  113     uint32_t    d_unused0;
  114 } cdf_directory_t;
  115 
  116 #define CDF_DIRECTORY_SIZE  128
  117 
  118 typedef struct {
  119     cdf_secid_t *sat_tab;
  120     size_t sat_len;
  121 } cdf_sat_t;
  122 
  123 typedef struct {
  124     cdf_directory_t *dir_tab;
  125     size_t dir_len;
  126 } cdf_dir_t;
  127 
  128 typedef struct {
  129     void *sst_tab;
  130     size_t sst_len;     /* Number of sectors */
  131     size_t sst_dirlen;  /* Directory sector size */
  132     size_t sst_ss;      /* Sector size */
  133 } cdf_stream_t;
  134 
  135 typedef struct {
  136     uint32_t    cl_dword;
  137     uint16_t    cl_word[2];
  138     uint8_t     cl_two[2];
  139     uint8_t     cl_six[6];
  140 } cdf_classid_t;
  141 
  142 typedef struct {
  143     uint16_t    si_byte_order;
  144     uint16_t    si_zero;
  145     uint16_t    si_os_version;
  146     uint16_t    si_os;
  147     cdf_classid_t   si_class;
  148     uint32_t    si_count;
  149 } cdf_summary_info_header_t;
  150 
  151 #define CDF_SECTION_DECLARATION_OFFSET 0x1c
  152 
  153 typedef struct {
  154     cdf_classid_t   sd_class;
  155     uint32_t    sd_offset;
  156 } cdf_section_declaration_t;
  157 
  158 typedef struct {
  159     uint32_t    sh_len;
  160     uint32_t    sh_properties;
  161 } cdf_section_header_t;
  162 
  163 typedef struct {
  164     uint32_t    pi_id;
  165     uint32_t    pi_type;
  166     union {
  167         uint16_t    _pi_u16;
  168         int16_t     _pi_s16;
  169         uint32_t    _pi_u32;
  170         int32_t     _pi_s32;
  171         uint64_t    _pi_u64;
  172         int64_t     _pi_s64;
  173         cdf_timestamp_t _pi_tp;
  174         float       _pi_f;
  175         double      _pi_d;
  176         struct {
  177             uint32_t s_len;
  178             const char *s_buf;
  179         } _pi_str;
  180     } pi_val;
  181 #define pi_u64  pi_val._pi_u64
  182 #define pi_s64  pi_val._pi_s64
  183 #define pi_u32  pi_val._pi_u32
  184 #define pi_s32  pi_val._pi_s32
  185 #define pi_u16  pi_val._pi_u16
  186 #define pi_s16  pi_val._pi_s16
  187 #define pi_f    pi_val._pi_f
  188 #define pi_d    pi_val._pi_d
  189 #define pi_tp   pi_val._pi_tp
  190 #define pi_str  pi_val._pi_str
  191 } cdf_property_info_t;
  192 
  193 #define CDF_ROUND(val, by)     (((val) + (by) - 1) & ~((by) - 1))
  194 
  195 /* Variant type definitions */
  196 #define CDF_EMPTY       0x00000000
  197 #define CDF_NULL        0x00000001
  198 #define CDF_SIGNED16        0x00000002
  199 #define CDF_SIGNED32        0x00000003
  200 #define CDF_FLOAT       0x00000004
  201 #define CDF_DOUBLE      0x00000005
  202 #define CDF_CY          0x00000006
  203 #define CDF_DATE        0x00000007
  204 #define CDF_BSTR        0x00000008
  205 #define CDF_DISPATCH        0x00000009
  206 #define CDF_ERROR       0x0000000a
  207 #define CDF_BOOL        0x0000000b
  208 #define CDF_VARIANT     0x0000000c
  209 #define CDF_UNKNOWN     0x0000000d
  210 #define CDF_DECIMAL     0x0000000e
  211 #define CDF_SIGNED8     0x00000010
  212 #define CDF_UNSIGNED8       0x00000011
  213 #define CDF_UNSIGNED16      0x00000012
  214 #define CDF_UNSIGNED32      0x00000013
  215 #define CDF_SIGNED64        0x00000014
  216 #define CDF_UNSIGNED64      0x00000015
  217 #define CDF_INT         0x00000016
  218 #define CDF_UINT        0x00000017
  219 #define CDF_VOID        0x00000018
  220 #define CDF_HRESULT     0x00000019
  221 #define CDF_PTR         0x0000001a
  222 #define CDF_SAFEARRAY       0x0000001b
  223 #define CDF_CARRAY      0x0000001c
  224 #define CDF_USERDEFINED     0x0000001d
  225 #define CDF_LENGTH32_STRING 0x0000001e
  226 #define CDF_LENGTH32_WSTRING    0x0000001f
  227 #define CDF_FILETIME        0x00000040
  228 #define CDF_BLOB        0x00000041
  229 #define CDF_STREAM      0x00000042
  230 #define CDF_STORAGE     0x00000043
  231 #define CDF_STREAMED_OBJECT 0x00000044
  232 #define CDF_STORED_OBJECT   0x00000045
  233 #define CDF_BLOB_OBJECT     0x00000046
  234 #define CDF_CLIPBOARD       0x00000047
  235 #define CDF_CLSID       0x00000048
  236 #define CDF_VECTOR      0x00001000
  237 #define CDF_ARRAY       0x00002000
  238 #define CDF_BYREF       0x00004000
  239 #define CDF_RESERVED        0x00008000
  240 #define CDF_ILLEGAL     0x0000ffff
  241 #define CDF_ILLEGALMASKED   0x00000fff
  242 #define CDF_TYPEMASK        0x00000fff
  243 
  244 #define CDF_PROPERTY_CODE_PAGE          0x00000001
  245 #define CDF_PROPERTY_TITLE          0x00000002
  246 #define CDF_PROPERTY_SUBJECT            0x00000003
  247 #define CDF_PROPERTY_AUTHOR         0x00000004
  248 #define CDF_PROPERTY_KEYWORDS           0x00000005
  249 #define CDF_PROPERTY_COMMENTS           0x00000006
  250 #define CDF_PROPERTY_TEMPLATE           0x00000007
  251 #define CDF_PROPERTY_LAST_SAVED_BY      0x00000008
  252 #define CDF_PROPERTY_REVISION_NUMBER        0x00000009
  253 #define CDF_PROPERTY_TOTAL_EDITING_TIME     0x0000000a
  254 #define CDF_PROPERTY_LAST_PRINTED       0X0000000b
  255 #define CDF_PROPERTY_CREATE_TIME        0x0000000c
  256 #define CDF_PROPERTY_LAST_SAVED_TIME        0x0000000d
  257 #define CDF_PROPERTY_NUMBER_OF_PAGES        0x0000000e
  258 #define CDF_PROPERTY_NUMBER_OF_WORDS        0x0000000f
  259 #define CDF_PROPERTY_NUMBER_OF_CHARACTERS   0x00000010
  260 #define CDF_PROPERTY_THUMBNAIL          0x00000011
  261 #define CDF_PROPERTY_NAME_OF_APPLICATION    0x00000012
  262 #define CDF_PROPERTY_SECURITY           0x00000013
  263 #define CDF_PROPERTY_LOCALE_ID          0x80000000
  264 
  265 typedef struct {
  266     int i_fd;
  267     const unsigned char *i_buf;
  268     size_t i_len;
  269 } cdf_info_t;
  270 
  271 
  272 typedef struct {
  273     uint16_t ce_namlen;
  274     uint32_t ce_num;
  275     uint64_t ce_timestamp;
  276     uint16_t ce_name[256];
  277 } cdf_catalog_entry_t;
  278 
  279 typedef struct {
  280     size_t cat_num;
  281     cdf_catalog_entry_t cat_e[1];
  282 } cdf_catalog_t;
  283 
  284 struct timespec;
  285 int cdf_timestamp_to_timespec(struct timespec *, cdf_timestamp_t);
  286 int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timespec *);
  287 int cdf_read_header(const cdf_info_t *, cdf_header_t *);
  288 void cdf_swap_header(cdf_header_t *);
  289 void cdf_unpack_header(cdf_header_t *, char *);
  290 void cdf_swap_dir(cdf_directory_t *);
  291 void cdf_unpack_dir(cdf_directory_t *, char *);
  292 void cdf_swap_class(cdf_classid_t *);
  293 ssize_t cdf_read_sector(const cdf_info_t *, void *, size_t, size_t,
  294     const cdf_header_t *, cdf_secid_t);
  295 ssize_t cdf_read_short_sector(const cdf_stream_t *, void *, size_t, size_t,
  296     const cdf_header_t *, cdf_secid_t);
  297 int cdf_read_sat(const cdf_info_t *, cdf_header_t *, cdf_sat_t *);
  298 size_t cdf_count_chain(const cdf_sat_t *, cdf_secid_t, size_t);
  299 int cdf_read_long_sector_chain(const cdf_info_t *, const cdf_header_t *,
  300     const cdf_sat_t *, cdf_secid_t, size_t, cdf_stream_t *);
  301 int cdf_read_short_sector_chain(const cdf_header_t *, const cdf_sat_t *,
  302     const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *);
  303 int cdf_read_sector_chain(const cdf_info_t *, const cdf_header_t *,
  304     const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t,
  305     size_t, cdf_stream_t *);
  306 int cdf_read_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
  307     cdf_dir_t *);
  308 int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
  309     cdf_sat_t *);
  310 int cdf_read_short_stream(const cdf_info_t *, const cdf_header_t *,
  311     const cdf_sat_t *, const cdf_dir_t *, cdf_stream_t *,
  312     const cdf_directory_t **);
  313 int cdf_read_property_info(const cdf_stream_t *, const cdf_header_t *, uint32_t,
  314     cdf_property_info_t **, size_t *, size_t *);
  315 int cdf_read_user_stream(const cdf_info_t *, const cdf_header_t *,
  316     const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
  317     const cdf_dir_t *, const char *, cdf_stream_t *);
  318 int cdf_find_stream(const cdf_dir_t *, const char *, int);
  319 int cdf_zero_stream(cdf_stream_t *);
  320 int cdf_read_doc_summary_info(const cdf_info_t *, const cdf_header_t *,
  321     const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
  322     const cdf_dir_t *, cdf_stream_t *);
  323 int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *,
  324     const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
  325     const cdf_dir_t *, cdf_stream_t *);
  326 int cdf_unpack_summary_info(const cdf_stream_t *, const cdf_header_t *,
  327     cdf_summary_info_header_t *, cdf_property_info_t **, size_t *);
  328 int cdf_unpack_catalog(const cdf_header_t *, const cdf_stream_t *,
  329     cdf_catalog_t **);
  330 int cdf_print_classid(char *, size_t, const cdf_classid_t *);
  331 int cdf_print_property_name(char *, size_t, uint32_t);
  332 int cdf_print_elapsed_time(char *, size_t, cdf_timestamp_t);
  333 uint16_t cdf_tole2(uint16_t);
  334 uint32_t cdf_tole4(uint32_t);
  335 uint64_t cdf_tole8(uint64_t);
  336 char *cdf_ctime(const time_t *, char *);
  337 char *cdf_u16tos8(char *, size_t, const uint16_t *);
  338 
  339 #ifdef CDF_DEBUG
  340 void cdf_dump_header(const cdf_header_t *);
  341 void cdf_dump_sat(const char *, const cdf_sat_t *, size_t);
  342 void cdf_dump(const void *, size_t);
  343 void cdf_dump_stream(const cdf_stream_t *);
  344 void cdf_dump_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
  345     const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *);
  346 void cdf_dump_property_info(const cdf_property_info_t *, size_t);
  347 void cdf_dump_summary_info(const cdf_header_t *, const cdf_stream_t *);
  348 void cdf_dump_catalog(const cdf_header_t *, const cdf_stream_t *);
  349 #endif
  350 
  351 
  352 #endif /* _H_CDF_ */