103 lines
2.7 KiB
C++
103 lines
2.7 KiB
C++
// Filename: p3dMultifileReader.h
|
|
// Created by: drose (15Jun09)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
//
|
|
// All use of this software is subject to the terms of the revised BSD
|
|
// license. You should have received a copy of this license along
|
|
// with this source code in a file named "LICENSE."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef P3DMULTIFILEREADER_H
|
|
#define P3DMULTIFILEREADER_H
|
|
|
|
#include "p3d_plugin_common.h"
|
|
#include "p3dInstanceManager.h" // for openssl
|
|
#include "p3dPackage.h"
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Class : P3DMultifileReader
|
|
// Description : A way-simple implementation of Panda's multifile
|
|
// reader. See panda/src/express/multifile.cxx for a
|
|
// full description of the binary format. This
|
|
// implementation doesn't support per-subfile
|
|
// compression or encryption.
|
|
////////////////////////////////////////////////////////////////////
|
|
class P3DMultifileReader {
|
|
public:
|
|
P3DMultifileReader();
|
|
bool open_read(const string &pathname);
|
|
inline bool is_open() const;
|
|
void close();
|
|
|
|
bool extract_all(const string &to_dir, P3DPackage *package,
|
|
P3DPackage::InstallStep *step);
|
|
|
|
bool extract_one(ostream &out, const string &filename);
|
|
|
|
class CertRecord {
|
|
public:
|
|
inline CertRecord(X509 *cert);
|
|
inline CertRecord(const CertRecord ©);
|
|
inline ~CertRecord();
|
|
X509 *_cert;
|
|
};
|
|
typedef vector<CertRecord> CertChain;
|
|
int get_num_signatures() const;
|
|
const CertChain &get_signature(int n) const;
|
|
|
|
private:
|
|
class Subfile;
|
|
|
|
bool read_header(const string &pathname);
|
|
bool read_index();
|
|
bool extract_subfile(ostream &out, const Subfile &s);
|
|
|
|
void check_signatures();
|
|
|
|
inline unsigned int read_uint16();
|
|
inline unsigned int read_uint32();
|
|
|
|
enum SubfileFlags {
|
|
SF_compressed = 0x0008,
|
|
SF_encrypted = 0x0010,
|
|
SF_signature = 0x0020,
|
|
};
|
|
|
|
class Subfile {
|
|
public:
|
|
inline size_t get_last_byte_pos() const;
|
|
|
|
string _filename;
|
|
size_t _index_start;
|
|
size_t _index_length;
|
|
size_t _data_start;
|
|
size_t _data_length;
|
|
size_t _timestamp;
|
|
};
|
|
|
|
ifstream _in;
|
|
bool _is_open;
|
|
|
|
typedef vector<Subfile> Subfiles;
|
|
Subfiles _subfiles;
|
|
Subfiles _cert_special;
|
|
size_t _last_data_byte;
|
|
|
|
typedef vector<CertChain> Certificates;
|
|
Certificates _signatures;
|
|
|
|
static const char _header[];
|
|
static const size_t _header_size;
|
|
static const int _current_major_ver;
|
|
static const int _current_minor_ver;
|
|
};
|
|
|
|
#include "p3dMultifileReader.I"
|
|
|
|
#endif
|