aboutsummaryrefslogtreecommitdiffstats
path: root/python/gevent/win32util.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/gevent/win32util.py')
-rw-r--r--python/gevent/win32util.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/python/gevent/win32util.py b/python/gevent/win32util.py
new file mode 100644
index 0000000..7158d69
--- /dev/null
+++ b/python/gevent/win32util.py
@@ -0,0 +1,98 @@
+# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+"""Error formatting function for Windows.
+
+The code is taken from twisted.python.win32 module.
+"""
+
+from __future__ import absolute_import
+import os
+
+
+__all__ = ['formatError']
+
+
+class _ErrorFormatter(object):
+ """
+ Formatter for Windows error messages.
+
+ @ivar winError: A callable which takes one integer error number argument
+ and returns an L{exceptions.WindowsError} instance for that error (like
+ L{ctypes.WinError}).
+
+ @ivar formatMessage: A callable which takes one integer error number
+ argument and returns a C{str} giving the message for that error (like
+ L{win32api.FormatMessage}).
+
+ @ivar errorTab: A mapping from integer error numbers to C{str} messages
+ which correspond to those errors (like L{socket.errorTab}).
+ """
+ def __init__(self, WinError, FormatMessage, errorTab):
+ self.winError = WinError
+ self.formatMessage = FormatMessage
+ self.errorTab = errorTab
+
+ @classmethod
+ def fromEnvironment(cls):
+ """
+ Get as many of the platform-specific error translation objects as
+ possible and return an instance of C{cls} created with them.
+ """
+ try:
+ from ctypes import WinError
+ except ImportError:
+ WinError = None
+ try:
+ from win32api import FormatMessage
+ except ImportError:
+ FormatMessage = None
+ try:
+ from socket import errorTab
+ except ImportError:
+ errorTab = None
+ return cls(WinError, FormatMessage, errorTab)
+
+ def formatError(self, errorcode):
+ """
+ Returns the string associated with a Windows error message, such as the
+ ones found in socket.error.
+
+ Attempts direct lookup against the win32 API via ctypes and then
+ pywin32 if available), then in the error table in the socket module,
+ then finally defaulting to C{os.strerror}.
+
+ @param errorcode: the Windows error code
+ @type errorcode: C{int}
+
+ @return: The error message string
+ @rtype: C{str}
+ """
+ if self.winError is not None:
+ return str(self.winError(errorcode))
+ if self.formatMessage is not None:
+ return self.formatMessage(errorcode)
+ if self.errorTab is not None:
+ result = self.errorTab.get(errorcode)
+ if result is not None:
+ return result
+ return os.strerror(errorcode)
+
+formatError = _ErrorFormatter.fromEnvironment().formatError