line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package SharePoint::SOAPHandler; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
41188
|
use 5.008000; |
|
1
|
|
|
|
|
6
|
|
|
1
|
|
|
|
|
42
|
|
4
|
1
|
|
|
1
|
|
7
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
376
|
|
5
|
1
|
|
|
1
|
|
8
|
use warnings; |
|
1
|
|
|
|
|
7
|
|
|
1
|
|
|
|
|
53
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
#our @ISA = qw(CopyTree::VendorProof); |
8
|
1
|
|
|
1
|
|
6
|
use base qw(CopyTree::VendorProof); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1651
|
|
9
|
1
|
|
|
1
|
|
54478
|
use Authen::NTLM qw/ntlmv2/;ntlmv2('sp'); |
|
1
|
|
|
|
|
91551
|
|
|
1
|
|
|
|
|
114
|
|
10
|
|
|
|
|
|
|
#use base happens at compile time, so we don't get the runtime error from our, saying that |
11
|
|
|
|
|
|
|
#Can't locate package CopyTree::VendorProof for @SharePoint::SOAPHandler::ISA at (eval 8) line 2. |
12
|
|
|
|
|
|
|
our $VERSION = '0.0013'; |
13
|
1
|
|
|
1
|
|
466
|
use SOAP::Lite; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
#use SOAP::Data; #included in SOAP::Lite |
15
|
|
|
|
|
|
|
use LWP::UserAgent; |
16
|
|
|
|
|
|
|
use LWP::Debug; |
17
|
|
|
|
|
|
|
use Data::Dumper; |
18
|
|
|
|
|
|
|
use MIME::Base64 (); |
19
|
|
|
|
|
|
|
use Carp (); |
20
|
|
|
|
|
|
|
use File::Basename (); |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
# Preloaded methods go here. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
sub new{ |
25
|
|
|
|
|
|
|
my $class=shift; |
26
|
|
|
|
|
|
|
my %args = @_; #not used, we set default args in bless, then offer option to reset |
27
|
|
|
|
|
|
|
Carp::croak("Options to LWP::UserAgent should be key/value pairs, not hash reference") |
28
|
|
|
|
|
|
|
if ref($_[1]) eq 'HASH'; |
29
|
|
|
|
|
|
|
#NOTE: you will get an error "Attempt to bless into a reference at lib/SharePoint/soaphandler.pm line 24" if you (accidentally) called a method that doesn't exist. |
30
|
|
|
|
|
|
|
my $self = bless { |
31
|
|
|
|
|
|
|
sp_creds_uaargs => [(keep_alive=>1)], #requires for NTLM |
32
|
|
|
|
|
|
|
sp_creds_uaagent => 'Mozilla/5.0', |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
}, $class; |
36
|
|
|
|
|
|
|
return $self; |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
} |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
sub sp_creds_uaargs{ |
42
|
|
|
|
|
|
|
my $inst = shift; |
43
|
|
|
|
|
|
|
if (@_){ |
44
|
|
|
|
|
|
|
#$inst->{'sp_creds_uaargs'}= [@_]; $inst; #mon aug 2 |
45
|
|
|
|
|
|
|
$inst->{'sp_creds_uaargs'}= shift; $inst; |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
else{@{$inst ->{'sp_creds_uaargs'}}} |
48
|
|
|
|
|
|
|
} |
49
|
|
|
|
|
|
|
sub sp_creds_domain{ |
50
|
|
|
|
|
|
|
my $inst = shift; |
51
|
|
|
|
|
|
|
if (@_){ |
52
|
|
|
|
|
|
|
my $site = shift; |
53
|
|
|
|
|
|
|
if ($site =~/%20/){ |
54
|
|
|
|
|
|
|
Carp::carp("Do not use %20 for spaces\n"); |
55
|
|
|
|
|
|
|
$site =~s/%20/ /g; |
56
|
|
|
|
|
|
|
} |
57
|
|
|
|
|
|
|
$inst->{'sp_creds_domain'}=$site; $inst; |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
else{$inst ->{'sp_creds_domain'}} |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
sub sp_creds_user{ |
64
|
|
|
|
|
|
|
my $inst = shift; |
65
|
|
|
|
|
|
|
if (@_){ |
66
|
|
|
|
|
|
|
my $domuser = shift; |
67
|
|
|
|
|
|
|
my ($dom, $user)=split /\\/, $domuser; |
68
|
|
|
|
|
|
|
$dom = uc($dom); |
69
|
|
|
|
|
|
|
$domuser = join('\\', $dom, $user); |
70
|
|
|
|
|
|
|
$inst->{'sp_creds_user'}= $domuser; $inst;} |
71
|
|
|
|
|
|
|
else{$inst ->{'sp_creds_user'}} |
72
|
|
|
|
|
|
|
} |
73
|
|
|
|
|
|
|
sub sp_creds_password{ |
74
|
|
|
|
|
|
|
my $inst = shift; |
75
|
|
|
|
|
|
|
if (@_){ $inst->{'sp_creds_password'}= shift; $inst;} |
76
|
|
|
|
|
|
|
else{$inst ->{'sp_creds_password'}} |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
#string, "Mozilla/5.0" |
79
|
|
|
|
|
|
|
sub sp_creds_uaagent{ |
80
|
|
|
|
|
|
|
my $inst = shift; |
81
|
|
|
|
|
|
|
if (@_){ $inst->{'sp_creds_uaagent'}= shift; $inst;} |
82
|
|
|
|
|
|
|
else{$inst ->{'sp_creds_uaagent'}} |
83
|
|
|
|
|
|
|
} |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
sub sp_creds_credentials{ |
86
|
|
|
|
|
|
|
my $inst = shift; |
87
|
|
|
|
|
|
|
if (@_){ $inst->{'sp_creds_credentials'}= [@_]; $inst;} |
88
|
|
|
|
|
|
|
else{@{$inst ->{'sp_creds_credentials'}}} |
89
|
|
|
|
|
|
|
} |
90
|
|
|
|
|
|
|
#user agent object |
91
|
|
|
|
|
|
|
sub sp_creds_schema_ua{ |
92
|
|
|
|
|
|
|
my $inst = shift; |
93
|
|
|
|
|
|
|
if (@_){ $inst ->{'sp_creds_schema_ua'}=shift; $inst;} |
94
|
|
|
|
|
|
|
else{$inst -> {'sp_creds_schema_ua'}} |
95
|
|
|
|
|
|
|
} |
96
|
|
|
|
|
|
|
#sp_authorized root is the root web address just above the Shared Documents link |
97
|
|
|
|
|
|
|
#that the user cred is authorized to post |
98
|
|
|
|
|
|
|
#e.g., https://sharepoint.shit.net/sitelevel/subsitelevel/collaboration |
99
|
|
|
|
|
|
|
sub sp_authorizedroot{ |
100
|
|
|
|
|
|
|
my $inst = shift; |
101
|
|
|
|
|
|
|
if (@_){ |
102
|
|
|
|
|
|
|
my $site = shift; |
103
|
|
|
|
|
|
|
$site =~s/\/$//; #auto removes trailing slashes |
104
|
|
|
|
|
|
|
if ($site =~/%20/){ |
105
|
|
|
|
|
|
|
Carp::carp("Do not use %20 for spaces\n"); |
106
|
|
|
|
|
|
|
$site =~s/%20/ /g; |
107
|
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
$inst->{'sp_authorizedroot'}=$site; $inst; |
109
|
|
|
|
|
|
|
} |
110
|
|
|
|
|
|
|
else{$inst ->{'sp_authorizedroot'}} |
111
|
|
|
|
|
|
|
} |
112
|
|
|
|
|
|
|
sub slvti{ |
113
|
|
|
|
|
|
|
my $inst = shift; |
114
|
|
|
|
|
|
|
if (@_){ $inst->{'slvti'}= shift; $inst;} |
115
|
|
|
|
|
|
|
else{$inst ->{'slvti'}} |
116
|
|
|
|
|
|
|
} |
117
|
|
|
|
|
|
|
sub sluri{ |
118
|
|
|
|
|
|
|
my $inst = shift; |
119
|
|
|
|
|
|
|
if (@_){$inst->{'sluri'}= shift;$inst;} |
120
|
|
|
|
|
|
|
else{$inst ->{'sluri'}} |
121
|
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
|
#sitedata lists dirs |
123
|
|
|
|
|
|
|
sub slsitedataobj{ |
124
|
|
|
|
|
|
|
my $inst = shift; |
125
|
|
|
|
|
|
|
if (@_){ $inst->{'slsitedataobj'}= shift; |
126
|
|
|
|
|
|
|
$inst->{'slsitedataobj'}->on_action(sub{"$_[0]$_[1]"}); |
127
|
|
|
|
|
|
|
$inst; |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
else{$inst ->{'slsitedataobj'}} |
130
|
|
|
|
|
|
|
} |
131
|
|
|
|
|
|
|
sub slcopyobj{ |
132
|
|
|
|
|
|
|
my $inst = shift; |
133
|
|
|
|
|
|
|
if (@_){ $inst->{'slcopyobj'}= shift; |
134
|
|
|
|
|
|
|
$inst->{'slcopyobj'}->on_action(sub{"$_[0]$_[1]"}); |
135
|
|
|
|
|
|
|
$inst; |
136
|
|
|
|
|
|
|
} |
137
|
|
|
|
|
|
|
else{$inst ->{'slcopyobj'}} |
138
|
|
|
|
|
|
|
} |
139
|
|
|
|
|
|
|
#dws creates and deletes dirs |
140
|
|
|
|
|
|
|
sub sldwsobj{ |
141
|
|
|
|
|
|
|
my $inst = shift; |
142
|
|
|
|
|
|
|
if (@_){ $inst->{'sldwsobj'}= shift; |
143
|
|
|
|
|
|
|
$inst->{'sldwsobj'}->on_action(sub{"$_[0]$_[1]"}); |
144
|
|
|
|
|
|
|
$inst; |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
else{$inst ->{'sldwsobj'}} |
147
|
|
|
|
|
|
|
} |
148
|
|
|
|
|
|
|
#list enables deleting of single files and listing list items, whatever that means for sharepoint |
149
|
|
|
|
|
|
|
sub sllistobj{ |
150
|
|
|
|
|
|
|
my $inst = shift; |
151
|
|
|
|
|
|
|
if (@_){ $inst->{'sllistobj'}= shift; |
152
|
|
|
|
|
|
|
$inst->{'sllistobj'}->on_action(sub{"$_[0]$_[1]"}); |
153
|
|
|
|
|
|
|
$inst; |
154
|
|
|
|
|
|
|
} |
155
|
|
|
|
|
|
|
else{$inst ->{'sllistobj'}} |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
#if there are shell env variables to tell anything to go through a proxy server, |
160
|
|
|
|
|
|
|
#this swtich says either to follow(0) or ignore(1) the proxy directions |
161
|
|
|
|
|
|
|
sub sp_creds_proxy{ |
162
|
|
|
|
|
|
|
my $inst = shift; |
163
|
|
|
|
|
|
|
if (@_){ $inst->{'sp_creds_proxy'}=[@_] ; $inst;} |
164
|
|
|
|
|
|
|
else{@{$inst ->{'sp_creds_proxy'}}} |
165
|
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
|
sub sp_creds_noproxy{ |
167
|
|
|
|
|
|
|
my $inst = shift; |
168
|
|
|
|
|
|
|
if (@_){ $inst->{'sp_creds_noproxy'}= [@_]; $inst;} |
169
|
|
|
|
|
|
|
else{@{$inst ->{'sp_creds_noproxy'}}} |
170
|
|
|
|
|
|
|
} |
171
|
|
|
|
|
|
|
#sp_connect requires two ua's, one for LWP and one for SOAP::Lite operations |
172
|
|
|
|
|
|
|
sub sp_connect_lwp{ |
173
|
|
|
|
|
|
|
my $soap_inst = shift; |
174
|
|
|
|
|
|
|
Carp::carp("sp_creds_uaargs not set\n") if (! $soap_inst->sp_creds_uaargs); |
175
|
|
|
|
|
|
|
if (! $soap_inst->sp_creds_domain){ |
176
|
|
|
|
|
|
|
Carp::croak("sp_creds_domain not set\n"); |
177
|
|
|
|
|
|
|
} |
178
|
|
|
|
|
|
|
elsif ($soap_inst->sp_creds_domain =~m/http/ or $soap_inst->sp_creds_domain =~m/\/\//){ |
179
|
|
|
|
|
|
|
Carp::croak("sp_creds_domain should not contain protocol\n". |
180
|
|
|
|
|
|
|
"use 'sharepoint.site:443' instead of 'https://sharepoint.site:443'" |
181
|
|
|
|
|
|
|
); |
182
|
|
|
|
|
|
|
} |
183
|
|
|
|
|
|
|
Carp::carp("sp_creds_user not set\n") if (! $soap_inst->sp_creds_user); |
184
|
|
|
|
|
|
|
Carp::carp("sp_creds_password not set\n") if (! $soap_inst->sp_creds_password); |
185
|
|
|
|
|
|
|
Carp::carp("sp_creds_uaagent not set\n") if (! $soap_inst->sp_creds_uaagent); |
186
|
|
|
|
|
|
|
#skip this sub if LWP shema_ua is already set |
187
|
|
|
|
|
|
|
if (ref $soap_inst ->sp_creds_schema_ua){ |
188
|
|
|
|
|
|
|
return $soap_inst; |
189
|
|
|
|
|
|
|
} |
190
|
|
|
|
|
|
|
$soap_inst ->sp_creds_credentials($soap_inst->sp_creds_domain, '', $soap_inst->sp_creds_user, $soap_inst->sp_creds_password); |
191
|
|
|
|
|
|
|
my $sp_schema_ua = LWP::UserAgent->new($soap_inst->sp_creds_uaargs); |
192
|
|
|
|
|
|
|
#LWP wants credentials in an array, not arrayref |
193
|
|
|
|
|
|
|
$sp_schema_ua -> credentials($soap_inst->sp_creds_credentials); |
194
|
|
|
|
|
|
|
$sp_schema_ua ->agent($soap_inst->sp_creds_uaagent); |
195
|
|
|
|
|
|
|
#$sp_schema_ua ->proxy($soap_inst->sp_creds_proxy); |
196
|
|
|
|
|
|
|
#$sp_schema_ua ->no_proxy($soap_inst->sp_creds_noproxy); |
197
|
|
|
|
|
|
|
$soap_inst ->sp_creds_schema_ua($sp_schema_ua); |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
return ($soap_inst); |
200
|
|
|
|
|
|
|
} |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
sub sp_sitedataini{ |
204
|
|
|
|
|
|
|
my $soap_inst=shift; |
205
|
|
|
|
|
|
|
return $soap_inst if (ref $soap_inst->slsitedataobj); |
206
|
|
|
|
|
|
|
$soap_inst -> sp_connect_lwp; |
207
|
|
|
|
|
|
|
$soap_inst->slvti($soap_inst->sp_authorizedroot()."/_vti_bin/SiteData.asmx"); |
208
|
|
|
|
|
|
|
#remember this uri requires a trailing slash |
209
|
|
|
|
|
|
|
$soap_inst -> sluri("http://schemas.microsoft.com/sharepoint/soap/"); |
210
|
|
|
|
|
|
|
#Important. SOAP::Lite-> proxy wants arguments to be in list form; uaargs is the same format |
211
|
|
|
|
|
|
|
#as LWP would prefer; |
212
|
|
|
|
|
|
|
#credentials is NOT the same: LWP wants array; SOAP::Lite::porxy wants array ref |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
$soap_inst -> slsitedataobj ( SOAP::Lite ->proxy ($soap_inst->slvti, $soap_inst ->sp_creds_uaargs, credentials =>[$soap_inst->sp_creds_credentials]) ); |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
$soap_inst -> slsitedataobj() -> schema->useragent($soap_inst->sp_creds_schema_ua); |
217
|
|
|
|
|
|
|
#$soap_inst -> slsitedataobj() -> uri($s_uri); |
218
|
|
|
|
|
|
|
$soap_inst -> slsitedataobj() -> uri($soap_inst->sluri); |
219
|
|
|
|
|
|
|
return $soap_inst;#->slsitedataobj; |
220
|
|
|
|
|
|
|
#@$slsitedataobj ->on_action(sub{qq/$_[0]$_[1]/});#now included in sub slsitedataobj |
221
|
|
|
|
|
|
|
#################IMPORTANT################# |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
#=head1 IMPORTANT: Microsoft soap doesn't use header info that SOAP::Lite requires |
224
|
|
|
|
|
|
|
# |
225
|
|
|
|
|
|
|
#i.e. SOAP::Lite uses default schemas.soap.come/#Function (uri#method), while MS uses |
226
|
|
|
|
|
|
|
#shcemas.microsoft.com/soap/Function (urimethod) |
227
|
|
|
|
|
|
|
# |
228
|
|
|
|
|
|
|
#If this is not set properly, you will get soap errors. Took me 3 days printing Dumpers |
229
|
|
|
|
|
|
|
#to everything to discover this stupid error |
230
|
|
|
|
|
|
|
# |
231
|
|
|
|
|
|
|
#This function is now included when setting the obj, i.e. sub slsitedataobj |
232
|
|
|
|
|
|
|
# |
233
|
|
|
|
|
|
|
#=cut |
234
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
} |
236
|
|
|
|
|
|
|
sub carpenvproxy{ |
237
|
|
|
|
|
|
|
Carp::carp("_____________________________________________________________\nYou might get a 500 can't connect error (Bad service 'port/')\n\t if your sharepoint is on https, and you have\n\t a https_proxy env var set,\n\t but the sharepoint does NOT require a proxy to connect.\n\t to fix, remove your https_proxy env variable. (in perl, delete \$ENV{'https_proxy'})\n\t". |
238
|
|
|
|
|
|
|
" bug from SOAP::Transport::HTTP, calls for SUPER::env_proxy from LWP::UserAgent, does\n\t". |
239
|
|
|
|
|
|
|
" not know how to deal with https_proxy (no_proxy does not override https_proxy, only http_proxy\n"); |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
} |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
sub fdls{ |
244
|
|
|
|
|
|
|
my $soap_inst = shift; |
245
|
|
|
|
|
|
|
#my $sp_sitedataobj = shift; |
246
|
|
|
|
|
|
|
Carp::croak("fdls item must be an instance, not a class\n") unless (ref $soap_inst); |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
my $lsoption=shift; #'d', 'f', 'fdarrayrefs' or undef |
249
|
|
|
|
|
|
|
$lsoption ='' if !($lsoption); |
250
|
|
|
|
|
|
|
my $rootsearchfolder =shift; |
251
|
|
|
|
|
|
|
$rootsearchfolder = $soap_inst ->SUPER::path if (!$rootsearchfolder); #'Shared Documents' or 'Shared Documents/something' |
252
|
|
|
|
|
|
|
$rootsearchfolder=~s/\/$//;#removes trailing slashes, should be trouble |
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
$soap_inst ->sp_sitedataini if (!ref $soap_inst->slsitedataobj ); |
255
|
|
|
|
|
|
|
my $sp_sitedataobj= $soap_inst->slsitedataobj; |
256
|
|
|
|
|
|
|
my $in_strfolderurl=SOAP::Data::name('strFolderUrl'=>$rootsearchfolder); |
257
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
258
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
my $enufolderobj=$sp_sitedataobj->EnumerateFolder($in_strfolderurl); |
261
|
|
|
|
|
|
|
#SHAREPOINT BUG STUPID: if only 1 item is returned, we get a hashref; |
262
|
|
|
|
|
|
|
#if more than 1 item is returned, we get an array ref of hashrefs |
263
|
|
|
|
|
|
|
#if no items returned, we get scalar undef |
264
|
|
|
|
|
|
|
#REMEMBER: EnumerateFolder DOES NOT work on files - must test parent dir first |
265
|
|
|
|
|
|
|
my $resultref = $enufolderobj -> body ->{'EnumerateFolderResponse'}{'vUrls'}{'_sFPUrl'}; |
266
|
|
|
|
|
|
|
if (ref $resultref eq 'HASH'){#fix stupid SHAREPOINT bug |
267
|
|
|
|
|
|
|
$resultref = [$resultref]; |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
#Carp::carp("resultref is ". print Dumper $resultref); |
271
|
|
|
|
|
|
|
delete $soap_inst->{'sp_sitedataenufolderret'}; |
272
|
|
|
|
|
|
|
$soap_inst->{'sp_sitedataenufolderret'}->{'dir'}=[]; |
273
|
|
|
|
|
|
|
$soap_inst->{'sp_sitedataenufolderret'}->{'file'}=[]; |
274
|
|
|
|
|
|
|
if ($resultref){ #$resultref is undef if no items returned |
275
|
|
|
|
|
|
|
for my $item (@$resultref){ |
276
|
|
|
|
|
|
|
if ($item->{'IsFolder'} eq 'true'){ |
277
|
|
|
|
|
|
|
#print "[d] ".$item->{'Url'}."\n";# if ($item->{'IsFolder'} eq 'true'); #Url, IsFolder, LastModified |
278
|
|
|
|
|
|
|
push @{$soap_inst->{'sp_sitedataenufolderret'}->{'dir'}}, $item ->{'Url'}; |
279
|
|
|
|
|
|
|
} |
280
|
|
|
|
|
|
|
else { |
281
|
|
|
|
|
|
|
#print "[f] ".$item->{'Url'}."\n"; |
282
|
|
|
|
|
|
|
push @{$soap_inst->{'sp_sitedataenufolderret'}->{'file'}}, $item ->{'Url'}; |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
}#end for my $item |
285
|
|
|
|
|
|
|
} |
286
|
|
|
|
|
|
|
$soap_inst ->SUPER::fdls_ret ( $lsoption, \@{$soap_inst->{'sp_sitedataenufolderret'}->{'file'}}, \@{$soap_inst->{'sp_sitedataenufolderret'}->{'dir'}} ); |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
sub sp_sitedatagetlistcol{ |
291
|
|
|
|
|
|
|
my $soap_inst = shift; |
292
|
|
|
|
|
|
|
$soap_inst ->sp_sitedataini if (!ref $soap_inst->slsitedataobj ); |
293
|
|
|
|
|
|
|
my $sp_sitedataobj= $soap_inst->slsitedataobj; |
294
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
295
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
296
|
|
|
|
|
|
|
} |
297
|
|
|
|
|
|
|
my $getlistcolobj=$sp_sitedataobj->GetListCollection(); |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
my $resultref = $getlistcolobj -> body->{'GetListCollectionResponse'}{'vLists'}{'_sList'}; |
300
|
|
|
|
|
|
|
return $resultref; |
301
|
|
|
|
|
|
|
#the return is an array ref of hash refs of keys and values |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
} |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub sp_copyini{ |
306
|
|
|
|
|
|
|
my $soap_inst=shift; |
307
|
|
|
|
|
|
|
return $soap_inst if (ref $soap_inst->slcopyobj); |
308
|
|
|
|
|
|
|
$soap_inst -> sp_connect_lwp; |
309
|
|
|
|
|
|
|
$soap_inst->slvti($soap_inst->sp_authorizedroot()."/_vti_bin/Copy.asmx"); |
310
|
|
|
|
|
|
|
#remember this uri requires a trailing slash |
311
|
|
|
|
|
|
|
$soap_inst -> sluri("http://schemas.microsoft.com/sharepoint/soap/"); |
312
|
|
|
|
|
|
|
#Important. SOAP::Lite-> proxy wants arguments to be in list form; uaargs is the same format |
313
|
|
|
|
|
|
|
#as LWP would prefer; |
314
|
|
|
|
|
|
|
#credentials is NOT the same: LWP wants array; SOAP::Lite::porxy wants array ref |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
$soap_inst -> slcopyobj ( SOAP::Lite ->proxy ($soap_inst->slvti, $soap_inst ->sp_creds_uaargs, credentials =>[$soap_inst->sp_creds_credentials]) ); |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
$soap_inst -> slcopyobj() -> schema->useragent($soap_inst->sp_creds_schema_ua); |
319
|
|
|
|
|
|
|
#$soap_inst -> slcopyobj() -> uri($s_uri); |
320
|
|
|
|
|
|
|
$soap_inst -> slcopyobj() -> uri($soap_inst->sluri); |
321
|
|
|
|
|
|
|
return $soap_inst;#->slcopyobj; |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
#memory is a ref to a scalar, in bin mode |
324
|
|
|
|
|
|
|
sub read_into_memory{ |
325
|
|
|
|
|
|
|
my $soap_inst = shift; |
326
|
|
|
|
|
|
|
my $sourcepath =shift; #return obj from sitedataenufolder, e.g., "Shared Documents/index.html" |
327
|
|
|
|
|
|
|
$sourcepath=$soap_inst->SUPER::path if (!$sourcepath); |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
$soap_inst->sp_copyini if (!ref $soap_inst->slcopyobj ); |
330
|
|
|
|
|
|
|
my $sp_copyobj= $soap_inst->slcopyobj; |
331
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
332
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
333
|
|
|
|
|
|
|
} |
334
|
|
|
|
|
|
|
my $in_strfileurl=SOAP::Data::name('Url'=>$soap_inst->sp_authorizedroot()."/".$sourcepath); |
335
|
|
|
|
|
|
|
my $getcopy=$sp_copyobj->GetItem($in_strfileurl); |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
my $result_bin=MIME::Base64::decode_base64( $getcopy -> body->{'GetItemResponse'}{'Stream'} ); |
338
|
|
|
|
|
|
|
Carp::carp("source file/dir on sharepoint [$sourcepath] does not exit (no stream) - ignoring this entry\n") if (! $result_bin); |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
#IMPORTANT: GetItem returns NO ERROR on files that doesn't exist |
341
|
|
|
|
|
|
|
return (\$result_bin); #I decided to not decode the file in case it's a binary. |
342
|
|
|
|
|
|
|
#will rely on calling program to decode it to make data transfer safe |
343
|
|
|
|
|
|
|
} |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
|
346
|
|
|
|
|
|
|
#memory is a ref to a scalar, in bin mode |
347
|
|
|
|
|
|
|
sub write_from_memory{ |
348
|
|
|
|
|
|
|
my $soap_inst = shift; |
349
|
|
|
|
|
|
|
my $binref =shift; |
350
|
|
|
|
|
|
|
my $destinationurl = shift;# in this version, I will only support writeing to one single dest |
351
|
|
|
|
|
|
|
#Shared Documents/something - do not use full path |
352
|
|
|
|
|
|
|
$destinationurl = $soap_inst ->SUPER::path if (!$destinationurl); |
353
|
|
|
|
|
|
|
my $sourceurl='local'; #doesn't do shit, but needs a value for it to work |
354
|
|
|
|
|
|
|
my $fields=[];# = shift; #array ref of field items, |
355
|
|
|
|
|
|
|
#my $stream = ; #array ref of single item byte stream, from slurping in binmode |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
Carp::carp ("no destinationurl in write_from_memory \n") if (! $destinationurl); |
358
|
|
|
|
|
|
|
Carp::carp ("no stream in write_from_memory \n") if (! $$binref); |
359
|
|
|
|
|
|
|
$soap_inst->sp_copyini if (!ref $soap_inst->slcopyobj ); |
360
|
|
|
|
|
|
|
my $sp_copyobj= $soap_inst->slcopyobj; |
361
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
362
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
363
|
|
|
|
|
|
|
} |
364
|
|
|
|
|
|
|
my $in_sourceurl=SOAP::Data::name('SourceUrl'=>$sourceurl); |
365
|
|
|
|
|
|
|
#construct full path |
366
|
|
|
|
|
|
|
my $destinationurls = [$destinationurl]; |
367
|
|
|
|
|
|
|
for my $destfileurl(@$destinationurls){ |
368
|
|
|
|
|
|
|
$destfileurl = $soap_inst->sp_authorizedroot(). "/".$destfileurl; |
369
|
|
|
|
|
|
|
$destfileurl = SOAP::Data::name ('string' => $destfileurl); |
370
|
|
|
|
|
|
|
} |
371
|
|
|
|
|
|
|
my $in_destinationurls=&soaparrayfmt("DestinationUrls", $destinationurls); |
372
|
|
|
|
|
|
|
my $in_fields=&soaparrayfmt("Fields", $fields); |
373
|
|
|
|
|
|
|
my $in_stream = SOAP::Data::name ('Stream' =>MIME::Base64::encode_base64($$binref)); |
374
|
|
|
|
|
|
|
my $copyresult = $sp_copyobj ->CopyIntoItems($in_sourceurl, $in_destinationurls, $in_fields, $in_stream); |
375
|
|
|
|
|
|
|
return $copyresult->body; #returns the same msg if file exists vs copy success |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
} |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
sub copy_local_files{ |
382
|
|
|
|
|
|
|
my $soap_inst = shift; |
383
|
|
|
|
|
|
|
my $sourceurl=shift; |
384
|
|
|
|
|
|
|
my $destinationurl = shift;# SCALAR now, different from sp_copyremotefiles |
385
|
|
|
|
|
|
|
#Shared Documents/something - do not use full path |
386
|
|
|
|
|
|
|
Carp::carp ("no sourceurl in sp_copypostfile \(copy no source\)\n") if (! $sourceurl); |
387
|
|
|
|
|
|
|
Carp::carp ("no destinationurls in sp_copypostfile \(copy no destination\)\n") if (! $destinationurl); |
388
|
|
|
|
|
|
|
$soap_inst -> sp_copyini if (!ref $soap_inst->slcopyobj ); |
389
|
|
|
|
|
|
|
my $sp_copyobj= $soap_inst->slcopyobj; |
390
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
391
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
392
|
|
|
|
|
|
|
} |
393
|
|
|
|
|
|
|
my $in_sourceurl=SOAP::Data::name('SourceUrl'=>$soap_inst->sp_authorizedroot().'/'.$sourceurl); |
394
|
|
|
|
|
|
|
#construct full path |
395
|
|
|
|
|
|
|
my $destinationurls = [$destinationurl]; |
396
|
|
|
|
|
|
|
for my $destfileurl(@$destinationurls){ |
397
|
|
|
|
|
|
|
$destfileurl = $soap_inst->sp_authorizedroot(). "/".$destfileurl; |
398
|
|
|
|
|
|
|
$destfileurl = SOAP::Data::name ('string' => $destfileurl); |
399
|
|
|
|
|
|
|
} |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
my $in_destinationurls=&soaparrayfmt("DestinationUrls", $destinationurls); |
402
|
|
|
|
|
|
|
my $copyresult = $sp_copyobj ->CopyIntoItemsLocal($in_sourceurl, $in_destinationurls) ->body; |
403
|
|
|
|
|
|
|
return $copyresult; |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
} |
406
|
|
|
|
|
|
|
#not really necessary functionally since write_from_memory and read_to_memory covers this, |
407
|
|
|
|
|
|
|
#but it is more efficient since files are moved within sharepoint |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
sub soaparrayfmt { |
411
|
|
|
|
|
|
|
my $arraytitle = shift; |
412
|
|
|
|
|
|
|
my $arrayref = shift; |
413
|
|
|
|
|
|
|
my $in_arraytitle =SOAP::Data::name($arraytitle =>\SOAP::Data::value( |
414
|
|
|
|
|
|
|
SOAP::Data::name('anonymous' => @$arrayref) |
415
|
|
|
|
|
|
|
)#end value |
416
|
|
|
|
|
|
|
);#end name |
417
|
|
|
|
|
|
|
return $in_arraytitle; |
418
|
|
|
|
|
|
|
} |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
sub sp_dwsini{ |
422
|
|
|
|
|
|
|
my $soap_inst=shift; |
423
|
|
|
|
|
|
|
return $soap_inst if (ref $soap_inst->sldwsobj); |
424
|
|
|
|
|
|
|
$soap_inst -> sp_connect_lwp; |
425
|
|
|
|
|
|
|
$soap_inst->slvti($soap_inst->sp_authorizedroot()."/_vti_bin/Dws.asmx"); |
426
|
|
|
|
|
|
|
####dws is the only one where the uri is in a sub dir |
427
|
|
|
|
|
|
|
#remember this uri requires a trailing slash |
428
|
|
|
|
|
|
|
$soap_inst -> sluri("http://schemas.microsoft.com/sharepoint/soap/dws/"); |
429
|
|
|
|
|
|
|
#Important. SOAP::Lite-> proxy wants arguments to be in list form; uaargs is the same format |
430
|
|
|
|
|
|
|
#as LWP would prefer; |
431
|
|
|
|
|
|
|
#credentials is NOT the same: LWP wants array; SOAP::Lite::porxy wants array ref |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
$soap_inst -> sldwsobj ( SOAP::Lite ->proxy ($soap_inst->slvti, $soap_inst ->sp_creds_uaargs, credentials =>[$soap_inst->sp_creds_credentials]) ); |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
$soap_inst -> sldwsobj() -> schema->useragent($soap_inst->sp_creds_schema_ua); |
436
|
|
|
|
|
|
|
#$soap_inst -> sldwsobj() -> uri($s_uri); |
437
|
|
|
|
|
|
|
$soap_inst -> sldwsobj() -> uri($soap_inst->sluri); |
438
|
|
|
|
|
|
|
return $soap_inst;#->sldwsobj; |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
} |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
sub sp_dws{ |
443
|
|
|
|
|
|
|
my $soap_inst = shift; |
444
|
|
|
|
|
|
|
my $dirtomk = shift; |
445
|
|
|
|
|
|
|
my $action=shift; |
446
|
|
|
|
|
|
|
$soap_inst->sp_dwsini if (!ref $soap_inst->sldwsobj ); |
447
|
|
|
|
|
|
|
my $sp_dwsobj= $soap_inst->sldwsobj; |
448
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
449
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
450
|
|
|
|
|
|
|
} |
451
|
|
|
|
|
|
|
#url starts with Shared Documents |
452
|
|
|
|
|
|
|
my $in_url=SOAP::Data::name('url'=>$dirtomk); |
453
|
|
|
|
|
|
|
my $dwsret; |
454
|
|
|
|
|
|
|
if ($action eq 'mkdir'){ |
455
|
|
|
|
|
|
|
$dwsret = $sp_dwsobj ->CreateFolder($in_url)->body->{'CreateFolderResponse'}{'CreateFolderResult'}; |
456
|
|
|
|
|
|
|
#returns "AlreadyExists" if already exists, '' if success |
457
|
|
|
|
|
|
|
} |
458
|
|
|
|
|
|
|
elsif ($action eq 'rmdir'){ |
459
|
|
|
|
|
|
|
$dwsret = $sp_dwsobj ->DeleteFolder($in_url)->body->{'DeleteFolderResponse'}{'DeleteFolderResult'}; |
460
|
|
|
|
|
|
|
#returns '' if success or folder does not exist |
461
|
|
|
|
|
|
|
} |
462
|
|
|
|
|
|
|
return $dwsret; |
463
|
|
|
|
|
|
|
} |
464
|
|
|
|
|
|
|
sub sp_listini{ |
465
|
|
|
|
|
|
|
my $soap_inst=shift; |
466
|
|
|
|
|
|
|
return $soap_inst if (ref $soap_inst->sllistobj); |
467
|
|
|
|
|
|
|
$soap_inst -> sp_connect_lwp; |
468
|
|
|
|
|
|
|
$soap_inst->slvti($soap_inst->sp_authorizedroot()."/_vti_bin/Lists.asmx"); |
469
|
|
|
|
|
|
|
####list is the only one where the uri is in a sub dir |
470
|
|
|
|
|
|
|
#remember this uri requires a trailing slash |
471
|
|
|
|
|
|
|
$soap_inst -> sluri("http://schemas.microsoft.com/sharepoint/soap/"); |
472
|
|
|
|
|
|
|
#Important. SOAP::Lite-> proxy wants arguments to be in list form; uaargs is the same format |
473
|
|
|
|
|
|
|
#as LWP would prefer; |
474
|
|
|
|
|
|
|
#credentials is NOT the same: LWP wants array; SOAP::Lite::porxy wants array ref |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
$soap_inst -> sllistobj ( SOAP::Lite ->proxy ($soap_inst->slvti, $soap_inst ->sp_creds_uaargs, credentials =>[$soap_inst->sp_creds_credentials]) ); |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
$soap_inst -> sllistobj() -> schema->useragent($soap_inst->sp_creds_schema_ua); |
479
|
|
|
|
|
|
|
#$soap_inst -> sllistobj() -> uri($s_uri); |
480
|
|
|
|
|
|
|
$soap_inst -> sllistobj() -> uri($soap_inst->sluri); |
481
|
|
|
|
|
|
|
return $soap_inst;#->sllistobj; |
482
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
} |
484
|
|
|
|
|
|
|
#returns "AlreadyExists" if already exists, '' if success |
485
|
|
|
|
|
|
|
sub cust_mkdir { |
486
|
|
|
|
|
|
|
my $soap_inst =shift; |
487
|
|
|
|
|
|
|
my $dirtomk = shift; |
488
|
|
|
|
|
|
|
if ($dirtomk eq '/' or $dirtomk eq 'Shared Documents'){ |
489
|
|
|
|
|
|
|
Carp::carp('should not be mkdiring a root'); |
490
|
|
|
|
|
|
|
} |
491
|
|
|
|
|
|
|
else { |
492
|
|
|
|
|
|
|
$soap_inst ->sp_dws($dirtomk, 'mkdir'); |
493
|
|
|
|
|
|
|
} |
494
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
} |
496
|
|
|
|
|
|
|
#returns '' if success or folder does not exist |
497
|
|
|
|
|
|
|
sub cust_rmdir{ |
498
|
|
|
|
|
|
|
my $soap_inst =shift; |
499
|
|
|
|
|
|
|
my $dirtomk = shift; |
500
|
|
|
|
|
|
|
if ($dirtomk eq '/' or $dirtomk eq 'Shared Documents'){ |
501
|
|
|
|
|
|
|
Carp::carp('should not be rmdiring a root'); |
502
|
|
|
|
|
|
|
} |
503
|
|
|
|
|
|
|
elsif ($soap_inst ->is_fd($dirtomk) eq 'd'){ |
504
|
|
|
|
|
|
|
$soap_inst ->sp_dws($dirtomk, 'rmdir'); |
505
|
|
|
|
|
|
|
} |
506
|
|
|
|
|
|
|
else { |
507
|
|
|
|
|
|
|
Carp::croak("wait. you told me to delete something that's not a dir. I'll stop for your protection"); |
508
|
|
|
|
|
|
|
} |
509
|
|
|
|
|
|
|
} |
510
|
|
|
|
|
|
|
sub cust_rmfile{ |
511
|
|
|
|
|
|
|
my $soap_inst=shift; |
512
|
|
|
|
|
|
|
my $filepath =shift; |
513
|
|
|
|
|
|
|
Carp::croak ("cannot rmfile a non-file") if ($soap_inst->is_fd($filepath) ne 'f'); |
514
|
|
|
|
|
|
|
$soap_inst ->sp_listini if (! ref $soap_inst ->sllistobj); |
515
|
|
|
|
|
|
|
my $sp_listobj = $soap_inst -> sllistobj; |
516
|
|
|
|
|
|
|
if ($ENV{'https_proxy'}){ |
517
|
|
|
|
|
|
|
$soap_inst ->carpenvproxy; |
518
|
|
|
|
|
|
|
} |
519
|
|
|
|
|
|
|
#first, we need the shared documents list id to do the delete. |
520
|
|
|
|
|
|
|
my $shareddoclistid =$soap_inst -> {'sllistid'}{'Shared Documents'} ; |
521
|
|
|
|
|
|
|
if (!$shareddoclistid){ |
522
|
|
|
|
|
|
|
#the dataof function returns a series of blessed references. These series of refs are not put |
523
|
|
|
|
|
|
|
#in an arrayref. Rather, they are just a series of blessed items. You can put it in @results, |
524
|
|
|
|
|
|
|
#and each item will be a SOAP::Data instance. You CANNOT access these instances through @{blah->dataof('/blah') } |
525
|
|
|
|
|
|
|
#the error msg will say Not an ARRAY reference |
526
|
|
|
|
|
|
|
my @results = $sp_listobj ->GetListCollection() ->dataof('//GetListCollectionResult/Lists/List'); |
527
|
|
|
|
|
|
|
for my $data (@results){#{ $sp_listobj ->GetListCollection() ->dataof('//GetListCollectionResult/Lists/List') }){ |
528
|
|
|
|
|
|
|
if ($data->attr ->{'Title'} eq "Shared Documents"){ |
529
|
|
|
|
|
|
|
$shareddoclistid = $data ->attr ->{'ID'} ; |
530
|
|
|
|
|
|
|
$soap_inst -> {'sllistid'}{'Shared Documents'}=$shareddoclistid; |
531
|
|
|
|
|
|
|
}#end if |
532
|
|
|
|
|
|
|
}#end for my $data |
533
|
|
|
|
|
|
|
}#end if !shareddoclistid |
534
|
|
|
|
|
|
|
my $in_str_listname = SOAP::Data::name('listName' => $shareddoclistid); |
535
|
|
|
|
|
|
|
my $fullqualified = $soap_inst->sp_authorizedroot().'/'.$filepath; |
536
|
|
|
|
|
|
|
my $xml = qq# 3 $fullqualified #; |
537
|
|
|
|
|
|
|
my $in_str_xml_xml = SOAP::Data->type ('xml' =>qq# $xml#); |
538
|
|
|
|
|
|
|
#basically, we want the xml to look like this: (spaces between update tags and $xml will crash the command) |
539
|
|
|
|
|
|
|
# |
540
|
|
|
|
|
|
|
# |
541
|
|
|
|
|
|
|
# $shareddoclistid |
542
|
|
|
|
|
|
|
# $xml |
543
|
|
|
|
|
|
|
# |
544
|
|
|
|
|
|
|
# |
545
|
|
|
|
|
|
|
$sp_listobj ->UpdateListItems($in_str_listname, $in_str_xml_xml); |
546
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
} |
548
|
|
|
|
|
|
|
sub is_fd{ |
549
|
|
|
|
|
|
|
my $soap_inst = shift; |
550
|
|
|
|
|
|
|
my $query =shift; |
551
|
|
|
|
|
|
|
if ($query =~m/\/$/){ #if query ends with slash 'someting/' |
552
|
|
|
|
|
|
|
Carp::carp("sharepoint file/dir should not have trailing slashes\n"); |
553
|
|
|
|
|
|
|
return 0; |
554
|
|
|
|
|
|
|
} |
555
|
|
|
|
|
|
|
else { |
556
|
|
|
|
|
|
|
my $queryparent = File::Basename::dirname($query); |
557
|
|
|
|
|
|
|
#in sharepoint, you can't really query the root Shared Documents folder. |
558
|
|
|
|
|
|
|
#to do it right, you're supposed to use getlistcollection. more resources - |
559
|
|
|
|
|
|
|
#not doing it. |
560
|
|
|
|
|
|
|
if ($queryparent eq '.'){ #result of no slashes in $query |
561
|
|
|
|
|
|
|
if ($query eq 'Shared Documents'){ |
562
|
|
|
|
|
|
|
return 'd'; |
563
|
|
|
|
|
|
|
} |
564
|
|
|
|
|
|
|
else {return 0} |
565
|
|
|
|
|
|
|
} |
566
|
|
|
|
|
|
|
my ($testfunderparent, $testdunderparent) = $soap_inst -> fdls('fdarrayrefs' , $queryparent);#only needs to return what's defined as file |
567
|
|
|
|
|
|
|
#my @testparent = $soap_inst -> sp_ls($queryparent, 'f');#only needs to return what's defined as file |
568
|
|
|
|
|
|
|
if ( @$testfunderparent + @$testdunderparent ==0){#$query can not be anything if it's parent is not a dir |
569
|
|
|
|
|
|
|
# Carp::carp("query $query 's parent is not a valid folder..check your path[$query]\n"); |
570
|
|
|
|
|
|
|
return 0; |
571
|
|
|
|
|
|
|
}#end if (! @testparent) |
572
|
|
|
|
|
|
|
else{ |
573
|
|
|
|
|
|
|
my %trackmatchf; |
574
|
|
|
|
|
|
|
for my $file (@$testfunderparent) { |
575
|
|
|
|
|
|
|
$trackmatchf {$file} ++; |
576
|
|
|
|
|
|
|
} |
577
|
|
|
|
|
|
|
my %trackmatchd; |
578
|
|
|
|
|
|
|
for my $dir (@$testdunderparent){ |
579
|
|
|
|
|
|
|
$trackmatchd{$dir} ++; |
580
|
|
|
|
|
|
|
} |
581
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
if ($trackmatchf {$query}){ |
583
|
|
|
|
|
|
|
# Carp::carp("query $query is a file through searching parent\n"); |
584
|
|
|
|
|
|
|
return 'f'; |
585
|
|
|
|
|
|
|
} |
586
|
|
|
|
|
|
|
elsif ($trackmatchd {$query}){ |
587
|
|
|
|
|
|
|
return 'd'; |
588
|
|
|
|
|
|
|
} |
589
|
|
|
|
|
|
|
else {return 'pd'}; |
590
|
|
|
|
|
|
|
}#end else |
591
|
|
|
|
|
|
|
} #end else main test |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
} |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
1; |
597
|
|
|
|
|
|
|
__END__ |