143 lines
4.5 KiB
C
143 lines
4.5 KiB
C
/*
|
|
cole - A free C OLE library.
|
|
Copyright 1998, 1999 Roberto Arturo Tena Sanchez
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
/*
|
|
Arturo Tena <arturo@directmail.org>
|
|
*/
|
|
|
|
#ifndef COLE_INTERNAL_H
|
|
#define COLE_INTERNAL_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifndef COLE_SUPPORT_H
|
|
#include "support.h"
|
|
#endif
|
|
|
|
#if defined( __WIN32__ ) || defined( __BORLANDC__ )
|
|
#define TMPNAM_LEN L_tmpnam
|
|
#else
|
|
#define TMPNAM_LEN 18 /* /tmp/xlHtmlXXXXXX + NULL */
|
|
#endif
|
|
|
|
/* This structure describe one stream. */
|
|
struct pps_block
|
|
{
|
|
char name[0x20];
|
|
char filename[TMPNAM_LEN]; /* valid only if type == 2 */
|
|
U8 type; /* 5 == root, 1 == dir, 2 == file */
|
|
U32 size; /* the size of the file,
|
|
valid only if type == 2 */
|
|
U32 next; /* next entry in this level,
|
|
in this directory */
|
|
U32 dir; /* valid only if type != 2 */
|
|
U16 level; /* level in the ole tree */
|
|
U32 seconds1;
|
|
U32 seconds2;
|
|
U32 days1;
|
|
U32 days2;
|
|
U32 start; /* start block */
|
|
|
|
/* private fields, used only inside OLEdecoded and OLEcode,
|
|
don't modify them if you want to use OLEcode */
|
|
U32 previous; /* previous pps, valid before reordering */
|
|
U32 ppsnumber; /* pps number */
|
|
};
|
|
typedef struct pps_block pps_entry;
|
|
|
|
|
|
/*
|
|
Create a OLE stream tree from a file.
|
|
Input: char *Olefilename = File to be decoded (ie. .xsl, .doc, .ppt).
|
|
. pps_entry ** stream_list = The stream tree.
|
|
. U32 * root = The number of root dir in stream_list.
|
|
. U8 **_BDepot, U8 **_SDepot, FILE **_sbfile, char **_sbfilename,
|
|
. FILE **_input,
|
|
. = Exposes internals, read only.
|
|
. U16 max_level = The maximum level on stream tree in which
|
|
. streams will be actually extracted
|
|
. to a file. 0 (zero) means extract all.
|
|
Output: 0 = Sucess.
|
|
. 4 = Couldn't open OLEfilename file (can use perror).
|
|
. 8 = OLEfilename file seems to contain plain text, not OLE file.
|
|
. 9 = OLEfilename is a binary file, but it have not OLEfile format.
|
|
. 5 = Error reading from file, means OLEfilename file has a faulty
|
|
. OLE file format (UPDATE: not always).
|
|
. 6 = Error removing temporal files. <-- this is never returned now
|
|
. 7 = Error creating temporal files, can use perror.
|
|
. 10 = Error allocating memory, there's no more memory.
|
|
*/
|
|
int __OLEdecode (char *OLEfilename, pps_entry ** stream_list, U32 * root,
|
|
U8 **_BDepot, U8 **_SDepot, FILE **_sbfile, char **_sbfilename,
|
|
FILE **_input, U16 max_level);
|
|
|
|
|
|
|
|
/*
|
|
* FROM COLE 2.0.0 API
|
|
*/
|
|
struct _COLEFS {
|
|
/* This structure is for internal use only, not for the public API */
|
|
pps_entry *tree;
|
|
U32 root; /* entry root, root pps_entry */
|
|
U8 *BDepot;
|
|
U8 *SDepot;
|
|
FILE *sbfile;
|
|
char *sbfilename;
|
|
FILE *file; /* actual file (the filesystem) */
|
|
};
|
|
struct _COLEDIRENT {
|
|
/* This structure is for internal use only, not for the public API */
|
|
U32 entry;
|
|
struct _COLEDIR *dir; /* father */
|
|
};
|
|
struct _COLEDIR {
|
|
/* This structure is for internal use only, not for the public API */
|
|
U32 entry;
|
|
struct _COLEDIRENT visited_entry;
|
|
struct _COLEFS *fs; /* father */
|
|
};
|
|
struct _COLEFILE {
|
|
/* This structure is for internal use only, not for the public API */
|
|
U32 entry;
|
|
FILE *file; /* actual extracted file */
|
|
char *filename; /* actual extracted file's name */
|
|
U32 filesize; /* actual extracted file size */
|
|
struct _COLEFS *fs; /* father */
|
|
U32 pos; /* file pointer position */
|
|
};
|
|
int __cole_extract_file (FILE **file, char **filename, U32 size,
|
|
U32 pps_start, U8 *BDepot, U8 *SDepot, FILE *sbfile,
|
|
FILE *inputfile);
|
|
#define _COLE_TYPE_DIR 1
|
|
#define _COLE_TYPE_FILE 2
|
|
#define _COLE_TYPE_ROOT 5
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* COLE_INTERNAL_H */
|
|
|