summaryrefslogtreecommitdiff
path: root/lib/File/HomeDir/Darwin/Cocoa.pm
blob: b54ea698e95b540451e86e2cfb933d27ed0260c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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 = '1.00';
	@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 undef unless defined $folder;

	unless ( -d $folder ) {
		# Make sure that symlinks resolve to directories.
		return undef unless -l $folder;
		my $dir = readlink $folder or return;
		return undef 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