/[libconf]/libconf/perl-Libconf/Glueconf/XF86Config.pm
ViewVC logotype

Diff of /libconf/perl-Libconf/Glueconf/XF86Config.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by dams, Thu Mar 20 23:43:36 2003 UTC revision 1.3 by dams, Sun Apr 6 18:22:14 2003 UTC
# Line 27  use strict; Line 27  use strict;
27  use vars qw(@ISA);  use vars qw(@ISA);
28  use Libconf::Glueconf;  use Libconf::Glueconf;
29  use Libconf::Libconf;  use Libconf::Libconf;
30    #use Libconf::Glueconf::XF86Config::Wrapper;
31  @ISA = qw(Libconf);  @ISA = qw(Libconf);
32    
33  my @synopsis = (  my @keywords_option = ();
34                  {  my @keywords_list = ();
                  type => 'SECTION',  
                  section_name => 'Files',  
                  content => [  
                              {  
                               key => 'FontPath',  
                               type => 'KEY_VALUE',  
                              },  
                              {  
                               key => 'RGBPath',  
                               type => 'KEY_VALUE',  
                              },  
                              {  
                               key => 'ModulePath',  
                               type => 'KEY_VALUE',  
                              },  
                             ],  
                 },  
                 {  
                  type => 'SECTION',  
                  section_name => 'ServerFlags',  
                  content => [  
                              {  
                               key => 'NoTrapSignals',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'DontZap',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'DontZoom',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'DisableVidModeExtension',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'AllowNonLocalXvidtune',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'DisableModInDev',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'AllowNonLocalModInDev',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'AllowMouseOpenFail',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'VTInit',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'VTSysReq',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'BlankTime',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'StandbyTime',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'SuspendTime',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'OffTime',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'Pixmap',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                              },  
                              {  
                               key => 'PC98',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'NoPM',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                              {  
                               key => 'Xinerama',  
                               type => 'KEY_VALUE',  
                               type2 => 'XF86_OPTION',  
                               value => 'BOOLEAN',  
                              },  
                             ],  
                 },  
                );  
35    
36  sub new {  sub new {
37      my ($pkg, $filename) = @_;      my ($pkg, $filename) = @_;
38      my $self = $pkg->Libconf::new($filename, 'XF86Config', '');      my $libconf = $pkg->Libconf::new($filename, 'XF86Config', '');
39      my $ret = Libconf::Glueconf::generateFunctions(@synopsis);  #    print Data::Dumper->Dump([$libconf],['libconf']) . "\n";
40      print " plop : $ret\n";      #my $ret = Libconf::Glueconf::generateFunctions(@synopsis);
41      eval Libconf::Glueconf::generateFunctions(@synopsis);      #print " plop : $ret\n";
42      $@ and die $@;      #eval Libconf::Glueconf::generateFunctions(@synopsis);
43      $self;      #$@ and die $@;
44    #    $self->{content} = {};
45        tie my %wrapper, 'Libconf::Glueconf::XF86Config::Wrapper', $libconf;
46    #    print Data::Dumper->Dump([%wrapper],['wrapper']) . "\n";
47        \%wrapper;
48  }  }
49    
50  sub sections {  #sub getSections {
51      my ($pkg, $filename) = @_;  #    my $self = shift;
52  }      #    map { my $atom = $self->getAtom($_); $atom->{section_name} } ($self->findAtomPos({type => 'SECTION'}));
53    #}
54    
55    
56    package Libconf::Glueconf::XF86Config::Wrapper;
57    
58    sub TIEHASH {
59        my ($pkg, $libconf) = @_;
60        print "Wrapper - TIEHASH\n";
61        bless { libconf => $libconf }, $pkg;
62    }
63    
64    sub CLEAR {
65        my ($obj) = @_;
66        print "Wrapper - CLEAR\n";
67        $obj->{libconf}->clear();
68    }
69    
70    #sub DESTROY {
71    #}
72    
73    sub DELETE {
74        my ($obj, $key) = @_;
75        print "Wrapper - DELETE - key: $key\n";
76        my @pos = $obj->{libconf}->findAtomPos( { type => 'SECTION', sections => [], section_name => $key });
77        foreach (@pos) {
78            $obj->{libconf}->deleteSection($_);
79        }
80    }
81    
82    sub FIRSTKEY {
83        my ($obj) = @_;
84        print "Wrapper - FIRSTKEY\n";
85        my $atom = $obj->{libconf}->getAtom(0);
86        $atom->{type} eq 'SECTION' or die "atom n° 0 is not a section\n";
87        $atom->{section_name};
88    }
89    
90    sub EXISTS {
91        my ($obj, $key) = @_;
92        print "Wrapper - EXISTS - key : $key\n";
93        my $pos = $obj->{libconf}->findAtomPos( { type => 'SECTION', sections => [], section_name => $key });
94        defined $pos;
95    }
96    
97    sub NEXTKEY {
98        my ($obj, $lastkey) = @_;
99        print "Wrapper - NEXTKEY - lastkey : $lastkey\n";
100        my $pos = $obj->{libconf}->findAtomPos( { type => 'SECTION', sections => [], section_name => $lastkey });
101        $obj->{libconf}->getAtom($pos+1)->{section_name};
102    }
103    
104    sub STORE {
105        my ($obj, $key, $value) = @_;
106        print "Wrapper - STORE - key : $key - value : $value\n";
107        ref $value eq 'HASH' or die 'trying to store anything else than hash ref';
108        my $index;
109        my @pos = $obj->{libconf}->findAtomPos({ type => 'SECTION', section_name => $key, sections => [] });
110        if (@pos == 0) {
111            $index = $obj->{libconf}->appendAtom({ section_name => $key, type => 'SECTION' });
112        } else {
113            $index = $pos[0];
114        }
115        my %hash;
116        tie %hash, 'Libconf::Glueconf::XF86Config::SectionWrapper', $obj->{libconf}, $index;
117        %hash = %$value;
118    }
119    
120    sub FETCH {
121        my ($obj, $key) = @_;
122        print "Wrapper - FETCH - key : $key\n";
123        $key eq 'libconf' and return $obj->{libconf};
124        my @section_positions = $obj->{libconf}->findAtomPos( { type => 'SECTION', section_name => $key, sections => [ ] });
125        my %ret;
126        if (Libconf::member($key, 'InputDevice', 'Monitor', 'Device', 'Screen')) {
127            my @identifier_positions = $obj->{libconf}->findAtomPos(
128                                                                    { type => 'KEY_VALUE',
129                                                                      key => 'Identifier',
130                                                                      sections => [ {name => $key} ]
131                                                                    }
132                                                                   );
133            my $i = 0;
134            foreach (@identifier_positions) {
135                my $atom = $obj->{libconf}->getAtom($_);
136                $ret{$atom->{value}} = {};
137                tie %{$ret{$atom->{value}}}, 'Libconf::Glueconf::XF86Config::SectionWrapper', $obj->{libconf}, $section_positions[$i++];
138            }
139            return %ret;
140        }
141        @section_positions > 1 and die "there are multiple sections named $key, but I don't know how to handle them";
142        tie %ret, 'Libconf::Glueconf::XF86Config::SectionWrapper', $obj->{libconf}, $section_positions[0];
143        \%ret;
144    }
145    
146    package Libconf::Glueconf::XF86Config::SectionWrapper;
147    
148    sub TIEHASH {
149        my ($pkg, $libconf, $beginning) = @_;
150        print "SectionWrapper - TIEHASH - beginning : $beginning\n";
151        my $atom = $libconf->getAtom($beginning);
152        my @depth = @{$atom->{sections}};
153        push @depth, {name => $atom->{section_name} };
154    
155        my $key = $beginning+1;
156        foreach ($beginning+1..$libconf->size()-1) {
157            my $atom = $libconf->getAtom($_);
158            if (!(@{$atom->{sections}} >= @depth)) {
159                $key++;
160                next;
161              }
162            Libconf::compare_depth($atom->{sections}, \@depth) or last;
163            $key++;
164        }
165        my %hash = (
166                    libconf => $libconf,
167                    firstkey => $beginning,
168                    sections => \@depth,
169                    lastkey => $key,
170                   );
171    #    print Data::Dumper->Dump([%hash],['hash']) . "\n";
172        return bless \%hash, $pkg;
173    #     bless {
174    #            libconf => $libconf,
175    #            firstkey => $beginning,
176    #            sections => \@depth,
177    #            lastkey => $key,
178    #           }, $pkg;
179    }
180    
181    sub CLEAR {
182        my ($obj) = @_;
183        print "SectionWrapper - CLEAR\n";
184        $obj->{lastkey} -= $obj->{libconf}->clearSection($obj->{firstkey});
185        $obj->{lastkey} == $obj->{firstkey} + 1 or die "removed atoms number is wrong";
186    #    $obj->{lastkey} = $obj->{firstkey} + 1;
187    }
188    
189    #sub DESTROY {
190    #}
191    
192    sub DELETE {
193        my ($obj, $key) = @_;
194        print "SectionWrapper - DELETE - key : $key\n";
195        foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
196            my $atom = $obj->{libconf}->getAtom($_);
197            if ($atom->{type} eq 'SECTION' &&
198                $atom->{section_name} eq $key) {
199                my $removed = $obj->{libconf}->deleteSection($_);
200                $obj->{lastkey} -= $removed;
201                last;
202            } elsif ($atom->{type} eq 'KEY_VALUE' &&
203                     $atom->{key} eq $key) {
204                $obj->{libconf}->deleteAtom($_);
205                $obj->{lastkey}--;
206            }
207        }
208    }
209    
210    sub FIRSTKEY {
211        my ($obj) = @_;
212        print "SectionWrapper - FIRSTKEY\n";
213        my $atom = $obj->{libconf}->getAtom($obj->{firstkey});
214        $atom->{type} eq 'SECTION' and return $atom->{section_name};
215        $atom->{type} eq 'KEY_VALUE' and return $atom->{key};
216        die "houston, we have a problem";
217    }
218    
219    sub EXISTS {
220        my ($obj, $key) = @_;
221        print "SectionWrapper - EXISTS - key : $key\n";
222        foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
223            my $atom = $obj->{libconf}->getAtom($_);
224            ($atom->{type} eq 'SECTION' && $atom->{section_name} eq $key) ||
225            ($atom->{type} eq 'KEY_VALUE' && $atom->{key} eq $key) and return 1;
226        }
227    }
228    
229    sub NEXTKEY {
230        my ($obj, $lastkey) = @_;
231        print "SectionWrapper - NEXTKEY - lastkey : $lastkey\n";
232        foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
233            my $atom = $obj->{libconf}->getAtom($_);
234            ($atom->{type} eq 'SECTION' && $atom->{section_name} eq $lastkey) ||
235            ($atom->{type} eq 'KEY_VALUE' && $atom->{key} eq $lastkey) and return $obj->{libconf}->getAtom($_+1);
236        }
237        undef;
238    }
239    
240    sub STORE {
241        my ($obj, $key, $value) = @_;
242        print "SectionWrapper - STORE - key : $key - value : $value\n";
243        #ref $value eq 'HASH' or die 'trying to store anything else than hash ref';
244        my $index;
245        if (ref $value eq 'HASH') {
246            foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
247                my $atom = $obj->{libconf}->getAtom($_);
248                ($atom->{type} eq 'SECTION' && $atom->{section_name} eq $key) and $index = $_, last;
249            }
250            if (!defined $index) {
251                $index = $obj->{libconf}->insertAtom($obj->{lastkey}, { section_name => $key,
252                                                                        type => 'SECTION',
253                                                                        sections => [ @{$obj->{sections}} ],
254                                                                      } );
255                $obj->{libconf}->insertAtom($obj->{lastkey}, { type => 'ENDSECTION',
256                                                                        sections => [ @{$obj->{sections}} ],
257                                                                      });
258                $obj->{lastkey} += 2;
259            }
260            my %hash;
261            tie %hash, 'Libconf::Glueconf::XF86Config::SectionWrapper', $obj->{libconf}, $index;
262            %hash = %$value;
263        } elsif (ref $value eq '') {
264            foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
265                my $atom = $obj->{libconf}->getAtom($_);
266                ($atom->{type} eq 'KEY_VALUE' && $atom->{key} eq $key) and $index = $_, last;
267            }
268            if (!defined $index) {
269                $index = $obj->{libconf}->insertAtom($obj->{lastkey}, { key => $key,
270                                                                        type => 'KEY_VALUE',
271                                                                        sections => [ @{$obj->{sections}} ],
272                                                                      } );
273                $obj->{lastkey}++;
274            }
275            $obj->{libconf}->editAtom($index, { value => $value });
276        } else {
277            die "not implemented yet";
278        }
279    }
280    
281    sub FETCH {
282        my ($obj, $key) = @_;
283        print "SectionWrapper - FETCH - key : $key\n";
284        my $index;
285        foreach ($obj->{firstkey}+1..$obj->{lastkey}-1) {
286            my $atom = $obj->{libconf}->getAtom($_);
287            ($atom->{type} eq 'SECTION' && $atom->{section_name} eq $key) ||
288            ($atom->{type} eq 'KEY_VALUE' && $atom->{key} eq $key) and $index = $_, last;
289        }
290        defined $index or return undef;
291        my $atom = $obj->{libconf}->getAtom($index);
292        if ($atom->{type} eq 'SECTION') {
293            my %ret;
294            tie %ret, 'Libconf::Glueconf::XF86Config::SectionWrapper', $obj->{libconf}, $index;
295            return %ret;
296        }
297        if ($atom->{type} eq 'KEY_VALUE') {
298            return $atom->{value};
299        }
300    }
301    
302    
303    
304    
305    
306    
307    
308    
309    
310    
311    #            Files          File pathnames
312    #            ServerFlags    Server flags
313    #            Module         Dynamic module loading
314    #            InputDevice    Input device description
315    #            Device         Graphics device description
316    #            VideoAdaptor   Xv video adaptor description
317    #            Monitor        Monitor description
318    #            Modes          Video modes descriptions
319    #            Screen         Screen configuration
320    #            ServerLayout   Overall layout
321    #            DRI            DRI-specific configuration
322    #            Vendor         Vendor-specific configuration
323    
324    
325    # 1;
326    
327    # my @synopsis = (
328    #                 {
329    #                  type => 'SECTION',
330    #                  section_name => 'Files',
331    #                  content => [
332    #                              {
333    #                               key => 'FontPath',
334    #                               type => 'KEY_VALUE',
335    #                              },
336    #                              {
337    #                               key => 'RGBPath',
338    #                               type => 'KEY_VALUE',
339    #                              },
340    #                              {
341    #                               key => 'ModulePath',
342    #                               type => 'KEY_VALUE',
343    #                              },
344    #                             ],
345    #                 },
346    #                 {
347    #                  type => 'SECTION',
348    #                  section_name => 'ServerFlags',
349    #                  content => [
350    #                              {
351    #                               key => 'NoTrapSignals',
352    #                               type => 'KEY_VALUE',
353    #                               type2 => 'XF86_OPTION',
354    #                               value => 'BOOLEAN',
355    #                              },
356    #                              {
357    #                               key => 'DontZap',
358    #                               type => 'KEY_VALUE',
359    #                               type2 => 'XF86_OPTION',
360    #                               value => 'BOOLEAN',
361    #                              },
362    #                              {
363    #                               key => 'DontZoom',
364    #                               type => 'KEY_VALUE',
365    #                               type2 => 'XF86_OPTION',
366    #                               value => 'BOOLEAN',
367    #                              },
368    #                              {
369    #                               key => 'DisableVidModeExtension',
370    #                               type => 'KEY_VALUE',
371    #                               type2 => 'XF86_OPTION',
372    #                               value => 'BOOLEAN',
373    #                              },
374    #                              {
375    #                               key => 'AllowNonLocalXvidtune',
376    #                               type => 'KEY_VALUE',
377    #                               type2 => 'XF86_OPTION',
378    #                               value => 'BOOLEAN',
379    #                              },
380    #                              {
381    #                               key => 'DisableModInDev',
382    #                               type => 'KEY_VALUE',
383    #                               type2 => 'XF86_OPTION',
384    #                               value => 'BOOLEAN',
385    #                              },
386    #                              {
387    #                               key => 'AllowNonLocalModInDev',
388    #                               type => 'KEY_VALUE',
389    #                               type2 => 'XF86_OPTION',
390    #                               value => 'BOOLEAN',
391    #                              },
392    #                              {
393    #                               key => 'AllowMouseOpenFail',
394    #                               type => 'KEY_VALUE',
395    #                               type2 => 'XF86_OPTION',
396    #                               value => 'BOOLEAN',
397    #                              },
398    #                              {
399    #                               key => 'VTInit',
400    #                               type => 'KEY_VALUE',
401    #                               type2 => 'XF86_OPTION',
402    #                              },
403    #                              {
404    #                               key => 'VTSysReq',
405    #                               type => 'KEY_VALUE',
406    #                               type2 => 'XF86_OPTION',
407    #                               value => 'BOOLEAN',
408    #                              },
409    #                              {
410    #                               key => 'BlankTime',
411    #                               type => 'KEY_VALUE',
412    #                               type2 => 'XF86_OPTION',
413    #                              },
414    #                              {
415    #                               key => 'StandbyTime',
416    #                               type => 'KEY_VALUE',
417    #                               type2 => 'XF86_OPTION',
418    #                              },
419    #                              {
420    #                               key => 'SuspendTime',
421    #                               type => 'KEY_VALUE',
422    #                               type2 => 'XF86_OPTION',
423    #                              },
424    #                              {
425    #                               key => 'OffTime',
426    #                               type => 'KEY_VALUE',
427    #                               type2 => 'XF86_OPTION',
428    #                              },
429    #                              {
430    #                               key => 'Pixmap',
431    #                               type => 'KEY_VALUE',
432    #                               type2 => 'XF86_OPTION',
433    #                              },
434    #                              {
435    #                               key => 'PC98',
436    #                               type => 'KEY_VALUE',
437    #                               type2 => 'XF86_OPTION',
438    #                               value => 'BOOLEAN',
439    #                              },
440    #                              {
441    #                               key => 'NoPM',
442    #                               type => 'KEY_VALUE',
443    #                               type2 => 'XF86_OPTION',
444    #                               value => 'BOOLEAN',
445    #                              },
446    #                              {
447    #                               key => 'Xinerama',
448    #                               type => 'KEY_VALUE',
449    #                               type2 => 'XF86_OPTION',
450    #                               value => 'BOOLEAN',
451    #                              },
452    #                             ],
453    #                 },
454    #                );
455    
456    # sub new {
457    #     my ($pkg, $filename) = @_;
458    #     my $self = $pkg->Libconf::new($filename, 'XF86Config', '');
459    #     my $ret = Libconf::Glueconf::generateFunctions(@synopsis);
460    #     print " plop : $ret\n";
461    #     eval Libconf::Glueconf::generateFunctions(@synopsis);
462    #     $@ and die $@;
463    #     $self;
464    # }
465    
466  1;  1;
467    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26