osutil.py
3.91 KB
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
###############################################################################
# Name: osutil.py #
# Purpose: Text Utilities. #
# Author: Cody Precord <cprecord@editra.org> #
# Copyright: (c) 2010 Cody Precord <staff@editra.org> #
# Licence: wxWindows Licence #
###############################################################################
"""
Editra Business Model Library: Operating System Utilities
Utilities for handling OS related interactions.
"""
__author__ = "Cody Precord <cprecord@editra.org>"
__svnid__ = "$Id: $"
__revision__ = "$Revision: $"
__all__ = ['InstallTermHandler',
'GetWindowsDrives', 'GetWindowsDriveType',
'GenericDrive', 'FixedDrive', 'CDROMDrive', 'RamDiskDrive', 'RemoteDrive',
'RemovableDrive' ]
#-----------------------------------------------------------------------------#
# Imports
import wx
import ctypes
import signal
import collections
HASWIN32 = False
if wx.Platform == '__WXMSW__':
try:
import win32api
except ImportError:
HASWIN32 = False
else:
HASWIN32 = True
#-----------------------------------------------------------------------------#
# Windows Drive Utilities
class GenericDrive(object):
def __init__(self, name):
super(GenericDrive, self).__init__()
# Attributes
self._name = name
Name = property(lambda self: self._name,
lambda self, v: setattr(self, '_name', v))
class RemovableDrive(GenericDrive):
pass
class FixedDrive(GenericDrive):
pass
class RemoteDrive(GenericDrive):
pass
class CDROMDrive(GenericDrive):
pass
class RamDiskDrive(GenericDrive):
pass
def GetWindowsDrives():
"""Get a list of all available windows drives
@return: list of strings
"""
assert wx.Platform == '__WXMSW__', "Windows Only API Method"
drives = list()
try:
dletters = list()
bmask = ctypes.windll.kernel32.GetLogicalDrives()
for dletter in u"ABCDEFGHIJKLMNOPQRSTUVWXYZ":
if bmask & 1:
dletters.append(dletter)
bmask >>= 1
for dletter in dletters:
dname = dletter + u":\\"
dtype = GetWindowsDriveType(dname)
if type(dtype) != GenericDrive:
drives.append(dtype)
except Exception, err:
pass
return drives
def GetWindowsDriveType(dname):
"""Get the drive type for the given letter"""
assert wx.Platform == '__WXMSW__', "Windows Only API Method"
dtype = GenericDrive(dname)
try:
dtypes = [None, None, RemovableDrive, FixedDrive, RemoteDrive, CDROMDrive, RamDiskDrive]
idx = ctypes.windll.kernel32.GetDriveTypeW(dname)
if idx < len(dtypes):
drive = dtypes[idx]
if drive:
dtype = drive(dname)
except:
pass
return dtype
#-----------------------------------------------------------------------------#
def InstallTermHandler(callback, *args, **kwargs):
"""Install exit app handler for sigterm (unix/linux)
and uses SetConsoleCtrlHandler on Windows.
@param callback: callable(*args, **kwargs)
@param args: positional arguments to pass to callback
@param kwargs: keyword arguments to pass to callback
@return: bool (installed or not)
"""
assert isinstance(callback, collections.Callable), "callback must be callable!"
installed = True
if wx.Platform == '__WXMSW__':
if HASWIN32:
win32api.SetConsoleCtrlHandler(lambda dummy : callback(*args, **kwargs),
True)
else:
installed = False
else:
signal.signal(signal.SIGTERM,
lambda signum, frame : callback(*args, **kwargs))
return installed