/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* This file is part of libxls -- A multiplatform, C library
* for parsing Excel(TM) files.
*
* libxls is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libxls is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with libxls. If not, see .
*
* Copyright 2004 Komarov Valery
* Copyright 2006 Christophe Leitienne
* Copyright 2008 David Hoerl
*/
#ifndef OLE_INCLUDE
#define OLE_INCLUDE
#pragma pack(1)
#include // FILE *
#include "xlstypes.h"
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;
//-----------------------------------------------------------------------------------
typedef struct
{
char* name;
DWORD start;
DWORD size;
}st_olefiles_data;
typedef struct st_olefiles
{
long count;
st_olefiles_data* 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;
DWORD pos;
int cfat;
int size;
DWORD fatpos;
BYTE* buf;
DWORD bufsize;
BYTE eof;
BYTE sfat; // short
}
OLE2Stream;
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;
extern int ole2_read(void* buf,long size,long count,OLE2Stream* olest);
extern OLE2Stream* ole2_sopen(OLE2* ole,DWORD start, int size);
extern void ole2_seek(OLE2Stream* olest,DWORD ofs);
extern OLE2Stream* ole2_fopen(OLE2* ole,char* file);
extern void ole2_fclose(OLE2Stream* ole2st);
extern OLE2* ole2_open(char *file, char *charset);
extern void ole2_close(OLE2* ole2);
extern void ole2_bufread(OLE2Stream* olest);
#endif