home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _8f43c60a5691e152aac57551106a4ba1 < prev    next >
Text File  |  2000-03-15  |  10KB  |  377 lines

  1. package Win32::NetResource;
  2.  
  3. require Exporter;
  4. require DynaLoader;
  5. require AutoLoader;
  6.  
  7. $VERSION = '0.05';
  8.  
  9. @ISA = qw(Exporter DynaLoader);
  10. # Items to export into callers namespace by default. Note: do not export
  11. # names by default without a very good reason. Use EXPORT_OK instead.
  12. # Do not simply export all your public functions/methods/constants.
  13. @EXPORT = qw(
  14.     RESOURCEDISPLAYTYPE_DOMAIN
  15.     RESOURCEDISPLAYTYPE_FILE
  16.     RESOURCEDISPLAYTYPE_GENERIC
  17.     RESOURCEDISPLAYTYPE_GROUP
  18.     RESOURCEDISPLAYTYPE_SERVER
  19.     RESOURCEDISPLAYTYPE_SHARE
  20.     RESOURCEDISPLAYTYPE_TREE
  21.     RESOURCETYPE_ANY
  22.     RESOURCETYPE_DISK
  23.     RESOURCETYPE_PRINT
  24.     RESOURCETYPE_UNKNOWN
  25.     RESOURCEUSAGE_CONNECTABLE
  26.     RESOURCEUSAGE_CONTAINER
  27.     RESOURCEUSAGE_RESERVED
  28.     RESOURCE_CONNECTED
  29.     RESOURCE_GLOBALNET
  30.     RESOURCE_REMEMBERED
  31. );
  32.  
  33. @EXPORT_OK = qw(
  34.     GetSharedResources
  35.     AddConnection
  36.     CancelConnection
  37.     WNetGetLastError
  38.     GetError
  39.     GetUNCName
  40.     NetShareAdd
  41.     NetShareCheck
  42.     NetShareDel
  43.     NetShareGetInfo
  44.     NetShareSetInfo
  45. );
  46.  
  47. =head1 NAME
  48.  
  49. Win32::NetResource - manage network resources in perl
  50.  
  51. =head1 SYNOPSIS
  52.  
  53.     use Win32::NetResource;
  54.  
  55.     $ShareInfo = {
  56.                     'path' => "C:\\MyShareDir",
  57.                     'netname' => "MyShare",
  58.                     'remark' => "It is good to share",
  59.                     'passwd' => "",
  60.                     'current-users' =>0,
  61.                     'permissions' => 0,
  62.                     'maxusers' => -1,
  63.                     'type'  => 0,
  64.                     };
  65.     
  66.     Win32::NetResource::NetShareAdd( $ShareInfo,$parm )
  67.         or die "unable to add share";
  68.  
  69.  
  70. =head1 DESCRIPTION
  71.  
  72. This module offers control over the network resources of Win32.Disks,
  73. printers etc can be shared over a network.
  74.  
  75. =head1 DATA TYPES
  76.  
  77. There are two main data types required to control network resources.
  78. In Perl these are represented by hash types.
  79.  
  80. =over 10
  81.  
  82. =item %NETRESOURCE
  83.  
  84.         KEY                    VALUE
  85.         
  86.         'Scope'         =>  Scope of an Enumeration
  87.                             RESOURCE_CONNECTED,
  88.                             RESOURCE_GLOBALNET,
  89.                             RESOURCE_REMEMBERED.
  90.         
  91.         'Type'          =>  The type of resource to Enum
  92.                             RESOURCETYPE_ANY    All resources
  93.                             RESOURCETYPE_DISK    Disk resources
  94.                             RESOURCETYPE_PRINT    Print resources
  95.         
  96.         'DisplayType'   =>  The way the resource should be displayed.
  97.                             RESOURCEDISPLAYTYPE_DOMAIN    
  98.                             The object should be displayed as a domain.
  99.                             RESOURCEDISPLAYTYPE_GENERIC    
  100.                             The method used to display the object does not matter.
  101.                             RESOURCEDISPLAYTYPE_SERVER    
  102.                             The object should be displayed as a server.
  103.                             RESOURCEDISPLAYTYPE_SHARE    
  104.                             The object should be displayed as a sharepoint.
  105.         
  106.         'Usage'         =>  Specifies the Resources usage:
  107.                             RESOURCEUSAGE_CONNECTABLE
  108.                             RESOURCEUSAGE_CONTAINER.
  109.         
  110.         'LocalName'     =>  Name of the local device the resource is 
  111.                             connected to.
  112.         
  113.         'RemoteName'    =>  The network name of the resource.
  114.         
  115.         'Comment'       =>  A string comment.
  116.         
  117.         'Provider'      =>  Name of the provider of the resource.
  118.  
  119. =back    
  120.  
  121. =item %SHARE_INFO
  122.  
  123. This hash represents the SHARE_INFO_502 struct.
  124.  
  125. =over 10
  126.  
  127.         KEY                    VALUE
  128.         'netname'        =>    Name of the share.
  129.         'type'           =>    type of share.
  130.         'remark'         =>    A string comment.
  131.         'permissions'    =>    Permissions value
  132.         'maxusers'       =>    the max # of users.
  133.         'current-users'  =>    the current # of users.
  134.         'path'           =>    The path of the share.
  135.         'passwd'         =>    A password if one is req'd
  136.  
  137. =back
  138.  
  139. =head1 FUNCTIONS
  140.  
  141. =head2 NOTE
  142.  
  143. All of the functions return FALSE (0) if they fail.
  144.  
  145. =over 10
  146.  
  147. =item GetSharedResources(\@Resources,dwType)
  148.  
  149. Creates a list in @Resources of %NETRESOURCE hash references.
  150.  
  151. The return value indicates whether there was an error in accessing
  152. any of the shared resources.  All the shared resources that were
  153. encountered (until the point of an error, if any) are pushed into
  154. @Resources as references to %NETRESOURCE hashes.  See example
  155. below.
  156.  
  157. =item AddConnection(\%NETRESOURCE,$Password,$UserName,$Connection)
  158.  
  159. Makes a connection to a network resource specified by %NETRESOURCE
  160.  
  161. =item CancelConnection($Name,$Connection,$Force)
  162.  
  163. Cancels a connection to a network resource connected to local device 
  164. $name.$Connection is either 1 - persistent connection or 0, non-persistent.
  165.  
  166. =item WNetGetLastError($ErrorCode,$Description,$Name)
  167.  
  168. Gets the Extended Network Error.
  169.  
  170. =item GetError( $ErrorCode )
  171.  
  172. Gets the last Error for a Win32::NetResource call.
  173.  
  174. =item GetUNCName( $UNCName, $LocalPath );
  175.  
  176. Returns the UNC name of the disk share connected to $LocalPath in $UNCName.
  177.  
  178. =head2 NOTE
  179.  
  180. $servername is optional for all the calls below. (if not given the
  181. local machine is assumed.)
  182.  
  183. =item NetShareAdd(\%SHARE,$parm_err,$servername = NULL )
  184.  
  185. Add a share for sharing.
  186.  
  187. =item NetShareCheck($device,$type,$servername = NULL )
  188.  
  189. Check if a share is available for connection.
  190.  
  191. =item NetShareDel( $netname, $servername = NULL )
  192.  
  193. Remove a share from a machines list of shares.
  194.  
  195. =item NetShareGetInfo( $netname, \%SHARE,$servername=NULL )
  196.  
  197. Get the %SHARE_INFO information about the share $netname on the
  198. server $servername.
  199.  
  200. =item NetShareSetInfo( $netname,\%SHARE,$parm_err,$servername=NULL)
  201.  
  202. Set the information for share $netname.
  203.  
  204. =back
  205.  
  206. =head1 EXAMPLE
  207.  
  208.  
  209.     #
  210.     # This example displays all the share points in the entire
  211.     # visible part of the network.
  212.     #
  213.  
  214.     use strict;
  215.     use Win32::NetResource qw(:DEFAULT GetSharedResources GetError);
  216.     my $resources = [];
  217.     unless(GetSharedResources($resources, RESOURCETYPE_ANY)) {
  218.     my $err = undef;
  219.     GetError($err);
  220.     warn Win32::FormatMessage($err);
  221.     }
  222.  
  223.     foreach my $href (@$resources) {
  224.     next if ($$href{DisplayType} != RESOURCEDISPLAYTYPE_SHARE);
  225.     print "-----\n";
  226.     foreach( keys %$href){
  227.         print "$_: $href->{$_}\n";
  228.     }
  229.     }
  230.  
  231. =head1 AUTHOR
  232.  
  233. Jesse Dougherty for Hip Communications.
  234.  
  235. Additional general cleanups and bug fixes by Gurusamy Sarathy <gsar@activestate.com>.
  236.  
  237. =cut
  238.  
  239. sub AUTOLOAD {
  240.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  241.     # XS function.  If a constant is not found then control is passed
  242.     # to the AUTOLOAD in AutoLoader.
  243.  
  244.     my($constname);
  245.     ($constname = $AUTOLOAD) =~ s/.*:://;
  246.     #reset $! to zero to reset any current errors.
  247.     $!=0;
  248.     my $val = constant($constname, @_ ? $_[0] : 0);
  249.     if ($! != 0) {
  250.         if ($! =~ /Invalid/) {
  251.             $AutoLoader::AUTOLOAD = $AUTOLOAD;
  252.             goto &AutoLoader::AUTOLOAD;
  253.         }
  254.         else {
  255.             ($pack,$file,$line) = caller;
  256.             die "Your vendor has not defined Win32::NetResource macro $constname, used at $file line $line.
  257. ";
  258.         }
  259.     }
  260.     eval "sub $AUTOLOAD { $val }";
  261.     goto &$AUTOLOAD;
  262. }
  263.  
  264. sub AddConnection
  265. {
  266.     my $h = $_[0];
  267.     die "AddConnection: HASH reference required" unless ref($h) eq "HASH";
  268.  
  269.     #
  270.     # The last four items *must* not be deallocated until the
  271.     # _AddConnection() completes (since the packed structure is
  272.     # pointing into these values.
  273.     #
  274.     my $netres = pack( 'i4 p4', $h->{Scope},
  275.                     $h->{Type},
  276.                 $h->{DisplayType},
  277.                 $h->{Usage},
  278.                 $h->{LocalName},
  279.                 $h->{RemoteName},
  280.                 $h->{Comment},
  281.                 $h->{Provider});
  282.     _AddConnection($netres,$_[1],$_[2],$_[3]);
  283. }
  284.  
  285. #use Data::Dumper;
  286.  
  287. sub GetSharedResources
  288. {
  289.     die "GetSharedResources: ARRAY reference required"
  290.     unless ref($_[0]) eq "ARRAY";
  291.  
  292.     my $aref = [];
  293.  
  294.     # Get the shared resources.
  295.  
  296.     my $ret = _GetSharedResources( $aref ,$_[1] );
  297.     
  298.     # build the array of hashes in $_[0]
  299. #   print Dumper($aref);    
  300.     foreach ( @$aref ) {
  301.     my %hash;
  302.     @hash{'Scope',
  303.           'Type',
  304.           'DisplayType',
  305.           'Usage',
  306.           'LocalName',
  307.           'RemoteName',
  308.           'Comment',
  309.           'Provider'} = split /\001/, $_;
  310.     push @{$_[0]}, \%hash;
  311.     }
  312.  
  313.     $ret;
  314. }
  315.  
  316. sub NetShareAdd
  317. {
  318.     my $shareinfo = _hash2SHARE( $_[0] );
  319.     _NetShareAdd($shareinfo,$_[1], $_[2] || "");
  320. }
  321.  
  322. sub NetShareGetInfo
  323. {
  324.     my ($netinfo,$val);
  325.     $val = _NetShareGetInfo( $_[0],$netinfo,$_[2] || "");
  326.     $_[1] = _SHARE2hash( $netinfo );    
  327.     $val;
  328. }
  329.  
  330. sub NetShareSetInfo
  331. {
  332.     my $shareinfo = _hash2SHARE( $_[1] );
  333.     _NetShareSetInfo( $_[0],$shareinfo,$_[2],$_[3] || "");
  334. }
  335.  
  336.  
  337. # These are private functions to work with the ShareInfo structure.
  338. # please note that the implementation of these calls requires the
  339. # SHARE_INFO_502 level of information.
  340.  
  341. sub _SHARE2hash
  342. {
  343.     my %hash = ();
  344.     @hash{'type',
  345.           'permissions',
  346.           'maxusers',
  347.           'current-users',
  348.           'remark',
  349.           'netname',
  350.           'path',
  351.           'passwd'} = unpack('i4 A257 A81 A257 A257',$_[0]);
  352.  
  353.     return \%hash;
  354. }
  355.  
  356. sub _hash2SHARE
  357. {
  358.     my $h = $_[0];
  359.     die "Argument must be a HASH reference" unless ref($h) eq "HASH";
  360.  
  361.     return pack 'i4 a257 a81 a257 a257',
  362.          @$h{'type',
  363.             'permissions',
  364.             'maxusers',
  365.             'current-users',
  366.             'remark',
  367.             'netname',
  368.             'path',
  369.             'passwd'};
  370. }
  371.  
  372.  
  373. bootstrap Win32::NetResource;
  374.  
  375. 1;
  376. __END__
  377.