"""Message

A very general (dumb) message class.

"""

from Common import *


class Message(Object):
    """A very general message class.

    Message is the abstract, parent class for both Request and Response,
    and implements the behavior that is generic to both.

    Messages have:

        * A set of arguments.
        * A protocol.
        * A content type and length.

    FUTURE
        * Support for different types of encodings
    """


    ## Init ##

    def __init__(self):
        Object.__init__(self)
        self._args = {}


    ## Content ##

    def contentLength(self):
        """ Returns the length of the message body or -1 if not known. """
        return -1

    def contentType(self):
        """ Returns the MIME type of the message body or None if not known. """
        return None


    ## Protocol ##

    def protocol(self):
        """Return the protocol-

        Returns the name and version of the protocol the message uses
        in the form protocol/majorVersion.minorVersion, for example, HTTP/1.1.

        """
        # @@ 2000-04-09 ce: Move this down into HTTPSomething subclasses
        return 'HTTP/1.0'


    ## Arguments ##

    # @@ 2000-05-10 ce: Are arguments really used for anything?

    def arg(self, name, default=NoDefault):
        if default is NoDefault:
            return self._args[name]
        else:
            return self._args.get(name, default)

    def setArg(self, name, value):
        self._args[name] = value

    def hasArg(self, name):
        return self._args.has_key(name)

    def deleteArg(self, name):
        del self._args[name]

    def clearArgs(self):
        self._args.clear()

    def argNames(self):
        """ Returns a list of argument names. """
        return self._args.keys()


    ## Exception reports ##

    _exceptionReportAttrNames = ['args']

    def writeExceptionReport(self, handler):
        handler.writeTitle(self.__class__.__name__)
        handler.writeAttrs(self, self._exceptionReportAttrNames)