W:\dev\indigoperl\indigoperl/perl/site/lib/IPM_RM.pm

sub parseppd { my ($PPDfile) = @_; # parse ppd file

        my $osname;
        if ($^O eq "MSWin32") {
            $osname = "MSWin32";
        }
        else {
            $osname = `uname`; chop $osname;
            $osname = lc($osname);
            $osname =~ s/-//;
            $osname =~ s/\///;
        }

        my $ppddata = ($PPDfile =~ /^http:/) ? get($PPDfile) : ReadFile($PPDfile);

        my ($package_name) = $ppddata =~ m/SOFTPKG NAME=\"(.*?)\"/i;
        my ($package_version) = $ppddata =~ m/SOFTPKG NAME=\".*?\"\s+VERSION=\"(.*?)\"/i;
        while($package_version =~ s/,0$//) { 1; }
        $package_version =~ s/,/./g;

        my $reltarfile;
        foreach ($ppddata =~ m/<IMPLEMENTATION>(.*?)<\/IMPLEMENTATION>/sg) {
            ($reltarfile) = $_ =~ m/CODEBASE HREF=\"(.*?)\"/is if (m/OS NAME=\"$osname\"/);
        }
        if (!$reltarfile) {
            print "ERROR: PPD does not contain an implementation section for OS=$osname\n";
            return undef;
        }
        my $package_description = "$package_name-$package_version";

        my $fulltarfile;
        if (-f $reltarfile) {       # ppd contain a full path
            $fulltarfile = $reltarfile;
        }
        elsif ($reltarfile =~ /^http:/) {
           $fulltarfile = $reltarfile;     # ppd contains an abs URL
        }
        else {
            my ($foo, $path) = fileparse($PPDfile);
            $fulltarfile = "$path$reltarfile";
        }

        return ($fulltarfile, $package_version);
    }

sub get_cached { my ($url, $cachedir) = @_;

        my $local_file = $url;
        $local_file =~ s%http://%%;
        $local_file =~ s%/|\\|\?|:%_%g;
        $local_file = "$cachedir/$local_file";

        my $rc = mirror($url, $local_file);
        #return is_success($rc) ? ReadFile($local_file) : undef;
        return (-e $local_file) ? ReadFile($local_file) : undef;
    }

W:\dev\indigoperl\indigoperl/perl/site/lib/IPM_RM.pm