ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC.pm (file contents):
Revision 1.137 by root, Sat Dec 9 21:26:45 2006 UTC vs.
Revision 1.164 by root, Tue Dec 25 18:58:32 2007 UTC

15package CFPlus; 15package CFPlus;
16 16
17use Carp (); 17use Carp ();
18 18
19BEGIN { 19BEGIN {
20 $VERSION = '0.97'; 20 $VERSION = '0.9960';
21 21
22 use XSLoader; 22 use XSLoader;
23 XSLoader::load "CFPlus", $VERSION; 23 XSLoader::load "CFPlus", $VERSION;
24} 24}
25 25
26use utf8; 26use utf8;
27 27
28use AnyEvent (); 28use AnyEvent ();
29use BerkeleyDB;
30use Pod::POM (); 29use Pod::POM ();
31use File::Path (); 30use File::Path ();
32use Storable (); # finally 31use Storable (); # finally
33 32use Fcntl ();
34BEGIN { 33use JSON::XS qw(encode_json decode_json);
35 use Crossfire::Protocol::Base ();
36 *to_json = \&Crossfire::Protocol::Base::to_json;
37 *from_json = \&Crossfire::Protocol::Base::from_json;
38}
39 34
40=item guard { BLOCK } 35=item guard { BLOCK }
41 36
42Returns an object that executes the given block as soon as it is destroyed. 37Returns an object that executes the given block as soon as it is destroyed.
43 38
71 $_ 66 $_
72} 67}
73 68
74sub socketpipe() { 69sub socketpipe() {
75 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC 70 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC
76 or die "cannot establish bidiretcional pipe: $!\n"; 71 or die "cannot establish bidirectional pipe: $!\n";
77 72
78 ($fh1, $fh2) 73 ($fh1, $fh2)
79} 74}
80 75
81sub background(&;&) { 76sub background(&;&) {
124 while ($buffer =~ s/^(.*)\n//) { 119 while ($buffer =~ s/^(.*)\n//) {
125 my $line = $1; 120 my $line = $1;
126 $line =~ s/\s+$//; 121 $line =~ s/\s+$//;
127 utf8::decode $line; 122 utf8::decode $line;
128 if ($line =~ /^\x{e877}json_msg (.*)$/s) { 123 if ($line =~ /^\x{e877}json_msg (.*)$/s) {
129 $cb->(from_json $1); 124 $cb->(JSON::XS->new->allow_nonref->decode ($1));
130 } else { 125 } else {
131 ::message ({ 126 ::message ({
132 markup => "background($pid): " . CFPlus::asxml $line, 127 markup => "background($pid): " . CFPlus::asxml $line,
133 }); 128 });
134 } 129 }
137} 132}
138 133
139sub background_msg { 134sub background_msg {
140 my ($msg) = @_; 135 my ($msg) = @_;
141 136
142 $msg = "\x{e877}json_msg " . to_json $msg; 137 $msg = "\x{e877}json_msg " . JSON::XS->new->allow_nonref->encode ($msg);
143 $msg =~ s/\n//g; 138 $msg =~ s/\n//g;
144 utf8::encode $msg; 139 utf8::encode $msg;
145 print $msg, "\n"; 140 print $msg, "\n";
146}
147
148package CFPlus::Database;
149
150our @ISA = BerkeleyDB::Btree::;
151
152sub get($$) {
153 my $data;
154
155 $_[0]->db_get ($_[1], $data) == 0
156 ? $data
157 : ()
158}
159
160my %DB_SYNC;
161
162sub put($$$) {
163 my ($db, $key, $data) = @_;
164
165 my $hkey = $db + 0;
166 CFPlus::weaken $db;
167 $DB_SYNC{$hkey} ||= AnyEvent->timer (after => 5, cb => sub {
168 delete $DB_SYNC{$hkey};
169 $db->db_sync if $db;
170 });
171
172 $db->db_put ($key => $data)
173} 141}
174 142
175package CFPlus; 143package CFPlus;
176 144
177sub find_rcfile($) { 145sub find_rcfile($) {
197 if ($CFG =~ /^---/) { ## TODO compatibility cruft, remove 165 if ($CFG =~ /^---/) { ## TODO compatibility cruft, remove
198 require YAML; 166 require YAML;
199 utf8::decode $CFG; 167 utf8::decode $CFG;
200 $::CFG = YAML::Load ($CFG); 168 $::CFG = YAML::Load ($CFG);
201 } elsif ($CFG =~ /^\{/) { 169 } elsif ($CFG =~ /^\{/) {
202 $::CFG = from_json $CFG; 170 $::CFG = decode_json $CFG;
203 } else { 171 } else {
204 $::CFG = eval $CFG; ## todo comaptibility cruft 172 $::CFG = eval $CFG; ## todo comaptibility cruft
205 } 173 }
206} 174}
207 175
210 178
211 $::CFG->{VERSION} = $::VERSION; 179 $::CFG->{VERSION} = $::VERSION;
212 180
213 open my $fh, ">:utf8", $file 181 open my $fh, ">:utf8", $file
214 or return; 182 or return;
215 print $fh to_json $::CFG; 183 print $fh encode_json $::CFG;
216} 184}
217 185
218sub http_proxy { 186sub http_proxy {
219 my @proxy = win32_proxy_info; 187 my @proxy = win32_proxy_info;
220 188
254 and die $res->status_line; 222 and die $res->status_line;
255 223
256 $res 224 $res
257} 225}
258 226
259our $DB_ENV; 227sub fh_nonblocking($$) {
260our $DB_STATE;
261
262sub db_table($) {
263 my ($table) = @_; 228 my ($fh, $nb) = @_;
264 229
265 $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge; 230 if ($^O eq "MSWin32") {
266 231 $nb = (! ! $nb) + 0;
267 new CFPlus::Database 232 ioctl $fh, 0x8004667e, \$nb; # FIONBIO
268 -Env => $DB_ENV, 233 } else {
269 -Filename => $table, 234 fcntl $fh, &Fcntl::F_SETFL, $nb ? &Fcntl::O_NONBLOCK : 0;
270# -Filename => "database",
271# -Subname => $table,
272 -Property => DB_CHKSUM,
273 -Flags => DB_CREATE | DB_UPGRADE,
274 or die "unable to create/open database table $_[0]: $BerkeleyDB::Error"
275}
276
277our $DB_HOME = "$Crossfire::VARDIR/cfplus";
278
279sub open_db {
280 use strict;
281
282 mkdir $DB_HOME, 0777;
283 my $recover = $BerkeleyDB::db_version >= 4.4
284 ? eval "DB_REGISTER | DB_RECOVER"
285 : 0;
286
287 $DB_ENV = new BerkeleyDB::Env
288 -Home => $DB_HOME,
289 -Cachesize => 1_000_000,
290 -ErrFile => "$DB_HOME/errorlog.txt",
291# -ErrPrefix => "DATABASE",
292 -Verbose => 1,
293 -Flags => DB_CREATE | DB_RECOVER | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_TXN | $recover,
294 -SetFlags => DB_AUTO_COMMIT | DB_LOG_AUTOREMOVE,
295 or die "unable to create/open database home $DB_HOME: $BerkeleyDB::Error";
296
297 $DB_STATE = db_table "state";
298
299 1 235 }
300}
301 236
302unless (eval { open_db }) {
303 File::Path::rmtree $DB_HOME;
304 open_db;
305} 237}
306 238
307package CFPlus::Layout; 239package CFPlus::Layout;
308 240
241$CFPlus::OpenGL::INIT_HOOK{"CFPlus::Layout"} = sub {
242 glyph_cache_restore;
243};
244
309$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub { 245$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub {
310 reset_glyph_cache; 246 glyph_cache_backup;
311}; 247};
312 248
3131; 2491;
314 250
315=back 251=back

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines