/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
*
|
* 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
|