releasing/cbrtools/perl/RemoteSite/NetDrive.pm
changeset 602 3145852acc89
--- /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<RemoteSite::NetDrive> is inherited from the abstract base class C<RemoteSite>, 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<RemoteSite::NetDrive> object
+
+=head2 Host
+
+Returns the current value of the C<host> 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