spoon.spoonstream

Package spoon :: Module spoonstream |
[hide private]
[frames] | no frames]

# Source Code for Module spoon.spoonstream

     1  #
     2  # Copyright (C) 2006, Matt Sullivan <matts@zarrf.com>
     3  #
     4  # Permission is hereby granted, free of charge, to any person obtaining
     5  # a copy of this software and associated documentation files (the
     6  # "Software"), to deal in the Software without restriction, including
     7  # without limitation the rights to use, copy, modify, merge, publish,
     8  # distribute, sublicense, and/or sell copies of the Software, and to
     9  # permit persons to whom the Software is furnished to do so, subject to
    10  # the following conditions:
    11  #
    12  # The above copyright notice and this permission notice shall be included
    13  # in all copies or substantial portions of the Software.
    14  #
    15  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    16  # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    17  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    18  # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    19  # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    20  # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    21  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    22  #
    23
    24  import ber
    25  import StringIO
    26  import zlib
    27
    28 -class SocketFile (object):
    29      """
    30      Simple wrapper around a socket like object that pretends to be a file.
    31      Albeit one that can't seek or tell for obvious reasons.
    32      """
    33 -    def __init__(self, sock):
    34          self.sock = sock
    35
    36 -    def read(self, cnt=1):
    37          return self.sock.recv(cnt)
    38
    39 -    def write(self, data):
    40          return self.sock.send(data)
    41
    42 -    def close(self):
    43          self.sock.close()
    44
    45 -class SpoonStream (object):
    46      """
    47      SpoonStream implements an object stream.
    48      This will take either a file like object or a socket like object
    49      """
    50 -    def __init__(self, fd, compress=False):
    51          self.compress = compress
    52          self.realfd = fd
    53          if hasattr(fd, "write") and hasattr(fd, "read"):
    54              self.fd = fd
    55          else:
    56              self.fd = SocketFile(fd)
    57          self.buffer = StringIO.StringIO()
    58
    59 -    def read(self, cnt=None):
    60          return ber.BERStream(self.fd).next()
    61
    62 -    def recv(self, cnt=None):
    63          return self.read()
    64
    65 -    def write(self, obj):
    66          ber.BERStream(self.buffer).add(obj, self.compress)
    67          self.fd.write(self.buffer.getvalue())
    68          self.buffer.truncate(0)
    69
    70 -    def send(self, obj):
    71          self.write(obj)
    72
    73 -    def close(self):
    74          self.realfd.close()
    75