forked from 3dyne/3dyne_legacy_engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ib_service.h
201 lines (160 loc) · 5.37 KB
/
ib_service.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
* 3dyne Legacy Engine GPL Source Code
*
* Copyright (C) 1996-2012 Matthias C. Berger & Simon Berger.
*
* This file is part of the 3dyne Legacy Engine GPL Source Code ("3dyne Legacy
* Engine Source Code").
*
* 3dyne Legacy Engine Source Code 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 3 of the License,
* or (at your option) any later version.
*
* 3dyne Legacy Engine Source Code 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
* 3dyne Legacy Engine Source Code. If not, see
* <http://www.gnu.org/licenses/>.
*
* In addition, the 3dyne Legacy Engine Source Code is also subject to certain
* additional terms. You should have received a copy of these additional terms
* immediately following the terms and conditions of the GNU General Public
* License which accompanied the 3dyne Legacy Engine Source Code.
*
* Contributors:
* Matthias C. Berger ([email protected]) - initial API and implementation
* Simon Berger ([email protected]) - initial API and implementation
*/
// ib_service.h
#ifndef ib_service_h
#define ib_service_h
#include <vector>
#include <string>
#include <memory>
#include <fstream>
#include "ib_defs.h"
#include "shock.h"
//#include "defs.h"
extern int ib_lastaction;
extern int sc_readbytes;
namespace ibase {
template<typename T>
class deleter {
public:
void operator()( T* ptr ) {
delete ptr;
}
};
class file {
public:
virtual size_t get_size() = 0;
virtual size_t get_pos() = 0;
virtual void set_pos( size_t ) = 0;
virtual size_t read( void *ptr, size_t bsize, size_t nb ) = 0;
virtual int get_char() = 0;
virtual int get_short() = 0;
virtual int get_int() = 0;
virtual const char *map() = 0;
virtual void unmap() = 0;
virtual ~file() {}
};
class source;
class service {
public:
service();
void add_source( const char *name, int stype ) ;
file* open( const char *name ) ;
const char *last_name_cstr() ;
static service& get_singleton() ;
~service() ;
private:
std::vector<source *> sources_;
std::string last_name_;
std::ofstream logs_;
};
class file_handle {
public:
class mapping {
public:
mapping( file_handle &h ) : h_(h) {
if( h.is_mapped_ ) {
__error( "mapping ibase::file more than once is not supported\n" );
}
if( !h.is_open() ) {
__error( "mapping non-open ibase::file\n" );
}
ptr_ = h.file_->map();
}
~mapping() {
h_.file_->unmap();
}
const char *ptr() {
return ptr_;
}
private:
file_handle &h_;
const char *ptr_;
};
file_handle( const char *name )
: is_mapped_(false)
{
open( name );
}
file_handle( const char *name, ibase::service &ibs )
: is_mapped_(false)
{
open( name, ibs );
}
void open( const char *name ) {
file_.reset( ibase::service::get_singleton().open(name) );
if( !is_open() ) {
__error( "open failed: '%s'\n", name );
}
}
void open( const char *name, ibase::service &ibs ) {
file_.reset( ibs.open(name) );
}
bool is_open() const {
return file_.get() != 0;
}
size_t get_size() { __chkptr(file_.get()); return file_->get_size(); }
size_t get_pos() { __chkptr(file_.get()); return file_->get_pos(); }
void set_pos( size_t s ) { __chkptr(file_.get()); file_->set_pos( s ); };
size_t read( void *ptr, size_t bsize, size_t nb ) { __chkptr(file_.get()); return file_->read( ptr, bsize, nb ); }
int get_char() { __chkptr(file_.get()); return file_->get_char(); }
// virtual int get_short() = 0;
// virtual int get_int() = 0;
//
// REMARK: try not to expose these functions directly. see if it is possible to exclusively use RAII wrapper (through mapping class)
// const char *map() { __chkptr(file_.get()); return file_->map(); }
// const char *unmap() { __chkptr(file_.get()); file_->unmap(); }
private:
file_handle() : is_mapped_(false) {}
file_handle( const file_handle & );
file_handle &operator=( const file_handle & );
std::auto_ptr<file> file_; // WARNING: keep this class non-copyable!
bool is_mapped_;
};
}
void IB_StartUp();
void IB_ShutDown();
int IB_ProbeSource( char *name );
void IB_AddSource( const char *name, int type );
ib_file_t *IB_Open( const char *name );
ib_file_t *IB_OpenDiskFile( const char *name );
unsigned int IB_Read( void *buf, unsigned int size, unsigned int blocks, ib_file_t *file );
unsigned int IB_GetSize( ib_file_t *file );
void IB_SetPos( ib_file_t *file, unsigned int pos );
unsigned int IB_GetPos( ib_file_t *file );
void IB_Close( ib_file_t *file );
char *IB_GetLastname( );
int IB_GetChar( ib_file_t *file );
short IB_GetShort( ib_file_t *file );
int IB_GetInt( ib_file_t *file );
void IB_Skip( ib_file_t *file, int size );
void IB_DumpLastSar( const char *outdir );
#endif