Panda3D

Loading...
Searching...
No Matches
downloadDb.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file downloadDb.h
10 * @author shochet
11 * @date 2000-09-06
12 */
13
14#ifndef DOWNLOADDB_H
15#define DOWNLOADDB_H
16
17#include "pandabase.h"
18#include "pnotify.h"
19#include "filename.h"
20#include "multifile.h"
21#include "datagram.h"
22#include "datagramIterator.h"
23
24#include "pvector.h"
25#include "pointerTo.h"
26#include "pmap.h"
27
28#include "hashVal.h"
29
30 class StreamReader;
31 class StreamWriter;
32 typedef PN_stdfloat Phase;
33 class Ramfile;
34
35/*
36// Database Format
37 magic_number
38 number_of_multifiles
39 header_length multifile_name phase version size status num_files
40 header_length file_name version hash
41 header_length file_name version hash
42 header_length multifile_name phase version size status num_files
43 header_length file_name version hash
44 header_length file_name version hash
45 ...
46...
47
48
49 A Db is a Vector<MultifileRecord>
50 MultifileRecord is a Vector<FileRecord>
51*/
52
53
54/**
55 * A listing of files within multifiles for management of client-side
56 * synchronization with a server-provided set of files.
57 *
58 * This class manages one copy of the database for the client, representing
59 * the files on the client system, and another copy for the server,
60 * representing the files the server has available.
61 */
62 class EXPCL_PANDA_DOWNLOADER DownloadDb {
63PUBLISHED:
64 // Status of a multifile is stored in this enum Note these values are in
65 // increasing order of "doneness" So if you are decompressed, you are
66 // complete If you are extracted, you are decompressed and complete
67 enum Status {
68 Status_incomplete = 0,
69 Status_complete = 1,
70 Status_decompressed = 2,
71 Status_extracted = 3
72 };
73
74 DownloadDb();
75 explicit DownloadDb(Ramfile &server_file, Filename &client_file);
76 explicit DownloadDb(Filename &server_file, Filename &client_file);
77 ~DownloadDb();
78
79 void output(std::ostream &out) const;
80 void write(std::ostream &out) const;
81 void write_version_map(std::ostream &out) const;
82
83 // Write a database file
84 bool write_client_db(Filename &file);
85 bool write_server_db(Filename &file);
86
87 INLINE int get_client_num_multifiles() const;
88 INLINE int get_server_num_multifiles() const;
89
90 INLINE std::string get_client_multifile_name(int index) const;
91 INLINE std::string get_server_multifile_name(int index) const;
92
93 INLINE int get_client_multifile_size(std::string mfname) const;
94 INLINE void set_client_multifile_size(std::string mfname, int size);
95 INLINE int set_client_multifile_delta_size(std::string mfname, int size);
96 INLINE int get_server_multifile_size(std::string mfname) const;
97 INLINE void set_server_multifile_size(std::string mfname, int size);
98
99 INLINE Phase get_client_multifile_phase(std::string mfname) const;
100 INLINE Phase get_server_multifile_phase(std::string mfname) const;
101
102 INLINE void set_client_multifile_incomplete(std::string mfname);
103 INLINE void set_client_multifile_complete(std::string mfname);
104 INLINE void set_client_multifile_decompressed(std::string mfname);
105 INLINE void set_client_multifile_extracted(std::string mfname);
106
107 INLINE int get_server_num_files(std::string mfname) const;
108 INLINE std::string get_server_file_name(std::string mfname, int index) const;
109
110 // Queries from the Launcher
111 bool client_multifile_exists(std::string mfname) const;
112 bool client_multifile_complete(std::string mfname) const;
113 bool client_multifile_decompressed(std::string mfname) const;
114 bool client_multifile_extracted(std::string mfname) const;
115
116 // Ask what version (told with the hash) this multifile is
117 HashVal get_client_multifile_hash(std::string mfname) const;
118 void set_client_multifile_hash(std::string mfname, HashVal val);
119 HashVal get_server_multifile_hash(std::string mfname) const;
120 void set_server_multifile_hash(std::string mfname, HashVal val);
121
122 // Operations on multifiles
123 void delete_client_multifile(std::string mfname);
124 void add_client_multifile(std::string server_mfname);
125 void expand_client_multifile(std::string mfname);
126
127 // Server side operations to create multifile records
128 void create_new_server_db();
129 void server_add_multifile(std::string mfname, Phase phase, int size, int status);
130 void server_add_file(std::string mfname, std::string fname);
131
132 public:
133
134 class EXPCL_PANDA_DOWNLOADER FileRecord : public ReferenceCount {
135 public:
136 FileRecord();
137 FileRecord(std::string name);
138 void write(std::ostream &out) const;
139 std::string _name;
140 };
141
142 typedef pvector< PT(FileRecord) > FileRecords;
143
144 class EXPCL_PANDA_DOWNLOADER MultifileRecord : public ReferenceCount {
145 public:
146 MultifileRecord();
147 MultifileRecord(std::string name, Phase phase, int size, int status);
148 void write(std::ostream &out) const;
149 int get_num_files() const;
150 std::string get_file_name(int index) const;
151 bool file_exists(std::string fname) const;
152 PT(FileRecord) get_file_record_named(std::string fname) const;
153 void add_file_record(PT(FileRecord) fr);
154 std::string _name;
155 Phase _phase;
156 int _size;
157 int _status;
158 HashVal _hash;
159 int32_t _num_files;
160 FileRecords _file_records;
161 };
162
163 typedef pvector< PT(MultifileRecord) > MultifileRecords;
164
165 class EXPCL_PANDA_DOWNLOADER Db {
166 public:
167 Db();
168 void write(std::ostream &out) const;
169 int get_num_multifiles() const;
170 std::string get_multifile_name(int index) const;
171 bool multifile_exists(std::string mfname) const;
172 PT(MultifileRecord) get_multifile_record_named(std::string mfname) const;
173 void add_multifile_record(PT(MultifileRecord) mfr);
174 int parse_header(Datagram dg);
175 int parse_record_header(Datagram dg);
176 PT(MultifileRecord) parse_mfr(Datagram dg);
177 PT(FileRecord) parse_fr(Datagram dg);
178 bool read(StreamReader &sr, bool want_server_info);
179 bool write(StreamWriter &sw, bool want_server_info);
180 Filename _filename;
181 MultifileRecords _mfile_records;
182 bool write_header(std::ostream &write_stream);
183 bool write_bogus_header(StreamWriter &sw);
184 private:
185 int32_t _header_length;
186 };
187
188PUBLISHED:
189 Db read_db(Filename &file, bool want_server_info);
190 Db read_db(Ramfile &file, bool want_server_info);
191 bool write_db(Filename &file, Db db, bool want_server_info);
192
193 public:
194 // The download db stores two databases, one that represents the client's
195 // state and one that represents the server state.
196 Db _client_db;
197 Db _server_db;
198
199 // Magic number for knowing this is a download Db
200 static uint32_t _magic_number;
201 static uint32_t _bogus_magic_number;
202 typedef pvector<HashVal> VectorHash;
203 typedef pmap<Filename, VectorHash> VersionMap;
204
205PUBLISHED:
206 void add_version(const Filename &name, const HashVal &hash, int version);
207 void insert_new_version(const Filename &name, const HashVal &hash);
208 bool has_version(const Filename &name) const;
209 int get_num_versions(const Filename &name) const;
210 void set_num_versions(const Filename &name, int num_versions);
211
212 int get_version(const Filename &name, const HashVal &hash) const;
213 const HashVal &get_hash(const Filename &name, int version) const;
214
215 protected:
216 void write_version_map(StreamWriter &sw);
217 bool read_version_map(StreamReader &sr);
218 VersionMap _versions;
219};
220
221INLINE std::ostream &operator << (std::ostream &out, const DownloadDb &dldb) {
222 dldb.output(out);
223 return out;
224}
225
226
227#include "downloadDb.I"
228
229#endif
Datagram
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition datagram.h:38
DownloadDb::Db
Definition downloadDb.h:165
DownloadDb::Db::parse_header
int parse_header(Datagram dg)
Verifies magic number, returns the number of multifiles or -1 if invalid.
Definition downloadDb.cxx:592
DownloadDb::Db::write_bogus_header
bool write_bogus_header(StreamWriter &sw)
Writes the bogus header uncompressed with platform- independent byte ordering.
Definition downloadDb.cxx:878
DownloadDb::Db::write_header
bool write_header(std::ostream &write_stream)
Writes the header uncompressed with platform- independent byte ordering.
Definition downloadDb.cxx:892
DownloadDb::Db::parse_record_header
int parse_record_header(Datagram dg)
Parses a file record (fr) header and returns the length of the next file record.
Definition downloadDb.cxx:630
DownloadDb::FileRecord
Definition downloadDb.h:134
DownloadDb::MultifileRecord
Definition downloadDb.h:144
DownloadDb
A listing of files within multifiles for management of client-side synchronization with a server-prov...
Definition downloadDb.h:62
DownloadDb::get_hash
const HashVal & get_hash(const Filename &name, int version) const
Returns the MD5 hash associated with the indicated version of the indicated file.
Definition downloadDb.cxx:1042
DownloadDb::set_server_multifile_hash
void set_server_multifile_hash(std::string mfname, HashVal val)
Set the hash value of file we are working on.
Definition downloadDb.cxx:216
DownloadDb::create_new_server_db
void create_new_server_db()
Used on the server side makefiles to create a new clean server db.
Definition downloadDb.cxx:354
DownloadDb::get_client_multifile_hash
HashVal get_client_multifile_hash(std::string mfname) const
Return the hash value of the file we are working on.
Definition downloadDb.cxx:188
DownloadDb::client_multifile_complete
bool client_multifile_complete(std::string mfname) const
A multifile is complete when it is completely downloaded.
Definition downloadDb.cxx:160
DownloadDb::get_version
int get_version(const Filename &name, const HashVal &hash) const
Returns the version number of this particular file, determined by looking up the hash generated from ...
Definition downloadDb.cxx:1021
DownloadDb::has_version
bool has_version(const Filename &name) const
Returns true if the indicated file has version information, false otherwise.
Definition downloadDb.cxx:980
DownloadDb::insert_new_version
void insert_new_version(const Filename &name, const HashVal &hash)
Inserts a new version 1 copy of the file, sliding all the other versions up by one.
Definition downloadDb.cxx:969
DownloadDb::get_server_multifile_hash
HashVal get_server_multifile_hash(std::string mfname) const
Return the hash value of the server file.
Definition downloadDb.cxx:197
DownloadDb::DownloadDb
DownloadDb()
Primarily used for testing.
Definition downloadDb.cxx:86
DownloadDb::set_client_multifile_hash
void set_client_multifile_hash(std::string mfname, HashVal val)
Set the hash value of file we are working on.
Definition downloadDb.cxx:206
DownloadDb::set_num_versions
void set_num_versions(const Filename &name, int num_versions)
Reduces the number of versions of a particular file stored in the ddb by throwing away all versions h...
Definition downloadDb.cxx:1002
DownloadDb::add_version
void add_version(const Filename &name, const HashVal &hash, int version)
Appends a new version of the file onto the end of the list, or changes the hash associated with a ver...
Definition downloadDb.cxx:945
DownloadDb::get_num_versions
int get_num_versions(const Filename &name) const
Returns the number of versions stored for the indicated file.
Definition downloadDb.cxx:988
Filename
The name of a file, such as a texture file or an Egg file.
Definition filename.h:44
HashVal
Stores a 128-bit value that represents the hashed contents (typically MD5) of a file or buffer.
Definition hashVal.h:31
Ramfile
An in-memory buffer specifically designed for downloading files to memory.
Definition ramfile.h:25
StreamReader
A class to read sequential binary data directly from an istream.
Definition streamReader.h:28
StreamWriter
A StreamWriter object is used to write sequential binary data directly to an ostream.
Definition streamWriter.h:29
datagramIterator.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
datagram.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
downloadDb.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
filename.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
hashVal.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
multifile.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pmap.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pnotify.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pvector.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.