summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl.straw/lib/File/HomeDir
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2010-02-28 09:36:33 +0000
committerNorbert Preining <preining@logic.at>2010-02-28 09:36:33 +0000
commit5589232e99f0fa13868111280c5b64ce9dc25730 (patch)
tree28f2e6ff422108ac87934aff9c3fc5911963625c /Master/tlpkg/tlperl.straw/lib/File/HomeDir
parenta6f5de6eed80d66fbd23ceabda7edf22b8162236 (diff)
add a tlperl.straw directory for public inspection
git-svn-id: svn://tug.org/texlive/trunk@17235 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/tlperl.straw/lib/File/HomeDir')
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm152
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm210
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm165
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm19
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm97
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm167
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm176
7 files changed, 986 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm
new file mode 100755
index 00000000000..fbe7847edda
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin.pm
@@ -0,0 +1,152 @@
+package File::HomeDir::Darwin;
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Unix ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Unix';
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ my $home = (getpwuid($<))[7];
+ return $home if $home && -d $home;
+
+ return undef;
+}
+
+sub _my_home {
+ my($class, $path) = @_;
+ my $home = $class->my_home;
+ return undef unless defined $home;
+
+ my $folder = "$home/$path";
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+sub my_desktop {
+ my $class = shift;
+ $class->_my_home('Desktop');
+}
+
+sub my_documents {
+ my $class = shift;
+ $class->_my_home('Documents');
+}
+
+sub my_data {
+ my $class = shift;
+ $class->_my_home('Library/Application Support');
+}
+
+sub my_music {
+ my $class = shift;
+ $class->_my_home('Music');
+}
+
+sub my_pictures {
+ my $class = shift;
+ $class->_my_home('Pictures');
+}
+
+sub my_videos {
+ my $class = shift;
+ $class->_my_home('Movies');
+}
+
+
+
+
+
+#####################################################################
+# Arbitrary User Methods
+
+sub users_home {
+ my $class = shift;
+ my $home = $class->SUPER::users_home(@_);
+ return defined $home ? Cwd::abs_path($home) : undef;
+}
+
+sub users_desktop {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_desktop, $name );
+}
+
+sub users_documents {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_documents, $name );
+}
+
+sub users_data {
+ my ($class, $name) = @_;
+ $class->_to_user( $class->my_data, $name )
+ ||
+ $class->users_home($name);
+}
+
+# cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
+# there's really no other good way to do it at this time, that i know of -- pudge
+sub _to_user {
+ my ($class, $path, $name) = @_;
+ my $my_home = $class->my_home;
+ my $users_home = $class->users_home($name);
+ defined $users_home or return undef;
+ $path =~ s/^\Q$my_home/$users_home/;
+ return $path;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin - Find your home and other directories, on Darwin (OS X) without Carbon/Cocoa
+
+=head1 DESCRIPTION
+
+This module provides Mac OS X specific file path for determining
+common user directories in pure perl, by just using C<$ENV{HOME}>
+without Carbon nor Cocoa API calls. In normal usage this module will
+always be used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm
new file mode 100755
index 00000000000..3234156b0eb
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Carbon.pm
@@ -0,0 +1,210 @@
+package File::HomeDir::Darwin::Carbon;
+
+# Basic implementation for the Dawin family of operating systems.
+# This includes (most prominently) Mac OS X.
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Darwin ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+
+ # This is only a child class of the pure Perl darwin
+ # class so that we can do homedir detection of all three
+ # drivers at one via ->isa.
+ @ISA = 'File::HomeDir::Darwin';
+
+ # Load early if in a forking environment and we have
+ # prefork, or at run-time if not.
+ local $@;
+ eval "use prefork 'Mac::Files'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kCurrentUserFolderType(),
+ );
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kDesktopFolderType(),
+ );
+}
+
+sub my_documents {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kDocumentsFolderType(),
+ );
+}
+
+sub my_data {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kApplicationSupportFolderType(),
+ );
+}
+
+sub my_music {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kMusicDocumentsFolderType(),
+ );
+}
+
+sub my_pictures {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kPictureDocumentsFolderType(),
+ );
+}
+
+sub my_videos {
+ my $class = shift;
+
+ require Mac::Files;
+ $class->_find_folder(
+ Mac::Files::kMovieDocumentsFolderType(),
+ );
+}
+
+sub _find_folder {
+ my $class = shift;
+ my $name = shift;
+
+ require Mac::Files;
+ my $folder = Mac::Files::FindFolder(
+ Mac::Files::kUserDomain(),
+ $name,
+ );
+ return unless defined $folder;
+
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+
+
+
+
+#####################################################################
+# Arbitrary User Methods
+
+sub users_home {
+ my $class = shift;
+ my $home = $class->SUPER::users_home(@_);
+ return defined $home ? Cwd::abs_path($home) : undef;
+}
+
+# in theory this can be done, but for now, let's cheat, since the
+# rest is Hard
+sub users_desktop {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_desktop, $name );
+}
+
+sub users_documents {
+ my ($class, $name) = @_;
+ return undef if $name eq 'root';
+ $class->_to_user( $class->my_documents, $name );
+}
+
+sub users_data {
+ my ($class, $name) = @_;
+ $class->_to_user( $class->my_data, $name )
+ ||
+ $class->users_home($name);
+}
+
+# cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
+# there's really no other good way to do it at this time, that i know of -- pudge
+sub _to_user {
+ my ($class, $path, $name) = @_;
+ my $my_home = $class->my_home;
+ my $users_home = $class->users_home($name);
+ defined $users_home or return undef;
+ $path =~ s/^\Q$my_home/$users_home/;
+ return $path;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin - Find your home and other directories, on Darwin (OS X)
+
+=head1 DESCRIPTION
+
+This module provides Darwin-specific implementations for determining
+common user directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+Note -- since this module requires Mac::Carbon and Mac::Carbon does
+not work with 64-bit perls, on such systems, File::HomeDir will try
+L<File::HomeDir::Darwin::Cocoa> and then fall back to the (pure Perl)
+L<File::HomeDir::Darwin>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=head1 TODO
+
+=over 4
+
+=item * Test with Mac OS (versions 7, 8, 9)
+
+=item * Some better way for users_* ?
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm
new file mode 100755
index 00000000000..e82dd9d449c
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Darwin/Cocoa.pm
@@ -0,0 +1,165 @@
+package File::HomeDir::Darwin::Cocoa;
+
+use 5.00503;
+use strict;
+use Cwd ();
+use Carp ();
+use File::HomeDir::Darwin ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Darwin';
+
+ # Load early if in a forking environment and we have
+ # prefork, or at run-time if not.
+ local $@;
+ eval "use prefork 'Mac::SystemDirectory'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ require Mac::SystemDirectory;
+ return Mac::SystemDirectory::HomeDirectory();
+}
+
+# from 10.4
+sub my_desktop {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSDesktopDirectory())
+ }
+ ||
+ $class->SUPER::my_desktop;
+}
+
+# from 10.2
+sub my_documents {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSDocumentDirectory())
+ }
+ ||
+ $class->SUPER::my_documents;
+}
+
+# from 10.4
+sub my_data {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSApplicationSupportDirectory())
+ }
+ ||
+ $class->SUPER::my_data;
+}
+
+# from 10.6
+sub my_music {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSMusicDirectory())
+ }
+ ||
+ $class->SUPER::my_music;
+}
+
+# from 10.6
+sub my_pictures {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSPicturesDirectory())
+ }
+ ||
+ $class->SUPER::my_pictures;
+}
+
+# from 10.6
+sub my_videos {
+ my $class = shift;
+
+ require Mac::SystemDirectory;
+ eval {
+ $class->_find_folder(Mac::SystemDirectory::NSMoviesDirectory())
+ }
+ ||
+ $class->SUPER::my_videos;
+}
+
+sub _find_folder {
+ my $class = shift;
+ my $name = shift;
+
+ require Mac::SystemDirectory;
+ my $folder = Mac::SystemDirectory::FindDirectory($name);
+ return unless defined $folder;
+
+ unless ( -d $folder ) {
+ # Make sure that symlinks resolve to directories.
+ return unless -l $folder;
+ my $dir = readlink $folder or return;
+ return unless -d $dir;
+ }
+
+ return Cwd::abs_path($folder);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Darwin::Cocoa - Find your home and other directories, on Darwin (OS X)
+
+=head1 DESCRIPTION
+
+This module provides Darwin-specific implementations for determining
+common user directories using Cocoa API through
+L<Mac::SystemDirectory>. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+Theoretically, this should return the same paths as both of the other
+Darwin drivers.
+
+Because this module requires L<Mac::SystemDirectory>, if the module
+is not installed, L<File::HomeDir> will fall back to L<File::HomeDir::Darwin>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /Users/mylogin
+ $desktop = File::HomeDir->my_desktop; # /Users/mylogin/Desktop
+ $docs = File::HomeDir->my_documents; # /Users/mylogin/Documents
+ $music = File::HomeDir->my_music; # /Users/mylogin/Music
+ $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures
+ $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies
+ $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support
+
+=cut
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm
new file mode 100755
index 00000000000..c47a7caaad1
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Driver.pm
@@ -0,0 +1,19 @@
+package File::HomeDir::Driver;
+
+# Abstract base class that provides no functionality,
+# but confirms the class is a File::HomeDir driver class.
+
+use 5.00503;
+use strict;
+use Carp ();
+
+use vars qw{$VERSION};
+BEGIN {
+ $VERSION = '0.89';
+}
+
+sub my_home {
+ Carp::croak("$_[0] does not implement compulsory method $_[1]");
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm
new file mode 100755
index 00000000000..f9fe9e0fbe6
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/MacOS9.pm
@@ -0,0 +1,97 @@
+package File::HomeDir::MacOS9;
+
+# Half-assed implementation for the legacy Mac OS9 operating system.
+# Provided mainly to provide legacy compatibility. May be removed at
+# a later date.
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+# Load early if in a forking environment and we have
+# prefork, or at run-time if not.
+SCOPE: {
+ local $@;
+ eval "use prefork 'Mac::Files'";
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # Try for $ENV{HOME} if we have it
+ if ( defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ ### DESPERATION SETS IN
+
+ # We could use the desktop
+ SCOPE: {
+ local $@;
+ eval {
+ my $home = $class->my_desktop;
+ return $home if $home and -d $home;
+ };
+ }
+
+ # Desperation on any platform
+ SCOPE: {
+ # On some platforms getpwuid dies if called at all
+ local $SIG{'__DIE__'} = '';
+ my $home = (getpwuid($<))[7];
+ return $home if $home and -d $home;
+ }
+
+ Carp::croak("Could not locate current user's home directory");
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ # Find the desktop via Mac::Files
+ local $SIG{'__DIE__'} = '';
+ require Mac::Files;
+ my $home = Mac::Files::FindFolder(
+ Mac::Files::kOnSystemDisk(),
+ Mac::Files::kDesktopFolderType(),
+ );
+ return $home if $home and -d $home;
+
+ Carp::croak("Could not locate current user's desktop");
+}
+
+
+
+
+
+#####################################################################
+# General User Methods
+
+sub users_home {
+ my ($class, $name) = @_;
+
+ SCOPE: {
+ # On some platforms getpwnam dies if called at all
+ local $SIG{'__DIE__'} = '';
+ my $home = (getpwnam($name))[7];
+ return $home if defined $home and -d $home;
+ }
+
+ Carp::croak("Failed to find home directory for user '$name'");
+}
+
+1;
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm
new file mode 100755
index 00000000000..640f64e7b26
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Unix.pm
@@ -0,0 +1,167 @@
+package File::HomeDir::Unix;
+
+# Unix-specific functionality
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+ my $home = $class->_my_home(@_);
+
+ # On Unix in general, a non-existant home means "no home"
+ # For example, "nobody"-like users might use /nonexistant
+ if ( defined $home and ! -d $home ) {
+ $home = undef;
+ }
+
+ return $home;
+}
+
+sub _my_home {
+ my $class = shift;
+ if ( exists $ENV{HOME} and defined $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ # This is from the original code, but I'm guessing
+ # it means "login directory" and exists on some Unixes.
+ if ( exists $ENV{LOGDIR} and $ENV{LOGDIR} ) {
+ return $ENV{LOGDIR};
+ }
+
+ ### More-desperate methods
+
+ # Light desperation on any (Unixish) platform
+ SCOPE: {
+ my $home = (getpwuid($<))[7];
+ return $home if $home and -d $home;
+ }
+
+ return undef;
+}
+
+# On unix by default, everything is under the same folder
+sub my_desktop {
+ shift->my_home;
+}
+
+sub my_documents {
+ shift->my_home;
+}
+
+sub my_data {
+ shift->my_home;
+}
+
+sub my_music {
+ shift->my_home;
+}
+
+sub my_pictures {
+ shift->my_home;
+}
+
+sub my_videos {
+ shift->my_home;
+}
+
+
+
+
+
+#####################################################################
+# General User Methods
+
+sub users_home {
+ my ($class, $name) = @_;
+
+ # IF and only if we have getpwuid support, and the
+ # name of the user is our own, shortcut to my_home.
+ # This is needed to handle HOME environment settings.
+ if ( $name eq getpwuid($<) ) {
+ return $class->my_home;
+ }
+
+ SCOPE: {
+ my $home = (getpwnam($name))[7];
+ return $home if $home and -d $home;
+ }
+
+ return undef;
+}
+
+sub users_desktop {
+ shift->users_home(@_);
+}
+
+sub users_documents {
+ shift->users_home(@_);
+}
+
+sub users_data {
+ shift->users_home(@_);
+}
+
+sub users_music {
+ shift->users_home(@_);
+}
+
+sub users_pictures {
+ shift->users_home(@_);
+}
+
+sub users_videos {
+ shift->users_home(@_);
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Unix - find your home and other directories, on Unix
+
+=head1 DESCRIPTION
+
+This module provides implementations for determining common user
+directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user
+ $home = File::HomeDir->my_home; # /home/mylogin
+
+ $desktop = File::HomeDir->my_desktop; # All of these will...
+ $docs = File::HomeDir->my_documents; # ...default to home...
+ $music = File::HomeDir->my_music; # ...directory at the...
+ $pics = File::HomeDir->my_pictures; # ...moment.
+ $videos = File::HomeDir->my_videos; #
+ $data = File::HomeDir->my_data; #
+
+=head1 TODO
+
+=over 4
+
+=item * Add support for common unix desktop and data directories when using KDE / Gnome / ...
+
+=back
diff --git a/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm
new file mode 100755
index 00000000000..888ccc8b819
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/File/HomeDir/Windows.pm
@@ -0,0 +1,176 @@
+package File::HomeDir::Windows;
+
+# Generalised implementation for the entire Windows family of operating
+# systems.
+
+use 5.00503;
+use strict;
+use Carp ();
+use File::Spec ();
+use File::HomeDir::Driver ();
+
+use vars qw{$VERSION @ISA};
+BEGIN {
+ $VERSION = '0.89';
+ @ISA = 'File::HomeDir::Driver';
+}
+
+sub CREATE () { 1 }
+
+
+
+
+
+#####################################################################
+# Current User Methods
+
+sub my_home {
+ my $class = shift;
+
+ # A lot of unix people and unix-derived tools rely on
+ # the ability to overload HOME. We will support it too
+ # so that they can replace raw HOME calls with File::HomeDir.
+ if ( exists $ENV{HOME} and $ENV{HOME} ) {
+ return $ENV{HOME};
+ }
+
+ # Do we have a user profile?
+ if ( exists $ENV{USERPROFILE} and $ENV{USERPROFILE} ) {
+ return $ENV{USERPROFILE};
+ }
+
+ # Some Windows use something like $ENV{HOME}
+ if ( exists $ENV{HOMEDRIVE} and exists $ENV{HOMEPATH} and $ENV{HOMEDRIVE} and $ENV{HOMEPATH} ) {
+ return File::Spec->catpath(
+ $ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '',
+ );
+ }
+
+ return undef;
+}
+
+sub my_desktop {
+ my $class = shift;
+
+ # The most correct way to find the desktop
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_DESKTOP(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ # MSWindows sets WINDIR, MS WinNT sets USERPROFILE.
+ foreach my $e ( 'USERPROFILE', 'WINDIR' ) {
+ next unless $ENV{$e};
+ my $desktop = File::Spec->catdir($ENV{$e}, 'Desktop');
+ return $desktop if $desktop and -d $desktop;
+ }
+
+ # As a last resort, try some hard-wired values
+ foreach my $fixed (
+ # The reason there are both types of slash here is because
+ # this set of paths has been kept from thethe original version
+ # of File::HomeDir::Win32 (before it was rewritten).
+ # I can only assume this is Cygwin-related stuff.
+ "C:\\windows\\desktop",
+ "C:\\win95\\desktop",
+ "C:/win95/desktop",
+ "C:/windows/desktop",
+ ) {
+ return $fixed if -d $fixed;
+ }
+
+ return undef;
+}
+
+sub my_documents {
+ my $class = shift;
+
+ # The most correct way to find my documents
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_PERSONAL(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_data {
+ my $class = shift;
+
+ # The most correct way to find my documents
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_LOCAL_APPDATA(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_music {
+ my $class = shift;
+
+ # The most correct way to find my music
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYMUSIC(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_pictures {
+ my $class = shift;
+
+ # The most correct way to find my pictures
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYPICTURES(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+sub my_videos {
+ my $class = shift;
+
+ # The most correct way to find my videos
+ SCOPE: {
+ require Win32;
+ my $dir = Win32::GetFolderPath(Win32::CSIDL_MYVIDEO(), CREATE);
+ return $dir if $dir and -d $dir;
+ }
+
+ return undef;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+File::HomeDir::Windows - find your home and other directories, on Windows
+
+=head1 DESCRIPTION
+
+This module provides Windows-specific implementations for determining
+common user directories. In normal usage this module will always be
+used via L<File::HomeDir>.
+
+=head1 SYNOPSIS
+
+ use File::HomeDir;
+
+ # Find directories for the current user (eg. using Windows XP Professional)
+ $home = File::HomeDir->my_home; # C:\Documents and Settings\mylogin
+ $desktop = File::HomeDir->my_desktop; # C:\Documents and Settings\mylogin\Desktop
+ $docs = File::HomeDir->my_documents; # C:\Documents and Settings\mylogin\My Documents
+ $music = File::HomeDir->my_music; # C:\Documents and Settings\mylogin\My Documents\My Music
+ $pics = File::HomeDir->my_pictures; # C:\Documents and Settings\mylogin\My Documents\My Pictures
+ $videos = File::HomeDir->my_videos; # C:\Documents and Settings\mylogin\My Documents\My Video
+ $data = File::HomeDir->my_data; # C:\Documents and Settings\mylogin\Local Settings\Application Data