/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of libxls -- A multiplatform, C/C++ library * for parsing Excel(TM) files. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. 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. * * THIS SOFTWARE IS PROVIDED BY David Hoerl ''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 David Hoerl 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. * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2013 Bob Colbert * Copyright 2008-2013 David Hoerl * */ #ifndef OLE_INCLUDE #define OLE_INCLUDE #include // FILE * #include "libxls/xlstypes.h" #ifdef AIX #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct TIME_T { DWORD LowDate; DWORD HighDate; } TIME_T; typedef struct OLE2Header { DWORD id[2]; //D0CF11E0 A1B11AE1 DWORD clid[4]; WORD verminor; //0x3e WORD verdll; //0x03 WORD byteorder; WORD lsectorB; WORD lssectorB; WORD reserved1; DWORD reserved2; DWORD reserved3; DWORD cfat; // count full sectors DWORD dirstart; DWORD reserved4; DWORD sectorcutoff; // min size of a standard stream ; if less than this then it uses short-streams DWORD sfatstart; // first short-sector or EOC DWORD csfat; // count short sectors DWORD difstart; // first sector master sector table or EOC DWORD cdif; // total count DWORD MSAT[109]; // First 109 MSAT } OLE2Header; #pragma pack(pop) //----------------------------------------------------------------------------------- typedef struct st_olefiles { long count; struct st_olefiles_data { BYTE* name; DWORD start; DWORD size; } * file; } st_olefiles; typedef struct OLE2 { FILE* file; WORD lsector; WORD lssector; DWORD cfat; DWORD dirstart; DWORD sectorcutoff; DWORD sfatstart; DWORD csfat; DWORD difstart; DWORD cdif; DWORD* SecID; // regular sector data DWORD* SSecID; // short sector data BYTE* SSAT; // directory of short sectors st_olefiles files; } OLE2; typedef struct OLE2Stream { OLE2* ole; DWORD start; size_t pos; size_t cfat; size_t size; size_t fatpos; BYTE* buf; DWORD bufsize; BYTE eof; BYTE sfat; // short } OLE2Stream; #ifdef AIX #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct PSS { BYTE name[64]; WORD bsize; BYTE type; //STGTY #define PS_EMPTY 00 #define PS_USER_STORAGE 01 #define PS_USER_STREAM 02 #define PS_USER_ROOT 05 BYTE flag; //COLOR #define BLACK 1 DWORD left; DWORD right; DWORD child; WORD guid[8]; DWORD userflags; TIME_T time[2]; DWORD sstart; DWORD size; DWORD proptype; } PSS; #pragma pack(pop) extern size_t ole2_read(void* buf,size_t size,size_t count,OLE2Stream* olest); extern OLE2Stream* ole2_sopen(OLE2* ole,DWORD start, size_t size); extern void ole2_seek(OLE2Stream* olest,DWORD ofs); extern OLE2Stream* ole2_fopen(OLE2* ole,BYTE* file); extern void ole2_fclose(OLE2Stream* ole2st); extern OLE2* ole2_open(const BYTE *file); extern void ole2_close(OLE2* ole2); extern void ole2_bufread(OLE2Stream* olest); #endif