You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.1 KiB
194 lines
6.1 KiB
/* This file is part of the KDE project
|
|
Copyright (C) 1999 Werner Trobin <trobin@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library 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
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
DESCRIPTION
|
|
|
|
This class is used to decode OLE 2 streams. When instantiated, it
|
|
constructs an internal "filesystem" that corresponds to the OLE storage
|
|
tree. This tree can be navigated, and the individual OLE streams
|
|
returned as a linear memory buffer.
|
|
*/
|
|
|
|
#ifndef KLAOLA_H
|
|
#define KLAOLA_H
|
|
|
|
#include <myfile.h>
|
|
#include <tqstring.h>
|
|
#include <tqptrlist.h>
|
|
|
|
class KLaola {
|
|
|
|
public:
|
|
KLaola(const myFile &file); // see myfile.h!
|
|
~KLaola();
|
|
|
|
bool isOk() {return ok;}
|
|
|
|
// A class representing an abstracted node in the OLE filesystem.
|
|
|
|
class OLENode {
|
|
public:
|
|
virtual ~OLENode() {};
|
|
virtual unsigned handle() const = 0;
|
|
virtual TQString name() const = 0;
|
|
|
|
// Does the node represent a stream datum, or a storage container
|
|
// of data?
|
|
virtual bool isDirectory() const = 0;
|
|
|
|
// If isDirectory() is true, return the CLSID associated with
|
|
// any child CompObj node. If the Node is a CompObj, return
|
|
// its CLSID. Otherwise return TQString().
|
|
//
|
|
// The CLSID is returned in the form:
|
|
//
|
|
// 00020900-0000-0000-C000-000000000046
|
|
//
|
|
virtual TQString readClassStream() const = 0;
|
|
|
|
// Return a human-readable description of a stream.
|
|
virtual TQString describe() const = 0;
|
|
protected:
|
|
OLENode() {}
|
|
};
|
|
|
|
// Wade through the "file system"
|
|
|
|
typedef TQPtrList<OLENode> NodeList;
|
|
NodeList parseRootDir();
|
|
NodeList parseCurrentDir();
|
|
const NodeList currentPath() const;
|
|
const NodeList find(const TQString &name, bool onlyCurrentDir=false);
|
|
bool enterDir(const OLENode *node);
|
|
bool leaveDir();
|
|
|
|
// Return the stream for a given node.
|
|
//
|
|
// Note: data - 512 byte blocks, but length is set correctly :)
|
|
myFile stream(const OLENode *node);
|
|
myFile stream(unsigned handle);
|
|
|
|
private:
|
|
KLaola(const KLaola &);
|
|
const KLaola &operator=(const KLaola &);
|
|
static const int s_area;
|
|
|
|
unsigned char read8(int i) const;
|
|
unsigned short read16(int i) const;
|
|
unsigned int read32(int i) const;
|
|
|
|
// Parsing functions.
|
|
bool parseHeader();
|
|
void readBigBlockDepot();
|
|
void readSmallBlockDepot();
|
|
void readSmallBlockFile();
|
|
void readRootList();
|
|
void readPPSEntry(int pos, const int handle);
|
|
void createTree(const int handle, const short index);
|
|
const unsigned char *readBBStream(int start, bool setmaxSblock=false);
|
|
const unsigned char *readSBStream(int start) const;
|
|
int nextBigBlock(int pos) const;
|
|
int nextSmallBlock(int pos) const;
|
|
|
|
// Dump the parsed structure info (similar to "lls"
|
|
// of the LAOLA-project).
|
|
void testIt(TQString prefix = "");
|
|
|
|
public:
|
|
typedef enum
|
|
{
|
|
DIRECTORY = 1,
|
|
FILE = 2,
|
|
ROOT_ENTRY = 5
|
|
} NodeType;
|
|
|
|
// If the first part of an on-disk name is less than 32, it is a prefix.
|
|
typedef enum
|
|
{
|
|
OLE_MANAGED_0,
|
|
CLSID,
|
|
OLE_MANAGED_2,
|
|
PARENT_MANAGED, // Marks an element as owned by the code that
|
|
// manages the parent storage of that element.
|
|
STRUCTURED_STORAGE, // For the exclusive use of the Structured Storage
|
|
// implementation.
|
|
RESERVED_FIRST,
|
|
RESERVED_LAST = 31,
|
|
NONE = 32
|
|
} Prefix;
|
|
|
|
class Node: public OLENode {
|
|
public:
|
|
Node(KLaola *laola) { m_laola = laola; }
|
|
~Node() {}
|
|
unsigned handle() const { return m_handle; }
|
|
TQString name() const;
|
|
bool isDirectory() const { return (type == DIRECTORY) || (type == ROOT_ENTRY); }
|
|
TQString readClassStream() const;
|
|
TQString describe() const;
|
|
|
|
KLaola *m_laola;
|
|
unsigned m_handle; // PPS entry number
|
|
Prefix m_prefix;
|
|
TQString m_name;
|
|
NodeType type;
|
|
int prevHandle; // Last pps
|
|
int nextHandle; // Next pps
|
|
int dirHandle; // Dir pps
|
|
int ts1s; // Timestamp 1, seconds
|
|
int ts1d; // Timestamp 1, days
|
|
int ts2s; // Timestamp 2, seconds
|
|
int ts2d; // Timestamp 2, days
|
|
unsigned sb; // Starting block
|
|
unsigned size; // Size of property
|
|
bool deadDir; // true, if the dir is a "dead end"
|
|
};
|
|
|
|
private:
|
|
// Lists of nodes.
|
|
|
|
NodeList m_nodeList;
|
|
NodeList m_currentPath;
|
|
|
|
// The OLE storage is represented as a tree. Each node in the tree may
|
|
// refer to a subtree. Each subtree is stored as a list of nodes.
|
|
|
|
struct TreeNode
|
|
{
|
|
Node *node;
|
|
short subtree;
|
|
};
|
|
typedef TQPtrList<TreeNode> SubTree;
|
|
TQPtrList<SubTree> m_nodeTree;
|
|
|
|
bool ok; // is the file OK?
|
|
|
|
myFile m_file;
|
|
unsigned char *bigBlockDepot;
|
|
unsigned char *smallBlockDepot;
|
|
unsigned char *smallBlockFile;
|
|
|
|
unsigned int maxblock; // maximum number of big-blocks
|
|
unsigned int maxSblock; // small-blocks
|
|
unsigned int num_of_bbd_blocks; // number of big block depot blocks
|
|
unsigned int root_startblock; // Root chain's first big block
|
|
unsigned int sbd_startblock; // small block depot's first big block
|
|
unsigned int *bbd_list; //array of num_of_bbd_blocks big block numbers
|
|
};
|
|
#endif // KLAOLA_H
|