admin
2022-09-30 62608682f362ff5ecddb03ef80cb441f2ccea49b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *
 * 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 <stdio.h>            // 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