Ignore:
Timestamp:
Mar 7, 2011, 7:47:42 PM (13 years ago)
Author:
Jessica B. Hamrick <jhamrick@…>
Branches:
no-cups
Children:
fa0d0ef
Parents:
5cfb358
git-author:
Jessica B. Hamrick <jhamrick@…> (03/07/11 19:47:42)
git-committer:
Jessica B. Hamrick <jhamrick@…> (03/07/11 19:47:42)
Message:

Update API for Value, Attribute, and AttributeGroup?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/lib/ippattribute.py

    rebf327d rc269bc7  
    4040    """
    4141
    42     def __init__(self, name, values):
    43         """
    44         Initialize an Attribute.
     42    def __init__(self, name=None, values=[]):
     43        """
     44        Initialize an Attribute.  This function can be called in three
     45        different ways:
     46
     47            Attribute() -- creates an empty Attribute
     48
     49            Attribute(name) -- creates an empty Attribute with a name
     50
     51            Attribute(name, values) -- creates an Attribute
     52            initialized with a name and list of values
    4553       
    4654        Arguments:
     
    5159        """
    5260
    53         # make sure name isn't empty
    54         assert name is not None
    55          
    56         # make sure the list of values isn't empty
    57         assert len(values) > 0
    58         # make sure each value is a Value
    59         for value in values: assert isinstance(value, Value)
    60          
    61         self.name = name
    62         self.values = values
    63 
    64     def toBinaryData(self):
     61        if name is not None:
     62            assert isinstance(name, str), \
     63                   "Attribute name must be a string!"
     64        for value in values:
     65            assert isinstance(value, Value), \
     66                   "Value must be of type Value"
     67
     68        self.name = None
     69        self.values = None
     70
     71        if name is not None:
     72            self.name = name
     73        if name is not None and len(values) > 0:
     74            self.values = values
     75            self.binary = self.pack()
     76            self.verify()
     77
     78    def pack(self):
    6579        """
    6680        Packs the attribute data into binary data.
    6781        """
     82
     83        assert self.name is not None, \
     84               "cannot pack unnamed attribute!"
     85        assert len(self.values) > 0, \
     86               "cannot pack empty attribute!"
    6887
    6988        # get the binary data for all the values
    7089        values = []
     90        length = 0
    7191        for v, i in zip(self.values, xrange(len(self.values))):
    7292
     
    7999
    80100            # get the value length and binary value
    81             value_length, value_bin = v.valueToBinary()
     101            value_length, value_bin = v.pack()
    82102
    83103            logger.debug("dumping name_length : %i" % name_length)
    84104            logger.debug("dumping name : %s" % self.name)
    85105            logger.debug("dumping value_length : %i" % value_length)
    86             logger.debug("dumping value : %s" % v.value)
     106            logger.debug("dumping value : %s" % v.getValue())
    87107
    88108            # the value tag in binary
    89             value_tag_bin = struct.pack('>b', v.value_tag)
     109            value_tag_bin = struct.pack('>b', v.getValueTag())
    90110
    91111            # the name length in binary
     
    109129                                       value_length_bin,
    110130                                       value_bin]))
     131
     132            length += 2            # name-length
     133            length += name_length  # name
     134            length += value_length # value
    111135               
    112         # concatenate everything together and return it
    113         return ''.join(values)
     136        # concatenate everything together and return it along with the
     137        # total length of the attribute
     138        return length, ''.join(values)
     139
     140    def getName(self):
     141        """
     142        Get the attribute's name.
     143        """
     144       
     145        return self.name
     146
     147    def getValues(self):
     148        """
     149        Get the list of values contained in the attribute.
     150        """
     151       
     152        return self.values
     153
     154    def setName(self, name):
     155        """
     156        Set the attribute's name.
     157        """
     158
     159        assert isinstance(name, str), \
     160               "name must be a string!"
     161       
     162        self.name = name
     163
     164    def setValues(self, values):
     165        """
     166        Set the list of values contained in the attribute.
     167        """
     168
     169        for v in values:
     170            assert isinstance(v, Value), \
     171                   "value must be of type Value!"
     172       
     173        self.values = values
     174
     175    def addValue(self, value):
     176        """
     177        Add a new value to the list of values contained in the
     178        attribute."
     179
     180        assert isinstance(value, Value), \
     181               "value must be of type Value!"
     182
     183        self.values.append(value)
     184
     185    def getSize(self):
     186        """
     187        Gets the total size of the attribute.
     188        """
     189
     190        size = 2 + len(self.name)
     191        for v in self.values:
     192            size += v.getTotalSize()
     193
     194    def verify(self):
     195        """
     196        Check to make sure that the Attribute is valid.  This means
     197        that is should have a name and a list of values, and that its
     198        binary representation should match up to the stored binary
     199        representation.
     200        """
     201       
     202        assert self.name is not None, \
     203               "attribute has no name!"
     204        assert len(self.value) > 0, \
     205               "attribute has no values!"
     206
     207        size, bindata = self.pack()
     208
     209        assert size == self.getSize(), \
     210               "pack size does not match self.getSize()!"
     211        assert bindata == self.binary_data, \
     212               "packed binary data does not match self.binary_data!"
     213
     214    def __str__(self):
     215        if len(self.values) > 0:
     216            values = [str(v) for v in self.values]
     217        else:
     218            values = "None"
     219
     220        if self.name is None:
     221            name = "None"
     222        else:
     223            name = self.name
     224       
     225        return "%s: %s" % (name, str(values))
Note: See TracChangeset for help on using the changeset viewer.