diff -r 6d08f4a05d93 -r 3145852acc89 releasing/cbrtools/perl/RemoteSite/NetDrive.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/releasing/cbrtools/perl/RemoteSite/NetDrive.pm Fri Jun 25 18:37:20 2010 +0800 @@ -0,0 +1,343 @@ +# Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# +# Description: +# RemoteSite::NetDrive.pm +# + +package RemoteSite::NetDrive; + +use strict; +use File::Copy; +use File::Basename; + +use RemoteSite; +use vars qw(@ISA); +@ISA=("RemoteSite"); + +# +# Initialization +# + +sub Initialize { + my $self = shift; + $self->SUPER::Initialize(@_); + + #connect to network drive + $self->Connect(); +} + +# +# Public (from RemoteSite) +# + +sub SendFile { + my $self = shift; + my $localFile = shift; + my $remoteFile = shift; + + unless (defined $localFile and defined $remoteFile) { + $self->HandleError("Incorrect args passed to ".ref($self)."::SendFile"); + } + + $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile); + $remoteFile =~ s{\\}{\/}g; + + if ($self->{verbose}) { + print "Copying ".basename($localFile)." to network drive ".$self->Host()."...\n"; + } + elsif (Utils::FileSize($localFile)) { + print "Copying ".basename($localFile)."...\n"; + } + + unless (-e $localFile) { + $self->HandleError("Local file $localFile does not exist"); + } + + $self->Connect(); + + my $remoteDir = dirname($remoteFile); + unless (-e $remoteDir) { + eval { + Utils::MakeDir($remoteDir); + }; + if ($@) { + $self->HandleError("Cannot make directory $remoteDir on network drive ".$self->Host()); + } + if ($self->{verbose}) { + print "Created directory $remoteDir on network drive\n"; + } + } + + #use a temporary file during uploads + my $tmpFile = $remoteDir.'/TMP_'.basename($remoteFile); + + unless (copy($localFile, $tmpFile)){ + my $flag = 0; + my $errormessage = $!; + + if(-e $tmpFile) { + unlink $tmpFile or $flag=1; + } + + if($errormessage =~ /No such file or directory/i) { + $errormessage = "Unknown Error - Check disk space or missing file/directory"; + } + + if($flag) { + $self->HandleError("Unable to cleanup $tmpFile, after the copy of $localFile failed : $errormessage"); + } + $self->HandleError("Unable to copy $localFile to $tmpFile : $errormessage"); + } + + unless (move($tmpFile, $remoteFile)){ + unlink $tmpFile; + $self->HandleError("Unable to move $tmpFile to $remoteFile : $!"); + } + + if ($self->{verbose} > 1) { + print "Copy successful. Stored as $remoteFile on network drive.\n"; + } +} + +sub GetFile { + my $self = shift; + my $remoteFile = shift; + my $localFile = shift; + + unless (defined $localFile and defined $remoteFile) { + $self->HandleError("Incorrect args passed to ".ref($self)."::GetFile"); + } + + my $host = $self->Host(); + $host =~ s{\\}{\/}g; + $remoteFile =~ s{\\}{\/}g; + + if ($self->{verbose}) { + print "Copying ".basename($remoteFile)." from network drive $host...\n"; + } + else { + print "Copying ".basename($remoteFile)."...\n"; + } + + $self->Connect(); + + if ($self->{verbose}) { + print "Checking whether \"$remoteFile\" exists...\n"; + } + unless ($self->FileExists($remoteFile)) { + $self->HandleError("Remote file $remoteFile does not exist on $host"); + } + + #check local dir exists and create it if it doesn't + my $localDir = dirname($localFile); + unless (-e $localDir) { + Utils::MakeDir($localDir); + if ($self->{verbose}) { + print "Created directory $localDir on local drive\n"; + } + } + + unless (copy($host.$remoteFile, $localFile)) { + unlink $localFile; + $self->HandleError("Transfer of $remoteFile from $host to local drive failed"); + } + if ($self->{verbose} > 1) { + print "Copy successful. Stored as $localFile on local drive.\n"; + } +} + +sub FileExists { + my $self = shift; + my $remoteFile = shift; + + unless (defined $remoteFile) { + return 0; + } + + $self->Connect(); + + $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile); + $remoteFile =~ s{\\}{\/}g; + return (-e $remoteFile); +} + +sub DirExists { + my $self = shift; + my $remoteDir = shift; + return $self->FileExists($remoteDir); +} + +sub DirList { + my $self = shift; + my $remoteDir = shift; + + my $host = $self->Host(); + $host =~ s{\\}{\/}g; + $remoteDir =~ s{\\}{\/}g; + + opendir(DIR, Utils::ConcatenateDirNames($host, $remoteDir)) or $self->HandleError("Cannot open $remoteDir on network drive ".$self->Host()); + my @dir = map {"$remoteDir/$_"} grep {$_ ne '.' and $_ ne '..'} readdir DIR; + closedir(DIR); + return \@dir; +} + +sub MakeDir { + my $self = shift; + my $remoteDir = shift; + + $remoteDir = $self->Host().$remoteDir; + $remoteDir =~ s{\\}{\/}g; + + eval { + Utils::MakeDir($remoteDir); + }; + if ($@) { + $self->HandleError("Cannot make directory $remoteDir on network drive ".$self->Host()); + } +} + +sub FileSize { + my $self = shift; + my $remoteFile = shift; + + $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile); + $remoteFile =~ s{\\}{\/}g; + + return Utils::FileSize($remoteFile); +} + +sub DeleteFile { + my $self = shift; + my $remoteFile = shift; + + $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile); + $remoteFile =~ s{\\}{\/}g; + + rmdir $remoteFile or unlink $remoteFile or $self->HandleError("Cannot delete $remoteFile on network dirve ($!)"); +} + +sub MoveFile { + my $self = shift; + my $oldFile = shift; + my $newFile = shift; + + $oldFile = Utils::ConcatenateDirNames($self->Host(), $oldFile); + $oldFile =~ s{\\}{\/}g; + $newFile = Utils::ConcatenateDirNames($self->Host(), $newFile); + $newFile =~ s{\\}{\/}g; + + move($oldFile, $newFile) or $self->HandleError("Cannot move $oldFile to $newFile on network drive"); +} + +sub FileModifiedTime { + my $self = shift; + my $remoteFile = shift; + + $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile); + $remoteFile =~ s{\\}{\/}g; + + return Utils::FileModifiedTime($remoteFile); +} + + +# +# Private +# + +sub Connect { + my $self = shift; + + unless ($self->Host()) { + $self->HandleError("Network drive host name not defined"); + } + my $hostName = $self->Host(); + unless (-e $hostName) { + $self->HandleError("Cannot connect to network drive $hostName"); + } +} + +1; + +=head1 NAME + +RemoteSite::NetDrive.pm - Access a remote network drive + +=head1 SYNOPSIS + + use RemoteSite::NetDrive; + + $drive = RemoteSite::NetDrive->New(host => '\\server\share', + verbose => 1); + + if ($drive->FileExists('/somedir/someremotefile')) { + do something... + } + $drive->SendFile('somelocalfile', 'someremotefile'); + $drive->GetFile('someremotefile', 'somelocalfile'); + +=head1 DESCRIPTION + +C is inherited from the abstract base class C, implementing the abstract methods required for transfer of files to and from a remote site when the remote site is a network drive. + +=head1 INTERFACE + +=head2 New + +Passed an argument list in the form of hash key value pairs. The supported arguments are... + + host => $host_address_string + verbose => $verbosity_integer + +Returns a reference to a C object + +=head2 Host + +Returns the current value of the C attribute which contains the UNC path of the network drive. If passed an argument sets the attribute to this new value. + +=head2 SendFile + +Passed a local and a remote file name. Uploads the local file to the network drive. + +=head2 GetFile + +Passed a remote and local file name. Downloads the remote file from the network drive and stores it on the local drive. + +=head2 FileExists + +Passed a filename (with full path) on the network drive. Returns a non zero value if the file exists. + +=head1 KNOWN BUGS + +None + +=head1 COPYRIGHT + + Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + This component and the accompanying materials are made available + under the terms of the License "Eclipse Public License v1.0" + which accompanies this distribution, and is available + at the URL "http://www.eclipse.org/legal/epl-v10.html". + + Initial Contributors: + Nokia Corporation - initial contribution. + + Contributors: + + Description: + + +=cut