source: server/lib/gutenbach/ipp/attributegroup.py @ df51061

no-cups
Last change on this file since df51061 was df51061, checked in by Jessica B. Hamrick <jhamrick@…>, 13 years ago

Create gutenbach module

  • Property mode set to 100644
File size: 3.2 KB
Line 
1#!/usr/bin/python
2
3import sys, struct, logging
4from .attribute import Attribute
5
6# initialize logger
7logger = logging.getLogger(__name__)
8
9class AttributeGroup(object):
10    """
11    An AttributeGroup consists of an attribute-group-tag, followed by
12    a sequence of Attributes. According to RFC 2565, "Within an
13    attribute-sequence, if two attributes have the same name, the
14    first occurrence MUST be ignored.", so we can effectively treat
15    this as an ordered dictionary.
16    """
17
18    def __init__(self, attribute_group_tag=None, attributes=[]):
19        """
20        Initialize an AttributeGroup.  An AttributeGroup can be
21        initialized in three ways:
22
23            AttributeGroup()
24            AttributeGroup(attribute_group_tag)
25            AttributeGroup(attribute_group_tag, attributes)
26
27        Arguments:
28
29            attribute_group_tag -- a signed char, holds the tag of the
30                                   attribute group
31
32            attributes -- a list of attributes
33        """
34
35        if attribute_group_tag is not None:
36            assert isinstance(attribute_group_tag, int), \
37                   "attribute_group_tag must be a character!"
38           
39
40        self.attribute_group_tag = attribute_group_tag
41        self.attributes = []
42        self.extend(attributes)
43
44    def __getitem__(self, name):
45        """
46        Returns a list of attributes which have name 'name'.
47        """
48       
49        attribute = filter(lambda x: x.name == name, self.attributes)
50        if attribute:
51            return attribute[0]
52        else:
53            raise KeyError("Attribute %r not found" % name)
54
55    def __contains__(self, name):
56        return len(filter(lambda x: x.name == name, self.attributes))
57
58    def __iter__(self):
59        return (a.name for a in self.attributes)
60
61    iterkeys = __iter__
62
63    def __setitem__(self, name, attribute):
64        """
65        Sets an attribute in the attribute group. Note that the key is
66        ignored and the attribute is queried for its name.
67        """
68
69        return self.append(attribute)
70
71    def __delitem__(self, name):
72        self.attributes = filter(lambda x: x.name != name,
73                                 self.attributes)
74
75    def append(self, attribute):
76        return self.extend([attribute])
77
78    def extend(self, attributes):
79        """
80        Sets the attributes for the attribute group.
81        """
82
83        for a in attributes:
84            assert isinstance(a, Attribute), \
85                   "attribute must be of type Attribute!"
86
87        for a in attributes:
88            # XXX: Instead of replacing the attribute, do we want to
89            # append the value to the attribute here?
90            del self[a.name]
91            self.attributes.append(a)
92
93    @property
94    def packed_value(self):
95        """
96        Convert the AttributeGroup to binary.
97        """
98
99        # conver the attribute_group_tag to binary
100        tag = struct.pack('>b', self.attribute_group_tag)
101
102        # convert each of the attributes to binary
103        attributes = [a.packed_value for a in self.attributes]
104
105        # concatenate everything and return
106        return tag + ''.join(attributes)
107
108    def __repr__(self):
109        return '<IPPAttributeGroup (%r, %r)>' % (self.attribute_group_tag, self.attributes)
Note: See TracBrowser for help on using the repository browser.