1 | # -*- test-case-name: wokkel.test.test_formats -*- |
---|
2 | # |
---|
3 | # Copyright (c) Ralph Meijer. |
---|
4 | # See LICENSE for details. |
---|
5 | |
---|
6 | """ |
---|
7 | Generic payload formats. |
---|
8 | """ |
---|
9 | |
---|
10 | from __future__ import division, absolute_import |
---|
11 | |
---|
12 | from twisted.python.compat import unicode |
---|
13 | |
---|
14 | NS_MOOD = 'http://jabber.org/protocol/mood' |
---|
15 | NS_TUNE = 'http://jabber.org/protocol/tune' |
---|
16 | |
---|
17 | class Mood: |
---|
18 | """ |
---|
19 | User mood. |
---|
20 | |
---|
21 | This represents a user's mood, as defined in |
---|
22 | U{XEP-0107<http://xmpp.org/extensions/xep-0107.html>}. |
---|
23 | |
---|
24 | @ivar value: The mood value. |
---|
25 | @ivar text: The optional natural-language description of, or reason |
---|
26 | for the mood. |
---|
27 | """ |
---|
28 | |
---|
29 | def __init__(self, value, text=None): |
---|
30 | self.value = value |
---|
31 | self.text = text |
---|
32 | |
---|
33 | |
---|
34 | def fromXml(self, element): |
---|
35 | """ |
---|
36 | Get a Mood instance from an XML representation. |
---|
37 | |
---|
38 | This class method parses the given XML document into a L{Mood} |
---|
39 | instances. |
---|
40 | |
---|
41 | @param element: The XML mood document. |
---|
42 | @type element: object providing |
---|
43 | L{IElement<twisted.words.xish.domish.IElement>} |
---|
44 | @return: A L{Mood} instance or C{None} if C{element} was not a mood |
---|
45 | document or if there was no mood value element. |
---|
46 | """ |
---|
47 | if element.uri != NS_MOOD or element.name != 'mood': |
---|
48 | return None |
---|
49 | |
---|
50 | value = None |
---|
51 | text = None |
---|
52 | |
---|
53 | for child in element.elements(): |
---|
54 | if child.uri != NS_MOOD: |
---|
55 | continue |
---|
56 | |
---|
57 | if child.name == 'text': |
---|
58 | text = unicode(child) |
---|
59 | else: |
---|
60 | value = child.name |
---|
61 | |
---|
62 | if value: |
---|
63 | return Mood(value, text) |
---|
64 | else: |
---|
65 | return None |
---|
66 | |
---|
67 | fromXml = classmethod(fromXml) |
---|
68 | |
---|
69 | |
---|
70 | |
---|
71 | class Tune: |
---|
72 | """ |
---|
73 | User tune. |
---|
74 | |
---|
75 | This represents a user's mood, as defined in |
---|
76 | U{XEP-0118<http://xmpp.org/extensions/xep-0118.html>}. |
---|
77 | |
---|
78 | @ivar artist: The artist or performer of the song or piece. |
---|
79 | @type artist: C{unicode} |
---|
80 | @ivar length: The duration of the song or piece in seconds. |
---|
81 | @type length: C{int} |
---|
82 | @ivar source: The collection (e.g. album) or other source. |
---|
83 | @type source: C{unicode} |
---|
84 | @ivar title: The title of the song or piece |
---|
85 | @type title: C{unicode} |
---|
86 | @ivar track: A unique identifier for the tune; e.g. the track number within |
---|
87 | the collection or the specific URI for the object. |
---|
88 | @type track: C{unicode} |
---|
89 | @ivar uri: A URI pointing to information about the song, collection, or |
---|
90 | artist. |
---|
91 | @type uri: C{str} |
---|
92 | |
---|
93 | """ |
---|
94 | |
---|
95 | artist = None |
---|
96 | length = None |
---|
97 | source = None |
---|
98 | title = None |
---|
99 | track = None |
---|
100 | uri = None |
---|
101 | |
---|
102 | def fromXml(self, element): |
---|
103 | """ |
---|
104 | Get a Tune instance from an XML representation. |
---|
105 | |
---|
106 | This class method parses the given XML document into a L{Tune} |
---|
107 | instances. |
---|
108 | |
---|
109 | @param element: The XML tune document. |
---|
110 | @type element: object providing |
---|
111 | L{IElement<twisted.words.xish.domish.IElement>} |
---|
112 | @return: A L{Tune} instance or C{None} if C{element} was not a tune |
---|
113 | document. |
---|
114 | """ |
---|
115 | if element.uri != NS_TUNE or element.name != 'tune': |
---|
116 | return None |
---|
117 | |
---|
118 | tune = Tune() |
---|
119 | |
---|
120 | for child in element.elements(): |
---|
121 | if child.uri != NS_TUNE: |
---|
122 | continue |
---|
123 | |
---|
124 | if child.name in ('artist', 'source', 'title', 'track', 'uri'): |
---|
125 | setattr(tune, child.name, unicode(child)) |
---|
126 | elif child.name == 'length': |
---|
127 | try: |
---|
128 | tune.length = int(unicode(child)) |
---|
129 | except ValueError: |
---|
130 | pass |
---|
131 | |
---|
132 | return tune |
---|
133 | |
---|
134 | fromXml = classmethod(fromXml) |
---|