/**
* ms-ole.h: MS Office OLE support for Gnumeric
*
* Authors:
* Michael Meeks (michael@imaginator.com)
* Arturo Tena (arturo@directmail.org)
*
* Copyright 1998-2001 Ximian, Inc., Arturo Tena
**/
#ifndef MS_OLE_H
#define MS_OLE_H
/* This should be done in glib */
/* Allin Cottrell modifications here */
# include <sys/types.h>
#ifndef _WIN32
# include <fcntl.h> /* for mode_t */
#else
# ifdef notdef
typedef unsigned long mode_t;
typedef /* signed */ long off_t;
typedef size_t ssize_t;
# endif
typedef /* unsigned */ long caddr_t;
#endif
#include <glib.h>
typedef enum {
MS_OLE_ERR_OK,
MS_OLE_ERR_EXIST,
MS_OLE_ERR_INVALID,
MS_OLE_ERR_FORMAT,
MS_OLE_ERR_PERM,
MS_OLE_ERR_MEM,
MS_OLE_ERR_SPACE,
MS_OLE_ERR_NOTEMPTY,
MS_OLE_ERR_BADARG
} MsOleErr;
typedef enum {
MsOleSeekSet,
MsOleSeekCur,
MsOleSeekEnd
} MsOleSeek;
typedef enum {
MsOleStorageT = 1,
MsOleStreamT = 2,
MsOleRootT = 5
} MsOleType;
typedef guint32 MsOlePos;
typedef gint32 MsOleSPos;
/*
#ifdef G_HAVE_GINT64
typedef guint64 MsOlePos;
typedef gint64 MsOleSPos;
#else
typedef guint32 MsOlePos;
typedef gint32 MsOleSPos;
#endif
*/
typedef struct _MsOle MsOle;
typedef struct _MsOleStat MsOleStat;
typedef struct _MsOleStream MsOleStream;
typedef struct _MsOleSysWrappers MsOleSysWrappers;
struct _MsOleSysWrappers {
int (*open2) (const char *pathname, int flags);
int (*open3) (const char *pathname, int flags, mode_t mode);
ssize_t (*read) (int fd, void *buf, size_t count);
int (*close) (int fd);
ssize_t (*write) (int fd, const void *buf, size_t count);
off_t (*lseek) (int fd, off_t offset, int whence);
int (*isregfile) (int fd);
int (*getfilesize) (int fd, guint32 *size);
/* Optionaly implementable */
void *(*mmap) (void *start, size_t length, int prot,
int flags, int fd, off_t offset);
int (*munmap) (void *start, size_t length);
};
struct _MsOleStat {
MsOleType type;
MsOlePos size;
};
#define ms_ole_open(fs,path) ms_ole_open_vfs ((fs), (path), TRUE, NULL)
extern MsOleErr ms_ole_open_vfs (MsOle **fs,
const char *path,
gboolean try_mmap,
MsOleSysWrappers *wrappers);
extern void ms_ole_destroy (MsOle **fs);
extern MsOleErr ms_ole_directory (char ***names,
MsOle *fs,
const char *dirpath);
struct _MsOleStream {
MsOlePos size;
gint (*read_copy) (MsOleStream *stream,
guint8 *ptr,
MsOlePos length);
guint8 * (*read_ptr) (MsOleStream *stream,
MsOlePos length);
MsOleSPos (*lseek) (MsOleStream *stream,
MsOleSPos bytes,
MsOleSeek type);
MsOlePos (*tell) (MsOleStream *stream);
MsOlePos (*write) (MsOleStream *stream,
guint8 *ptr,
MsOlePos length);
/**
* Private.
**/
enum {
MsOleSmallBlock,
MsOleLargeBlock
} type;
MsOle *file;
void *pps; /* Straight PPS */
GArray *blocks; /* A list of the blocks in the file
if NULL: no file */
MsOlePos position; /* Current offset into file.
Points to the next byte to read */
};
#define MS_OLE_GET_GUINT8(p) (*((const guint8 *)(p) + 0))
#define MS_OLE_GET_GUINT16(p) (guint16)(*((const guint8 *)(p)+0) | \
(*((const guint8 *)(p)+1)<<8))
#define MS_OLE_GET_GUINT32(p) (guint32)(*((const guint8 *)(p)+0) | \
(*((const guint8 *)(p)+1)<<8) | \
(*((const guint8 *)(p)+2)<<16) | \
(*((const guint8 *)(p)+3)<<24))
#define MS_OLE_GET_GUINT64(p) (MS_OLE_GET_GUINT32(p) | \
(((guint32)MS_OLE_GET_GUINT32((const guint8 *)(p)+4))<<32))
#define MS_OLE_SET_GUINT8(p,n) (*((guint8 *)(p) + 0) = n)
#define MS_OLE_SET_GUINT16(p,n) ((*((guint8 *)(p)+0)=((n)&0xff)), \
(*((guint8 *)(p)+1)=((n)>>8)&0xff))
#define MS_OLE_SET_GUINT32(p,n) ((*((guint8 *)(p)+0)=((n))&0xff), \
(*((guint8 *)(p)+1)=((n)>>8)&0xff), \
(*((guint8 *)(p)+2)=((n)>>16)&0xff), \
(*((guint8 *)(p)+3)=((n)>>24)&0xff))
extern MsOleErr ms_ole_stream_open (MsOleStream ** const stream,
MsOle *fs,
const char *dirpath,
const char *name,
char mode);
extern MsOleErr ms_ole_stream_close (MsOleStream ** const stream);
extern void ms_ole_ref (MsOle *fs);
extern void ms_ole_unref (MsOle *fs);
#endif /* MS_OLE_H */
syntax highlighted by Code2HTML, v. 0.9.1