~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/win32utils.py

  • Committer: John Arbash Meinel
  • Author(s): Mark Hammond
  • Date: 2008-09-09 17:02:21 UTC
  • mto: This revision was merged to the branch mainline in revision 3697.
  • Revision ID: john@arbash-meinel.com-20080909170221-svim3jw2mrz0amp3
An updated transparent icon for bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
    else:
65
65
        create_buffer = ctypes.create_unicode_buffer
66
66
        suffix = 'W'
 
67
try:
 
68
    import win32file
 
69
    has_win32file = True
 
70
except ImportError:
 
71
    has_win32file = False
 
72
try:
 
73
    import win32api
 
74
    has_win32api = True
 
75
except ImportError:
 
76
    has_win32api = False
67
77
 
68
78
 
69
79
# Special Win32 API constants
197
207
    return os.environ.get('USERNAME', None)
198
208
 
199
209
 
 
210
# 1 == ComputerNameDnsHostname, which returns "The DNS host name of the local
 
211
# computer or the cluster associated with the local computer."
 
212
_WIN32_ComputerNameDnsHostname = 1
 
213
 
200
214
def get_host_name():
201
215
    """Return host machine name.
202
216
    If name cannot be obtained return None.
203
217
 
204
 
    Returned value can be unicode or plain sring.
205
 
    To convert plain string to unicode use
206
 
    s.decode(bzrlib.user_encoding)
 
218
    :return: A unicode string representing the host name. On win98, this may be
 
219
        a plain string as win32 api doesn't support unicode.
207
220
    """
 
221
    if has_win32api:
 
222
        try:
 
223
            return win32api.GetComputerNameEx(_WIN32_ComputerNameDnsHostname)
 
224
        except (NotImplementedError, win32api.error):
 
225
            # NotImplemented will happen on win9x...
 
226
            pass
208
227
    if has_ctypes:
209
228
        try:
210
229
            kernel32 = ctypes.windll.kernel32
211
 
            GetComputerName = getattr(kernel32, 'GetComputerName'+suffix)
212
230
        except AttributeError:
213
 
            pass
 
231
            pass # Missing the module we need
214
232
        else:
215
233
            buf = create_buffer(MAX_COMPUTERNAME_LENGTH+1)
216
234
            n = ctypes.c_int(MAX_COMPUTERNAME_LENGTH+1)
217
 
            if GetComputerName(buf, ctypes.byref(n)):
218
 
                return buf.value
219
 
    # otherwise try env variables
220
 
    return os.environ.get('COMPUTERNAME', None)
 
235
 
 
236
            # Try GetComputerNameEx which gives a proper Unicode hostname
 
237
            GetComputerNameEx = getattr(kernel32, 'GetComputerNameEx'+suffix,
 
238
                                        None)
 
239
            if (GetComputerNameEx is not None
 
240
                and GetComputerNameEx(_WIN32_ComputerNameDnsHostname,
 
241
                                      buf, ctypes.byref(n))):
 
242
                return buf.value
 
243
 
 
244
            # Try GetComputerName in case GetComputerNameEx wasn't found
 
245
            # It returns the NETBIOS name, which isn't as good, but still ok.
 
246
            # The first GetComputerNameEx might have changed 'n', so reset it
 
247
            n = ctypes.c_int(MAX_COMPUTERNAME_LENGTH+1)
 
248
            GetComputerName = getattr(kernel32, 'GetComputerName'+suffix,
 
249
                                      None)
 
250
            if (GetComputerName is not None
 
251
                and GetComputerName(buf, ctypes.byref(n))):
 
252
                return buf.value
 
253
    # otherwise try env variables, which will be 'mbcs' encoded
 
254
    # on Windows (Python doesn't expose the native win32 unicode environment)
 
255
    # According to this:
 
256
    # http://msdn.microsoft.com/en-us/library/aa246807.aspx
 
257
    # environment variables should always be encoded in 'mbcs'.
 
258
    try:
 
259
        return os.environ['COMPUTERNAME'].decode("mbcs")
 
260
    except KeyError:
 
261
        return None
221
262
 
222
263
 
223
264
def _ensure_unicode(s):
225
266
        import bzrlib
226
267
        s = s.decode(bzrlib.user_encoding)
227
268
    return s
228
 
    
 
269
 
229
270
 
230
271
def get_appdata_location_unicode():
231
272
    return _ensure_unicode(get_appdata_location())
319
360
        _winreg.CloseKey(hkey)
320
361
 
321
362
    return fullpath
 
363
 
 
364
 
 
365
def set_file_attr_hidden(path):
 
366
    """Set file attributes to hidden if possible"""
 
367
    if has_win32file:
 
368
        win32file.SetFileAttributes(path, win32file.FILE_ATTRIBUTE_HIDDEN)