diff mbox

[ovs-dev,V2,1/5] Python tests: Add winutils.py module

Message ID 1483456542-7522-2-git-send-email-abalutoiu@cloudbasesolutions.com
State Superseded
Headers show

Commit Message

Alin Balutoiu Jan. 3, 2017, 3:16 p.m. UTC
From: Alin Balutoiu <abalutoiu@cloudbasesolutions.com>

This patch adds a new python module which contains
helper functions. These will be neccessary for the
Windows implementation.

They cover the following aspects: sockets and namedpipes.

Signed-off-by: Alin-Gheorghe Balutoiu <abalutoiu@cloudbasesolutions.com>
---
V2: No changes.
---
 python/automake.mk     |   3 +-
 python/ovs/winutils.py | 226 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 228 insertions(+), 1 deletion(-)
 create mode 100644 python/ovs/winutils.py

Comments

Gurucharan Shetty Jan. 3, 2017, 4:06 p.m. UTC | #1
On 3 January 2017 at 07:16, Alin Balutoiu <abalutoiu@cloudbasesolutions.com>
wrote:

> From: Alin Balutoiu <abalutoiu@cloudbasesolutions.com>
>
> This patch adds a new python module which contains
> helper functions. These will be neccessary for the
> Windows implementation.
>
> They cover the following aspects: sockets and namedpipes.
>
> Signed-off-by: Alin-Gheorghe Balutoiu <abalutoiu@cloudbasesolutions.com>
>

Can you please use the same name for Author and Signed-off-by. In this
patch the author is "Alin Balutoiu", but the Signed-off-by is from
"Alin-Gheorghe Balutoiu". Also, when you rebase, please include any
Acked-by's, Tested-by's etc from the previous iteration.




> ---
> V2: No changes.
> ---
>  python/automake.mk     |   3 +-
>  python/ovs/winutils.py | 226 ++++++++++++++++++++++++++++++
> +++++++++++++++++++
>  2 files changed, 228 insertions(+), 1 deletion(-)
>  create mode 100644 python/ovs/winutils.py
>
> diff --git a/python/automake.mk b/python/automake.mk
> index 1c8fa38..e417483 100644
> --- a/python/automake.mk
> +++ b/python/automake.mk
> @@ -34,7 +34,8 @@ ovs_pyfiles = \
>         python/ovs/unixctl/server.py \
>         python/ovs/util.py \
>         python/ovs/version.py \
> -       python/ovs/vlog.py
> +       python/ovs/vlog.py \
> +       python/ovs/winutils.py
>
>  # These python files are used at build time but not runtime,
>  # so they are not installed.
> diff --git a/python/ovs/winutils.py b/python/ovs/winutils.py
> new file mode 100644
> index 0000000..0694ce2
> --- /dev/null
> +++ b/python/ovs/winutils.py
> @@ -0,0 +1,226 @@
> +# Copyright (c) 2016 Cloudbase Solutions Srl
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at:
> +#
> +#     http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +
> +import six
> +import sys
> +
> +if sys.platform != 'win32':
> +    raise Exception("Intented to use only on Windows")
> +else:
> +    import pywintypes
> +    import winerror
> +    import win32pipe
> +    import win32con
> +    import win32security
> +    import win32file
> +    import win32event
> +
> +
> +def close_handle(handle, logger=None):
> +    try:
> +        win32file.CloseHandle(handle)
> +        return None
> +    except pywintypes.error as e:
> +        if logger is not None:
> +            logger("failed to close handle: %s" % e.strerror)
> +        return e.winerror
> +
> +
> +def windows_create_pipe(sAttrs=-1, nSize=None):
> +    # Default values if parameters are not passed
> +    if sAttrs == -1:
> +        sAttrs = win32security.SECURITY_ATTRIBUTES()
> +        sAttrs.bInheritHandle = 1
> +    if nSize is None:
> +        # If this parameter is zero, the system uses the default buffer
> size.
> +        nSize = 0
> +
> +    try:
> +        (read_pipe, write_pipe) = win32pipe.CreatePipe(sAttrs, nSize)
> +    except pywintypes.error:
> +        raise
> +
> +    return (read_pipe, write_pipe)
> +
> +
> +def windows_read_pipe(fd, length):
> +    try:
> +        (error, data) = win32file.ReadFile(fd, length)
> +        return error, data
> +    except pywintypes.error as e:
> +        return e.winerror, ""
> +
> +
> +def create_file(filename, desiredAccess=None, shareMode=None,
> attributes=-1,
> +                CreationDisposition=None, flagsAndAttributes=None,
> +                hTemplateFile=-1):
> +    # Default values if parameters are not passed
> +    if desiredAccess is None:
> +        desiredAccess = win32file.GENERIC_READ | win32file.GENERIC_WRITE
> +    if shareMode is None:
> +        shareMode = 0
> +    if attributes == -1:
> +        # attributes can be None
> +        attributes = None
> +    if CreationDisposition is None:
> +        CreationDisposition = win32file.OPEN_EXISTING
> +    if flagsAndAttributes is None:
> +        flagsAndAttributes = (win32file.FILE_ATTRIBUTE_NORMAL |
> +                              win32file.FILE_FLAG_OVERLAPPED |
> +                              win32file.FILE_FLAG_NO_BUFFERING)
> +    if hTemplateFile == -1:
> +        hTemplateFile = None
> +
> +    try:
> +        npipe = win32file.CreateFile(filename,
> +                                     desiredAccess,
> +                                     shareMode,
> +                                     attributes,
> +                                     CreationDisposition,
> +                                     flagsAndAttributes,
> +                                     hTemplateFile)
> +    except pywintypes.error:
> +        raise
> +    return npipe
> +
> +
> +def write_file(handle, data, overlapped=None):
> +    try:
> +        (errCode, nBytesWritten) = win32file.WriteFile(handle,
> +                                                       data,
> +                                                       overlapped)
> +        # Note: win32file.WriteFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        return (errCode, nBytesWritten)
> +    except pywintypes.error as e:
> +        return (e.winerror, 0)
> +
> +
> +def read_file(handle, bufsize, overlapped=None):
> +    try:
> +        # Note: win32file.ReadFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        (errCode, read_buffer) = win32file.ReadFile(
> +            handle, bufsize, overlapped)
> +        return (errCode, read_buffer)
> +    except pywintypes.error as e:
> +        return (e.winerror, "")
> +
> +
> +def create_named_pipe(pipename, openMode=None, pipeMode=None,
> +                      nMaxInstances=None, nOutBufferSize=None,
> +                      nInBufferSize=None, nDefaultTimeOut=None,
> +                      saAttr=-1):
> +    # Default values if parameters are not passed
> +    if openMode is None:
> +        openMode = win32con.PIPE_ACCESS_DUPLEX |
> win32con.FILE_FLAG_OVERLAPPED
> +    if pipeMode is None:
> +        pipeMode = (win32con.PIPE_TYPE_MESSAGE |
> +                    win32con.PIPE_READMODE_BYTE |
> +                    win32con.PIPE_WAIT)
> +    if nMaxInstances is None:
> +        nMaxInstances = 64
> +    if nOutBufferSize is None:
> +        nOutBufferSize = 65000
> +    if nInBufferSize is None:
> +        nInBufferSize = 65000
> +    if nDefaultTimeOut is None:
> +        nDefaultTimeOut = 0
> +    if saAttr == -1:
> +        # saAttr can be None
> +        saAttr = win32security.SECURITY_ATTRIBUTES()
> +        saAttr.bInheritHandle = 1
> +
> +    try:
> +        npipe = win32pipe.CreateNamedPipe(pipename,
> +                                          openMode,
> +                                          pipeMode,
> +                                          nMaxInstances,
> +                                          nOutBufferSize,
> +                                          nInBufferSize,
> +                                          nDefaultTimeOut,
> +                                          saAttr)
> +
> +        if npipe == win32file.INVALID_HANDLE_VALUE:
> +            return None
> +
> +        return npipe
> +    except pywintypes.error:
> +        return None
> +
> +
> +def set_pipe_mode(hPipe, mode=-1, maxCollectionCount=None,
> +                  collectDataTimeout=None):
> +    # Default values if parameters are not passed
> +    if mode == -1:
> +        mode = win32pipe.PIPE_READMODE_BYTE
> +    try:
> +        win32pipe.SetNamedPipeHandleState(
> +            hPipe, mode, maxCollectionCount, collectDataTimeout)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def connect_named_pipe(pipe_handle, overlapped=None):
> +    try:
> +        # If the result of ConnectNamedPipe is ERROR_IO_PENDING or
> +        # ERROR_PIPE_CONNECTED, then this value is returned.
> +        # All other error values raise a win32 exception
> +        error = win32pipe.ConnectNamedPipe(pipe_handle, overlapped)
> +        return error
> +    except pywintypes.error as e:
> +        return e.winerror
> +
> +
> +def get_pipe_name(name):
> +    name = name.replace('/', '')
> +    name = name.replace('\\', '')
> +    name = "\\\\.\\pipe\\" + name
> +    return name
> +
> +
> +def get_overlapped_result(handle, overlapped=None, bWait=False):
> +    try:
> +        return win32file.GetOverlappedResult(handle, overlapped, bWait)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def get_decoded_buffer(recvBuffer):
> +    if six.PY3:
> +        return bytes(recvBuffer).decode("utf-8")
> +    else:
> +        return str(recvBuffer)
> +
> +
> +def get_encoded_buffer(buff):
> +    # Python 3 has separate types for strings and bytes.
> +    # We must have bytes here.
> +    if not isinstance(buff, six.binary_type):
> +        if six.PY3:
> +            buff = six.binary_type(buff, 'utf-8')
> +        else:
> +            buff = six.binary_type(buff)
> +    return buff
> +
> +
> +def get_new_event(sa=None, bManualReset=True, bInitialState=True,
> +                  objectName=None):
> +    return win32event.CreateEvent(sa, bManualReset, bInitialState,
> objectName)
> +
> +
> +pipe_disconnected_errors = [winerror.ERROR_PIPE_NOT_CONNECTED,
> +                            winerror.ERROR_BAD_PIPE,
> +                            winerror.ERROR_NO_DATA,
> +                            winerror.ERROR_BROKEN_PIPE]
> --
> 2.10.0.windows.1
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Alin Balutoiu Jan. 3, 2017, 4:27 p.m. UTC | #2
Please ignore this patch, I will send another one soon.

Thanks,
Alin Balutoiu.

> -----Original Message-----
> From: Alin Balutoiu
> Sent: Tuesday, January 3, 2017 5:17 PM
> To: dev@openvswitch.org
> Cc: Alin Balutoiu <abalutoiu@cloudbasesolutions.com>
> Subject: [PATCH V2 1/5] Python tests: Add winutils.py module
> 
> From: Alin Balutoiu <abalutoiu@cloudbasesolutions.com>
> 
> This patch adds a new python module which contains helper functions. These
> will be neccessary for the Windows implementation.
> 
> They cover the following aspects: sockets and namedpipes.
> 
> Signed-off-by: Alin-Gheorghe Balutoiu <abalutoiu@cloudbasesolutions.com>
> ---
> V2: No changes.
> ---
>  python/automake.mk     |   3 +-
>  python/ovs/winutils.py | 226
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 228 insertions(+), 1 deletion(-)  create mode 100644
> python/ovs/winutils.py
> 
> diff --git a/python/automake.mk b/python/automake.mk index
> 1c8fa38..e417483 100644
> --- a/python/automake.mk
> +++ b/python/automake.mk
> @@ -34,7 +34,8 @@ ovs_pyfiles = \
>  	python/ovs/unixctl/server.py \
>  	python/ovs/util.py \
>  	python/ovs/version.py \
> -	python/ovs/vlog.py
> +	python/ovs/vlog.py \
> +	python/ovs/winutils.py
> 
>  # These python files are used at build time but not runtime,  # so they are
> not installed.
> diff --git a/python/ovs/winutils.py b/python/ovs/winutils.py new file mode
> 100644 index 0000000..0694ce2
> --- /dev/null
> +++ b/python/ovs/winutils.py
> @@ -0,0 +1,226 @@
> +# Copyright (c) 2016 Cloudbase Solutions Srl # # Licensed under the
> +Apache License, Version 2.0 (the "License"); # you may not use this
> +file except in compliance with the License.
> +# You may obtain a copy of the License at:
> +#
> +#     http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software #
> +distributed under the License is distributed on an "AS IS" BASIS, #
> +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> +# See the License for the specific language governing permissions and #
> +limitations under the License.
> +
> +import six
> +import sys
> +
> +if sys.platform != 'win32':
> +    raise Exception("Intented to use only on Windows")
> +else:
> +    import pywintypes
> +    import winerror
> +    import win32pipe
> +    import win32con
> +    import win32security
> +    import win32file
> +    import win32event
> +
> +
> +def close_handle(handle, logger=None):
> +    try:
> +        win32file.CloseHandle(handle)
> +        return None
> +    except pywintypes.error as e:
> +        if logger is not None:
> +            logger("failed to close handle: %s" % e.strerror)
> +        return e.winerror
> +
> +
> +def windows_create_pipe(sAttrs=-1, nSize=None):
> +    # Default values if parameters are not passed
> +    if sAttrs == -1:
> +        sAttrs = win32security.SECURITY_ATTRIBUTES()
> +        sAttrs.bInheritHandle = 1
> +    if nSize is None:
> +        # If this parameter is zero, the system uses the default buffer size.
> +        nSize = 0
> +
> +    try:
> +        (read_pipe, write_pipe) = win32pipe.CreatePipe(sAttrs, nSize)
> +    except pywintypes.error:
> +        raise
> +
> +    return (read_pipe, write_pipe)
> +
> +
> +def windows_read_pipe(fd, length):
> +    try:
> +        (error, data) = win32file.ReadFile(fd, length)
> +        return error, data
> +    except pywintypes.error as e:
> +        return e.winerror, ""
> +
> +
> +def create_file(filename, desiredAccess=None, shareMode=None,
> attributes=-1,
> +                CreationDisposition=None, flagsAndAttributes=None,
> +                hTemplateFile=-1):
> +    # Default values if parameters are not passed
> +    if desiredAccess is None:
> +        desiredAccess = win32file.GENERIC_READ | win32file.GENERIC_WRITE
> +    if shareMode is None:
> +        shareMode = 0
> +    if attributes == -1:
> +        # attributes can be None
> +        attributes = None
> +    if CreationDisposition is None:
> +        CreationDisposition = win32file.OPEN_EXISTING
> +    if flagsAndAttributes is None:
> +        flagsAndAttributes = (win32file.FILE_ATTRIBUTE_NORMAL |
> +                              win32file.FILE_FLAG_OVERLAPPED |
> +                              win32file.FILE_FLAG_NO_BUFFERING)
> +    if hTemplateFile == -1:
> +        hTemplateFile = None
> +
> +    try:
> +        npipe = win32file.CreateFile(filename,
> +                                     desiredAccess,
> +                                     shareMode,
> +                                     attributes,
> +                                     CreationDisposition,
> +                                     flagsAndAttributes,
> +                                     hTemplateFile)
> +    except pywintypes.error:
> +        raise
> +    return npipe
> +
> +
> +def write_file(handle, data, overlapped=None):
> +    try:
> +        (errCode, nBytesWritten) = win32file.WriteFile(handle,
> +                                                       data,
> +                                                       overlapped)
> +        # Note: win32file.WriteFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        return (errCode, nBytesWritten)
> +    except pywintypes.error as e:
> +        return (e.winerror, 0)
> +
> +
> +def read_file(handle, bufsize, overlapped=None):
> +    try:
> +        # Note: win32file.ReadFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        (errCode, read_buffer) = win32file.ReadFile(
> +            handle, bufsize, overlapped)
> +        return (errCode, read_buffer)
> +    except pywintypes.error as e:
> +        return (e.winerror, "")
> +
> +
> +def create_named_pipe(pipename, openMode=None, pipeMode=None,
> +                      nMaxInstances=None, nOutBufferSize=None,
> +                      nInBufferSize=None, nDefaultTimeOut=None,
> +                      saAttr=-1):
> +    # Default values if parameters are not passed
> +    if openMode is None:
> +        openMode = win32con.PIPE_ACCESS_DUPLEX |
> win32con.FILE_FLAG_OVERLAPPED
> +    if pipeMode is None:
> +        pipeMode = (win32con.PIPE_TYPE_MESSAGE |
> +                    win32con.PIPE_READMODE_BYTE |
> +                    win32con.PIPE_WAIT)
> +    if nMaxInstances is None:
> +        nMaxInstances = 64
> +    if nOutBufferSize is None:
> +        nOutBufferSize = 65000
> +    if nInBufferSize is None:
> +        nInBufferSize = 65000
> +    if nDefaultTimeOut is None:
> +        nDefaultTimeOut = 0
> +    if saAttr == -1:
> +        # saAttr can be None
> +        saAttr = win32security.SECURITY_ATTRIBUTES()
> +        saAttr.bInheritHandle = 1
> +
> +    try:
> +        npipe = win32pipe.CreateNamedPipe(pipename,
> +                                          openMode,
> +                                          pipeMode,
> +                                          nMaxInstances,
> +                                          nOutBufferSize,
> +                                          nInBufferSize,
> +                                          nDefaultTimeOut,
> +                                          saAttr)
> +
> +        if npipe == win32file.INVALID_HANDLE_VALUE:
> +            return None
> +
> +        return npipe
> +    except pywintypes.error:
> +        return None
> +
> +
> +def set_pipe_mode(hPipe, mode=-1, maxCollectionCount=None,
> +                  collectDataTimeout=None):
> +    # Default values if parameters are not passed
> +    if mode == -1:
> +        mode = win32pipe.PIPE_READMODE_BYTE
> +    try:
> +        win32pipe.SetNamedPipeHandleState(
> +            hPipe, mode, maxCollectionCount, collectDataTimeout)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def connect_named_pipe(pipe_handle, overlapped=None):
> +    try:
> +        # If the result of ConnectNamedPipe is ERROR_IO_PENDING or
> +        # ERROR_PIPE_CONNECTED, then this value is returned.
> +        # All other error values raise a win32 exception
> +        error = win32pipe.ConnectNamedPipe(pipe_handle, overlapped)
> +        return error
> +    except pywintypes.error as e:
> +        return e.winerror
> +
> +
> +def get_pipe_name(name):
> +    name = name.replace('/', '')
> +    name = name.replace('\\', '')
> +    name = "\\\\.\\pipe\\" + name
> +    return name
> +
> +
> +def get_overlapped_result(handle, overlapped=None, bWait=False):
> +    try:
> +        return win32file.GetOverlappedResult(handle, overlapped, bWait)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def get_decoded_buffer(recvBuffer):
> +    if six.PY3:
> +        return bytes(recvBuffer).decode("utf-8")
> +    else:
> +        return str(recvBuffer)
> +
> +
> +def get_encoded_buffer(buff):
> +    # Python 3 has separate types for strings and bytes.
> +    # We must have bytes here.
> +    if not isinstance(buff, six.binary_type):
> +        if six.PY3:
> +            buff = six.binary_type(buff, 'utf-8')
> +        else:
> +            buff = six.binary_type(buff)
> +    return buff
> +
> +
> +def get_new_event(sa=None, bManualReset=True, bInitialState=True,
> +                  objectName=None):
> +    return win32event.CreateEvent(sa, bManualReset, bInitialState,
> +objectName)
> +
> +
> +pipe_disconnected_errors = [winerror.ERROR_PIPE_NOT_CONNECTED,
> +                            winerror.ERROR_BAD_PIPE,
> +                            winerror.ERROR_NO_DATA,
> +                            winerror.ERROR_BROKEN_PIPE]
> --
> 2.10.0.windows.1
diff mbox

Patch

diff --git a/python/automake.mk b/python/automake.mk
index 1c8fa38..e417483 100644
--- a/python/automake.mk
+++ b/python/automake.mk
@@ -34,7 +34,8 @@  ovs_pyfiles = \
 	python/ovs/unixctl/server.py \
 	python/ovs/util.py \
 	python/ovs/version.py \
-	python/ovs/vlog.py
+	python/ovs/vlog.py \
+	python/ovs/winutils.py
 
 # These python files are used at build time but not runtime,
 # so they are not installed.
diff --git a/python/ovs/winutils.py b/python/ovs/winutils.py
new file mode 100644
index 0000000..0694ce2
--- /dev/null
+++ b/python/ovs/winutils.py
@@ -0,0 +1,226 @@ 
+# Copyright (c) 2016 Cloudbase Solutions Srl
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import six
+import sys
+
+if sys.platform != 'win32':
+    raise Exception("Intented to use only on Windows")
+else:
+    import pywintypes
+    import winerror
+    import win32pipe
+    import win32con
+    import win32security
+    import win32file
+    import win32event
+
+
+def close_handle(handle, logger=None):
+    try:
+        win32file.CloseHandle(handle)
+        return None
+    except pywintypes.error as e:
+        if logger is not None:
+            logger("failed to close handle: %s" % e.strerror)
+        return e.winerror
+
+
+def windows_create_pipe(sAttrs=-1, nSize=None):
+    # Default values if parameters are not passed
+    if sAttrs == -1:
+        sAttrs = win32security.SECURITY_ATTRIBUTES()
+        sAttrs.bInheritHandle = 1
+    if nSize is None:
+        # If this parameter is zero, the system uses the default buffer size.
+        nSize = 0
+
+    try:
+        (read_pipe, write_pipe) = win32pipe.CreatePipe(sAttrs, nSize)
+    except pywintypes.error:
+        raise
+
+    return (read_pipe, write_pipe)
+
+
+def windows_read_pipe(fd, length):
+    try:
+        (error, data) = win32file.ReadFile(fd, length)
+        return error, data
+    except pywintypes.error as e:
+        return e.winerror, ""
+
+
+def create_file(filename, desiredAccess=None, shareMode=None, attributes=-1,
+                CreationDisposition=None, flagsAndAttributes=None,
+                hTemplateFile=-1):
+    # Default values if parameters are not passed
+    if desiredAccess is None:
+        desiredAccess = win32file.GENERIC_READ | win32file.GENERIC_WRITE
+    if shareMode is None:
+        shareMode = 0
+    if attributes == -1:
+        # attributes can be None
+        attributes = None
+    if CreationDisposition is None:
+        CreationDisposition = win32file.OPEN_EXISTING
+    if flagsAndAttributes is None:
+        flagsAndAttributes = (win32file.FILE_ATTRIBUTE_NORMAL |
+                              win32file.FILE_FLAG_OVERLAPPED |
+                              win32file.FILE_FLAG_NO_BUFFERING)
+    if hTemplateFile == -1:
+        hTemplateFile = None
+
+    try:
+        npipe = win32file.CreateFile(filename,
+                                     desiredAccess,
+                                     shareMode,
+                                     attributes,
+                                     CreationDisposition,
+                                     flagsAndAttributes,
+                                     hTemplateFile)
+    except pywintypes.error:
+        raise
+    return npipe
+
+
+def write_file(handle, data, overlapped=None):
+    try:
+        (errCode, nBytesWritten) = win32file.WriteFile(handle,
+                                                       data,
+                                                       overlapped)
+        # Note: win32file.WriteFile doesn't throw an exception
+        # in case it receives ERROR_IO_PENDING.
+        return (errCode, nBytesWritten)
+    except pywintypes.error as e:
+        return (e.winerror, 0)
+
+
+def read_file(handle, bufsize, overlapped=None):
+    try:
+        # Note: win32file.ReadFile doesn't throw an exception
+        # in case it receives ERROR_IO_PENDING.
+        (errCode, read_buffer) = win32file.ReadFile(
+            handle, bufsize, overlapped)
+        return (errCode, read_buffer)
+    except pywintypes.error as e:
+        return (e.winerror, "")
+
+
+def create_named_pipe(pipename, openMode=None, pipeMode=None,
+                      nMaxInstances=None, nOutBufferSize=None,
+                      nInBufferSize=None, nDefaultTimeOut=None,
+                      saAttr=-1):
+    # Default values if parameters are not passed
+    if openMode is None:
+        openMode = win32con.PIPE_ACCESS_DUPLEX | win32con.FILE_FLAG_OVERLAPPED
+    if pipeMode is None:
+        pipeMode = (win32con.PIPE_TYPE_MESSAGE |
+                    win32con.PIPE_READMODE_BYTE |
+                    win32con.PIPE_WAIT)
+    if nMaxInstances is None:
+        nMaxInstances = 64
+    if nOutBufferSize is None:
+        nOutBufferSize = 65000
+    if nInBufferSize is None:
+        nInBufferSize = 65000
+    if nDefaultTimeOut is None:
+        nDefaultTimeOut = 0
+    if saAttr == -1:
+        # saAttr can be None
+        saAttr = win32security.SECURITY_ATTRIBUTES()
+        saAttr.bInheritHandle = 1
+
+    try:
+        npipe = win32pipe.CreateNamedPipe(pipename,
+                                          openMode,
+                                          pipeMode,
+                                          nMaxInstances,
+                                          nOutBufferSize,
+                                          nInBufferSize,
+                                          nDefaultTimeOut,
+                                          saAttr)
+
+        if npipe == win32file.INVALID_HANDLE_VALUE:
+            return None
+
+        return npipe
+    except pywintypes.error:
+        return None
+
+
+def set_pipe_mode(hPipe, mode=-1, maxCollectionCount=None,
+                  collectDataTimeout=None):
+    # Default values if parameters are not passed
+    if mode == -1:
+        mode = win32pipe.PIPE_READMODE_BYTE
+    try:
+        win32pipe.SetNamedPipeHandleState(
+            hPipe, mode, maxCollectionCount, collectDataTimeout)
+    except pywintypes.error:
+        raise
+
+
+def connect_named_pipe(pipe_handle, overlapped=None):
+    try:
+        # If the result of ConnectNamedPipe is ERROR_IO_PENDING or
+        # ERROR_PIPE_CONNECTED, then this value is returned.
+        # All other error values raise a win32 exception
+        error = win32pipe.ConnectNamedPipe(pipe_handle, overlapped)
+        return error
+    except pywintypes.error as e:
+        return e.winerror
+
+
+def get_pipe_name(name):
+    name = name.replace('/', '')
+    name = name.replace('\\', '')
+    name = "\\\\.\\pipe\\" + name
+    return name
+
+
+def get_overlapped_result(handle, overlapped=None, bWait=False):
+    try:
+        return win32file.GetOverlappedResult(handle, overlapped, bWait)
+    except pywintypes.error:
+        raise
+
+
+def get_decoded_buffer(recvBuffer):
+    if six.PY3:
+        return bytes(recvBuffer).decode("utf-8")
+    else:
+        return str(recvBuffer)
+
+
+def get_encoded_buffer(buff):
+    # Python 3 has separate types for strings and bytes.
+    # We must have bytes here.
+    if not isinstance(buff, six.binary_type):
+        if six.PY3:
+            buff = six.binary_type(buff, 'utf-8')
+        else:
+            buff = six.binary_type(buff)
+    return buff
+
+
+def get_new_event(sa=None, bManualReset=True, bInitialState=True,
+                  objectName=None):
+    return win32event.CreateEvent(sa, bManualReset, bInitialState, objectName)
+
+
+pipe_disconnected_errors = [winerror.ERROR_PIPE_NOT_CONNECTED,
+                            winerror.ERROR_BAD_PIPE,
+                            winerror.ERROR_NO_DATA,
+                            winerror.ERROR_BROKEN_PIPE]