ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLhandler.pm
Revision: 1.8
Committed: Thu Nov 4 13:46:16 1999 UTC (25 years, 6 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.7: +20 -26 lines
Log Message:
Use Utilities to expand

File Contents

# Content
1 # url handler -> returns the location of the file
2 # Interface
3 # ---------
4 # new(cache) : A new urlhandler with a defined default cahce directory
5 # get(url) : download from the specified url to the default cache
6 # getto(url,dirlocation): download to the specified directory - no cache registry
7 # setbase(type,variablehash) : set the url defaults for a specific url type
8 # arguments are dependent on type
9 # unsetbase(type) : deactivate a previously set base
10 #
11 # ----------------------------------------------------------------------
12 # returns file location - or crashes out
13 # can pass a file name for the item to be stored as
14 # if not then stores in a default cache.
15
16 package URL::URLhandler;
17 require 5.004;
18 use Utilities::AddDir;
19 use URL::URLUtilities;
20 use URL::URL_base;
21 use Carp;
22
23 sub new {
24 my $class=shift;
25 my $cache=shift;
26 $self={};
27 bless $self, $class;
28 $self->init($cache);
29 return $self;
30 }
31
32 sub init {
33 use URL::URLcache;
34 use Utilities::AddDir;
35 my $self=shift;
36 my $cache=shift;
37 $self->{cache}=$cache;
38 $self->{cachestore}=$self->{cache}->filestore();
39 use URL::URL_cvs;
40 use URL::URL_cvsfile;
41 use URL::URL_file;
42 use URL::URL_filed;
43 $self->{urlmodules}={
44 'cvsfile' => 'URL::URL_cvsfile',
45 'cvs' => 'URL::URL_cvs',
46 'file' => 'URL::URL_file',
47 'filed' => 'URL::URL_filed'
48 };
49 $self->{filebase}="";
50 $self->setbase("file", {}); # Base file as default
51 $self->setbase("filed", {}); # Base file as default
52 }
53
54 #
55 sub get {
56 my $self=shift;
57 my $url=shift;
58
59
60 my ($urlstring, $type, $urltypehandler, $base, $version)
61 =$self->_urlexpand($url); # get a unique url string
62 my $rv="";
63 $rv=$self->getto($url,$self->{cache}->filename($urlstring));
64
65 # now register it in the cache if successful
66 if ( $rv ne "" ) {
67 $self->{cache}->store($urlstring, $rv);
68 }
69 return $rv;
70 }
71
72 sub getto ($@) {
73 my $self=shift;
74 my $origurl=shift;
75 my $dirname=shift;
76
77 my $rv="";
78
79 # Process the URL string
80 my ($type,$rest,$version)=URLUtilities::parseURL($origurl);
81 my ($urltypehandler, $base)=$self->_typecheck($type);
82
83 if ( defined $urltypehandler ) {
84 # Call the download module
85 $rv=eval{$urltypehandler->get($rest.(($version ne "")?"\?".$version:""), $dirname); };
86 }
87 return $rv;
88 }
89
90 sub setbase {
91 my $self=shift;
92 my $type=shift;
93 my @args=@_;
94 my $oref;
95
96 # Check type is supported
97 if ( ! exists $self->{urlmodules}{$type} ) {
98 print "URLhandler error: Unsupported type $type\n";
99 return 1;
100 }
101 else {
102 # A new URL object - pushed onto the stack
103 $oref=eval{$self->{urlmodules}{$type}}->new();
104 push @{$self->{urlostack}{$type}}, $oref;
105 $oref->setbase(@args);
106 }
107 }
108
109 sub unsetbase {
110 my $self=shift;
111 my $type=shift;
112 my $oref;
113
114 # Check type is supported
115 if ( ! exists $self->{urlmodules}{$type} ) {
116 print "URLhandler error: Unsupported type $type\n";
117 return 1;
118 }
119 else {
120 # pop off the stack and call the unset base method
121 if ( $#{$self->{urlostack}{$type}} >=0 ) {
122 $oref=pop @{$self->{urlostack}{$type}};
123 $oref->unsetbase();
124 undef $oref;
125 }
126 else {
127 print "URLhandler error: Unable to unset type $type\n";
128 return 1;
129 }
130 }
131 }
132
133 # -------------------- Support Routines (private Methods) -------------
134
135 #
136 # Process the URL string into its component parts
137 #
138 sub _typecheck {
139 my $self=shift;
140 my $type=shift;
141
142 my $base="";
143
144 # check type are supported
145 if ( ! ( exists $self->{'urlmodules'}{$type}) ) {
146 print "URLhandler: Unsupported type $type\n";
147 die;
148 }
149 else {
150 if ( $#{$self->{urlostack}{$type}} < 0 ) {
151 print "URLhandler : base not set for type $type \n";
152 die;
153 }
154 else {
155 # ---- type is supported
156 $urltypehandler=
157 ${$self->{urlostack}{$type}}[$#{$self->{urlostack}{$type}}];
158 $base=$urltypehandler->baseurl();
159 }
160 }
161
162 return $urltypehandler, $base;
163 }
164
165 sub _urlexpand {
166 my $self=shift;
167 my $url=shift;
168
169 my ($type,$rest,$cmds)=URLUtilities::parseURL($url);
170 my ($urltypehandler, $base)=$self->_typecheck($type);
171
172 my $expurl=$type.":".($base ne ""?$base."/":"").$rest.
173 ($cmds ne ""?"\?".$cmds:"");
174 return $expurl;
175 }