CopyTree-VendorProof version 0.0012
==============================================

This module provides a generic interface to implement a copy method between [a local computer and a remote file system] or [a remote file system and itself] or [local computer to local computer].

The supported (very basic) copy functionalities mimics the unix cp -rf command - copies SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

This module is written for file copies to and from a remote file system that cannot be mounted; for example, the Microsoft Sharepoint web service (as of 2011).  To use the methods in this module, you must provide objects that act as connectors to the remote file system and / or the local file system (More details about the methods required in these connector modules below).  For example, if you want to copy locally a file to a dir (I don't know why you would want to use this module for that, unless you're on a very silly OS that doesn't handle copy well), you must provide an extra object that provides basic methods for local file copying.  I have written one for local, named CopyTree::VendorProof::LocalFileOp.

If you would like to copy between local to remote, you must also provide the connector object for the remote.  I have written one for sharepoint, called SharePoint::SOAPHandler.

If you would like to copy to and from a variety of remote and local file systems, you must include connecter objects for these systems, and all of which will use this module as a base class.  In other words, this module is quite useless by itself, yet other modules like SharePoint::SOAPHandler and CopyTree::VendorProof::LocalFileOp depends on it.  In all likeliness, you have to use these 3 modules in your script to complete a copy operation - the two connectors to provide basic copy / ls methods, and this module to provide the cp -rf functionality.

The primary use of this module is on a linux / unix system that needs to interact with a remote system.  This module is not tested on Macs.

Currently, you need to install Authen::NTLM version 1.09 or greater for this module to work.  With my v1.09 tweak to Authen::NTLM on CPAN, this module should just work.  If you actually use Authen::NTLM directly for some reason, remember to set

ntlmv2('sp');

prior to using SharePoint::SOAPHandler.  You did remember to export ntlmv2, no?

use Authen::NTLM qw(ntlmv2);

The methods provided in this module (base class) include:
       new
       reset
       src
       dst
       cp
       copy_meth_deci
       ls_tree
       ls_tree_fdret
       path
       fdls_ret

       Of the aforementioned methods, new, path, and reset are the only methods that do not require additional connector objects to function, although path has the sole function of providing a base class to connector objects.

The methods required in the connector objects include:
       new
       fdls
       is_fd
       read_info_memory
       write_from_memory
       copy_local_files
       cust_mkdir
       cust_rmdir
       cust_rmfile

How to write connector methods ($_[0] holds the class / instance itself, arguments mentioned below are in $_[1] and onwards):

       new:    Takes no arguments, but blesses an anonymous hash into the data connection object and returns it

       fdls:  Pass in $lsoption, $path
               Where $lsoption is 'd', 'f', 'fdarrayrefs', or '',
               and $path is the path of the directory to be listed.
               The lsoption is passed to the SUPER class fdls_ret, and is not handled at this level.
               The $startpath should be standardized to start in a certain 'root' directory; for
     example, in SharePoint::SOAPHandler, it must start with "Shared Documents", and in
               Livelink::DAV, it must start with a dir right under the webdav root folder.

               Required action:
               You must put all the files found in $path in @files, and all the dirs in @dirs, then
               return $self->SUPER::fdls_ret ($lsoption, \@files, \@dirs).

          For example, if you have a tree structure:

             /home/
             /home/john
             /home/john/notes.txt
             /home/john/punch.mov
             /home/john/picutres
             /home/john/pictures/1.jpg

          and your $startdir is /home/john, and your $lsoption is 'f':
          You will create
             @files, which is ("/home/john/notes.txt", "/home/john/punch.mov")
             @dirs, which consist of ("/home/john/pictures")
          And, the last line of your method (subroutine) will be
             return $self->SUPER::fdls_ret($lsoption, \@files, \@dirs);

       is_fd: Pass in $query
               Where $query is the file or dir in question to do a file test.
               Required action:
               For the specific $query, the return must be 'f' for file, 'd' for directory, 'pd' for
               a non existing file / dir that has a valid parent, and 0 for everything else.

          This code will vary by connector modules; most connectors have file test
               facilities to return 'f' or 'd', but most connectors we have to create
               something for the 'pd' test.  For connectors that can't tell 'f' or 'd' directly,
               we have to be creative and do a dir listing of the $path or do a dir listing
               of the $path's parent to guss what $path is.


       read_into_memory: Pass in $sourcepath
               Where $sourcepath is the file to read.
               Required action:
               The return must be a reference to a scalar, which holds the contents of the file
               in bin mode.

       write_from_memory: Pass in $bincontentref, $dest
               Where $bincontentref is a reference to a scalar, which holds the content of a file
               in bin mode, and $dest is the file name to write the content to.
               Required action:
               The method will write the content of the file onto the file system, using the $dest
               specified.
               No return is necessary.

       copy_local_files: Pass in $source, $dest
               Where $source is the $source path of a file, and $dest is a destination path on
               the same file system.
               Required Action:
               This method is written such that purely remote operations
               do not require an intermediate step of holding each file in memory.
               The $source file is copied and saved to the file name specified by
               $dest.
               Does not proceed if destination already exists (prevents
               accidental overwrite).
               No return is necessary.

       cust_mkdir: Pass in $path
               Where $path is the dir name to be created.
               Required action:
               Create the dir as specified by $path.
               No return is necessary.

       cust_rmdir: Pass in $path
               Where $path is the dir name to be removed.
               Required action:
       Removes the dir as specified by $path.  If items / files / other dirs exists under $path,
               recursively remove them.
               No return is necessary.

       cust_rmfile: Pass in $filepath
               Where $filepath is the path of the file
               Required action
               removes the file as specified by path.  warns / carps if $filepath is not a file
               No return is necessary.



INSTALLATION

To install this module type the following:

  perl Makefile.PL
  make
  make test
  make install

DEPENDENCIES

This module requires these other modules and libraries:

Carp
Data::Dumper

COPYRIGHT AND LICENCE


Copyright (C) 2011 by dbmolester

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.1 or,
at your option, any later version of Perl 5 you may have available.