require 'Win32API'

module Windows
   module Pipe
      NMPWAIT_NOWAIT           = 0x00000001
      NMPWAIT_WAIT_FOREVER     = 0xffffffff
      NMPWAIT_USE_DEFAULT_WAIT = 0x00000000

      PIPE_WAIT             = 0x00000000
      PIPE_NOWAIT           = 0x00000001
      PIPE_ACCESS_INBOUND   = 0x00000001
      PIPE_ACCESS_OUTBOUND  = 0x00000002
      PIPE_ACCESS_DUPLEX    = 0x00000003
      PIPE_TYPE_BYTE        = 0x00000000
      PIPE_TYPE_MESSAGE     = 0x00000004
      PIPE_READMODE_BYTE    = 0x00000000
      PIPE_READMODE_MESSAGE = 0x00000002
      PIPE_CLIENT_END       = 0x00000000
      PIPE_SERVER_END       = 0x00000001

      CallNamedPipe           = Win32API.new('kernel32', 'CallNamedPipe', 'PPLPLPL', 'I')
      ConnectNamedPipe        = Win32API.new('kernel32', 'ConnectNamedPipe', 'LP', 'I')
      CreateNamedPipe         = Win32API.new('kernel32', 'CreateNamedPipe', 'PLLLLLLL', 'L')
      CreatePipe              = Win32API.new('kernel32', 'CreatePipe', 'PPPL', 'I')
      DisconnectNamedPipe     = Win32API.new('kernel32', 'DisconnectNamedPipe', 'L', 'I')
      GetNamedPipeHandleState = Win32API.new('kernel32', 'GetNamedPipeHandleState', 'LPPPPPL', 'I')
      GetNamedPipeInfo        = Win32API.new('kernel32', 'GetNamedPipeInfo', 'LPPPP', 'I')
      PeekNamedPipe           = Win32API.new('kernel32', 'PeekNamedPipe', 'LPLPPP', 'I')
      SetNamedPipeHandleState = Win32API.new('kernel32', 'SetNamedPipeHandleState', 'LPPP', 'I')
      TransactNamedPipe       = Win32API.new('kernel32', 'TransactNamedPipe', 'LPLPLPP', 'I')
      WaitNamedPipe           = Win32API.new('kernel32', 'WaitNamedPipe', 'PL', 'I')

      def CallNamedPipe(name, buf, buf_size, out, out_size, read, timeout)
         CallNamedPipe.call(name, buf, buf_size, out, out_size, read, timeout) != 0
      end

      def ConnectNamedPipe(pipe, overlapped = 0)
         ConnectNamedPipe.call(pipe, overlapped) != 0
      end

      def CreateNamedPipe(name, open_mode, pipe_mode, max, out_size, in_size, timeout, sec_attr)
         CreateNamedPipe.call(name, open_mode, pipe_mode, max, out_size, in_size, timeout, sec_attr)
      end

      def CreatePipe(read_pipe, write_pipe, pipe_attr, size)
         CreatePipe.call(read_pipe, write_pipe, pipe_attr, size) != 0
      end

      def DisconnectNamedPipe(name)
         DisconnectNamedPipe.call(name) != 0
      end

      def GetNamedPipeHandleState(name, state, instances, count, timeout, user, size)
         GetNamedPipeHandleState.call(name, state, instances, count, timeout, user, size) != 0
      end

      def GetNamedPipeInfo(name, flags, out_size, in_size, max)
         GetNamedPipeInfo.call(name, flags, out_size, in_size, max) != 0
      end

      def PeekNamedPipe(name, buf, buf_size, bytes_read, bytes_avail, bytes_left)
         PeekNamedPipe.call(name, buf, buf_size, bytes_read, bytes_avail, bytes_left) != 0
      end

      def SetNamedPipeHandleState(name, mode, max, timeout)
         SetNamedPipeHandleState.call(name, mode, max, timeout) != 0
      end

      def TransactNamedPipe(name, in_buf, in_buf_size, out_buf, out_buf_size, read, overlapped)
         TransactNamedPipe.call(name, in_buf, in_buf_size, out_buf, out_buf_size, read, overlapped) != 0
      end

      def WaitNamedPipe(name, timeout)
         WaitNamedPipe.call(name, timeout) != 0
      end
   end
end