File Coverage

blib/lib/Win32/Mock/Win32.pm
Criterion Covered Total %
statement 101 176 57.3
branch 20 50 40.0
condition 2 23 8.7
subroutine 26 68 38.2
pod 0 59 0.0
total 149 376 39.6


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             Win32;
3 12     12   8409 use strict;
  12         95  
  12         414  
4 12     12   61 use warnings;
  12         22  
  12         301  
5 12     12   60 use Config;
  12         21  
  12         847  
6 12     12   61 use Exporter ();
  12         19  
  12         213  
7 12     12   61 use File::Spec;
  12         19  
  12         281  
8 12     12   12569 use File::Spec::Functions;
  12         12226  
  12         1310  
9              
10             {
11 12     12   80 no strict;
  12         22  
  12         44933  
12             $VERSION = '0.01';
13             @ISA = qw|Exporter|;
14              
15             @EXPORT = qw(
16             NULL
17             WIN31_CLASS
18             OWNER_SECURITY_INFORMATION
19             GROUP_SECURITY_INFORMATION
20             DACL_SECURITY_INFORMATION
21             SACL_SECURITY_INFORMATION
22             MB_ICONHAND
23             MB_ICONQUESTION
24             MB_ICONEXCLAMATION
25             MB_ICONASTERISK
26             MB_ICONWARNING
27             MB_ICONERROR
28             MB_ICONINFORMATION
29             MB_ICONSTOP
30             );
31             @EXPORT_OK = qw(
32             GetOSName
33             SW_HIDE
34             SW_SHOWNORMAL
35             SW_SHOWMINIMIZED
36             SW_SHOWMAXIMIZED
37             SW_SHOWNOACTIVATE
38              
39             CSIDL_DESKTOP
40             CSIDL_PROGRAMS
41             CSIDL_PERSONAL
42             CSIDL_FAVORITES
43             CSIDL_STARTUP
44             CSIDL_RECENT
45             CSIDL_SENDTO
46             CSIDL_STARTMENU
47             CSIDL_MYMUSIC
48             CSIDL_MYVIDEO
49             CSIDL_DESKTOPDIRECTORY
50             CSIDL_NETHOOD
51             CSIDL_FONTS
52             CSIDL_TEMPLATES
53             CSIDL_COMMON_STARTMENU
54             CSIDL_COMMON_PROGRAMS
55             CSIDL_COMMON_STARTUP
56             CSIDL_COMMON_DESKTOPDIRECTORY
57             CSIDL_APPDATA
58             CSIDL_PRINTHOOD
59             CSIDL_LOCAL_APPDATA
60             CSIDL_COMMON_FAVORITES
61             CSIDL_INTERNET_CACHE
62             CSIDL_COOKIES
63             CSIDL_HISTORY
64             CSIDL_COMMON_APPDATA
65             CSIDL_WINDOWS
66             CSIDL_SYSTEM
67             CSIDL_PROGRAM_FILES
68             CSIDL_MYPICTURES
69             CSIDL_PROFILE
70             CSIDL_PROGRAM_FILES_COMMON
71             CSIDL_COMMON_TEMPLATES
72             CSIDL_COMMON_DOCUMENTS
73             CSIDL_COMMON_ADMINTOOLS
74             CSIDL_ADMINTOOLS
75             CSIDL_COMMON_MUSIC
76             CSIDL_COMMON_PICTURES
77             CSIDL_COMMON_VIDEO
78             CSIDL_RESOURCES
79             CSIDL_RESOURCES_LOCALIZED
80             CSIDL_CDBURN_AREA
81             );
82             }
83              
84             # mock up the environment
85             $ENV{WINDIR} = catdir(rootdir(), "opt", "Win32");
86             $ENV{SYSTEMROOT} = catdir($ENV{WINDIR}, "System");
87             $ENV{PROCESSOR_ARCHITECTURE} = $Config{archname};
88              
89             # constants, copied from Win32.pm
90 0     0 0 0 sub NULL { 0 }
91 0     0 0 0 sub WIN31_CLASS { &NULL }
92              
93 0     0 0 0 sub OWNER_SECURITY_INFORMATION { 0x00000001 }
94 0     0 0 0 sub GROUP_SECURITY_INFORMATION { 0x00000002 }
95 0     0 0 0 sub DACL_SECURITY_INFORMATION { 0x00000004 }
96 0     0 0 0 sub SACL_SECURITY_INFORMATION { 0x00000008 }
97              
98 0     0 0 0 sub MB_ICONHAND { 0x00000010 }
99 0     0 0 0 sub MB_ICONQUESTION { 0x00000020 }
100 0     0 0 0 sub MB_ICONEXCLAMATION { 0x00000030 }
101 0     0 0 0 sub MB_ICONASTERISK { 0x00000040 }
102 0     0 0 0 sub MB_ICONWARNING { 0x00000030 }
103 0     0 0 0 sub MB_ICONERROR { 0x00000010 }
104 0     0 0 0 sub MB_ICONINFORMATION { 0x00000040 }
105 0     0 0 0 sub MB_ICONSTOP { 0x00000010 }
106              
107             sub SW_HIDE () { 0 }
108             sub SW_SHOWNORMAL () { 1 }
109             sub SW_SHOWMINIMIZED () { 2 }
110             sub SW_SHOWMAXIMIZED () { 3 }
111             sub SW_SHOWNOACTIVATE () { 4 }
112              
113             sub CSIDL_DESKTOP () { 0x0000 } #
114             sub CSIDL_PROGRAMS () { 0x0002 } # Start Menu\Programs
115             sub CSIDL_PERSONAL () { 0x0005 } # "My Documents" folder
116             sub CSIDL_FAVORITES () { 0x0006 } # \Favorites
117             sub CSIDL_STARTUP () { 0x0007 } # Start Menu\Programs\Startup
118             sub CSIDL_RECENT () { 0x0008 } # \Recent
119             sub CSIDL_SENDTO () { 0x0009 } # \SendTo
120             sub CSIDL_STARTMENU () { 0x000B } # \Start Menu
121             sub CSIDL_MYMUSIC () { 0x000D } # "My Music" folder
122             sub CSIDL_MYVIDEO () { 0x000E } # "My Videos" folder
123             sub CSIDL_DESKTOPDIRECTORY () { 0x0010 } # \Desktop
124             sub CSIDL_NETHOOD () { 0x0013 } # \nethood
125             sub CSIDL_FONTS () { 0x0014 } # windows\fonts
126             sub CSIDL_TEMPLATES () { 0x0015 }
127             sub CSIDL_COMMON_STARTMENU () { 0x0016 } # All Users\Start Menu
128             sub CSIDL_COMMON_PROGRAMS () { 0x0017 } # All Users\Start Menu\Programs
129             sub CSIDL_COMMON_STARTUP () { 0x0018 } # All Users\Startup
130             sub CSIDL_COMMON_DESKTOPDIRECTORY () { 0x0019 } # All Users\Desktop
131             sub CSIDL_APPDATA () { 0x001A } # Application Data, new for NT4
132             sub CSIDL_PRINTHOOD () { 0x001B } # \PrintHood
133             sub CSIDL_LOCAL_APPDATA () { 0x001C } # non roaming, user\Local Settings\Application Data
134             sub CSIDL_COMMON_FAVORITES () { 0x001F }
135             sub CSIDL_INTERNET_CACHE () { 0x0020 }
136             sub CSIDL_COOKIES () { 0x0021 }
137             sub CSIDL_HISTORY () { 0x0022 }
138             sub CSIDL_COMMON_APPDATA () { 0x0023 } # All Users\Application Data
139             sub CSIDL_WINDOWS () { 0x0024 } # GetWindowsDirectory()
140             sub CSIDL_SYSTEM () { 0x0025 } # GetSystemDirectory()
141             sub CSIDL_PROGRAM_FILES () { 0x0026 } # C:\Program Files
142             sub CSIDL_MYPICTURES () { 0x0027 } # "My Pictures", new for Win2K
143             sub CSIDL_PROFILE () { 0x0028 } # USERPROFILE
144             sub CSIDL_PROGRAM_FILES_COMMON () { 0x002B } # C:\Program Files\Common
145             sub CSIDL_COMMON_TEMPLATES () { 0x002D } # All Users\Templates
146             sub CSIDL_COMMON_DOCUMENTS () { 0x002E } # All Users\Documents
147             sub CSIDL_COMMON_ADMINTOOLS () { 0x002F } # All Users\Start Menu\Programs\Administrative Tools
148             sub CSIDL_ADMINTOOLS () { 0x0030 } # \Start Menu\Programs\Administrative Tools
149             sub CSIDL_COMMON_MUSIC () { 0x0035 } # All Users\My Music
150             sub CSIDL_COMMON_PICTURES () { 0x0036 } # All Users\My Pictures
151             sub CSIDL_COMMON_VIDEO () { 0x0037 } # All Users\My Video
152             sub CSIDL_RESOURCES () { 0x0038 } # %windir%\Resources\, For theme and other windows resources.
153             sub CSIDL_RESOURCES_LOCALIZED () { 0x0039 } # %windir%\Resources\, for theme and other windows specific resources.
154             sub CSIDL_CDBURN_AREA () { 0x003B } # \Local Settings\Application Data\Microsoft\CD Burning
155              
156              
157              
158             #
159             # AbortSystemShutdown()
160             # -------------------
161 0     0 0 0 sub AbortSystemShutdown {
162             # XXX: not implemented
163             }
164              
165              
166             #
167             # BuildNumber()
168             # -----------
169             sub BuildNumber {
170 15     15 0 38601 return $Config{PERL_VERSION} * 100 + $Config{PERL_SUBVERSION} * 10 + $Config{PERL_REVISION}
171             }
172              
173              
174             #
175             # CopyFile()
176             # --------
177             sub CopyFile {
178 0     0 0 0 require File::Copy;
179 0         0 File::Copy::copy($_[0], $_[1]);
180             }
181              
182              
183             #
184             # CreateDirectory()
185             # ---------------
186             sub CreateDirectory {
187 3     3 0 1099 require File::Path;
188 3         7 my $r = eval { File::Path::mkpath($_[0]) };
  3         790  
189 3         37 $^E = $!;
190 3         18 return $r
191             }
192              
193              
194             #
195             # CreateFile()
196             # ----------
197             sub CreateFile {
198 3     3 0 35 my ($file) = @_;
199 3 100       50 return 0 if -f $file;
200 2         1279 require ExtUtils::Command;
201 2         9722 eval { local @ARGV = ($file); ExtUtils::Command::touch() };
  2         8  
  2         8  
202 2         269 $^E = $!;
203 2         36 return -f $file
204             }
205              
206              
207             #
208             # DomainName()
209             # ----------
210             sub DomainName {
211 1     1 0 8 return "WORKGROUP" # that's the actual value on many hosts anyway ;)
212             # but if really needed we can try to grep smb.conf
213             }
214              
215              
216             #
217             # ExpandEnvironmentStrings()
218             # ------------------------
219             sub ExpandEnvironmentStrings {
220 1     1 0 558 my ($string) = @_;
221 1 50       9 $string =~ s/%([^%]*)%/$ENV{$1} || "%$1%"/eg; # copied from Win32.pm doc
  1         11  
222 1         8 return $string
223             }
224              
225              
226             #
227             # FormatMessage()
228             # -------------
229             sub FormatMessage {
230 0     0 0 0 require POSIX;
231 0         0 return POSIX::strerror($_[0])
232             }
233              
234              
235             #
236             # FsType()
237             # ------
238             sub FsType {
239 1     1 0 3075 my $fstype = "RandomFS";
240              
241 1 50       3 if (wantarray) {
242 1         8 require Cwd;
243 1         792 require POSIX;
244 1         13191 my $cwd = Cwd::cwd();
245              
246 1         16 my $flags = 0;
247 1 50       11 my $is_case_tolerant = eval { File::Spec->case_tolerant() } ? 1 : 0;
  1         87  
248 1         11 $flags |= $is_case_tolerant;
249              
250 1         56 my $maxcomplen = POSIX::pathconf($cwd, &POSIX::_PC_NAME_MAX);
251              
252 1         35 return ($fstype, $flags, $maxcomplen)
253             }
254             else {
255 0         0 return $fstype
256             }
257             }
258              
259              
260             #
261             # FreeLibrary()
262             # -----------
263             sub FreeLibrary {
264 0     0 0 0 require DynaLoader;
265 0         0 DynaLoader::dl_unload_file($_[0]);
266             }
267              
268              
269             #
270             # GetANSIPathName()
271             # ---------------
272             sub GetANSIPathName {
273 0     0 0 0 return $_[0]
274             }
275              
276              
277             #
278             # GetArchName()
279             # -----------
280             sub GetArchName {
281 3     3 0 935 return $Config{archname}
282             }
283              
284              
285             #
286             # GetChipName()
287             # -----------
288             sub GetChipName {
289 1     1 0 1736 require POSIX;
290 1         7742 return "" . (POSIX::uname())[4]
291             }
292              
293              
294             #
295             # GetCwd()
296             # ------
297             sub GetCwd {
298 0     0 0 0 require Cwd;
299 0         0 return Cwd::cwd()
300             }
301              
302              
303             #
304             # GetCurrentThreadId()
305             # ------------------
306             sub GetCurrentThreadId {
307 0     0 0 0 return -$$
308             }
309              
310              
311             #
312             # GetFileVersion()
313             # --------------
314             sub GetFileVersion {
315 1 50   1 0 540 if ($_[0] eq $^X) {
316 1         8 my @version = map {int} $] =~ /^([0-9]+)\.([0-9]{3})([0-9]+)$/;
  3         9  
317 1         4 push @version, Win32::BuildNumber();
318 1 50       11 return wantarray ? @version : join ".", @version
319             }
320 0 0       0 return wantarray ? (0,0,0,0) : "0.0.0.0"
321             }
322              
323              
324             #
325             # GetFolderPath()
326             # -------------
327             sub GetFolderPath {
328 1     1 0 626 my ($folder, $create) = @_;
329 1     2   98 eval "use File::HomeDir";
  2         2295  
  2         3236391  
  2         88  
330              
331 1         4 my $path = '';
332 1   33     5 my $home = eval { File::HomeDir->my_home } || (getpwuid($>))[7];
333              
334             # TODO CSIDL_DESKTOP
335             # TODO CSIDL_PROGRAMS
336              
337             $folder == &CSIDL_PERSONAL
338 1 50 0     83 and $path = eval { File::HomeDir->my_documents } || catdir($home, "Documents");
339              
340             # TODO CSIDL_FAVORITES
341             # TODO CSIDL_STARTUP
342             # TODO CSIDL_RECENT
343             # TODO CSIDL_SENDTO
344             # TODO CSIDL_STARTMENU
345              
346             $folder == &CSIDL_MYMUSIC
347 1 50 0     10 and $path = eval { File::HomeDir->my_music } || catdir($home, "Music");
348              
349             $folder == &CSIDL_MYVIDEO
350 1 50 0     8 and $path = eval { File::HomeDir->my_videos } || catdir($home, "Movies");
351              
352             $folder == &CSIDL_DESKTOPDIRECTORY
353 1 50 0     5 and $path = eval { File::HomeDir->my_desktop } || catdir($home, "Desktop");
354              
355             # TODO CSIDL_NETHOOD
356             # TODO CSIDL_FONTS
357             # TODO CSIDL_TEMPLATES
358             # TODO CSIDL_COMMON_STARTMENU
359             # TODO CSIDL_COMMON_PROGRAMS
360             # TODO CSIDL_COMMON_STARTUP
361             # TODO CSIDL_COMMON_DESKTOPDIRECTORY
362             # TODO CSIDL_APPDATA
363             # TODO CSIDL_PRINTHOOD
364             # TODO CSIDL_LOCAL_APPDATA
365             # TODO CSIDL_COMMON_FAVORITES
366             # TODO CSIDL_INTERNET_CACHE
367             # TODO CSIDL_COOKIES
368             # TODO CSIDL_HISTORY
369             # TODO CSIDL_COMMON_APPDATA
370              
371 1 50       7 $folder == &CSIDL_WINDOWS and $path = $ENV{WINDIR};
372 1 50       6 $folder == &CSIDL_SYSTEM and $path = $ENV{SYSTEMROOT};
373              
374             # TODO CSIDL_PROGRAM_FILES
375              
376             $folder == &CSIDL_MYPICTURES
377 1 50 0     6 and $path = eval { File::HomeDir->my_pictures } || catdir($home, "Pictures");
378              
379 1 50       6 $folder == &CSIDL_PROFILE and $path = $home;
380              
381             # TODO CSIDL_PROGRAM_FILES_COMMON
382             # TODO CSIDL_COMMON_TEMPLATES
383             # TODO CSIDL_COMMON_DOCUMENTS
384             # TODO CSIDL_COMMON_ADMINTOOLS
385             # TODO CSIDL_ADMINTOOLS
386             # TODO CSIDL_COMMON_MUSIC
387             # TODO CSIDL_COMMON_PICTURES
388             # TODO CSIDL_COMMON_VIDEO
389             # TODO CSIDL_RESOURCES
390             # TODO CSIDL_RESOURCES_LOCALIZED
391             # TODO CSIDL_CDBURN_AREA
392              
393 1   33     4 $path ||= $home;
394 1 50       4 mkpath $path if $create;
395 1         9 return $path
396             }
397              
398              
399             #
400             # GetFullPathName()
401             # ---------------
402             sub GetFullPathName {
403 0     0 0 0 require Cwd;
404 0         0 my $fullpath = Cwd::abs_path($_[0]);
405              
406 0 0       0 if (wantarray) {
407 0         0 require File::Basename;
408 0         0 my ($name, $path) = File::Basename::fileparse($fullpath);
409 0         0 return ($path, $name)
410             }
411             else {
412 0         0 return $fullpath
413             }
414             }
415              
416              
417             #
418             # GetLastError()
419             # ------------
420             sub GetLastError {
421 2 50   2 0 30 return defined $^E ? 0+$^E : 0+$!
422             }
423              
424              
425             #
426             # GetLongPathName()
427             # ---------------
428             sub GetLongPathName {
429 0 0   0 0 0 if (wantarray) {
430 0         0 require File::Basename;
431 0         0 my ($name, $path) = File::Basename::fileparse($_[0]);
432 0         0 return ($path, $name)
433             }
434             else {
435 0         0 return $_[0]
436             }
437             }
438              
439              
440             #
441             # GetNextAvailDrive()
442             # -----------------
443             sub GetNextAvailDrive {
444 0     0 0 0 return "Z" # not sure what this function should return
445             }
446              
447              
448             #
449             # GetOSName()
450             # ---------
451             sub GetOSName {
452 2     2 0 1450 my ($name, $major, $minor, $build, $id) = GetOSVersion();
453 2         5 my $osname = "$name-$major.$minor";
454 2         7 my $desc = "$name $major.$minor " . GetArchName();
455 2 100       12 return wantarray ? ($osname, $desc) : $osname
456             }
457              
458              
459             #
460             # GetOSVersion()
461             # ------------
462             sub GetOSVersion {
463 4     4 0 599 my ($name, $major, $minor, $build, $id);
464              
465 4         939 require POSIX;
466 4         14653 my @uname = POSIX::uname();
467 4         11 $name = $uname[0];
468 4         28 ($major, $minor) = $uname[2] =~ /^([0-9]+)\.([0-9]+)/;
469 4         19 $id = 2;
470              
471 4         21 return ($name, $major, $minor, $build, $id)
472             }
473              
474              
475             #
476             # GetShortPathName()
477             # ----------------
478             sub GetShortPathName {
479 0 0   0 0 0 if (wantarray) {
480 0         0 require File::Basename;
481 0         0 my ($name, $path) = File::Basename::fileparse($_[0]);
482 0         0 return ($path, $name)
483             }
484             else {
485 0         0 return $_[0]
486             }
487             }
488              
489              
490             #
491             # GetProcAddress()
492             # --------------
493             sub GetProcAddress {
494 0     0 0 0 require DynaLoader;
495 0         0 return DynaLoader::dl_find_symbol($_[0], $_[1])
496             }
497              
498              
499             #
500             # GetTickCount()
501             # ------------
502             sub GetTickCount {
503             return time()
504 0     0 0 0 }
505              
506              
507             #
508             # GuidGen()
509             # -------
510             sub GuidGen {
511 2     2 0 568 my $guid = "";
512              
513 2 50   1   198 if (eval "use Data::GUID; 1") {
  1 0       13  
  1         3  
  1         6  
514 2         8 $guid = "{" . eval { Data::GUID->new } ."}"
  2         14  
515             }
516             elsif (eval "use Win32::Guidgen; 1") {
517 0         0 $guid = eval { Win32::Guidgen::create() }
  0         0  
518             }
519             else {
520 0         0 $guid = sprintf "{%08X-%04X-%04X-%04X-%06X%06X}" =>
521 0         0 map { rand( hex("F"x$_) ) } 8, 4, 4, 4, 6,6
522             }
523              
524 2         495 return $guid
525             }
526              
527              
528             #
529             # InitiateSystemShutdown()
530             # ----------------------
531 0     0 0 0 sub InitiateSystemShutdown {
532             # XXX: nahhh...
533             }
534              
535              
536             #
537             # IsAdminUser()
538             # -----------
539             sub IsAdminUser {
540 0 0   0 0 0 return $< == 0 ? 1 : 0
541             }
542              
543              
544             #
545             # IsWinNT()
546             # -------
547             sub IsWinNT {
548 2     2 0 217 return 1
549             }
550              
551              
552             #
553             # IsWin95()
554             # -------
555             sub IsWin95 {
556 0     0 0 0 return 0
557             }
558              
559              
560             #
561             # LoadLibrary()
562             # -----------
563             sub LoadLibrary {
564 0     0 0 0 DynaLoader::dl_load_file($_[0])
565             }
566              
567              
568             #
569             # LoginName()
570             # ---------
571             sub LoginName {
572 1     1 0 283649 return "" . (getpwuid($<))[0]
573             }
574              
575              
576             #
577             # LookupAccountName()
578             # -----------------
579             sub LookupAccountName {
580 0     0 0 0 my ($system, $account, $domain, $sid, $sidtype) = @_;
581             # XXX: not implement, don't know what this is
582             return
583 0         0 }
584              
585              
586             #
587             # LookupAccountSID()
588             # ----------------
589             sub LookupAccountSID {
590 0     0 0 0 my ($system, $account, $domain, $sid, $sidtype) = @_;
591             # XXX: not implement, don't know what this is
592             return
593 0         0 }
594              
595              
596             #
597             # MsgBox()
598             # ------
599             sub MsgBox {
600 0     0 0 0 my ($message, $flags, $title) = @_;
601 0   0     0 $title ||= "Perl";
602 0         0 warn "[!!] $title\: $message\n"; # XXX: maybe we could use Gtk ot Wx?
603 0         0 return 0
604             }
605              
606              
607             #
608             # NodeName()
609             # --------
610             sub NodeName {
611 1     1 0 955 require POSIX;
612 1         16 return "" . (POSIX::uname())[1]
613             }
614              
615              
616             #
617             # OutputDebugString()
618             # -----------------
619             sub OutputDebugString {
620 0     0 0 0 print STDERR "[debug] ", @_, $/
621             }
622              
623              
624             #
625             # RegisterServer()
626             # --------------
627             sub RegisterServer {
628             # XXX: not implemented
629 0     0 0 0 return 0
630             }
631              
632              
633             #
634             # SetChildShowWindow()
635             # ------------------
636             sub SetChildShowWindow {
637             # XXX: not implemented
638 0     0 0 0 return 0
639             }
640              
641              
642             #
643             # SetCwd()
644             # ------
645             sub SetCwd {
646 0     0 0 0 return chdir $_[0]
647             }
648              
649              
650             #
651             # SetLastError()
652             # ------------
653             sub SetLastError {
654 0     0 0 0 $^E = $! = $_[0]
655             }
656              
657              
658             #
659             # Sleep()
660             # -----
661             sub Sleep {
662 0 0   0 0 0 if (eval "use Time::HiRes; 1") {
663 0         0 usleep($_[0] * 1000)
664             }
665             else {
666 0         0 sleep($_[0] / 1000)
667             }
668             }
669              
670              
671             #
672             # Spawn()
673             # -----
674             sub Spawn {
675 0     0 0 0 my ($comand, $args, $pid_r) = @_;
676             return
677 0         0 }
678              
679              
680             #
681             # UnregisterServer()
682             # ----------------
683             sub UnregisterServer {
684             # XXX: not implemented
685             return
686 0     0 0 0 }
687              
688              
689             1
690              
691             __END__