]> mj.ucw.cz Git - pciids.git/blob - PciIds/Address/Pci.pm
New item -> notification
[pciids.git] / PciIds / Address / Pci.pm
1 package PciIds::Address::Pci;
2 use strict;
3 use warnings;
4 use PciIds::Address::Toplevel;
5 use base 'PciIds::Address::Base';
6
7 sub new( $ ) {
8         my( $address ) = @_;
9         return PciIds::Address::Toplevel::new( $address ) if( $address =~ /^PC\/?$/ );
10         return bless PciIds::Address::Base::new( $address );
11 }
12
13 sub fullPretty( $ ) {
14         $_ = shift->get();
15         s/^PC\/?//;
16         s/\//:/g;
17         if( /:.*:/ ) {
18                 s/^/PCI subsystem /;
19         } elsif( /:/ ) {
20                 s/^/PCI device /;
21         } else {
22                 s/^/PCI vendor /;
23         }
24         return $_;
25 }
26
27 sub pretty( $ ) {
28         my $self = shift;
29         $_ = $self->get();
30         s/^PC\/?//;
31         s/\//:/g;
32         s/([0-9a-f]{4})([0-9a-f]{4})/$1 $2/g;
33         my $prefix = '';
34         if( /:.*:/ ) {
35                 $prefix = 'Subsystem';
36         } elsif( /:/ ) {
37                 $prefix = 'Device';
38         } else {
39                 $prefix = 'Vendor';
40         }
41         return $prefix.' '. $_;
42 }
43
44 sub tail( $ ) {
45         my( $new ) = ( shift->get() );
46         $new =~ s/.*\/(.)/$1/;
47         $new =~ s/([0-9a-f]{4})([0-9a-f]{4})/$1 $2/g;
48         return $new;
49 }
50
51 sub restrictRex( $$ ) {
52         my( $self, $restrict ) = @_;
53         my( $result ) = ( $restrict =~ /^([a-f0-9]{1,4})/ );#TODO every time?
54         return $result;
55 }
56
57 sub leaf( $ ) {
58         return ( shift->get() =~ /\/.*\/.*\// );
59 }
60
61 sub append( $$ ) {
62         my( $self, $suffix ) = @_;
63         return ( undef, 'You can not add to leaf node' ) if( $self->leaf() );
64         $suffix =~ s/ //g;
65         return ( undef, "Invalid ID syntax" ) unless ( ( ( $self->get() !~ /^PC\/.*\// ) && ( $suffix =~ /^[0-9a-f]{4}$/ ) ) || ( ( $self->get() =~ /^PC\/.*\// ) && ( $suffix =~ /^[0-9a-f]{8}$/ ) ) );
66         return ( PciIds::Address::new( $self->{'value'} . ( ( $self->{'value'} =~ /\/$/ ) ? '' : '/' ) . $suffix ), undef );
67 }
68
69 sub path( $ ) {
70         my( $self ) = @_;
71         my $result = PciIds::Address::Base::path( $self );
72         my( $vid ) = ( $self->get() =~ /^PC\/[0-9a-f]{4}\/[0-9a-f]{4}\/([0-9a-f]{4})/ );
73         splice @{$result}, 2, 0, PciIds::Address::new( "PC/$vid" ) if( defined $vid ) && ( $result->[1]->get() ne "PC/$vid" );
74         return $result;
75 }
76
77 sub helpName( $ ) {
78         return 'pci';
79 }
80
81 sub addressDeps( $ ) {
82         my( $addr ) = ( shift->get() =~ /^PC\/....\/....\/(....)/ );
83         return [] unless defined $addr;
84         return [ [ PciIds::Address::new( "PC/$addr" ), "Subsystem vendor $addr does not exist" ] ];
85 }
86
87 sub subName( $ ) {
88         my( $self ) = @_;
89         return 'Subsystems' if $self->get() =~ /^PC\/....\/..../;
90         return 'Devices' if $self->get() =~ /^PC\/..../;
91         die "Can not happend\n";
92 }
93
94 sub subIdSize( $ ) {
95         my( $self ) = @_;
96         return 9 if $self->get() =~ /^PC\/....\/..../;
97         return 4 if $self->get() =~ /^PC\/..../;
98         die "Can not happen\n";
99 }
100
101 1;