Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

186 lines
5.2 KiB

#---------------------------------------------------------------------
package Win32::ChangeNotify;
#
# Copyright 1998 Christopher J. Madsen
#
# Created: 3 Feb 1998 from the ActiveWare version
# (c) 1995 Microsoft Corporation. All rights reserved.
# Developed by ActiveWare Internet Corp., http://www.ActiveWare.com
#
# Other modifications (c) 1997 by Gurusamy Sarathy <[email protected]>
#
# Author: Christopher J. Madsen <[email protected]>
# Version: 1.02 (13-Jun-1999)
#
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the
# GNU General Public License or the Artistic License for more details.
#
# Monitor directory for changes
#---------------------------------------------------------------------
$VERSION = '1.02';
use Carp;
use Win32::IPC 1.00 '/./'; # Import everything
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader Win32::IPC);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT = qw(
FILE_NOTIFY_CHANGE_ATTRIBUTES
FILE_NOTIFY_CHANGE_DIR_NAME
FILE_NOTIFY_CHANGE_FILE_NAME
FILE_NOTIFY_CHANGE_LAST_WRITE
FILE_NOTIFY_CHANGE_SECURITY
FILE_NOTIFY_CHANGE_SIZE
INFINITE
);
@EXPORT_OK = qw(
wait_all wait_any
);
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
# XS function.
my $constname;
($constname = $AUTOLOAD) =~ s/.*:://;
if ($constname =~ /^(?:FILE_NOTIFY_CHANGE_|INFINITE)/) {
my $val = constant($constname);
croak("$constname is not defined by Win32::ChangeNotify") if $! != 0;
eval "sub $AUTOLOAD { $val }";
goto &$AUTOLOAD;
}
} # end AUTOLOAD
bootstrap Win32::ChangeNotify;
sub new {
my ($class,$path,$subtree,$filter) = @_;
if ($filter =~ /\A[\s|A-Z_]+\Z/i) {
$filter = 0;
foreach (split(/[\s|]+/, $_[3])) {
$filter |= constant("FILE_NOTIFY_CHANGE_" . uc $_);
carp "Invalid filter $_" if $!;
}
}
_new($class,$path,$subtree,$filter);
} # end new
sub Close { &close }
sub FindFirst { $_[0] = Win32::ChangeNotify->_new(@_[1..3]); }
sub FindNext { &reset }
1;
__END__
=head1 NAME
Win32::ChangeNotify - Monitor events related to files and directories
=head1 SYNOPSIS
require Win32::ChangeNotify;
$notify = Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
$notify->wait or warn "Something failed: $!\n";
# There has been a change.
=head1 DESCRIPTION
This module allows the user to use a Win32 change notification event
object from Perl. This allows the Perl program to monitor events
relating to files and directory trees.
The C<wait> method and C<wait_all> & C<wait_any> functions are
inherited from the L<"Win32::IPC"> module.
=head2 Methods
=over 4
=item $notify = Win32::ChangeNotify->new($path, $subtree, $filter)
Constructor for a new ChangeNotification object. C<$path> is the
directory to monitor. If C<$subtree> is true, then all directories
under C<$path> will be monitored. C<$filter> indicates what events
should trigger a notification. It should be a string containing any
of the following flags (separated by whitespace and/or C<|>).
ATTRIBUTES Any attribute change
DIR_NAME Any directory name change
FILE_NAME Any file name change (creating/deleting/renaming)
LAST_WRITE Any change to a file's last write time
SECURITY Any security descriptor change
SIZE Any change in a file's size
(C<$filter> can also be an integer composed from the
C<FILE_NOTIFY_CHANGE_*> constants.)
=item $notify->close
Shut down monitoring. You could just C<undef $notify> instead (but
C<close> works even if there are other copies of the object). This
happens automatically when your program exits.
=item $notify->reset
Resets the ChangeNotification object after a change has been detected.
The object will become signalled again after the next change. (It is
OK to call this immediately after C<new>, but it is not required.)
=item $notify->wait
See L<"Win32::IPC">. Remember to call C<reset> afterwards if you want
to continue monitoring.
=back
=head2 Deprecated Functions and Methods
B<Win32::ChangeNotify> still supports the ActiveWare syntax, but its
use is deprecated.
=over 4
=item FindFirst($Obj,$PathName,$WatchSubTree,$Filter)
Use
$Obj = Win32::ChangeNotify->new($PathName,$WatchSubTree,$Filter)
instead.
=item $obj->FindNext()
Use C<$obj-E<gt>reset> instead.
=item $obj->Close()
Use C<$obj-E<gt>close> instead.
=back
=head1 AUTHOR
Christopher J. Madsen E<lt>F<[email protected]>E<gt>
Loosely based on the original module by ActiveWare Internet Corp.,
F<http://www.ActiveWare.com>
=cut
# Local Variables:
# tmtrack-file-task: "Win32::ChangeNotify"
# End: