… | |
… | |
26 | #XSLoader::load __PACKAGE__, $VERSION; |
26 | #XSLoader::load __PACKAGE__, $VERSION; |
27 | use Data::Dumper;#d# |
27 | use Data::Dumper;#d# |
28 | |
28 | |
29 | my $interface; # Mozilla::Plugin::xxx (design weakness) |
29 | my $interface; # Mozilla::Plugin::xxx (design weakness) |
30 | |
30 | |
|
|
31 | sub NP_VERSION_MAJOR (){ 0 } |
|
|
32 | sub NP_VERSION_MINOR (){ 9 } |
|
|
33 | sub NP_EMBED (){ 1 } |
|
|
34 | sub NP_FULL (){ 2 } |
|
|
35 | sub NP_NORMAL (){ 1 } |
|
|
36 | sub NP_SEEK (){ 2 } |
|
|
37 | sub NP_ASFILE (){ 3 } |
|
|
38 | sub NP_ASFILEONLY (){ 4 } |
|
|
39 | sub NP_MAXREADY (){ 2147483647 } |
|
|
40 | sub NPERR_NO_ERROR (){ 0 } |
|
|
41 | sub NPERR_GENERIC_ERROR (){ 1 } |
|
|
42 | sub NPERR_INVALID_INSTANCE_ERROR (){ 2 } |
|
|
43 | sub NPERR_INVALID_FUNCTABLE_ERROR (){ 3 } |
|
|
44 | sub NPERR_MODULE_LOAD_FAILED_ERROR (){ 4 } |
|
|
45 | sub NPERR_OUT_OF_MEMORY_ERROR (){ 5 } |
|
|
46 | sub NPERR_INVALID_PLUGIN_ERROR (){ 6 } |
|
|
47 | sub NPERR_INVALID_PLUGIN_DIR_ERROR (){ 7 } |
|
|
48 | sub NPERR_INCOMPATIBLE_VERSION_ERROR (){ 8 } |
|
|
49 | sub NPERR_INVALID_PARAM (){ 9 } |
|
|
50 | sub NPERR_INVALID_URL (){ 10 } |
|
|
51 | sub NPERR_FILE_NOT_FOUND (){ 11 } |
|
|
52 | sub NPERR_NO_DATA (){ 12 } |
|
|
53 | sub NPERR_STREAM_NOT_SEEKABLE (){ 13 } |
|
|
54 | sub NPVERS_HAS_STREAMOUTPUT (){ 8 } |
|
|
55 | sub NPVERS_HAS_NOTIFICATION (){ 9 } |
|
|
56 | sub NPVERS_HAS_LIVECONNECT (){ 9 } |
|
|
57 | sub NPVERS_WIN16_HAS_LIVECONNECT (){ 10 } |
|
|
58 | |
31 | my $data; |
59 | my $data; |
32 | |
60 | |
33 | sub BIAS() { -2000000000 } # ugliest hack ever seen |
61 | sub BIAS() { -2147483647 } # ugliest hack ever seen |
34 | |
62 | |
35 | sub snd_cmd($) { |
63 | sub snd_cmd($) { |
36 | $data = pack "NN", 0, ord($_[0]); |
64 | $data = pack "NN", 0, ord($_[0]); |
37 | } |
65 | } |
38 | |
66 | |
… | |
… | |
129 | |
157 | |
130 | if ($cmd eq "I") { |
158 | if ($cmd eq "I") { |
131 | rcv_u32 == 1 or die "protocol version mismatch\n"; |
159 | rcv_u32 == 1 or die "protocol version mismatch\n"; |
132 | ($IFACE, $OSNAME, $OSVERS) = (rcv_blk, rcv_blk, rcv_blk); |
160 | ($IFACE, $OSNAME, $OSVERS) = (rcv_blk, rcv_blk, rcv_blk); |
133 | |
161 | |
134 | } elsif ($cmd eq "+") { |
162 | } elsif ($cmd eq "+") { # New |
135 | my ($objid, $type, $mode, $save, $argc) |
163 | my ($objid, $type, $mode, $save, $argc) |
136 | = (rcv_ptr, rcv_blk, rcv_u32, rcv_blk, rcv_u32); |
164 | = (rcv_ptr, rcv_blk, rcv_u32, rcv_blk, rcv_u32); |
137 | my %args; |
165 | my %args; |
138 | while ($argc--) { |
166 | while ($argc--) { |
139 | my ($argn, $argv) = (rcv_blk, rcv_blk); |
167 | my ($argn, $argv) = (rcv_blk, rcv_blk); |
… | |
… | |
146 | mode => $mode, |
174 | mode => $mode, |
147 | save => $save, |
175 | save => $save, |
148 | args => \%args, |
176 | args => \%args, |
149 | ); |
177 | ); |
150 | |
178 | |
151 | } elsif ($cmd eq "-") { |
179 | } elsif ($cmd eq "-") { # Destroy |
152 | my $objid = rcv_ptr; |
180 | my $objid = rcv_ptr; |
153 | my $save = (delete $_OBJ{$objid})->save; |
181 | my $save = (delete $_OBJ{$objid})->save; |
154 | snd_cmd "-"; |
182 | snd_cmd "-"; |
155 | snd_u32 length $save; |
183 | snd_u32 length $save; |
156 | snd_snd and snd_dyn $save; |
184 | snd_snd and snd_dyn $save; |
157 | |
185 | |
158 | } elsif ($cmd eq "W") { |
186 | } elsif ($cmd eq "X") { # SetWindow |
159 | my $objid = rcv_ptr; |
187 | my $objid = rcv_ptr; |
160 | my %args = ( |
188 | my %args = ( |
161 | window => rcv_ptr, |
189 | window => rcv_ptr, |
162 | x => rcv_i32, |
190 | x => rcv_i32, |
163 | y => rcv_i32, |
191 | y => rcv_i32, |
… | |
… | |
168 | $args{window} = unpack "xxxxN", $args{window}; |
196 | $args{window} = unpack "xxxxN", $args{window}; |
169 | $args{ws_type} = rcv_i32; |
197 | $args{ws_type} = rcv_i32; |
170 | $args{ws_depth} = rcv_u32; |
198 | $args{ws_depth} = rcv_u32; |
171 | } |
199 | } |
172 | |
200 | |
|
|
201 | snd_cmd 'X'; |
173 | $_OBJ{$objid}->set_window(\%args); |
202 | snd_u32 $_OBJ{$objid}->set_window(\%args); |
|
|
203 | snd_snd; |
|
|
204 | |
|
|
205 | } elsif ($cmd eq "N") { # NewStream |
|
|
206 | my $obj = $_OBJ{+rcv_ptr}; |
|
|
207 | my %args = ( |
|
|
208 | obj => $obj, |
|
|
209 | mimetype => rcv_blk, |
|
|
210 | id => rcv_ptr, |
|
|
211 | url => rcv_blk, |
|
|
212 | end => rcv_u32, |
|
|
213 | lastmodified => rcv_u32, |
|
|
214 | notifydata => rcv_u32, |
|
|
215 | seekable => rcv_u32, |
|
|
216 | ); |
|
|
217 | my $str = $_OBJ{$args{id}} = new Mozilla::Stream \%args; |
|
|
218 | |
|
|
219 | my ($stype, $err) = $obj->push_stream($str); |
|
|
220 | |
|
|
221 | snd_cmd 'W'; |
|
|
222 | snd_u32 $err; |
|
|
223 | snd_u32 $stype || NP_NORMAL; |
|
|
224 | snd_snd; |
|
|
225 | |
|
|
226 | } elsif ($cmd eq "/") { # StreamAsFile |
|
|
227 | my $obj = $_OBJ{+rcv_ptr}; |
|
|
228 | my $str = $_OBJ{+rcv_ptr}; |
|
|
229 | my $path = rcv_blk; |
|
|
230 | |
|
|
231 | $obj->stream_as_file($obj, $stream, $path); |
|
|
232 | |
|
|
233 | } elsif ($cmd eq "R") { # WriteReady |
|
|
234 | my $obj = $_OBJ{+rcv_ptr}; |
|
|
235 | my $str = $_OBJ{+rcv_ptr}; |
|
|
236 | |
|
|
237 | snd_cmd 'R'; |
|
|
238 | snd_u32 $obj->write_ready($obj, $str); |
|
|
239 | snd_snd; |
|
|
240 | |
|
|
241 | } elsif ($cmd eq "W") { # Write |
|
|
242 | my $obj = $_OBJ{+rcv_ptr}; |
|
|
243 | my $str = $_OBJ{+rcv_ptr}; |
|
|
244 | my $ofs = rcv_i32; |
|
|
245 | my $len = rcv_i32; |
|
|
246 | my $dta = rcv_dyn $len; |
|
|
247 | |
|
|
248 | snd_cmd 'W'; |
|
|
249 | snd_i32 $obj->write($str, $ofs, $len, $dta); |
|
|
250 | snd_snd; |
|
|
251 | |
|
|
252 | } elsif ($cmd eq "D") { # DestroyStream |
|
|
253 | my $obj = $_OBJ{+rcv_ptr}; |
|
|
254 | my $str = delete $_OBJ{+rcv_ptr}; |
|
|
255 | my $why = rcv_u32; |
|
|
256 | |
|
|
257 | $obj->destroy_stream($obj, $str, $why); |
174 | |
258 | |
175 | } else { |
259 | } else { |
176 | die "unknown command '$cmd' received"; |
260 | die "unknown command '$cmd' received"; |
177 | } |
261 | } |
178 | } |
262 | } |
… | |
… | |
215 | unless ($self->{window}) { |
299 | unless ($self->{window}) { |
216 | $self->{window} = $new; |
300 | $self->{window} = $new; |
217 | print "window new calling with $new->{window}, $new->{w}, $new->{h}\n";#d# |
301 | print "window new calling with $new->{window}, $new->{w}, $new->{h}\n";#d# |
218 | $self->window_new($new->{window}, $new->{w}, $new->{h}); |
302 | $self->window_new($new->{window}, $new->{w}, $new->{h}); |
219 | } |
303 | } |
|
|
304 | |
|
|
305 | (); |
220 | } |
306 | } |
221 | |
307 | |
222 | sub window_new {} |
308 | sub window_new {} |
223 | sub window_resize {} |
309 | sub window_resize {} |
224 | |
310 | |
… | |
… | |
228 | } |
314 | } |
229 | |
315 | |
230 | sub save { |
316 | sub save { |
231 | my $self = shift; |
317 | my $self = shift; |
232 | $self->set_window(undef); |
318 | $self->set_window(undef); |
|
|
319 | $self->{destroy}; |
233 | Storable::nfreeze $self->{save}; |
320 | Storable::nfreeze $self->{save}; |
234 | } |
321 | } |
235 | |
322 | |
|
|
323 | sub destroy {} |
236 | sub DESTROY { |
324 | sub DESTROY {} |
237 | #warn "DESTROY";#d# |
325 | sub write_ready { 0xfffff } |
|
|
326 | sub push_stream {} |
|
|
327 | sub stream_as_file {} |
|
|
328 | sub destroy_stream {} |
|
|
329 | |
|
|
330 | sub write { |
|
|
331 | my ($self) = shift; |
|
|
332 | shift->write(@_); |
238 | } |
333 | } |
239 | |
334 | |
240 | 1; |
335 | 1; |
241 | |
336 | |
242 | =back |
337 | =back |