From ed587e94d3b048968bce01e25bed4d1d66ef7838 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 8 Feb 2006 23:57:11 -0800 Subject: [PATCH 001/179] import a python media server based upon twisted among other things.. from: http://frungy.org/~tpot/weblog/2006/01/19#python-upnp-abandoned [git-p4: depot-paths = "//depot/": change = 717] --- ConnectionManager.py | 19 +++ ContentDirectory.py | 202 ++++++++++++++++++++++++ DIDLLite.py | 304 ++++++++++++++++++++++++++++++++++++ MediaServer.py | 9 ++ README | 8 + SSDP.py | 143 +++++++++++++++++ browse-zms.py | 53 +++++++ cdsclient | 67 ++++++++ connection-manager-scpd.xml | 6 + content-directory-scpd.xml | 7 + pymediaserv | 77 +++++++++ root-device.xml | 35 +++++ upnp.py | 18 +++ xml/browsemusic.xml | 32 ++++ xml/browsemusicgenres.xml | 11 ++ xml/browsephotos.xml | 14 ++ xml/browsetoplevel.xml | 22 +++ xml/browsetrackmetadata.xml | 8 + xmlpretty | 18 +++ 19 files changed, 1053 insertions(+) create mode 100644 ConnectionManager.py create mode 100644 ContentDirectory.py create mode 100644 DIDLLite.py create mode 100644 MediaServer.py create mode 100644 README create mode 100644 SSDP.py create mode 100755 browse-zms.py create mode 100755 cdsclient create mode 100644 connection-manager-scpd.xml create mode 100644 content-directory-scpd.xml create mode 100755 pymediaserv create mode 100644 root-device.xml create mode 100644 upnp.py create mode 100644 xml/browsemusic.xml create mode 100644 xml/browsemusicgenres.xml create mode 100644 xml/browsephotos.xml create mode 100644 xml/browsetoplevel.xml create mode 100644 xml/browsetrackmetadata.xml create mode 100755 xmlpretty diff --git a/ConnectionManager.py b/ConnectionManager.py new file mode 100644 index 0000000..1c191d9 --- /dev/null +++ b/ConnectionManager.py @@ -0,0 +1,19 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +# Connection Manager service + +from twisted.python import log +from twisted.web import resource, static, soap +from upnp import UPnPPublisher + +class ConnectionManagerControl(UPnPPublisher): + pass + +class ConnectionManagerServer(resource.Resource): + def __init__(self): + resource.Resource.__init__(self) + self.putChild('scpd.xml', static.File('connection-manager-scpd.xml')) + self.putChild('control', ConnectionManagerControl()) diff --git a/ContentDirectory.py b/ContentDirectory.py new file mode 100644 index 0000000..3e13a43 --- /dev/null +++ b/ContentDirectory.py @@ -0,0 +1,202 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +# +# This module implements the Content Directory Service (CDS) service +# type as documented in the ContentDirectory:1 Service Template +# Version 1.01 +# + +# +# TODO: Figure out a nicer pattern for debugging soap server calls as +# twisted swallows the tracebacks. At the moment I'm going: +# +# try: +# .... +# except: +# traceback.print_exc(file = log.logfile) +# + +from twisted.python import log +from twisted.web import resource, static + +from elementtree.ElementTree import Element, SubElement, tostring +from upnp import UPnPPublisher +from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack + +import traceback +from urllib import quote + +class ContentDirectoryControl(UPnPPublisher): + """This class implements the CDS actions over SOAP.""" + + # Required actions + + def soap_GetSearchCapabilities(self, *args, **kwargs): + """Return the searching capabilities supported by the device.""" + + log.msg('GetSearchCapabilities()') + + def soap_GetSortCapabilities(self, *args, **kwargs): + """Return the CSV list of meta-data tags that can be used in + sortCriteria.""" + + log.msg('GetSortCapabilities()') + + def soap_GetSystemUpdateID(self, *args, **kwargs): + """Return the current value of state variable SystemUpdateID.""" + + log.msg('GetSystemUpdateID()') + + BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') + + def soap_Browse(self, *args): + """Incrementally browse the native heirachy of the Content + Directory objects exposed by the Content Directory Service.""" + + (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, + SortCriteria) = args + + log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' + 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % + (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, + `RequestedCount`, `SortCriteria`)) + + didl = DIDLElement() + + try: + + if ObjectID == '0\\Music\\': + + c = Container('0\\Music\\Spotty\\', '0\\Music\\', 'Spotty') + c.childCount = 6 + c.searchable = 0 + didl.addItem(c) + + c = Container('0\\Music\\Foot\\', '0\\Music\\', 'Foot') + c.childCount = 1 + c.searchable = 0 + didl.addItem(c) + + + if ObjectID == '0\\Music\\Spotty\\': + + m = MusicTrack('0\\Music\\media\\foo.mp3', '0\\Music\\', 'foo.mp3') + + m.res = Resource('http://192.168.1.105:8080/media/foo.mp3', 'http-get:*:audio/mpeg:*') + m.res.size = 1234 + m.res.bitrate = 256 + m.genre = 'Others' + m.artist = 'Others' + m.album = 'Others' + + didl.addItem(m) + + result = {'BrowseResponse': {'Result': didl.toString() , + 'NumberReturned': didl.numItems(), + 'TotalMatches': didl.numItems(), + 'UpdateID': 0}} + + except: + traceback.print_exc(file=log.logfile) + + log.msg('Returning: %s' % result) + + return result + + # Optional actions + + def soap_Search(self, *args, **kwargs): + """Search for objects that match some search criteria.""" + + (ContainerID, SearchCriteria, Filter, StartingIndex, + RequestedCount, SortCriteria) = args + + log.msg('Search(ContainerID=%s, SearchCriteria=%s, Filter=%s, ' \ + 'StartingIndex=%s, RequestedCount=%s, SortCriteria=%s)' % + (`ContainerID`, `SearchCriteria`, `Filter`, + `StartingIndex`, `RequestedCount`, `SortCriteria`)) + + def soap_CreateObject(self, *args, **kwargs): + """Create a new object.""" + + (ContainerID, Elements) = args + + log.msg('CreateObject(ContainerID=%s, Elements=%s)' % + (`ContainerID`, `Elements`)) + + def soap_DestroyObject(self, *args, **kwargs): + """Destroy the specified object.""" + + (ObjectID) = args + + log.msg('DestroyObject(ObjectID=%s)' % `ObjectID`) + + def soap_UpdateObject(self, *args, **kwargs): + """Modify, delete or insert object metadata.""" + + (ObjectID, CurrentTagValue, NewTagValue) = args + + log.msg('UpdateObject(ObjectID=%s, CurrentTagValue=%s, ' \ + 'NewTagValue=%s)' % (`ObjectID`, `CurrentTagValue`, + `NewTagValue`)) + + def soap_ImportResource(self, *args, **kwargs): + """Transfer a file from a remote source to a local + destination in the Content Directory Service.""" + + (SourceURI, DestinationURI) = args + + log.msg('ImportResource(SourceURI=%s, DestinationURI=%s)' % + (`SourceURI`, `DestinationURI`)) + + def soap_ExportResource(self, *args, **kwargs): + """Transfer a file from a local source to a remote + destination.""" + + (SourceURI, DestinationURI) = args + + log.msg('ExportResource(SourceURI=%s, DestinationURI=%s)' % + (`SourceURI`, `DestinationURI`)) + + def soap_StopTransferResource(self, *args, **kwargs): + """Stop a file transfer initiated by ImportResource or + ExportResource.""" + + (TransferID) = args + + log.msg('StopTransferResource(TransferID=%s)' % TransferID) + + def soap_GetTransferProgress(self, *args, **kwargs): + """Query the progress of a file transfer initiated by + an ImportResource or ExportResource action.""" + + (TransferID, TransferStatus, TransferLength, TransferTotal) = args + + log.msg('GetTransferProgress(TransferID=%s, TransferStatus=%s, ' \ + 'TransferLength=%s, TransferTotal=%s)' % + (`TransferId`, `TransferStatus`, `TransferLength`, + `TransferTotal`)) + + def soap_DeleteResource(self, *args, **kwargs): + """Delete a specified resource.""" + + (ResourceURI) = args + + log.msg('DeleteResource(ResourceURI=%s)' % `ResourceURI`) + + def soap_CreateReference(self, *args, **kwargs): + """Create a reference to an existing object.""" + + (ContainerID, ObjectID) = args + + log.msg('CreateReference(ContainerID=%s, ObjectID=%s)' % + (`ContainerID`, `ObjectID`)) + +class ContentDirectoryServer(resource.Resource): + def __init__(self): + resource.Resource.__init__(self) + self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) + self.putChild('control', ContentDirectoryControl()) diff --git a/DIDLLite.py b/DIDLLite.py new file mode 100644 index 0000000..2884b23 --- /dev/null +++ b/DIDLLite.py @@ -0,0 +1,304 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface + +class Resource: + """An object representing a resource.""" + + def __init__(self, data, protocolInfo): + self.data = data + self.protocolInfo = protocolInfo + self.bitrate = None + self.size = None + + def toElement(self): + + root = Element('res') + root.attrib['protocolInfo'] = self.protocolInfo + root.text = self.data + + if self.bitrate is not None: + root.attrib['bitrate'] = str(self.bitrate) + + if self.size is not None: + root.attrib['size'] = str(self.size) + + return root + +class Object: + """The root class of the entire content directory class heirachy.""" + + klass = 'object' + creator = None + res = None + writeStatus = None + + def __init__(self, id, parentID, title, restricted = False, + creator = None): + + self.id = id + self.parentID = parentID + self.title = title + self.creator = creator + + if restricted: + self.restricted = '1' + else: + self.restricted = '0' + + def toElement(self): + + root = Element(self.elementName) + + root.attrib['id'] = self.id + root.attrib['parentID'] = self.parentID + SubElement(root, 'dc:title').text = self.title + SubElement(root, 'upnp:class').text = self.klass + + root.attrib['restricted'] = self.restricted + + if self.creator is not None: + SubElement(root, 'dc:creator').text = self.creator + + if self.res is not None: + root.append(self.res.toElement()) + + if self.writeStatus is not None: + SubElement(root, 'upnp:writeStatus').text = self.writeStatus + + return root + + def toString(self): + return tostring(self.toElement()) + +class Item(Object): + """A class used to represent atomic (non-container) content + objects.""" + + klass = Object.klass + '.item' + elementName = 'item' + refID = None + + def toElement(self): + + root = Object.toElement(self) + + if self.refID is not None: + SubElement(root, 'refID').text = self.refID + + return root + +class ImageItem(Item): + klass = Item.klass + '.imageItem' + +class Photo(ImageItem): + klass = ImageItem.klass + '.photo' + +class AudioItem(Item): + """A piece of content that when rendered generates some audio.""" + + klass = Item.klass + '.audioItem' + + genre = None + description = None + longDescription = None + publisher = None + language = None + relation = None + rights = None + + def toElement(self): + + root = Item.toElement(self) + + if self.genre is not None: + SubElement(root, 'upnp:genre').text = self.genre + + if self.description is not None: + SubElement(root, 'dc:description').text = self.description + + if self.longDescription is not None: + SubElement(root, 'upnp:longDescription').text = \ + self.longDescription + + if self.publisher is not None: + SubElement(root, 'dc:publisher').text = self.publisher + + if self.language is not None: + SubElement(root, 'dc:language').text = self.language + + if self.relation is not None: + SubElement(root, 'dc:relation').text = self.relation + + if self.rights is not None: + SubElement(root, 'dc:rights').text = self.rights + + return root + +class MusicTrack(AudioItem): + """A discrete piece of audio that should be interpreted as music.""" + + klass = AudioItem.klass + '.musicTrack' + + artist = None + album = None + originalTrackNumber = None + playlist = None + storageMedium = None + contributor = None + date = None + + def toElement(self): + + root = AudioItem.toElement(self) + + if self.artist is not None: + SubElement(root, 'upnp:artist').text = self.artist + + if self.album is not None: + SubElement(root, 'upnp:album').text = self.album + + if self.originalTrackNumber is not None: + SubElement(root, 'upnp:originalTrackNumber').text = \ + self.originalTrackNumber + + if self.playlist is not None: + SubElement(root, 'upnp:playlist').text = self.playlist + + if self.storageMedium is not None: + SubElement(root, 'upnp:storageMedium').text = self.storageMedium + + if self.contributor is not None: + SubElement(root, 'dc:contributor').text = self.contributor + + if self.date is not None: + SubElement(root, 'dc:date').text = self.date + + return root + +class AudioBroadcast(AudioItem): + klass = AudioItem.klass + '.audioBroadcast' + +class AudioBook(AudioItem): + klass = AudioItem.klass + '.audioBook' + +class VideoItem(Item): + klass = Item.klass + '.videoItem' + +class Movie(VideoItem): + klass = VideoItem.klass + '.movie' + +class VideoBroadcast(VideoItem): + klass = VideoItem.klass + '.videoBroadcast' + +class MusicVideoClip(VideoItem): + klass = VideoItem.klass + '.musicVideoClip' + +class PlaylistItem(Item): + klass = Item.klass + '.playlistItem' + +class TextItem(Item): + klass = Item.klass + '.textItem' + +class Container(Object): + """An object that can contain other objects.""" + + klass = Object.klass + '.container' + + elementName = 'container' + childCount = 0 + createClass = None + searchClass = None + searchable = None + + def __init__(self, id, parentID, title, restricted = 0, creator = None): + Object.__init__(self, id, parentID, title, restricted, creator) + + def toElement(self): + + root = Object.toElement(self) + + root.attrib['childCount'] = str(self.childCount) + + if self.createClass is not None: + SubElement(root, 'upnp:createclass').text = self.createClass + + if self.searchClass is not None: + if not isinstance(self.searchClass, (list, tuple)): + self.searchClass = ['searchClass'] + for i in searchClass: + SubElement(root, 'upnp:searchclass').text = i + + if self.searchable is not None: + root.attrib['searchable'] = str(self.searchable) + + return root + +class Person(Container): + klass = Container.klass + '.person' + +class MusicArtist(Person): + klass = Person.klass + '.musicArtist' + +class PlaylistContainer(Container): + klass = Container.klass + '.playlistContainer' + +class Album(Container): + klass = Container.klass + '.album' + +class MusicAlbum(Album): + klass = Album.klass + '.musicAlbum' + +class PhotoAlbum(Album): + klass = Album.klass + '.photoAlbum' + +class Genre(Container): + klass = Container.klass + '.genre' + +class MusicGenre(Genre): + klass = Genre.klass + '.musicGenre' + +class MovieGenre(Genre): + klass = Genre.klass + '.movieGenre' + +class StorageSystem(Container): + klass = Container.klass + '.storageSystem' + +class StorageVolume(Container): + klass = Container.klass + '.storageVolume' + +class StorageFolder(Container): + klass = Container.klass + '.storageFolder' + +class DIDLElement(_ElementInterface): + def __init__(self): + _ElementInterface.__init__(self, 'DIDL-Lite', {}) + self.attrib['xmlns'] = 'urn:schemas-upnp-org:metadata-1-0/DIDL-Lite' + self.attrib['xmlns:dc'] = 'http://purl.org/dc/elements/1.1/' + self.attrib['xmlns:upnp'] = 'urn:schemas-upnp-org:metadata-1-0/upnp' + + def addContainer(self, id, parentID, title, restricted = False): + e = Container(id, parentID, title, restricted, creator = '') + self.append(e.toElement()) + + def addItem(self, item): + self.append(item.toElement()) + + def numItems(self): + return len(self) + + def toString(self): + return tostring(self) + +if __name__ == '__main__': + + root = DIDLElement() + root.addContainer('0\Movie\\', '0\\', 'Movie') + root.addContainer('0\Music\\', '0\\', 'Music') + root.addContainer('0\Photo\\', '0\\', 'Photo') + root.addContainer('0\OnlineMedia\\', '0\\', 'OnlineMedia') + + print tostring(root) diff --git a/MediaServer.py b/MediaServer.py new file mode 100644 index 0000000..63724d0 --- /dev/null +++ b/MediaServer.py @@ -0,0 +1,9 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +from twisted.web import static + +class MediaServer(static.File): + pass diff --git a/README b/README new file mode 100644 index 0000000..9a3e8d4 --- /dev/null +++ b/README @@ -0,0 +1,8 @@ +This code has been abandoned, but released in the hope that it might +be useful for someone. It is licensed under the MIT license at: + +http://opensource.org/licenses/mit-license.php + + +Tim Potter +2006-01-19 diff --git a/SSDP.py b/SSDP.py new file mode 100644 index 0000000..f1ad76b --- /dev/null +++ b/SSDP.py @@ -0,0 +1,143 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +# +# Implementation of SSDP server under Twisted Python. +# + +import string + +from twisted.python import log +from twisted.internet.protocol import DatagramProtocol + +# TODO: Is there a better way of hooking the SSDPServer into a reactor +# without having to know the default SSDP port and multicast address? +# There must be a twisted idiom for doing this. + +SSDP_PORT = 1900 +SSDP_ADDR = '239.255.255.250' + +# TODO: Break out into a HTTPOverUDP class and implement +# process_SEARCH(), process_NOTIFY() methods. Create UPNP specific +# class to handle services etc. + +class SSDPServer(DatagramProtocol): + """A class implementing a SSDP server. The notifyReceived and + searchReceived methods are called when the appropriate type of + datagram is received by the server.""" + + elements = {} + known = {} + + def datagramReceived(self, data, (host, port)): + """Handle a received multicast datagram.""" + + # Break up message in to command and headers + + data = string.replace(data, '\r', '') + data = string.replace(data, ': ', ':') + lines = string.split(data, '\n') + lines = filter(lambda x: len(x) > 0, lines) + cmd = string.split(lines[0], ' ') + + headers = dict([string.split(x, ':', 1) for x in lines[1:]]) + + # TODO: datagram may contain a payload, i.e Content-Length + # header is > 0. Maybe use some twisted HTTP object to do the + # parsing for us. + + # SSDP discovery + + if cmd[0] == 'M-SEARCH' and cmd[1] == '*': + self.discoveryRequest(headers, (host, port)) + + # SSDP presence + + if cmd[0] == 'NOTIFY' and cmd[1] == '*': + self.notifyReceived(headers, (host, port)) + + def discoveryRequest(self, headers, (host, port)): + """Process a discovery request. The response must be sent to + the address specified by (host, port).""" + + log.msg('Discovery request for %s' % headers['ST']) + + # Do we know about this service? + + if not self.known.has_key(headers['ST']): + return + + # Generate a response + + response = [] + response.append('HTTP/1.1 200 OK') + + for k, v in self.known[headers['ST']].items(): + response.append('%s: %s' % (k, v)) + + log.msg('responding with: %s' % response) + + self.transport.write( + string.join(response, '\r\n') + '\r\n\r\n', (host, port)) + + def register(self, usn, st, location): + """Register a service or device that this SSDP server will + respond to.""" + + log.msg('Registering %s' % st) + + self.known[st] = {} + self.known[st]['USN'] = usn + self.known[st]['LOCATION'] = location + self.known[st]['ST'] = st + self.known[st]['EXT'] = '' + self.known[st]['SERVER'] = 'Twisted, UPnP/1.0, python-upnp' + self.known[st]['CACHE-CONTROL'] = 'max-age=1800' + + def notifyReceived(self, headers, (host, port)): + """Process a presence announcement. We just remember the + details of the SSDP service announced.""" + + if headers['NTS'] == 'ssdp:alive': + + if not self.elements.has_key(headers['NT']): + + # Register device/service + + self.elements[headers['NT']] = {} + self.elements[headers['NT']]['USN'] = headers['USN'] + self.elements[headers['NT']]['host'] = (host, port) + + log.msg('Detected presence for %s' % headers['NT']) + + elif headers['NTS'] == 'ssdp:byebye': + + if self.elements.has_key(headers['NT']): + + # Unregister device/service + + del(self.elements[headers['NT']]) + + log.msg('Detected absence for %s' % headers['NT']) + + else: + log.msg('Unknown subtype %s for notification type %s' % + (headers['NTS'], headers['NT'])) + + def findService(self, name): + """Return information about a service registered over SSDP.""" + + # TODO: Implement me. + + # TODO: Send out a discovery request if we haven't registered + # a presence announcement. + + def findDevice(self, name): + """Return information about a device registered over SSDP.""" + + # TODO: Implement me. + + # TODO: Send out a discovery request if we haven't registered + # a presence announcement. diff --git a/browse-zms.py b/browse-zms.py new file mode 100755 index 0000000..743e090 --- /dev/null +++ b/browse-zms.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# +# Small client for sending text to a socket and displaying the result. +# + +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +from twisted.internet import reactor, error +from twisted.internet.protocol import Protocol, ClientFactory + +class Send(Protocol): + def connectionMade(self): + self.transport.write('''POST /ContentDirectory/control HTTP/1.1\r +Host: 192.168.126.1:80\r +User-Agent: POSIX, UPnP/1.0, Intel MicroStack/1.0.1423\r +SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"\r +Content-Type: text/xml\r +Content-Length: 511\r +\r +\r +\r + \r + \r + \r + 0\OnlineMedia\Internet radio\\r + BrowseDirectChildren\r + *\r + 0\r + 7\r + \r + \r + \r + \r\n''') + + def dataReceived(self, data): + print(data) + + def connectionLost(self, reason): + if reason.type != error.ConnectionDone: + print str(reason) + reactor.stop() + +class SendFactory(ClientFactory): + protocol = Send + +host = '192.168.126.128' +port = 5643 + +reactor.connectTCP(host, port, SendFactory()) +reactor.run() diff --git a/cdsclient b/cdsclient new file mode 100755 index 0000000..06e3119 --- /dev/null +++ b/cdsclient @@ -0,0 +1,67 @@ +#!/usr/bin/python +# +# Test harness for UPnP ContentDirectory:1 service. +# + +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +from twisted.web import client +from twisted.internet import reactor +from twisted.python import usage + +import sys, string, SOAPpy + +class UPnPSOAPProxy: + """A proxy for making UPnP SOAP calls.""" + + def __init__(self, url): + self.url = url + + def _cbGotResult(self, result): + return SOAPpy.parseSOAPRPC(result) + + def callRemote(self, method, *args, **kwargs): + + payload = SOAPpy.buildSOAP(args = args, kw = kwargs, method = method) + payload = string.replace(payload, '\n', '\r\n') + + action = \ + '"urn:schemas-upnp-org:service:ContentDirectory:1#%s"' % method + + page = client.getPage(self.url, postdata = payload, method = 'POST', + headers = {'Content-Type': 'text/xml', + 'SOAPACTION': action}) + + return page.addCallback(self._cbGotResult) + +class Options(usage.Options): + pass + +def printResult(value): + print value + reactor.stop() + +def printError(error): + print 'error', error + reactor.stop() + +#proxy = UPnPSOAPProxy('http://192.168.126.128:5643/ContentDirectory/control') +proxy = UPnPSOAPProxy('http://127.0.0.1:8080/ContentDirectory/control') +#proxy = UPnPSOAPProxy('http://16.176.65.48:5643/ContentDirectory/control') + +#proxy.callRemote('GetSearchCapabilities').addCallbacks(printResult, printError) +#proxy.callRemote('GetSortCapabilities').addCallbacks(printResult, printError) + +proxy.callRemote('Browse', + ObjectID = '0\\Music\\Genres\\Others\\chimes.wav', +# BrowseFlag = 'BrowseDirectChildren', + BrowseFlag = 'BrowseMetadata', + Filter = '*', + StartingIndex = 0, + RequestedCount = 700, + SortCriteria = None).addCallbacks(printResult, printError) + +reactor.run() diff --git a/connection-manager-scpd.xml b/connection-manager-scpd.xml new file mode 100644 index 0000000..3c7d500 --- /dev/null +++ b/connection-manager-scpd.xml @@ -0,0 +1,6 @@ +10GetCurrentConnectionInfoConnectionIDinA_ARG_TYPE_ConnectionIDRcsIDoutA_ARG_TYPE_RcsIDAVTransportIDoutA_ARG_TYPE_AVTransportIDProtocolInfooutA_ARG_TYPE_ProtocolInfoPeerConnectionManageroutA_ARG_TYPE_ConnectionManagerPeerConnectionIDoutA_ARG_TYPE_ConnectionIDDirectionoutA_ARG_TYPE_DirectionStatusoutA_ARG_TYPE_ConnectionStatusGetProtocolInfoSourceoutSourceProtocolInfoSinkoutSinkProtocolInfoGetCurrentConnectionIDsConnectionIDsoutCurrentConnectionIDsA_ARG_TYPE_ProtocolInfostringA_ARG_TYPE_ConnectionStatusstringOKContentFormatMismatchInsufficientBandwidthUnreliableChannelUnknownA_ARG_TYPE_AVTransportIDi4A_ARG_TYPE_RcsIDi4A_ARG_TYPE_ConnectionIDi4A_ARG_TYPE_ConnectionManagerstring +SourceProtocolInfostringSinkProtocolInfostringA_ARG_TYPE_DirectionstringInputOutputCurrentConnectionIDsstring diff --git a/content-directory-scpd.xml b/content-directory-scpd.xml new file mode 100644 index 0000000..b43ba47 --- /dev/null +++ b/content-directory-scpd.xml @@ -0,0 +1,7 @@ +10BrowseObjectIDinA_ARG_TYPE_ObjectIDBrowseFlaginA_ARG_TYPE_BrowseFlagFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_T +YPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSortCapabilitiesSortCapsoutSortCapabilitiesGetSystemUpdateIDIdoutSystemUpdateIDSearchContainerIDinA_ARG_TYPE_ObjectIDSearchCriteriainA_ARG_TYPE_SearchCriteriaFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSearchCapabilitiesSearchCapsoutSearchCapabilitiesA_ARG_TYPE_BrowseFlagstringBrowseMetadataBrowseDirectChildren +A_ARG_TYPE_SearchCriteriastringSystemUpdateIDui4A_ARG_TYPE_Countui4A_ARG_TYPE_SortCriteriastringSortCapabilitiesstringA_ARG_TYPE_Indexui4A_ARG_TYPE_ObjectIDstringA_ARG_TYPE_UpdateIDui4A_ARG_TYPE_ResultstringSearchCapabilitiesstringA_ARG_TYPE_Filterstring diff --git a/pymediaserv b/pymediaserv new file mode 100755 index 0000000..b590f45 --- /dev/null +++ b/pymediaserv @@ -0,0 +1,77 @@ +#!/usr/bin/python + +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +import sys +from twisted.python import log +from twisted.internet import reactor + +listenAddr = sys.argv[1] + +log.startLogging(sys.stdout) + +# Create SSDP server + +from SSDP import SSDPServer, SSDP_PORT, SSDP_ADDR + +s = SSDPServer() + +port = reactor.listenMulticast(SSDP_PORT, s, SSDP_ADDR) +port.joinGroup(SSDP_ADDR, listenAddr) + +uuid = 'uuid:XVKKBUKYRDLGJQDTPOT' + +s.register('%s::upnp:rootdevice' % uuid, + 'upnp:rootdevice', + 'http://%s:8080/root-device.xml' % listenAddr) + +s.register(uuid, + uuid, + 'http://%s:8080/root-device.xml' % listenAddr) + +s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid, + 'urn:schemas-upnp-org:device:MediaServer:1', + 'http://%s:8080/root-device.xml' % listenAddr) + +s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid, + 'urn:schemas-upnp-org:device:ConnectionManager:1', + 'http://%s:8080/root-device.xml' % listenAddr) + +s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid, + 'urn:schemas-upnp-org:device:ContentDirectory:1', + 'http://%s:8080/root-device.xml' % listenAddr) + +# Create SOAP server + +from twisted.web import server, resource, static +from ContentDirectory import ContentDirectoryServer +from ConnectionManager import ConnectionManagerServer + +class WebServer(resource.Resource): + def __init__(self): + resource.Resource.__init__(self) + +class RootDevice(static.File): + def __init__(self): + static.File.__init__(self, 'root-device.xml', defaultType = 'text/xml') + +root = WebServer() +root.putChild('ContentDirectory', ContentDirectoryServer()) +root.putChild('ConnectionManager', ConnectionManagerServer()) +root.putChild('root-device.xml', RootDevice()) + +# Area of server to serve media files from + +from MediaServer import MediaServer + +root.putChild('media', static.File('media')) + +site = server.Site(root) +reactor.listenTCP(8080, site) + +# Main loop + +reactor.run() diff --git a/root-device.xml b/root-device.xml new file mode 100644 index 0000000..f74caba --- /dev/null +++ b/root-device.xml @@ -0,0 +1,35 @@ + + + +1 +0 + + +urn:schemas-upnp-org:device:MediaServer:1 +1.0 +Python Media Server +Zensonic +http://www.redsonic.com +UPnP/AV 1.0 Compliant Media Server +PC-MediaServer-DSM +103 +0000001 +uuid:XVKKBUKYRDLGJQDTPOT + + +urn:schemas-upnp-org:service:ConnectionManager:1 +urn:upnp-org:serviceId:CMGR_0-99 +ConnectionManager/scpd.xml +ConnectionManager/control +ConnectionManager/event + + +urn:schemas-upnp-org:service:ContentDirectory:1 +urn:upnp-org:serviceId:CDS_0-99 +ContentDirectory/scpd.xml +ContentDirectory/control +ContentDirectory/event + + + + diff --git a/upnp.py b/upnp.py new file mode 100644 index 0000000..12254f4 --- /dev/null +++ b/upnp.py @@ -0,0 +1,18 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# (c) 2005, Tim Potter + +from twisted.web import soap + +import SOAPpy + +class UPnPPublisher(soap.SOAPPublisher): + """UPnP requires OUT parameters to be returned in a slightly + different way than the SOAPPublisher class does.""" + + def _gotResult(self, result, request, methodName): + response = SOAPpy.buildSOAP(kw=result, + encoding=self.encoding) + self._sendResponse(request, response) + diff --git a/xml/browsemusic.xml b/xml/browsemusic.xml new file mode 100644 index 0000000..671ee27 --- /dev/null +++ b/xml/browsemusic.xml @@ -0,0 +1,32 @@ + + + All Tracks + object.container.storageFolder + + + + Playlists + object.container + + + + Genres + object.container + + + + Artists + object.container + + + + Albums + object.container + + + + Folders + object.container + + + diff --git a/xml/browsemusicgenres.xml b/xml/browsemusicgenres.xml new file mode 100644 index 0000000..065ec66 --- /dev/null +++ b/xml/browsemusicgenres.xml @@ -0,0 +1,11 @@ + + + chimes.wav + object.item.audioItem.musicTrack + + Others + Others + Others + http://16.176.65.48:5643/web/C:\temp\Resource%20Kit\kixtart\chimes.wav + + diff --git a/xml/browsephotos.xml b/xml/browsephotos.xml new file mode 100644 index 0000000..bde5967 --- /dev/null +++ b/xml/browsephotos.xml @@ -0,0 +1,14 @@ + + + All Photos + object.container.album.photoAlbum + + http://16.176.65.48:5643/web/C:\temp\foo.jpg.thumb + + + Folders + object.container.album.photoAlbum + + http://16.176.65.48:5643/web/C:\temp\foo.jpg.thumb + + diff --git a/xml/browsetoplevel.xml b/xml/browsetoplevel.xml new file mode 100644 index 0000000..27a7e2e --- /dev/null +++ b/xml/browsetoplevel.xml @@ -0,0 +1,22 @@ + + + Movie + object.container + + + + Music + object.container + + + + Photo + object.container + + + + OnlineMedia + object.container + + + diff --git a/xml/browsetrackmetadata.xml b/xml/browsetrackmetadata.xml new file mode 100644 index 0000000..94e5f37 --- /dev/null +++ b/xml/browsetrackmetadata.xml @@ -0,0 +1,8 @@ + + + chimes.wav + object.item.audioItem.musicTrack + + + + diff --git a/xmlpretty b/xmlpretty new file mode 100755 index 0000000..800b52a --- /dev/null +++ b/xmlpretty @@ -0,0 +1,18 @@ +#!/usr/bin/python + +# (c) 2005, Tim Potter + +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +"""Take XML on stdin and produce pretty-printed XML on stdout.""" + +import sys +from xml.dom import minidom + +str = "" +for s in sys.stdin.readlines(): + str = str + s[:-1] # Eat trailing \n + +doc = minidom.parseString(str) +print doc.toprettyxml(indent = " ") From 30b233410dda3eaaf10e403a655cffb7b3448fc4 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 00:01:10 -0800 Subject: [PATCH 002/179] improve SSDP, like not making headers case sensitive... send out notifications when we register an address... make it so we send our responses on our own ip, and not the multicast, along with turning off multicast loopback so we don't see our own traffic... Move the registering the SSDP services after the start of the http server since we now send out notifications... [git-p4: depot-paths = "//depot/": change = 718] --- SSDP.py | 84 ++++++++++++++++++++++++++++++++++------------------- pymediaserv | 65 +++++++++++++++++++++++++---------------- 2 files changed, 94 insertions(+), 55 deletions(-) diff --git a/SSDP.py b/SSDP.py index f1ad76b..9ead2d8 100644 --- a/SSDP.py +++ b/SSDP.py @@ -27,7 +27,9 @@ class SSDPServer(DatagramProtocol): """A class implementing a SSDP server. The notifyReceived and searchReceived methods are called when the appropriate type of datagram is received by the server.""" - + + # not used yet + stdheaders = [ ('Server', 'Twisted, UPnP/1.0, python-upnp'), ] elements = {} known = {} @@ -36,37 +38,40 @@ class SSDPServer(DatagramProtocol): # Break up message in to command and headers - data = string.replace(data, '\r', '') - data = string.replace(data, ': ', ':') - lines = string.split(data, '\n') - lines = filter(lambda x: len(x) > 0, lines) + log.msg('respond to: %s:%d' % (host, port)) + header, payload = data.split('\r\n\r\n') + lines = header.split('\r\n') cmd = string.split(lines[0], ' ') + lines = map(lambda x: x.replace(': ', ':', 1), lines[1:]) + lines = filter(lambda x: len(x) > 0, lines) - headers = dict([string.split(x, ':', 1) for x in lines[1:]]) - - # TODO: datagram may contain a payload, i.e Content-Length - # header is > 0. Maybe use some twisted HTTP object to do the - # parsing for us. - - # SSDP discovery + headers = [string.split(x, ':', 1) for x in lines[1:]] + headers = dict(map(lambda x: (x[0].lower(), x[1]), headers)) if cmd[0] == 'M-SEARCH' and cmd[1] == '*': + # SSDP discovery self.discoveryRequest(headers, (host, port)) - - # SSDP presence - - if cmd[0] == 'NOTIFY' and cmd[1] == '*': + elif cmd[0] == 'NOTIFY' and cmd[1] == '*': + # SSDP presence self.notifyReceived(headers, (host, port)) + else: + log.msg('Unknown SSDP command %s %s' % cmd) def discoveryRequest(self, headers, (host, port)): """Process a discovery request. The response must be sent to the address specified by (host, port).""" - log.msg('Discovery request for %s' % headers['ST']) + log.msg('Discovery request for %s' % headers['st']) # Do we know about this service? - if not self.known.has_key(headers['ST']): + if headers['st'] == 'ssdp:all': + for i in self.known: + hcopy = dict(headers.iteritems()) + hcopy['st'] = i + self.discoveryRequest(hcopy, (host, post)) + return + if not self.known.has_key(headers['st']): return # Generate a response @@ -74,11 +79,12 @@ class SSDPServer(DatagramProtocol): response = [] response.append('HTTP/1.1 200 OK') - for k, v in self.known[headers['ST']].items(): + for k, v in self.known[headers['st']].items(): response.append('%s: %s' % (k, v)) log.msg('responding with: %s' % response) + # TODO: we should wait random(headers['mx']) self.transport.write( string.join(response, '\r\n') + '\r\n\r\n', (host, port)) @@ -95,36 +101,54 @@ class SSDPServer(DatagramProtocol): self.known[st]['EXT'] = '' self.known[st]['SERVER'] = 'Twisted, UPnP/1.0, python-upnp' self.known[st]['CACHE-CONTROL'] = 'max-age=1800' + self.doNotify(st) + + def doNotify(self, st): + """Do notification""" + + log.msg('Sending alive notification for %s' % st) + + resp = [ 'NOTIFY * HTTP/1.1', + 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), + 'NTS: ssdp:alive', + ] + stcpy = dict(self.known[st].iteritems()) + stcpy['NT'] = stcpy['ST'] + del stcpy['ST'] + resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) + log.msg(repr(resp)) + self.transport.write( + string.join(resp, '\r\n') + '\r\n\r\n', (SSDP_ADDR, SSDP_PORT)) def notifyReceived(self, headers, (host, port)): """Process a presence announcement. We just remember the details of the SSDP service announced.""" - if headers['NTS'] == 'ssdp:alive': + if headers['nts'] == 'ssdp:alive': - if not self.elements.has_key(headers['NT']): + if not self.elements.has_key(headers['nt']): # Register device/service - self.elements[headers['NT']] = {} - self.elements[headers['NT']]['USN'] = headers['USN'] - self.elements[headers['NT']]['host'] = (host, port) + self.elements[headers['nt']] = {} + self.elements[headers['nt']]['USN'] = headers['usn'] + self.elements[headers['nt']]['host'] = (host, port) - log.msg('Detected presence for %s' % headers['NT']) + log.msg('Detected presence for %s' % headers['nt']) - elif headers['NTS'] == 'ssdp:byebye': + elif headers['nts'] == 'ssdp:byebye': - if self.elements.has_key(headers['NT']): + if self.elements.has_key(headers['nt']): # Unregister device/service - del(self.elements[headers['NT']]) + del(self.elements[headers['nt']]) - log.msg('Detected absence for %s' % headers['NT']) + log.msg('Detected absence for %s' % headers['nt']) else: log.msg('Unknown subtype %s for notification type %s' % - (headers['NTS'], headers['NT'])) + (headers['nts'], headers['nt'])) def findService(self, name): """Return information about a service registered over SSDP.""" diff --git a/pymediaserv b/pymediaserv index b590f45..e64ce59 100755 --- a/pymediaserv +++ b/pymediaserv @@ -1,15 +1,28 @@ -#!/usr/bin/python +#!/usr/bin/env python # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # (c) 2005, Tim Potter +import random +import string import sys from twisted.python import log from twisted.internet import reactor +def generateuuid(): + if False: + return 'asdflkjewoifjslkdfj' + return ''.join(map(lambda x: random.choice(string.letters), xrange(20))) + listenAddr = sys.argv[1] +if len(sys.argv) > 2: + listenPort = int(sys.argv[2]) + if listenPort < 1024 or listenPort > 65535: + raise ValueError, 'port out of range' +else: + listenPort = 8080 log.startLogging(sys.stdout) @@ -19,30 +32,11 @@ from SSDP import SSDPServer, SSDP_PORT, SSDP_ADDR s = SSDPServer() -port = reactor.listenMulticast(SSDP_PORT, s, SSDP_ADDR) -port.joinGroup(SSDP_ADDR, listenAddr) - -uuid = 'uuid:XVKKBUKYRDLGJQDTPOT' - -s.register('%s::upnp:rootdevice' % uuid, - 'upnp:rootdevice', - 'http://%s:8080/root-device.xml' % listenAddr) - -s.register(uuid, - uuid, - 'http://%s:8080/root-device.xml' % listenAddr) - -s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid, - 'urn:schemas-upnp-org:device:MediaServer:1', - 'http://%s:8080/root-device.xml' % listenAddr) - -s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid, - 'urn:schemas-upnp-org:device:ConnectionManager:1', - 'http://%s:8080/root-device.xml' % listenAddr) +port = reactor.listenMulticast(SSDP_PORT, s) +port.joinGroup(SSDP_ADDR) +port.setLoopbackMode(0) # don't get our own sends -s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid, - 'urn:schemas-upnp-org:device:ContentDirectory:1', - 'http://%s:8080/root-device.xml' % listenAddr) +uuid = 'uuid:' + generateuuid() # Create SOAP server @@ -70,7 +64,28 @@ from MediaServer import MediaServer root.putChild('media', static.File('media')) site = server.Site(root) -reactor.listenTCP(8080, site) +reactor.listenTCP(listenPort, site) + +# we need to do this after the children are there, since we send notifies +s.register('%s::upnp:rootdevice' % uuid, + 'upnp:rootdevice', + 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + +s.register(uuid, + uuid, + 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + +s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid, + 'urn:schemas-upnp-org:device:MediaServer:1', + 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + +s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid, + 'urn:schemas-upnp-org:device:ConnectionManager:1', + 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + +s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid, + 'urn:schemas-upnp-org:device:ContentDirectory:1', + 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) # Main loop From 25dd7972fe0a49304e345616558a8c0330636eb5 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 00:26:10 -0800 Subject: [PATCH 003/179] dynamicly change the root device's xml description... [git-p4: depot-paths = "//depot/": change = 719] --- pymediaserv | 22 +++++++++++++++------- root-device.xml | 23 +++++++++++++---------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/pymediaserv b/pymediaserv index e64ce59..ba201d0 100755 --- a/pymediaserv +++ b/pymediaserv @@ -6,6 +6,7 @@ # (c) 2005, Tim Potter import random +import socket import string import sys from twisted.python import log @@ -37,6 +38,7 @@ port.joinGroup(SSDP_ADDR) port.setLoopbackMode(0) # don't get our own sends uuid = 'uuid:' + generateuuid() +urlbase = 'http://%s:%d/' % (listenAddr, listenPort) # Create SOAP server @@ -48,9 +50,15 @@ class WebServer(resource.Resource): def __init__(self): resource.Resource.__init__(self) -class RootDevice(static.File): +class RootDevice(static.Data): def __init__(self): - static.File.__init__(self, 'root-device.xml', defaultType = 'text/xml') + r = { + 'hostname': socket.gethostname(), + 'uuid': uuid, + 'urlbase': urlbase, + } + d = file('root-device.xml').read() % r + static.Data.__init__(self, d, 'text/xml') root = WebServer() root.putChild('ContentDirectory', ContentDirectoryServer()) @@ -69,23 +77,23 @@ reactor.listenTCP(listenPort, site) # we need to do this after the children are there, since we send notifies s.register('%s::upnp:rootdevice' % uuid, 'upnp:rootdevice', - 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + urlbase + 'root-device.xml') s.register(uuid, uuid, - 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid, 'urn:schemas-upnp-org:device:MediaServer:1', - 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid, 'urn:schemas-upnp-org:device:ConnectionManager:1', - 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid, 'urn:schemas-upnp-org:device:ContentDirectory:1', - 'http://%s:%d/root-device.xml' % (listenAddr, listenPort)) + urlbase + 'root-device.xml') # Main loop diff --git a/root-device.xml b/root-device.xml index f74caba..5e6bc32 100644 --- a/root-device.xml +++ b/root-device.xml @@ -4,32 +4,35 @@ 1 0 +%(urlbase)s urn:schemas-upnp-org:device:MediaServer:1 -1.0 -Python Media Server -Zensonic -http://www.redsonic.com -UPnP/AV 1.0 Compliant Media Server +PyMedS (%(hostname)s) +JMGDIE +http://www.funkthat.com/ +hopefully a UPnP/AV 1.0 Compliant Media Server PC-MediaServer-DSM -103 -0000001 -uuid:XVKKBUKYRDLGJQDTPOT +1 +about:blank +0 +uuid:%(uuid)s + urn:schemas-upnp-org:service:ConnectionManager:1 -urn:upnp-org:serviceId:CMGR_0-99 +urn:upnp-org:serviceId:ConnectionManager ConnectionManager/scpd.xml ConnectionManager/control ConnectionManager/event urn:schemas-upnp-org:service:ContentDirectory:1 -urn:upnp-org:serviceId:CDS_0-99 +urn:upnp-org:serviceId:ContenDirectory ContentDirectory/scpd.xml ContentDirectory/control ContentDirectory/event + From 82eba4cbccf1b86ba19108d025d8ac26d5b944f6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 00:38:04 -0800 Subject: [PATCH 004/179] don't immediately reply to the request, wait a random time [0, MX] before repling as per draft-goland-http-udp-04.txt [git-p4: depot-paths = "//depot/": change = 720] --- SSDP.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/SSDP.py b/SSDP.py index 9ead2d8..6f117a1 100644 --- a/SSDP.py +++ b/SSDP.py @@ -7,10 +7,12 @@ # Implementation of SSDP server under Twisted Python. # +import random import string from twisted.python import log from twisted.internet.protocol import DatagramProtocol +from twisted.internet import reactor # TODO: Is there a better way of hooking the SSDPServer into a reactor # without having to know the default SSDP port and multicast address? @@ -45,7 +47,7 @@ class SSDPServer(DatagramProtocol): lines = map(lambda x: x.replace(': ', ':', 1), lines[1:]) lines = filter(lambda x: len(x) > 0, lines) - headers = [string.split(x, ':', 1) for x in lines[1:]] + headers = [string.split(x, ':', 1) for x in lines] headers = dict(map(lambda x: (x[0].lower(), x[1]), headers)) if cmd[0] == 'M-SEARCH' and cmd[1] == '*': @@ -82,11 +84,12 @@ class SSDPServer(DatagramProtocol): for k, v in self.known[headers['st']].items(): response.append('%s: %s' % (k, v)) - log.msg('responding with: %s' % response) + delay = random.randint(0, int(headers['mx'])) + log.msg('responding in %d with: %s' % (delay, response)) # TODO: we should wait random(headers['mx']) - self.transport.write( - string.join(response, '\r\n') + '\r\n\r\n', (host, port)) + reactor.callLater(delay, self.transport.write, + string.join(response, '\r\n') + '\r\n\r\n', (host, port)) def register(self, usn, st, location): """Register a service or device that this SSDP server will From 28d473c4a66e105a14143e3c9f1d76eba68f36e9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 00:59:58 -0800 Subject: [PATCH 005/179] make the extra double \r\n at the end part of the join.. [git-p4: depot-paths = "//depot/": change = 721] --- SSDP.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/SSDP.py b/SSDP.py index 6f117a1..23490e9 100644 --- a/SSDP.py +++ b/SSDP.py @@ -84,12 +84,10 @@ class SSDPServer(DatagramProtocol): for k, v in self.known[headers['st']].items(): response.append('%s: %s' % (k, v)) + response.extend(('', '')) delay = random.randint(0, int(headers['mx'])) - log.msg('responding in %d with: %s' % (delay, response)) - - # TODO: we should wait random(headers['mx']) reactor.callLater(delay, self.transport.write, - string.join(response, '\r\n') + '\r\n\r\n', (host, port)) + '\r\n'.join(response), (host, port)) def register(self, usn, st, location): """Register a service or device that this SSDP server will @@ -119,9 +117,8 @@ class SSDPServer(DatagramProtocol): stcpy['NT'] = stcpy['ST'] del stcpy['ST'] resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) - log.msg(repr(resp)) - self.transport.write( - string.join(resp, '\r\n') + '\r\n\r\n', (SSDP_ADDR, SSDP_PORT)) + resp.extend(('', '')) + self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) def notifyReceived(self, headers, (host, port)): """Process a presence announcement. We just remember the From 853b81c01b225c66cc1ebcc56811663c8a489471 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 01:26:37 -0800 Subject: [PATCH 006/179] fix these files.. make them all one line, somehow they got cut up... this now makes Intel's Device Spy see my UPnP device!! wh00t! [git-p4: depot-paths = "//depot/": change = 722] --- connection-manager-scpd.xml | 7 +------ content-directory-scpd.xml | 8 +------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/connection-manager-scpd.xml b/connection-manager-scpd.xml index 3c7d500..1359fd7 100644 --- a/connection-manager-scpd.xml +++ b/connection-manager-scpd.xml @@ -1,6 +1 @@ -10GetCurrentConnectionInfoConnectionIDinA_ARG_TYPE_ConnectionIDRcsIDoutA_ARG_TYPE_RcsIDAVTransportIDoutA_ARG_TYPE_AVTransportIDProtocolInfooutA_ARG_TYPE_ProtocolInfoPeerConnectionManageroutA_ARG_TYPE_ConnectionManagerPeerConnectionIDoutA_ARG_TYPE_ConnectionIDDirectionoutA_ARG_TYPE_DirectionStatusoutA_ARG_TYPE_ConnectionStatusGetProtocolInfoSourceoutSourceProtocolInfoSinkoutSinkProtocolInfoGetCurrentConnectionIDsConnectionIDsoutCurrentConnectionIDsA_ARG_TYPE_ProtocolInfostringA_ARG_TYPE_ConnectionStatusstringOKContentFormatMismatchInsufficientBandwidthUnreliableChannelUnknownA_ARG_TYPE_AVTransportIDi4A_ARG_TYPE_RcsIDi4A_ARG_TYPE_ConnectionIDi4A_ARG_TYPE_ConnectionManagerstring -SourceProtocolInfostringSinkProtocolInfostringA_ARG_TYPE_DirectionstringInputOutputCurrentConnectionIDsstring +10GetCurrentConnectionInfoConnectionIDinA_ARG_TYPE_ConnectionIDRcsIDoutA_ARG_TYPE_RcsIDAVTransportIDoutA_ARG_TYPE_AVTransportIDProtocolInfooutA_ARG_TYPE_ProtocolInfoPeerConnectionManageroutA_ARG_TYPE_ConnectionManagerPeerConnectionIDoutA_ARG_TYPE_ConnectionIDDirectionoutA_ARG_TYPE_DirectionStatusoutA_ARG_TYPE_ConnectionStatusGetProtocolInfoSourceoutSourceProtocolInfoSinkoutSinkProtocolInfoGetCurrentConnectionIDsConnectionIDsoutCurrentConnectionIDsA_ARG_TYPE_ProtocolInfostringA_ARG_TYPE_ConnectionStatusstringOKContentFormatMismatchInsufficientBandwidthUnreliableChannelUnknownA_ARG_TYPE_AVTransportIDi4A_ARG_TYPE_RcsIDi4A_ARG_TYPE_ConnectionIDi4A_ARG_TYPE_ConnectionManagerstringSourceProtocolInfostringSinkProtocolInfostringA_ARG_TYPE_DirectionstringInputOutputCurrentConnectionIDsstring diff --git a/content-directory-scpd.xml b/content-directory-scpd.xml index b43ba47..a46795f 100644 --- a/content-directory-scpd.xml +++ b/content-directory-scpd.xml @@ -1,7 +1 @@ -10BrowseObjectIDinA_ARG_TYPE_ObjectIDBrowseFlaginA_ARG_TYPE_BrowseFlagFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_T -YPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSortCapabilitiesSortCapsoutSortCapabilitiesGetSystemUpdateIDIdoutSystemUpdateIDSearchContainerIDinA_ARG_TYPE_ObjectIDSearchCriteriainA_ARG_TYPE_SearchCriteriaFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSearchCapabilitiesSearchCapsoutSearchCapabilitiesA_ARG_TYPE_BrowseFlagstringBrowseMetadataBrowseDirectChildren -A_ARG_TYPE_SearchCriteriastringSystemUpdateIDui4A_ARG_TYPE_Countui4A_ARG_TYPE_SortCriteriastringSortCapabilitiesstringA_ARG_TYPE_Indexui4A_ARG_TYPE_ObjectIDstringA_ARG_TYPE_UpdateIDui4A_ARG_TYPE_ResultstringSearchCapabilitiesstringA_ARG_TYPE_Filterstring +10BrowseObjectIDinA_ARG_TYPE_ObjectIDBrowseFlaginA_ARG_TYPE_BrowseFlagFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSortCapabilitiesSortCapsoutSortCapabilitiesGetSystemUpdateIDIdoutSystemUpdateIDSearchContainerIDinA_ARG_TYPE_ObjectIDSearchCriteriainA_ARG_TYPE_SearchCriteriaFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSearchCapabilitiesSearchCapsoutSearchCapabilitiesA_ARG_TYPE_BrowseFlagstringBrowseMetadataBrowseDirectChildrenA_ARG_TYPE_SearchCriteriastringSystemUpdateIDui4A_ARG_TYPE_Countui4A_ARG_TYPE_SortCriteriastringSortCapabilitiesstringA_ARG_TYPE_Indexui4A_ARG_TYPE_ObjectIDstringA_ARG_TYPE_UpdateIDui4A_ARG_TYPE_ResultstringSearchCapabilitiesstringA_ARG_TYPE_Filterstring From 76b405174cc969b63c6394fd388a1873286a4db8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 01:27:39 -0800 Subject: [PATCH 007/179] make the uuid: part of the generateuuid function, and make the uuid variable include it also... fix xml to be same... support randomly assigning the port of the web server... this makes more sense than always using 8080.. [git-p4: depot-paths = "//depot/": change = 723] --- pymediaserv | 8 ++++---- root-device.xml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pymediaserv b/pymediaserv index ba201d0..2889c32 100755 --- a/pymediaserv +++ b/pymediaserv @@ -14,8 +14,8 @@ from twisted.internet import reactor def generateuuid(): if False: - return 'asdflkjewoifjslkdfj' - return ''.join(map(lambda x: random.choice(string.letters), xrange(20))) + return 'uuid:asdflkjewoifjslkdfj' + return ''.join([ 'uuid:'] + map(lambda x: random.choice(string.letters), xrange(20))) listenAddr = sys.argv[1] if len(sys.argv) > 2: @@ -23,7 +23,7 @@ if len(sys.argv) > 2: if listenPort < 1024 or listenPort > 65535: raise ValueError, 'port out of range' else: - listenPort = 8080 + listenPort = random.randint(10000, 65000) log.startLogging(sys.stdout) @@ -37,7 +37,7 @@ port = reactor.listenMulticast(SSDP_PORT, s) port.joinGroup(SSDP_ADDR) port.setLoopbackMode(0) # don't get our own sends -uuid = 'uuid:' + generateuuid() +uuid = generateuuid() urlbase = 'http://%s:%d/' % (listenAddr, listenPort) # Create SOAP server diff --git a/root-device.xml b/root-device.xml index 5e6bc32..887ac6e 100644 --- a/root-device.xml +++ b/root-device.xml @@ -15,19 +15,19 @@ 1 about:blank 0 -uuid:%(uuid)s +%(uuid)s urn:schemas-upnp-org:service:ConnectionManager:1 -urn:upnp-org:serviceId:ConnectionManager +urn:upnp-org:serviceId:urn:schemas-upnp-org:service:ConnectionManager ConnectionManager/scpd.xml ConnectionManager/control ConnectionManager/event urn:schemas-upnp-org:service:ContentDirectory:1 -urn:upnp-org:serviceId:ContenDirectory +urn:upnp-org:serviceId:urn:schemas-upnp-org:service:ContenDirectory ContentDirectory/scpd.xml ContentDirectory/control ContentDirectory/event From 619d2f6c34eeac49234603a6c1d419a5893bbf3a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 11:36:02 -0800 Subject: [PATCH 008/179] add a bunch of docs.. the 218762_218762.pdf is Intel's recommendations for making an AV Server, the others are the various UPnP docs from http://www.upnp.org/ and some sample XML files [git-p4: depot-paths = "//depot/": change = 724] --- docs/218762_218762.pdf | Bin 0 -> 510382 bytes docs/AVTransport1.0.pdf | Bin 0 -> 719554 bytes docs/ConnectionManager1.0.pdf | Bin 0 -> 287455 bytes docs/ContentDirectory1.0.pdf | Bin 0 -> 1166753 bytes docs/MediaRenderer1.0_000.pdf | Bin 0 -> 96205 bytes docs/MediaServer1.0.pdf | Bin 0 -> 114157 bytes docs/RenderingControl1.0.pdf | Bin 0 -> 938277 bytes docs/UPnPAvArchtiecture0.83.pdf | Bin 0 -> 197860 bytes docs/draft-cohen-gena-client-01.txt | 812 +++++++++++++ docs/draft-goland-fxpp-01.txt | 348 ++++++ docs/draft-goland-http-udp-04.txt | 928 +++++++++++++++ docs/draft-leach-uuids-guids-00.txt | 1040 ++++++++++++++++ docs/draft_cai_ssdp_v1_03.txt | 1044 +++++++++++++++++ docs/xml data files/device/MediaRenderer1.xml | 17 + docs/xml data files/device/MediaServer1.xml | 17 + docs/xml data files/service/AVTransport1.xml | 477 ++++++++ .../service/ConnectionManager1.xml | 170 +++ .../service/ContentDirectory1.xml | 405 +++++++ .../service/RenderingControl1.xml | 718 ++++++++++++ .../syntax/AVTransport1.SyntaxTests.xml | 168 +++ .../syntax/ConnectionManager1.SyntaxTests.xml | 48 + .../syntax/ContentDirectory1.SyntaxTests.xml | 146 +++ .../syntax/RenderingControl1.SyntaxTests.xml | 347 ++++++ 23 files changed, 6685 insertions(+) create mode 100644 docs/218762_218762.pdf create mode 100644 docs/AVTransport1.0.pdf create mode 100644 docs/ConnectionManager1.0.pdf create mode 100644 docs/ContentDirectory1.0.pdf create mode 100644 docs/MediaRenderer1.0_000.pdf create mode 100644 docs/MediaServer1.0.pdf create mode 100644 docs/RenderingControl1.0.pdf create mode 100644 docs/UPnPAvArchtiecture0.83.pdf create mode 100644 docs/draft-cohen-gena-client-01.txt create mode 100644 docs/draft-goland-fxpp-01.txt create mode 100644 docs/draft-goland-http-udp-04.txt create mode 100644 docs/draft-leach-uuids-guids-00.txt create mode 100644 docs/draft_cai_ssdp_v1_03.txt create mode 100644 docs/xml data files/device/MediaRenderer1.xml create mode 100644 docs/xml data files/device/MediaServer1.xml create mode 100644 docs/xml data files/service/AVTransport1.xml create mode 100644 docs/xml data files/service/ConnectionManager1.xml create mode 100644 docs/xml data files/service/ContentDirectory1.xml create mode 100644 docs/xml data files/service/RenderingControl1.xml create mode 100644 docs/xml data files/service/test cases/syntax/AVTransport1.SyntaxTests.xml create mode 100644 docs/xml data files/service/test cases/syntax/ConnectionManager1.SyntaxTests.xml create mode 100644 docs/xml data files/service/test cases/syntax/ContentDirectory1.SyntaxTests.xml create mode 100644 docs/xml data files/service/test cases/syntax/RenderingControl1.SyntaxTests.xml diff --git a/docs/218762_218762.pdf b/docs/218762_218762.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce34c986c3cfa3c1df9003b620ff78d0ebdf40dc GIT binary patch literal 510382 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

O|q_6_a4b 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 z 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 YfIDCVCWu58fIliV<>%B?uXB_{1s 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ⅅN81_K{m^*ad=sTz( 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�EKx9l8wvPD=!e9hrRV0yOLoH@NvSd}Q` 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%0AtQ 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%0A~&SLgI8IX#5KbNJ+T4IFh4ch=4^MY1)6%1 zr|Pjj|GwpT*RQpw0h5#IZ}_Gphba}lS=ze^LS}d^E>J8@zS4t3v(?|Ix5OrtG$mgm z1$y638&tOabn?-CY|oT?2%l>#mPKY85QB6?`hA0jzr3>$mEgac+6}I ziPU$I9^oYLSlQUe!HtLt-gIGW=Tz)zBfxeD?!n!J8C#saAJh@YJ1Q#KP(*Shsv$ZS z20j|Pu(S2%dfu*WqW0(A3o}`pkfn$NYxFfCNHa|zQ&MtMif9P{X|$OX03){SSv=V~{VMJO4gLxXC>D}F zIXWQ7GJY&9{$qDeV?zi_YXJ6%IB5XT9CH}vQxvM<`3D2({Cz((};my zi@*|Uelp`&V|5Hmk0H)Q@DWEPsON78`jpvdgz(Xh3`9ou8|K){W57ZjVn>i}FK&!x zWp?Y45VPo2_1h_#GdwF$_K`q)iwnfsnhkgarEYfQwREXl&-mC>WdXt3{r>kg#cNIQ z;ome)AHyO2!*FdO*S*4xF#Vi9ZIu)Gcr4RXfyM?gPQUsRspXhQU^R!unGEzY)KO zvPN(!36k}ej(4P5$Sw3NyLlh7M~L%xKw2cCW_SyW3bKlrNg6iI*|C-(JsD@#w7L&Z zr}43YnM>F|p#-x+w8AN$c9kxqCOE33%HF4N--Sqgt_x+96cNQ{#736_>XvBcR|Qr? z-+>@3T3!Ea=(0kK1b6qgk_s`-+nhu>qM}~4^xbO~p5tBEZP!HzvNUQLVE?Pq{gW(Z z`Jc(s|K7=q6usI9{qeN|0d<3%=i4xjLnC`j!Hf*+)E0&uMSazwn#LsQ7t~`fKOAMNT)jP9pe7jR5ijXgjzB8fp~PL_2!g}0DakkcbIUw@?>zJw^1yVen?kZT+EUhzCK&|o!3A%! z*^VpT1)hrEs#o007TrF8(P02q+VLTz^F|0$rT;{#`TY|QmoSDS428LxG;)q*+BY~7 zN#ItD0Ikal`O-#RnCbTg74j67p;sV_^lNxw9ruDt>&DqpcFrH&oM;oFbQ%Y%f^cIK zXZ{4|cKC~Un#dPCrQKP?$T`-_TH~&l=mow-h_r^+`utXL5rbQ#q!Y9@#W-IJYs|L_ zhJVc*b6r~%U@A!vl>dweB<^+3#y0>RX0Xc_gO*zfIOR`~_t(onMIQ!MTRe7l(9a0< zh_%`Ho7ROfg83r_j5v6F9Uy7rSKBfLU)X+(qQC|x+`d3I+jCtdRpUHIuRHC^OYCR; z5v=_mXMxTxoX|}SxKoT(%@4gT80sbKmKJfB@_4zenU&S_*p5q2as0M^Fl)6* zs-e8wWP7nE6w3V511w*-I%6r+Q;?W};ntrh{a8GP$Z7U2aE+?9ORq3e%62(58!IYR zC@H`Mms?*}@>hckhJuloS6wZ)I?c;Fsi?O#nQ$T$=8|+@{p~K?5CT)iyxm@LE#$Vh z$(p~*%PvwC_vTk%gzs|C{Bu>3L!<)B-)?|K_bd#b&(ZXt}N9 zm!8vFupeILc}C_GW=-w+$({S=HMBMQHCP*^jloa zA*ut^Q5=|__H`W4n|1r1_BAL9h{I8j;}*z)Bv#<}(ib2WW{_lvC83rtlx#wMk3al8 zaMd5kICY>F{1_g{(p(DvI*bA3P4vlr%Ngso9n!4rKDMz9Gz>vwz?_VOFYsA-yq{E5 zeTcb1m-5%&1>Sd<&T2f9D3^ZwoR`Zym+YAW)_Cmj#xD(gV1}Eta6*~|wR{(-*;zdS}dT^V)xUY7akJwn`OEL+3s!QNZOk(q7fh>}UV5sI{SKp;YQ z1)1?x)D9c|#?{s^?g0_OOmQr~`ie*K8Nc3`A$YTzlmbWs{|q4#W(yUU4}tVzgvjZT zkj+}z64(l+6kBlc1|yI<@Yv#LzoR`_1%SOYC^u6N&oTirTP9XX?y;&h(#{yx>bMUi zoE}#&$+b*>z+ly3^aT=wZeqxW7%w{B+z3e}?=;7YQbmVXgLtA)by@MRggak2CUsHsemRX1u}TZ~0dWVR9ERiO*}%*`Uj5aJ zyXDten8N2xr8gJB(0f+ItMS1=?*ed@fB2pnqZyBf00Iy-hH5RESRlm} zD-~WL396nkV?s$0jBcymK9bb{UYz&!4Blx5Ov8ifZ@_DZQ4$z9*7ne_@;mU~?h&Sc zp;y`d*W}0l_Wq=-f2yf+%;<1kpG8f|iVRbdugb(U;O^+4B^^N#0{U%S>p4az zy8@;@2Hz2HgF8H#nW;nQSw)o-y$X$=p(XXHzMZLDgN2b@eNF%#cua-LdVl-|N@Atq zi^*0b+q!HzvD?Stf9zKHd5dK~Q^~Lt0{Mj&1iXwmnUd!6Eb2kz#q)U&edS#2g6aJm z^*#au?cP1+fIv~mL*A`H_kc{!(it8v?f75=<{mZ>lwed6*tuxHFn+8u6F0 zi-l6tsbx6SKKQxf&DJrUmry!#lerogkBpikX=*vCzR1i-wQ{FM(hSZC&U2w*9Y$@m z5z%gEatQRttgM}L{49k|U2EwAk1(L0^7-n+;IpX`q1x%Q=*MZ38@?>wTrY5^Xu`G4 z{WgW%0#CMcWR1#hTn%&F`8QqT2ZeJ##?ldfz5_cI4^l4MKyk#tjJ{iZ3L$ZhykG_l z<1ke4ZnWpfM*KmKo-OQBHeXdhqCPYbnb8INZ6O=9NB?Tx-+I@WFtUnug3HQUQ@PlF*Rx;dQ=faYJ!a6vZ9$Syi z*`FJp&^ac_fH251&g4UHt9H{#Ue3^OVS8xyi7#}8le*gP;7nsJd8ZltX-l;!U1hYO zt}3)Ilk_<+9pNA=t(|j1X4;MFJ#n=vbp>?#?oIqpsB1Qg znC&Gb049C9>cO}jx(sNQOQAz-_f(j$%C$byg52yZ0=RMBolSTxqW2U1LjwnIcMvz-={C3#(vb zv@eHky1O?0wMnn~b))MUpkoY4MhDMVyu$fUvY$T~4t7q}SY(Z>X7#Sqym1LTXi1U5 zSi#C*Z*Byft$P5v-O`txUiNH;%A;$*5U{BFA%b%#(cq;sof`8OQ|N%zy0Sbi8*oZd zv8LF69l@7g(AmD|$?$(bnhI_E zRQeS5&QsG8+Pcwt(Oe@q={UgVJOM^@y0rKGgIFf&o%xBjUIPX3m7;z9!X1r}ay$u`8F5Bce*1wY z?KgrO!s1!WFxrF~T1<+w6VVLWLLuo}CJG?FtYbvG<-IUYnW4ZIcYVZE!wq+7xrP3X znx7d@DO56tt+Ra)JF3kvta1sqyz}J;f3f zvckiRHc#_$^Bku6+R_|JTyWT&;meu>jH_tyM3OoCXvkud-2BIbi+ipY%ulk~NzuiM zZaYh<$LLNA^c>4B6b=84$#gkJUV-DYO!m2l+Vt`EoHq zQ=}|-_#>9TB{D+r&P#EHc3x{N|IjZ6h!(dPw7`yss za!=hpYl3XjI|>?}WkTYpOs1<6%ij62&)Sv>%6ch0U0U+J#2;-gyI6jM3sO^%Gs)TA|9fWwTG8s;aNjBAI>mi^_zKe86jv<2X|A zGO+Y7hEn~$$IQ_4+vld2s#ugpQk&O@%aVpR6vKeTEqtxOa(~V%O1<3p>uA9@H0^@0G#~7r2r%BQEi12&uy+^i7F630Y0}HPmxs{+Ea&4o zWP#n@0t2KLr-O!T(Cif%StSWR>^D-pblzPaUokYEY;442(FBP*^E9u!P4B*43QY;% z_2h}MSYaB7eyT1>QB-8I77{#jw z3=NkaYS>N4ZJ??nH4$$f;c{_x`BezxbQXE_Jt|1r!rkiOG6ir_h(-(9POnads`r42 z*BU>EifM)-y(8Z>eL$^xMDhjXCU|g~B-Qljna4>6oykYJ=)85kLL?&zv1$oo6sC(N z!CFWMQP(|&MurttYKcID?M|XWWx*K0&cNlcL2f{hJNYSbvp1LXgiYO$7**0faAgza z?^848pn5T`M1;VK^;5V}AFrFBP*ZPDj_*9KS4O>%9%v$~8p6|D@)@CwI7qXeispzH z#2h9uoMCAU5n6}C0t8n1B}wpval_*f84CEVZ06^T8Sc8dkJ*L9)sqq}M^D-rl{C`% zx!L!yt!~q9+Q+C!((yJ!9zhGFD~G*~F?K`9i7bE2VommYo76|1G#wR`8|1~xPwyF3$J$j9Ut~tg5%f&D7{j! zuKbh225r_3nJ$)Mg9giQx6OqlNpjdJEe!^#pgVwv2-ng7~P^a7c^Z%yk=HDtxU z8km}>B1y#2P2ta z{wCXbn?NHFzu(V-vA;#C!5@?ALXb|WYrQM&FWGsusHSruM1dth#||;njRSEp1Z4zE z)}2KR6;eyg$P*y)@UrH3@EEZzY>Au9ESC}yGSD4}4bTiq(|Gtc!%(mbWSM~8|BiMv zB3d3eZAUVTu(0=?@J+n#7Q^(Tv$)-}P5gM0lcj6KJ%ZOh2;(&BMPu0RB*YeDS3C@P zx?k-QR9t?e;f*@@c9WM&B4*D;u(ugxE*`_f+4ym6?;8%)YGxW*>+z`HgBqr0ByP(7LSw zI$NWR`E|2g7Kq@?9{2~b{EgK#qc-L)k*QMfQxZax=&*9rrHz?)hnRGuWr@4KaBM6O z;At=eo2qI=4})k*Wubetzf!5RP^x1FhvId>*7nw{g^J)v9QqNXyo-CQ9^&`-!V$rr zZ6ysVoJR7r)!g1h=GxIo{Mjg49At&EGs*p1>$;NSdiWzo`!RL@&h}17vN{b?Wm_V)WDkc(kPr!h~l#V|k9+D?{~N*)ep6oP4EkZnTS`Gx@BVk{Fve)2zrlIkLe zZ4DFgWL|vL!^hZr&(}bFw#ic^|0gkWc>r;)< z9}ix-8?KyO1hx*lTkGOc5V1WyS}=MJG1tFs+HI<=_I?e0eFRd|ry{xzjXp=$PS&Le zjDivUwMNwe42srt$Zq!1V~))f}`SmuaJlWjl@kCfw_# zO3~GI@)*@1;$7`GQ|FYBf8K2$?#9XhI9Q_5z*64;5zG`QS30vcZtqb^_`D zNzvj(`B!!PCrZk~@xR82|97|+;9T)@^H%7)zBo+LHXs_P=7oW=Jn+Z{MH<%w9vSCc zvo2Sx@6M8K=0S+iii^t(y52eiMs|)K@~KXuGxlbnMv5e+%d)`5@P`#5M0L=vv+Y7Q z;5lgiW91Vq>q|rE56*%?BcHa8*B#tLz4V)_hb*1CcGgoQ%};?K?-XZrz9qjxq8ao8 zvzpN;5q#}6q&oUq9WPli93^52w$3N{hHpf~)dbR^L`PGa)ue=afLB!+{=&nF9i>NObABRiXA8s>= zq6xDpo!tA=YzwIeTWROEux#@-QfkcrjD=w88jJbv0j6w0yew&<+27zPBGgAYVKHKS zwZwrpk$Z`Qrk()8pZsJJ)n2o>pCQ~QMj?h9KoM+sIq`H$^TSJT;MW)#4dGOk4vdfw z$s7i`P6t%#tgNeIH5{|3!S7P>L;p5))EU+#neMgrNT+1=<_Qob(bgC(lrO!f3Neyr zb2QA`B`_o87c^`ZcrwZ+MymNq-Sf}HkJL?bW5ya=3zvAslT9{K zx*C2>62#XVZxi4x=>T9zbYyfQXbTlzGLhf}$B0`rVoX$Ww-w!a*!&qmRz$pnx2H57 zcVaZx&JFBlx~rxc5j<>vF`6I`|N9>D zK2no`UqzRrK;`_!Xe^#P+Qqx~N#96a{DU>q(p~wY{@|<-lm1EXmk93;!~tyev{~0%-Z1;C+>o>|57rg>sYRG48M-A5n0Rd^bGIb2OgDCaSvzykrLY^Fn$X8-e!iK#jv%g<(%S#Dy|e&xiXw)N1hKIrBoT>OP#J@xTn*#z+$vsRqtDsB5isD zvk%he?Qtg>Z$6l9+yZ5zp$0Cf$PcX%v3%DPoHlfWuJ6x@vce2f!tOxZzK9PxwYDZ9 zDNR*e1}hLHaRx{f5%dZB+a66N6S>{%Zl|c1uIL7l&dwd9EmhVu`Y;)pFlnj&9r=(%K?!be#1 z!Q&h-JqT-7b; zqDUWzo%R@t0}I>EtUMjYa%l_~sNf4&N2UnMPaxId6M`a-0G>aQARNLZ3epAE8AG2H zS^73pE5o}(n`I1Q?Xgxfj&|1gLlNg0bC)dQp6S4fQp|~v)$iFYg8(qBckQ!uw!&g5 zZI|%s@usW7lj%?Lsq~R5d>P@q%g41$=^Z@2xj@d7UG!I`ez&7JpMy7awfay$4Lh3%Z$ z+-y}T%7Gh$AX)|pF z_C!~#3_2G)%aO!;@S9A>tWHHKSv@+rRO`r}JIBN$C_nibHRDM$l`uPGoa(!hYGJlj zwqz#7;8sgeQ`0D5b_SoNS>Akm==<{GVkv{!w9~@S3s4G}ORk5Wa-7IPkD{^{>;&eO2hn6oZ(XSF5LgXOo=O3C*_Ei3o7?$|~%I!iTg$HBI zH1M3N9k0Pp6~qOfy@B|(@>KAhOZZl|YXt?la2O6^C+Kf!_~+z{lzB|e4G?h4*3V%h z(nAWwQJQ1>bqX53AITRHaMSvC2=0ClZwNWP7NsZT`WR0ugx1*8_&n8K9{0wVxPR;x zp@>#WSIZtsIQ4yiDs9u-rR9T-E9D5e?@CVs!~)lx^ns~E(O0?~cFMhg#AMp{l?%vW zbWrY>BLfI&c`mf`I!8yhyQ#idEZ&?}4kn&H_Cm69S$4lcYkp-($dGJQBD~Dll#0uC4rWpf23f2-+NEN&^;N&?Jz5C{p zj?_m{FK`f!0axs+m4}ZijAi(epV=ShhaW36hek_9pEcYGYdU!+zrAF^^wv;n8x1;_ zIkN7FGlJa4O@EFfwEEG2!!Mwhs zAKTIj^oGCBZ03)M;BC-0?wyC*7*+_RI@H>D+ui>5=(GhTx{F2a|TjU zaPN`=RGtd@_2l8lqlEh#FXR@1Z>47eLh5dtG9t}voz{<-zW029X_ zmU};Elr@soQ+j)CbJ`BEUUgkeaPzv)>%|k86@H2g^c_iqLgj;dppRp0ATEm)@Poz-SyIQtBM^ly zVyhsf54h9eu^p)X*!omnkLPE_rp3XNymZ` zvWPt;9z8I(j>;J%2W``Q=AQuHR^ho!fC{*=-1;r#;^6Vi$Ewj#?>CG4shBCJ#0iYX zm}=vs;YEc5x*(%{TCBne@ahU_6J2wYKfQ18&K=p5$pCuRc^_;*b=uN6@Fp0nM0U^| zXvV8akOVVN9fXyP!*F)Hnr1b+Fj?MOcB}9FUP$s!H#wdyW_3f1GR$^-S^`d;k*j*6 z5ZH9q63V5FIzFvYvRKj)pYJM8@4z=M)e}14aXGH_tgP@O(+NVg3Ua7$x1NT)N9F4t zxH@=304mu@7Q@LFIxR&Z!Idl^*8b7KJ3II6Yoc3!m#Jyx>~NdgVKx52A;1K*;x6Ny zDGAeFFQcvdND?Mwbpi=RwzVzF_+>9Pj=!Bp9bgmuy1I8%i>-Of>Nnu%D+ay|Wvb?> z0kZyVv#H+XSO=`eU$#cJjM#CSP&_w%vr zGx}y;cd*M(+*dQErPJnAePI)J%E=s%bXCDkxmPx~(+Vj_+vfb8cL7N_d-k8>CN}r;Lk}cFOqgc0+_?06cHM{@3IOnT8JjRy7cEP&1Qr zdIi{}?p%TeLI%MGP>7i$<@oyOSyy6CWO2W4S7m`UI>)(2?r)%kxv}(AVI*Oudxb)j zv-DK1wS`bFxVy_?Pi0RJ1y*|KoN#-`A5gVGZ&LL3FFTG!?96+HLm`xAfxG6jHHD;}`VFGBa*>u_T$i zs+FH|Kc}fD$!a<0ww6+T2n61XBrHP-(GkDwZz=xhu|Ou|eJh}eH0g1T*{8RZ&C*tA zc0;Gc5)&60Lz?V&U@8_vMieD?N$!Qu^7xA$;k}^xfPhPps_n)4DrTSKr+DFBp=x#u zi$Kb*@Ya5gIh(A<6fhLbWVDpZ3JNZ4n@a>#A2Xb^x#ljD&^$}K&Olf!)}m|ZPiDf0 z!6|RzVR$#|ypY-WFL-VF9m+s4^^go94z-VJ<0`G;caMNZrB#5HyJi%BU8m7uYjBsKAAU>p=d;22Rvi-kAgtY1oT}mi*x8!FX`(%XOZdhQ4AuT zfP+@u2NDjmH6fHyh3oSL-SR*nZ>*rA+dvIeS+E-B>{XjdE5=f=qXJY++pT3<*1EV^rKv&Duwwv@<=j%+I|uM2Tr|+CC?c{>QQ&441p?%I zv3-pyCsmR%p^z$YGZVHO1svRQH{$E{e$5!&y97CnEYP6YtUQ^WE3u>|zHYNQY)M?< z=rOk~7g{MJD29=O&J?4)mx>_`w99de2xLD`!p-wm!O{slDXvV>^aT0*(e%%&to|`- z=3P7^70#qJ0a_OAQYOf_i7|!VQ(rz{{~Z)l5iJprN|gun(jp3S1UsQnnNE2=tU<~t zMkECX#gEC{LKqI4pqK_)E{0OH_QD*ZnaLwhc&PZVTC8v>Wmlly8!@^VFlrIWJY{J5o_h%R=bF9 z?#*=(_RM)a_=#SD-NwdUdv7f+S&bmGq3O{cS1%DawE^HTl-39Ht}2mQOgCdO*#~2@ zhe)%hFUSE$M;n}UwYG<%wwm0bB54H-7qb)z;=)MirJ%eR&kCmD<{o+@Y%unUnt>~Z zj0Yx0EpaIbV4psRobuqXiUeiy;}|OU&p{v?UxRYH`Ksx@0P-}Lne54fJ`M6)2>xbl zb0{+Z@1ed`g{z)YzaAB ziHhq@Je7q!8!opo59!Oete6%_%v>O0V)KJ8%RlpiL2L~S5fq}%z0Xs)wf5Wj*T{x4 z18Pv=Nby`5$QhBpJclbvkJOr`v#Z^)3$K&AKkaI8(7gvMP~m8H%^5KPVPyz{lYf6* zXk(dqVIPeEIos`GWu13m-V@gYi5khq|5B|<=4x(`?i1UJP$YrsQ`Uk7Ly8Kne~)^pnm)O@2BDAfaujWUCa z*t3ZdHaydAPQh6tN6nOfSvZQyp9xhf3kHn7>bI+U41Oh#=KtcmK8~@(Veg~AxP2S$ z)9+xB@^J>pf?GXUQHiVv_oNFfydvlUc(BHCcZIOFxx6l(M#cZ4!X(jG|YZ@ z(HRP%fj#ds5zF|a!eqd6j~xiD5Snk9uA&-;6;@DF7f!Ne2qm}lxuo)%J(h(JL{jrC zS4aKsodV3v^J<72+~e*#l9E(=jl=@xzX9O~<^AnK-Qk#H$}|g`E_n_|culQqFj|!) zGybR2_&})}dg|q4%=uY)pnIK3L)F>27zHZ^SP|g(sU4l?aGhiiO{qs%&bFAMRVhSl;zKY!)Mz&iP$;*G{*)0Q689TKi6tz3oV=~-XG%?7U#5FGX zcj8`SqdjvL*$+zi!_2z`!#YcPwQCVra>^D^ZOipr2>tc1e4-70nbYS#Qg^m zo#2d}Hff`eGNedR!*~(1+^M+uxiITLJ2aKCD5%)6P>;&OpkZDK#r{x;?+y!|vs|1u z-umFN9$<1A`dS`vO|#K^WY*@J=5|f%p~3cj3Am0g|5&Pl%fiK%NJ;*g0B{+Z>D)n* zlTL5y?5Ms?Y`Z8JSzd@;>-G)ReUSJ%eA-GWHjHNJA8^arI!j2LU=Wx!g`mOh>ERIP zEoHcYg(^?e(W#TihXjgerBN#w;l-eg1bfzP`s4t9v|J~wfN)#d$N`?9cPXb%t~mb*Bk?2%b*8r{M3Vi zL>PdI!oR~ozNVt63z1}i&n-7!i7EBM>?d{zdy$CO{H2A~9goxHw{16}7VSkSCMHSy zFVe=Jy1GW(w9j}BGgF*H57 z+pc!m2|+NiA0&-xv&XfU3_>j(N(WYi|Jt|1l}9*w!&?f`#a(wm2uA6h=wa5d*O*EQ zuZ>PLylcixp+V(JrgNswEn+UR;J7jJ6?c%xQ_3f0wln;NyHUQK&=wGGy0GxCQvOe< zkoA8ri1<%y9cUmc?kLQ`mI5-+PRG9`2v0S#z!W zYR;qZ0{YeP2!~!Ano5e^)wZS&hL!3qxDIadtRN_GCv?_pj!^5E@XKvu<%Z5kzS1p5 z?nuApPCT^~!x&&wxL&{swA#31$?^@;t@*7brfoWn@z;%@vragMU>;+VnHPaHljvoa4*wV&g_VWEq>|DmUW>NYV1e@7!Z^ zBKM4Rf5M)94_v<=-Q>-V zgy?$la;kH8X7AGJLeVOHnN z;LS7j#7+bvbqocCE@7e106``a(8^)80iv@#=mzcK2;6ldXX2BrLNt6rabPNb`$%ZQ zAD-%w1Eh<^KO)HV8JR>erS4X#M2}1y+_0ctM`bQvgJ4`--!L~|bu}m2>cz&j@8N~Q zsnjBuE&0zyZsZaLX9dS~`ASx*{=tx<27K?CvF2T2(d?WO1TZr? zV;rEYMI31zqCO<-SiTYsWtQ0)Y^c$jnfauRskexeUw^vJ=S3O-#CoVSVfFsj%H#hM z-Q@Y?pon-2uIpAzhUO7GNnT#=Ko)y8NA}p8-7y9H!7+{(ZwHrlDYDo<@5twW4sU$v3ZBNiCn(I6NPVQxPw9wJ3n z=EK}gwwU#}tA@kL)+C=Jg#)Tevt;NA}qxBpj)-XR>Q4in^zhfzAVw zdfGKzn&fM2+4wj2=Yk5i=@^^T^V(88EczxZjXT~qdTu7q1!|!G7J45#lxh3c^Bo}?ub91H?G&;co@zgS; znz9C)dD*c}+UU@$^C_K{hv>DtQ5kxyk)tS%T2Pp4hD5 zuic)EdlG6Y{T9=bwNlBRk{&8t7*Eua8SS z27t(6UPo&;sJov+ZtcB=2Je#F;SQ@Ax2R54(L~QWAN4$G-JvOzDb%H`XmRYKK6Krs zU-)Wfdae~9ipLS*34(nlUi)J9HEa`&v_TQ;X;w3>8b;smRwiK5n44lXUmV$8ioCmY z+?X+dx+^vkuH7Q$tgdZ_YT=oI!<>Uj*OMy{d593P%ZTxW7Cu@mJPh4Kst!x^PVrOl z-0x%uWHCS4#rW%BrwpA8jIoLV2N*6NsbwBulcvI!hpKsGDa#T9EyhEej=UU?2@9@} zCQx^7j%_NibE|Dwtnj8aa)4S%K`&(^E+Vhj*-+hqvLmWIQw5cj`?5E;mtq4)+(-L=R+p%wkK3RFj5Zz*id}l+x^a9GZ)@QO6R+Q^s|7bHVhepLV zJu8L4-p6*b&gPD77Tarp8WW7VcYKMq5K`VJsXe!DJ+q3I-1Spp@$4>7GnnFaEI? zk030oXqap#Kh0{^1y`{opa+1?0d*AP#R)A+$Z9QTl6PI>EW zcZB|NjfiE&S9Sw~O$7DfmlW$#?8^%)`3jGXb?xJ!M7H8c!O>3NHd(I87$Zg(jqI(G zDkR>oR}HNW3=k$@cZ~~YYBLcNaM8=oZ5){TgNmjmWuMG$A>WUS6!)5CZkI(D7UA+= z%8bP;ZP4jbp|U~Gw8?o3w;Zpv_|%wW$Oa}6NJzghX)Qp@dpTsW;;vqb&2us z(qfCy22LVoSYRM_OdiR6ar4$Os16+aC!_^GR|Yce<(*y(aWuSG#pq<59P$24X2_6} z*)9#vW4UMK)Yi1`!_?D-ke6c8OX<+bdmZK9p{h;k2-4jrKmI5~zo9U@!$kX8B-&b1 zHnleZlpY8p?hp|o{9Zr9x+M|FDsLJURXYX$Hx*?52cF2u{QpNMmK_vU^++Rx%DM`` zww>gZn=oV)Yu_qR#(HH}$j}?KTP?tI&W>Aorn_qLkM_Aw7_Rbl7qWl*(P-CfQm#`W?>e=~nc zQig*&i*nK|Dw&6fxtJLbt|y}iyqP*{y3uBqblgD-5s_{gK}p(_Nxp33CMqG+<9{qn zS4i|yZf)J8AJ|4Xew8k-USldrkwHrbbyqwO)NxvEFXVixqM3iYt?ZujTBaHG>XnjEY zLL_}bFYPivApe}K%mot^ZvcX1Z5udbby*p!hjV;7N}w>ju^5NMnhK?1iqwofa^OeNNo{Qr`IX;>6n_lFwa$3m?|avbSJg&w!#E&;bWK;q~6B#a@dk$17rg8;XOXb;3Th? ztdrjI1#>;GmBKOSz@R`t;%XkqFT*sjexNdzz?AQnjv>=PqN{NpsX^q_$6KPLOv&>L z%(+3<4E2<2EDWX8M9?*1=I zy=mqu4LHsWDOAm-OmX&?_Q}gmyVTvyD#&w;=M%=9g9wo;d!v+8O@m3BNT}@bhaeYExuwXqYl6jLT*6_CHInP-Va+0_|9(ky)B?!orwCy`v>rN9Su`(BayZsFaU zD97h^6U;Ov3C{mnTeG+l3VzS!F+^{G3=V+$=>;uTspolC6%KByy z@cp6sbBlG2dR0eTF}n{=1qXjnQRmlOM4d)!Eecf~eBatYJ|wBZ_BT>B71=OUIFc`7TUhIY(^Ly6Asq1{hgfYH0)535Sg90lE#`7n`(B~ikE=1mZk6S( zjvdru<&r$^N?_E>dq9e($8sb>}A2@kEpKC?vdVyTk6yOiQA%ILCAFVkgw+^c+GDZ7{)T{)5Q$dsR2ft89dfs~~weK(!q6 zJDwf*EF@tcJQ!P&>f@?o<4}x|aET&fbw8ztD;?;whH$q%DxSHO4*HNlWb?FtGOsR^x|D&T$1FX zcYLFvzYL7iFAPS98Y*UZ6lq`=D(^@bAN-FSN(;63bC zG8(ajbf90{PsJqVYJ+EQ-87No!!X;(8d31VnEY_&aad4JZlOo85;1E8kr*qKrV}d)nseLP?UD3XAk8^L$7Gsz7FuP` z3Pen)e*LR7{DY|C{GXA5|CWX=`bma6xb@#;5+a8ykiccc)APYeKi8UVkEEJ|dBdcf zXyl8UUBIi*4*0cSd}K=$1NdsryT3gZv$dH7MyX#}#dZm`#x@faQ=9{f}&WOlVHQu^Y?Dr-6oJ6iY7rAON*?2wx+A|mL^Nby&08lLZ3!++KIiTOT(4l zerW4p;zIOdn%1#C4%$6M?b7jtSppIs)81xMLnSbPmU2a6Hzu7*4~E*y4m0>72ibx* zA}gyQOK79FT@L)j>^ETyUP2&QHTDMJS1V1u-;V`t__aY!7OD_(?0`>Clg&IT8*Md0gcjwxU!j~J`VhN@y5pZiLa~mXS-}bmd|3#A(-otHiK?%8s&``~6 ze0U+G54Q({06dQ!;rm5zwi&5ZS+k?qlG|aHPy%-^dH3E1C|&gJPQ@Q}XqjrL{1=G3 z3U*S@ey(&vDfl^yxVmQJ}ZH~7?gms9k95VK~ zL>>>KpC&W$dDay>Pyu)#NyQ7sp<*T50o6uwc=pZ0LItAS_@X)yic?1lEDsZ1vsRaQl-g<3W_( z0s4c+L7!Fk?(2Csdc7Ya>w3y2*G2pyeAhKGxhtcfy5q8?2>fDQQbz5+7F0W8M-NJ& ztA^eqPm|(GUV4Osrh|7ED||^x%O}ms*TS!SZ-WfriM=818d{wI{|TRMsEhh#QUNxN z$#~$ECRh*vi31L?enoWf*iO&3@T1&4X)-XKHeQn-hS+Af@m!`Zr2M6#RGpVu;5d~e zrKBe1NPeRIL!fTJ$;z6H`tSS4KlvlZ|Ji5!H-E&P*p0xUo7D3$TP}DA!qO&56?S|! zQz(cT)N;eZz#0zQun?eV4%|;x14;X*iFa->mVcPvtZ}C&>pGOW834C+)4#j*Xg{S) z-&^SwMXY?@brZb2*30-fgC#wiDbV zbjKGp@W8>2ZdmuFCmM4QATHGtG8q5kLzQGkKIK*AF>a+XGAQlSNXebKmhQzAibqI}j{5( zFo~(WCC8o!s);6O7j3o(us~Q4qxrg6Ha9O-PG|6b4RzeLc`KU+^YauacrYL@kyDbn zhyXW;$st=XhiCFc^tYYOc&6pK5W&Un)lr9ZHjVoz2Zv%%pWI@n>k)I%PNwgTePIWi z9q&j^3U~&_OXmk`*NqQc0w9NPSE)G&eKw9{=7C_v?$POG)UHwpM5#!04@9!4n&Njb zE>h*CQNL*?Mmyv2md{WRoQ@gWf&?Dt&D`xy2nu#Io4zES<@s=}s(ub}Poh)J{h@ts zMxk#DAS5W5D6Kqa=x;w=2vGup5WpJxC)JAhVYZr)(xQE8YTg24JP>i}8(lr7hKTy{ z%*HU^D-r*v!OYJT=SPSxaXjNXQVVVdsl1RqPLye!GH$rl)LnsLWmKp@&9~{(jB>Fs zWgL`lzOMLh!J-M*sqFvQiF z=82}@7n@B#nk2)u3nAveqF?)dLVosQ(cF=9?{D z`uWtm5lsi8Mn37t@|`CNG8ct8W1X+VS>NZA`|d@#lUP)=YP9({ia9t>nfz2W;DFk zn7W_iG8wJ}YT>iI#juQhi{3H$g{isWs&c8YIpkMK=Re*Rj+(s=DWu@8#5VHGqCB_n zl*X|?=?>1HrT0gL$+vCS=p4~lZJWY0n&$N#wP+s)nwRVbiDLv2cbKc_N%~7nXFF8Y zIcSNL#mztzOIE;0uW{~8%zs)T><5~}u^!>&p-|1G2*hNyoQ&3*1ov&UH5-3(D;efa z+KOCp>6~t56f<^M3?U(6iXiML#9cA6I1P>-Nf&I1Igu=6RQHQ<5pn{h0O;E!QGyf1 z#b_3{Ne~gka~UZjx}TM8Mymzaj#-TXCvX3n?3PMVp16Mo)d0e|2m}IdjYVCWY@Bssl&`HlHAA^k4nbKM@%w_Wzl&{Lk|~mduex({ZcBJ6LGb zsfUJf@$VD(r87rNwl}o(XvTZy=ZA3u3ezYBsZ$)NmJSnArtL47SOo=h4WupVL& z%yUixBh2f^d9HYgZO$5Eht09rp_P7ryMTj6&LhBO!VMY>eC&i{_9_R(ZRXph{h{g$ zLVo(BU%NL+Ah?jNi^PGLurc}QE5w?0C-1+7Qs^Hq_kq@h`uc+^NXU+k*$$2u^xeq< zh=)qHN5NXxX;5vhH&3q>JiV?lSuJ3Ukt?&sroQ6~2Lvt1!HADE=3>NBC8erZdO(Dj zX4hs_fkxft=)dIj68SVRk}JDC-)`%}uX&Y+E>sRgp}suh+YPmQ$TAH4pnX$Bsj)hU z%9rF9Og{9(CXoUihgp9;?qh4#|*0^wUtpra^$;81MQbR2fR(HQMYC7o%{= zhV!r0*}_pf34?l0LQY7t$y2C8L&Y3eZNZB-DJHgP$7gls8_cFERgP{UUEjXA5vMVm zj2%rYBD>C2Jj(?Q7-4Q*$7uZCLmfXrsXz#%5+Kx@P^C+Ia9Hrx> zob91Fz!c-92O+L)u0@in;5+RK&*Osc^uyk>`(DnehYrRBZ*stu(WJA(UdJsDp7R;r z9j77H%!h`in_gw08HE&EB*t8E>^;W-gW!;U2jT2h#q8w%G34%jm5*R4NYHe7Q%*w*) zGSH44E3#p@6j2#(TD>XY61n+f((pJsx1W$;&Vfvwo%R+7U4;|d%>-V`ZjNHUd}0Me zOw|_HwFlhal>sjEVajpdWS(xqSBF_ANQhQ!0wg^gOm+Yz3A#{>%EJ={j=r!v>M@@Y z!Y34NI*?6$3_ib)2unz(U`X$tl-{_HcAi=;YULBa1eo0HyOl&w0N-nF74W)`pj_>9 zW#h>$mu&mI6i)r9OK*B1MSF`(*W{{a5cv;L>F{gSwrDx$$oV6E}p@OT4*3*~R` zmAQ1L46b=>Yv0f~6rp_v&v_CvOP78P1?D&b9o){a?(@ zNn#eTt(lU32))Z@AjL@i-`!o&0WlNFu;GlBUlIaTEi^gFsg0!4F0V1|Soj5Z>s`Jt z-T(n3QKr>HN6zWP$$LgOaWJhMGIUU+Ihb}N(_&%zEv|LaYvl1DO`_bp)VQ5d9)4!8 zVSxz248F`(*wztu^5a>lN>JI{EQ7(PT|W7A6|YCQLT9^(-Hd99_tnIqpvQbkTxQi{)B;7xl^S?%Pv zIZ;w&8`e?YK7gt)XcS{K^iI>;w(SR{7y1H5c^3_ViZe~3f5oHp`a0}*@ec`h={**h<6g^4jsEzXVU2KirZpzlG%ArefBt4NT0adfh<*A9A1(+viFZPtUj5(gIX31FSHX4jiS~ z={GH%KzOg)frhuxNz0zED{$!um*aMwJvc3XAAciKB@@yt1jU#$sR3b$CHf zmoHv2#{p7jhfuV>vvPf8t(d!iz*=#-_48S9N1*i}g#xWO7z(N6ji(DP@xkIOJ&KmS zncq18Zl>{^Lc{$)F~+^X7+U9dA3DFy|M6*dtZjc0ro!jl9q4O+M#{tGho=SR>-sC1N~)L#UkQToM)5{wI)QZ# z?mHqBvz97Vs2}aAKBvi8jK))&YCC+f`C#=|J-im^nmRVIlC5}pd%1iAr+U{ab8U3F1`X4}+fkggQF8cgAi z4|GwAVs?w*skO!cn97r9C>%|8@h0v>F==0T3MERBk_1y~ma7h1w_a^PEARul`4eAA zWmZ_@OP+V%>+$|Wgzd&WUuX&}A@MRu>~kt8ijeDsWxq$u-~Bz+XItXVphh8DeB{gx zf8XH{Dq?-ZzOkCg4U-BDrQWbLoEfD3*hTB>q5zUh6;5C}IHUl43 z2N|FKa6!Onl$K0DgsVt@%P;~}#O)3BY9a-~c|nOlAjGa_1^byM&vFZN`t*k>8t~lE5TtFBx*n#2b!o!(U`}K0% z+Z$wr7iH1L%p-qWJtso%J-4hnslPY3n{{gM*`LMW0Lw-%-O=~z=HNU~|U-^wxP8Aj|wUNbm z&MhyM`n{Zk&lg(u;`T=opF%$lc03RG?rQ z;1nQ-m3eAp?P{uK0TjmU0o1(Sf=Mi0UYW=86q! zA0wm%FN(iKapI;_0Ar8*@SlkQL?Ec}oYfm6hctIBC+XXE6-TF4!6l2Ml0bGb!pTD> zR3XajqBIr^s}&W3UZj+Do?ecsO=avSwC_R9hIey1;BDh!EG;d8SVt}MK^U7QnX zeGQ>X;;9c%&OEh(@H#M13tIXx<|Tf~^Ybm!F8Hs4VUZE+leV=edlKs3aSa%qfv}9O zDS@ljI)q2xc&!Ur7~V$M3-uevoKM^AoQ!2`oiDVrA``aPmDO(?vuU^>mR1Ko5`9)E zt8Q2@&5Yke@v)+T%34ZUAbd0ZK3^UP!I>zf&D%mQhqh+FbiRk5<%-o~DO1Kch%tPe zKK%xz{8I`@)SgS`>iz44;=KNfsB1?W*_T+^bvKsOE6gM=9nVDM0Hc=ywVK^Mdy^vrsqn~H*DZQKhW|no}S0)wpT{2 zqh6(bK-5Rjee|Gf*3-$y*m-mrYM9Jff(J?NyqIAJHbt@%mXajpR>^v06NZIP?U|tD_Se2XaFg8o>_v| z@hc8m4(Y-5kFImrHnf&w)0xpOr!TYGTCXOX+JplOJ#~K z7#=l&lXF@P*10+8Ptw{d;#*QAl)qf7?a_xmI;tL#{qf^m!EwCvLI)i4OlA$wuMCIw z176UFD-dxdmJ^1q07d!Qe3T4!Wxj1QzrwM(8^ERMGUW8@|GZntA2USZlMPr zbsyfNu1+g$6P%)J2&Nk*uWOQy(6bd3#8qs|LhK$2!M#>!yGZ8dq1j#-L)pAnDj6B^@<#yhS^SzHobu)0Pf-kOd@N@ zb2#*)aD(9RotzMDTX|ktMK$$k`|_ZVpny<&?k6{DPtLXMg{)0a?w%by%RY8`AQh-u zE)=wVNsq24q1Va!zn9p~aRUeB4^uSe*$148Z|Pt%?y~|a(iBmBx;hQ#3ODfbu~WNW zX2XD@m@pRPfggnTUJBD4@PrhjOx?lF{6)99e07m00#OLfo-t4xOa4{2{|WA}u>H>` zWd8FtWEqotU9G-x@C?ZieuipD04R~{+?%WlzVZ{5iKu*)Kj z2P2X_b2YZNznGppnEx5M4s?f0UgsfW{LjNHC~w@0)_O)-@g%>Xz88)QJ?)4D&SDp& zi5!FY!N->(202C3 z5A<-unm{-@4e5|MT=Eya7$3O6yLV6FQ2ay_vESslvw_4C;1k~yHIXA{yExz&xnDZE zH&(DL?^=&TFv1Eg zR50Q}O^s&$p2xNr8w>U48Ln~UzEHXfqT=-Ko8k2PE3N(QE)UkJ6$G*kZ8F1*cg^0w zbU|OG<7ii4vxeaXx5n9F_&;2TvVn^A`c?B&6!JAjg4J;bL!9(y^&^*Ciy`>IV(uhj zR)o1f)GD7STau1Zedv+-ybaI~ncpdRb` zt<;m#bEIo2D1Zz}Mg5NDKxEjh@!GJBW+;@Q+3k>8+J~pEWdKiG*}vNxaZ7?yOhG0X zF|1rQdL6BjOVuhMC$m`bJCn>$gfmISRXmDjlWW=BjctbOwuEIAQNPS!aK*Swi|24x zHl|&fjeu2oD}q{kOejL@|LlQjy7V4+10?FcGQepGeRa1Q6=_dr4i*n-6m442tdUk~~dvSM>WE zyPZPPFn^3t%&t}PtTVd9uVN*53|%15DF=pR&(NHz;H|{SxehW0q0kiy*&`uRJgr_y zC|P;OmL1@fUSc}X6V1zKc3_p_d|b%Ytx_!-`)aj7PbC?T~H1ZQ@C2Z zt9(>g&Ry|%->eNn|JOAd2lyC7yV8#0 z2PXIRBM*d-DE+5s-x`1a{-21JoOi#G$w@C*zq&Ux`6L^vLka_(oE+Ehn*1UElZXX& z0M_k%>?R5IBK1T|y@ZP%63&PYXQM&Wr+^D)Reo>Db?)$m(zO6NOc|sF3~AE`)Rk!& zCAsJoq+c{bQMay`WuoJ@NIbN^UAy#;_E3_+l)ah;^a^BoaG$n4R-m>Zbn%S?C0gkL z!xj>EOoE(hLu>WTz|J?xQQGMZwds<{-!Th$G8&{HE*Zd53$RkgcAHL&D*OFvdV6JK z+gs;;aU-!=v)AsrggT`b3mVJoob863!T&P;1?@|$QNE@*8mU=ov-!BuNSl9=J)q1C z)S;@iLlL;(a6ES~Y5hj zd5oQ&J)MBFINn~mr)J&8IR5L;HaSnw0eR+cm`sg+)=`ZpO(f7f?-zK4<=Vk%#~6SY zTt#`WZp%>Rh}Pser3ytVL@@=9mn7hjC3+TDb^g*2XeKX$%sW`0C1DN41!ur zB(7ZGtP-ap9ruX-rc?aY{qM;uky$-K{5}r-c$Ag~UBq3p8VuYqoaugW2hCX$35V8$T z&sK??F!-}aYu#>ZtF}ewQF~i(6KW6X zYTT4D4?~9zVwdm+$h~D=zEG~N;!z^5S%)^AUU@6kVQFp~3~~-?y3Ee_mDQCf4>hmhbks(N*jnNRR|;8x09SC%@YPrBWizyuhvLCW{A@5nEAK33T@T?)+DY{3pc1%Je^*>HkD0{SAQY zSWh5S=(KRliL=uj1}Y|U$PsGyz?{()gJ4<5x`4Nlekj43Y{JzUPkP<7M z7;Av(Xw$4Bg=#u*H$Ew;87+-U=mwazlhy%StXKaYFX zdZHnsA|VWC;(ut4u3N|c%O~Mbc&G;YwEv=n zr7BXV2E+Sx*WMo*?_2x)Krc`st|m?Mmw{y+!x1-RckM!ohh3b&V8APA0={)qEE}dt z32nA$m#WNCh+H`euLYXPFaFvYI*C^kKxf|L08vFV3LuuGKgsS zxswJc+r}^y_~LCs4BIWJNCiTIKtOmY1X+5t%+eo*3{1OXotH^w7|g?ao^3QfEgquY zVmL-cUAZ~%<+f6exNbv4&s{}3(j;GyIU!WP#YN&W(I6RsXlmSyhPwmr9z_G_ijg4r zdP*MRNE7*u4u)q++r3PztNmRaZ-%Xk*umm;)n?q=03xN?F0*~Ya8J+}m|`3_hTb#D zv7zn6sk|B~jA+SUgOmt~-Lb){dwsmA8%_{I)~~P>m@zwE?x+S#titnmt*75173V4n z07)ZwA;&PDJ#$|W#W$H#Gls&mMrRxW|T%emA)RH;(3WXf-Cd68U_ z962nY>yI>u^>*b-4}xf>w9Y+|(Z|T)BDO7FZ#|v$tw$t7-bzUj=F?i%O&Q#VIE!Kn zFH%J;>KpP@v532TOIdGQE6t&;s<6Nx=?TVzLb)c&0o-B5O@BfEXz!7Vygl%(qtl^(_r0-oTc zb&vy@AO}9^+*4!3HO0VXJpO&LJBvYM6i=&jn7W;kf6qnBtA#TYa#0$t!LlG^`spUf$w~@P!!)V!GaO_ibzT7@d(`L8cg5cV<&pnJb*Dyl8~_p;qsxE*?Xgye~6C zdVGdBc+D{5crce5ID_*VQ*#BpBSlzyeGd$lO9Te3fz*9eX=(muJi_;8kn`F+`3O7w zQ)g+I0?QIx1_7X~*Ns^b>s5h!E6~fExv1g>ZCVbI$_?P}2^(K@kC-Xd;nWVLC*weh zqASQWB%ur{}u@=rT6u`J`=t@?+Iw(9;>}T_?C$){PfWU=(U>Y6_5`i`*j? zcPGV0kG@>Yo*R?ZCPhI@WIBawwTE`W1^ZUjZ4zb2rnr5R>!nyb+^H$4^Tp@tuq*ev z=!yey{jjfjv=FQ>{1Ht65wujy77ypCY}8As1vsRJ_R(Q+8IPX*<g09;XbNfqE^Q zcKTvIA%yWZn4883N0?%lk5Hw)nz}chufv?xvSOs_Fw&0W9E=Yasvrxi}| zgtDs4j7L|{5rKKn<~a1zf!I>|*Oh@Pb0M=ZSR+&)a5#4Caby`C99e&@rIM;!B$z~> z*1$|3O%Q&1>@N||7xaaq2`|(tppdxYq?_=@#=7Q53t^@C4vD2nc8>LoIaUwF@kwE? z)!-U!WwZC}DQE1&*ngWcEdPLn7#Z0AS0m2O@n28v0#QbHindAVg9dnpq&-Q-xHcKh zCUZQaF(e%|K3UqzN+>sM2G#*63YeL3AQGT}e?VEvNogu1gDwtIkdB}VCX!M1xCzx9 zZfhAzN|mwMadUG0uVar5Y7>qzxC!EzUT!nO!NLHn&J)@mt6TL{_j6B)CD#ABz6o1QQ0n-0E=yRO)u)c@y4O`BZ01 z26zx~$af}k@v)a~fgLuwJJ$-YIE1zd88OnEn zG)-C4+mfV45>e11Cq7^(e?~Zfz912l2BU#7Dfa{49YwnPo*dKSD5*xbEAuQvgokk$ zy)dGYp9q|AngzeCc*{x|Kqv|wVOLkFL#rT3mf6ruv+HeYvHHZ~yWpPIs2qfS=}X2{ z0dKwy;DLDCdH$*uY@k1BQnFw94EYn0Mt^|Zo7F6QZZ~l6<~iMC!nBzCXE}m4wOF=v zM1Vg!JT`EQKQIz@7$AoS?gs{aP^`y8to64(!X}^+ih$}XtmJWJ%FZ%4XdBus^|s5K zj&B1GgPm-fkW_UtB89s0v1r16_YCp9lG3f8elzr{PQMLST5@o zji5=B;#b(cL(NxvlnxgUK0MtjDj$36=x$67dwOzyFA40dL;1(QQ7Vl6By=(fCmI^-nLn>4 zFTuw~XGKD&K@vX6gcD>qraJQ^nSF`3luL&1k%`{{>u8pl$3QL~E%$z`AZFF+odxb5 z4Yk9LnD(~)7N33p1YX--IYO6WU{h-rQ;Rc%Z}-=U(qcFXxczG&lzrcR3EL{AKvO{Q z2pQy39d?d!T_%CJDehN-9#5$&SlGtGX1XG9MBPa%J#+u)r3SuW{4GdO-r)MEA>B+k zZR~FUgFrU)YHZm2hP>jTX+&@KNm;nMWjV= zbIDSf)lww$y!ud74T2#&og4M0fa|qw1~2ky1JRr1dZh(L16RN<7NUCgLp`r9<{+(L z>ZRO=OK0)%d_4~FzY5epU?oOIW|sf;FYrHYaB+BBmJ&;1NiwebS^iWbM1T)dP-*Z6 zQ=2taV~@sMEoI#ED^_uMa<|bU$B-JL)SSjWDAAr`^VPv>K?Qp3> zw6{5U0_J0x9}~*ezAdid7u)k$wu~atvsSrlEogFsxz@_TVhD^y@ym}2(zQgZYKjNDKoQowI0ffg#4@-RY<~* z==!(F0R75bbR5tAUvexdhcNxNHCa>2qx9{yICA5Bjiza#+0<7{&_S8z#$C8iS15?Y zj=!(^S;nd^`oNxRP+UUPncvpV?s=mNR~Ww6 z;-op4{&3N7=7!>X(_LX=)({tY=itP=Fx51glQeXZpNZ-Qv$LoY-Ms8*V0+7DEK8YOnYl}6iPVwK4P?#h=9)uuHtD5D z1IK?!%O8EDUz`*Yhlhky%hBNbCo0(8m2ZW*0xN3H$5UFD=JaRcR!B;avQ9 z8gXQjp)Y&jwy*%bNLWwK$RV-VFdPCBm7dna+OvaI)ghudFLT21u zW8>$L&067lSKca*qgYOe>%B)m$##B#Tu2AxnUx_lxtMqhDFkQ8qZda{0G5hHY97Vr z=Y`OTKcv8B#3#{yt%G7c?9HENj&L%cUf-mD2iiBqbim#}bKe0C7Q>;y*U>*e5sW^# zx>Fs18;M++rI~Mkf8Ny;=^5=F!XOYKNKG_^uHX?|tGOfVU3&({z!Z*GJmomzaALn-+eQs|lWw?d#jY1KCE3 z%FW>Y1V5QdoQ{mUMB_GkULj>q+|<|!*LSx*bZ~fNmEUAfTZaZENH4h}Ej$kE-=2z` z-}L&e>RtsO8`R%kZ}(lxMU>fhAl@#0t|CrILvTKE=sRg+ zp$Kg`)SOF|1iSIPPWNLt%MKAG->ajme%XQ=myxUq&6bDlwrvUG^nq&KMnk+SYl9KBGG{3+Gn8_X;{g z?XkaprZ*ntzZoPVd+jrV1@>@uR=|`0D2rs1m%s$clgt`!X7xt(j7rOIV*#+K|Gvh< z?5*Bd7a(N((~|S>ZQ_@w!au2% zHCmv6fm$CL&3ET$H|1I)WOk_9FigJMhA1jJ#kg(|;6KoN`?jg1G)za^vQK?*gGw#` zHwwOZ?$EZ16x|(|7{szXC`i+6fWG_o(?;XQJjOGukP-ZTv<2NSQml~H0S|)lL2=C( zZ$out!UNP!laaLcIU~KBT&tVKo)zHRHy@`R%8k4=BL{e-E$rFhomtZwBt2We$Q8TP z?FGjWi&dU3hqcx@`l0_E$AU!05m9}}^^`6~HkdbEHC6H)T5KPPZdA0Q74q2hWAQ5S zuyD2O99Ud%?NWy85hztPdWTcQavsppB8R@{=%ng<`cIE7bFX1$KciVoNgIOG(RnHGh*{@lx8=89VrEuB&X-PJi zK&!_sF<?oGNb*ule=EdaUX3!>q+`Fr!G@d9JvF%z0COfT-S z$r*@r>HP;4_4qDV`4g@$Tc)#KOj1`!EWXT{n{>cA4w0r`5?Nl4 z0h2lm`^%8Vv~+On)UcJ`$G?8`J87(O3Hr1I;K@U$JPJPUz?G_0ff@~rp^wgU9o~&4 z$9+eKZCr$BgS1z!t~GgMs}D-bi+cHE4!xD1!deS+L(44j>3MQf9Yamv=13mY2w670 zox3gEX}cQBtbITSe~b8P#2bLMTksN-pr+OKfZZuM`d9PKpL~XCFlXV#5~cXykEyHe zHcrSg@2-Gq9B+zJ_0>)3D+QvX1SS`q?n@fEwn)f0X1P5Z#R(l)IrXP#VKD{}?#6lF z4>U8)MmSv&Y~6@$zuD(yHv0o$I0qUqZD4imnfG_$t&5uz!*Q(ux0a|TUqi5Za&x+6m#iSyLC^0A&~j$C_MuS+PWVdpMBDe^^BO!Pi_DMr|sc&&DiBlrYk0{sWn5d zMh2S@7lMI{MoNrXL!V_{XFY00d3B1aa`Vd@`I=Qml>Y{?iC}2%?-RB|^|#sh^L`99 zcypz9P!uAFyuDzLhl{VLLzfAH>7-pmJ({1>%~dy`NeR@m_imveVAN|Dtc66KzrmsZ zB4cAZ-8c#{kd#_h7!H%wHADnq)7(oWaW!tK&T#_N-WO*$2c=kGn(ReXAJ+CiI{joUc z-o(ndxK1_dFiNlu>+C7IU%aah)wgHEWC?T0H}|o9=-{N)EtSFH{uL2{ty1+?hQXkBS}pQVzLlPN?9pvxv)xOI=tDN3m^9%RXy!~;Ym zx*`!Jcub>G1Mjv+C@&z+MovAZJV&+EB`%zl?GF0X-vvBQS{!U|j;?@?aJ-pH>p;^# zWfIQ{VjtEmF+}o7tEHQ!G{Tk8pmP@svoyf^agh#dI+e?A=#Z0q;;7U@P2^SScbq9h z^*3J1LPf$_epYhiN#C7f(Malx5q&F7@n5Lc2J?%M-=38|CIY!$dR?)+ zB^S#N!k*(>)PI@9^;Uqwfo07EfqMy?kyS=;fkx{ZclwI5^{+~bs?z{@HS}VLh~E@n zk@ihof}F>*=dbkhR(r6zeC0*-P6{>`HW&xl%r|~o<9Wk=h9pWs=#vV$dd+=ymn3JI zdN#yT?@~~B@tSZ%Kz@YC0Z>HrcnFw_)nMf~7`d%0SBNOl0-yzSF9muyTXA598+>5THg9X3)HB(SS^?UoDB9OUAC&O!A$F$ zTys#Fz+wYQNgCPA{>D3Hi9slwe&0xWg*GpZ_`IdK_zd@?DF`uIl5~_t4qeKolYVLiyBKdh49G_t#2ih)r?F z-}B;w@;IlIPF=HDSNpFJpF9Jo*k(eVEec_ry5WR|l7kq<>x#qh1Ix@}Ov43v2}^w$ zQjCi{mBA5P4Y6wsAwAi_%!jPDu;h~z>3VB8l3Rm_Z#MktltKVo^(1_FsMyOi(`Kmi zG+;u6f8seSZIMsXXD!hmw!NHMPOh({D{nvI7;{<%qSThE7b`^#ksHam5gMi5*?+F?UJm&enq0k6AHKS$(6$5z(?U`7x7vZS-H=-?}sLf8WDg-FuXOWpyl zWE{yZwUd|X?2c>~Akef!f#~;({M-y|E&UT_W4N5s)P|n4G|hW0P`CBs#r?RPu&|l( zB!|{=UGaILSD&D6#@ zr|g}c7W6J=Ke_7NukCl|NFu7$_Bh|~md1M*6K5^u!eD!tbFy|z%V3HkH=TQcF<7?C zk5wnMb>xwJM_xN1z&LdC@=JEqH9ul5;sK4OqffNGpF6h{?FP0Lw7S9{rWNE3!2DZy z;@eR=&-xZlWGiA5a8MTX#o*8@FaYyc+yU~q3Rr3!JW?i=05J`Y1fVvE+&X&@RHo4o zzCJ6%fA!C1`6raf{J&?q{O9^~MZ$eYN0i%mtJ7AT|l_wa)LX-iiI!;e=> zQ{9V1W9^9ypBGC$p|;zptMMD0i(Zff$xhQ2NmY}m{mO@$ez<)x==_59-|f6$Ih6-z zt)cdc-NE~!2-d-?=v4DKWzSt65T1pLf!^z-NXk_<`q$j#5SX_6Z6ZAqzF)_B6Na_r z8wp#?u3+mpFFGSGgkAtg0IjdpB4r2V+nj_Wn{FjRPaxt?$Bbz0((!7d&7|Qq`k-TA z!u881WTMUz{F=(wCqKRZ7wJ{-u#1U=Pz~UIofk96qo~%#gxLFobCvy83nj?5nlM45 zw$Vn{ZvzV8$CmSGCw@hi_^V&cn|DdWsjRMJ)_oMf>>)<5v#wVLD9b*v@Oa9IT!*6q zCUTun(`C$>=W?i(pQqL=Fq;_xSLX&4Fa3?Ym4ni~anhWR z;>?4^IFZ@5#Q~5e2Qxw$+Ynb~(PmbBSSpS;Q`cV{35Y%9$`799ab0iDWav{AO&fA0 zg<-y32lz2eRH%DNn14jPq@dJp(Vkx%y>R3CR%sT5O0^-+O0xWiQQkUb!YYbit2QNp z?DYHYM^bOW%+v@QVfi#xrp_=znz|_b5VcRxtgvQY1!%#p+{&q6zfe+aG5;?ASBruh zwg-)AZ&`(BCBZ*_Fc_3RXO_Ch`t2b8O*Rc-ITC^4;+&SYWdp_7q_2fEQ65{Fq3>-6 zU*4uGAl~7eCN&;=$yaLm)AC8Z3q)lp4|321EJ8gaP}_?Oi^H`~rk~K|_^BU?kk9)j z!-yK|`-}@LvViB;uMB!CO}!(TviA$zJ}MBBY^a5vZGGvfDJID~)2aattl$70UpIoh zctv|uo~ZZ-0zP{y9f)O&#UJ`!4H=DqreKa@{%7PUE>-)2Eo}khr7;5HV9d6}Xo5zU z)V(CJdrUF`yArGf_=RQ{dRQ0T;qKgEi@0CW@>dB~V7f26#yC|ScT0*c4-@hUi9=7BqJ`z!twSJh%% z-cjh__=HG1(ARDEAL1Gzv6anznVDd9OS`D8^!ZrGj^2#aGIsag)GiULMvyfJSGk`g z?=DcK4~9aLg2a@|ANjk0@@DQUA?#I4+(nCR+n~NAfcrXg zSX4t}P_zh>&RTgx%zxztIsfq=eZ}XwE#eM=u7vw27r` z-D_m8+k(hz>T$S>DL$|!8b`i|b!Yp%UP=(Q0LV^ma+yWRI)WVB{^E znj>=jD=|=Yga3CiZuF(7j0XjU#TqW&k2_TnF~0+C@oVXtGCwDhv4$PoiuCkRgk_YS zec^X?4vi_Pe#R0I{V82;!d6HYli=ws$|}acc7*;xIdZc7&+euFDc@w}q?-)%`=)C? z$mp3CEMKh*wvxZ?*(qLt=~Ir$4#ojU{&42S+W>z`dp?zGv^X@HzAf=S(#@9jsvpwMUOfSvWQO;+|WdGPg%N&~k>{1GMLF{-lMzn6^Xj`$*I+uH_&7 z9#bnu%`{pwiK3o}wqxUh*mnSGTB#}W#Te7t%J#%IvU~;!_X&HZ{&)I)%dkX$ac^vOVtg#tg}=?2t=;Kq)|Lq;0c*WpT&UHsi`m6Pw&gbjaT^#fbn?i2gStO3^AKYt5OXktH|2%cHocEq`Z^KyAl$V#16t+=V%;^eZRm ztwpkO#g*IGGkh)?BEfVdAXr1lR#YFv?YBY?3x}BqwWazj-$QKqQhB)WNV3hx$I8tw z(AsSez#frFvf($o>yzopi4WNbNPdY68tp)!hGVwfvGa5 zxPBevu_R_a#0lr*-ks|($dx|2h9BH?OSpP(n7T?f`jZOH6{l9~a2X{H8p5m6iG-5O zHvUdr`EB))C#PD>GTuTr7FVY0y4;Qmfjl)VKYy@pomQzm`56H*M>32Gjz}{c$FS93 zU$~EyJh4`{$6st69$H*q5t@4YmO)<&H;2OQ=?X-7?tHSWj7Zr>)ype5?k;Q572hQi z?0~`D;Jv+AP)J8jQUePZsI@Ad+%IZ16JqagEUaF#icjYB!Nh>l$U3c&;wG(&S^7FO zbpq~DObkLoYUS36`>sH-fuK1=w<3@`d*+uia67WcC42P!YDReW$a4?IB1uoTS;Ug_ z&2wz_@*S)^7$~D+AnOQc|0)^(Am%vP|L3;De@aI54ZkQy<9B)Y`SC_ntpujQ-I?Hv zIO=^?4kgQ`2YX?cU9j?(#2)t%nP~|t=_T={mj;D}2#@U#Fty3A2p&{U2T5;=fw>@? z9#vd%#=U4g**R_?yC;1=YBZAk)Dt{@>N*N6I9GOLR!6J#wq}?c*Q{2fE*F!@ zGbDYUJ&{O7p&+>$n=67f3J2=L#Nh8EP}EQ#2#12|NvC~}>TD_%2X4>HiuyJ=TV ziHyOk$vN0Hp_*y81GB_sTWV%WMaI!-`msw=&6HU2QO+zm#%L*4oN&-^< zA5S(ZB{scbAiY~N0~e(O*guPocS4uA{dg|<-@g;p8}W#csg)O`vsQQACZqa3;zAjbshRa<=XBWGN! z1SA#2S@2h9xp$TW)K49&lM+qM-@qhnJ3wV7@N^FQZ$kh%9IH>8jUJKBy+xIcI;{;+ zy&KkD3L)7GKy-+N!K451mCeCL%!?+`!~ES4wbs)n0m61wkh?$o(Uj#euHj`kI=VFo z@$L3&591%)a5!0+`)NixIi&+U?@T3+`vHYAX15vWlJlz%vK29z$3-sA!%$uu0;MI^ zKF?0Oeu$bIHhUqO!-h$x;{G(3MH!yErCnJvkjfacpc>ETvo8W|*|S8;qQ6vSH1N

n3t<>Hi4*Oc@+0*k*9QrWH|SMWdylRm)F=(xQmZ7X<=$VsSeb+= zWbr;zcjRGE`0MtgZtb$~(u{>GCt@iCWu(?W6vz2?On;!xfD=>&sDMI>wQiJ$`QKwR z)s=Ej5f#kEm%l}?2z7qx{YvD^*t<#X^ZOwvHi*i4s@%FBHGh68BUS7P2H_O7dYDD$MSDhqURI zBHw77%gC1*yDY&Fh#m-FDMZXPCKMdIvz-6wu1TA|Oj}M-6GhC`qRe`7vG~mnPXt*y2y}unm->cJw>BbE`$(xF^njDnINPR_D>;`~Y`%u>jfj0m zCm0Vsyq)^0>D@e7)TVJs>F(`?;K05>?~abH^-8c=4yP!W#dpLyUVtk4MDwUJM>FwEj7GT@tNOnBSGs2QW9FJ&p&iP~y z0=q_2>#1VYPRDzz9f^Y-DJePZ!7M42y!H9co73cdKF9hyR?j4R8;VE8>Ik%b8TK3# z3V^5GL%hD%lP#54nam4{PdRX%Afv-}9Nj-aY%gWmCI!CZCpEQtZVcYTpQ}a@vgw<4 zSnqlNd?I*3I##EX(XnKwNn%TrZO@tIsZn!YC%NiU{N)+G=972hb}b!(1XmUFn5oQK zC_nI(UixsKgAc>N8MBa)7e;Up&p-Yk?Rx&Nti#`15@xN@B&tW>Wq>3v%{L8>iZ z$R;u<=IL;IoEg!1lU|4dK2n$0tRgk)@K7E?eLl8 zYOF7=FRoYDtkC->rQGU_vGjV##BOqB?NN&17vp?E5#yspYF1&9hf1Q)yU?~~-k-il zjNYDI>UgsMPP1|5Edt8-_ao*6N*HZ0iIv(iX_`cb=>uQ&(Ia8DC|$OJ zrZB*2*G|0|qRLvdbgRuHrzLO8RU1wiu#2#ksV{HwFuUFfr+?IY+=4Vj57ZpG=n%e0 z%ozR7vbw%iv3|zTN5FY#N4sNpCA%Bwr5DcAli{eJ`~#D#<@JAZCr%6^v7jG4QaclT7UXxtQi*?P zX!*vRy4SwCBBK3=Rcg-C=-r?Z37_|U#dtVMwX0eBLkRyr@rg z+W}uTXSrmDsR~JytBE`jRfSfQ3w;O4v*iPw4{kc-O7n)^dlC2Meb9E7*}~LR;VZ4X zVSQeUDOoy;GFQ^I#`KQ*2o}$X9$^|&vew_=11VleNQ_i#ihcYPCTdE+ICT&Tybz#? z$8%QW&|BZi!Sk=WBqQz3p5N(&7kH4*zsJz?+>kC_GQG@tDTdmG-0CSqq(k&AJeeG` zD<+}YG-|E945{YlcvPHo3DL)|OR z=__eZrr%Rv%3YLfXF9&}`s8J=SoqRP&5WXaY2qQ`6s}4zPxhkR>TzAJdt@YW8*SIj z9ockULXT|6%*;7hmBA-!4xKSD^|gF|=FNC9RXe|0RNYNao~>GD-2jGisX}POG>tD! zO%k$E&jY{lisNT1Te){VG{)zr-iG&GpXtmoB059sGMSk1P$D|nn3D8NXX};4+o-NwgmED^~;s?5o6@0M$ct^P7X5PZHcZ@=Lg_ITSf}63) z31x|w53_~bmic0H{Z8Anm)vc{aVob@U5@0p9MQg+rgKCDv0`H+K%`dCeL_57k&q{2 zL7B=wD3>xzjEI0pTv&bRZVcm5-4sco#(noKQ;X8jjApuodC$&X3b@S5FZ{`sg=`c^ zJ~R|D53^t+ztN}^xFzw3Q7ZZoQDU3=R{HAa^5ScQkIX$pQfccRPBvx+&pLRqK{7dx zD4-PEjOq5bSWFcwuQfIb-cjk8Dcgt0UmVm?;u#BN*m#!cIHdull=Pnp^W6`zW#tt* zW+)EHOjvY?ds%bOr0v@6z>UAzz-t`XnVBT(Xlx@m6@ZVq3U)GqJT=k)IWI4G^Ol-HYi(k5KbyjOhI zxPC0}z{gke)m0^oWvq`#Ot}SX4I?`cf(k>=Ynm4Lib?3R->biiNHbt{xVuoy9+=S~ zG8kHV_JiZS^7_*!1p*oU7(**BPadWJf0%m*9?`mXU9()PY`bceZ5yj>+qP}nwr$(C zZQI6KXTM+f`I5c&Nhh7t>0dB1#+;cm8Ta+vS4^I&;K@8^K7-Q;B0^sc6u1aht)Q43 zQaDQWwfEjP-R*^XF$#7~oa~t!;AZ%+V9d3g2#HHgV2pGgL$y#-zM>jZ+Igig^i>qR zNQwYn0SiKv&(EWkqL|zml4j-ERLi<>T_NC3z2im*z{cM;w%wycB$8rF zbxW@oKkn1Mo>-wCR+HYDeLufkTm2D$&D!%SHQ$1Jc@us}U##y2EZ}y(;}-;>v)s9n zI|BvX#Wy!lGMRfP^AB`NIYvY8Dz8aU5SYY8xJqbccx_FT&gbj|Z~ZOrkD5PllhmBG zgL4aX!*&&m82VLk0$GesuuznO63@YyUP z>>$Gs7nC$G2$-0(BJ9X7)c|)Rdz*pD?U3~+@5DlA49Oh}ec)s3`Yem&iFqTG*pL;E zM)PY77mLQZpUM`(BD!&Bm=^4<*XMk}GAy|{#n?qB1sfNed&z7mfg6dnzwsLO%0WLk% zVoIQIwoa@5^a)bnKZ<_S_f8157}>t}IJONUvNKvfJw{m}DQh1dtt$~}>PIQh%9CXQ zxz&9h{o;&~*R?m(Y2kacKgWh$xOjDbK?#E0BR)fPFc@`I&%LDEoVtiK82fbpb& z?96q00?jF81Q2C2lP)5#waAy->H#UV|frQe>*LENt8|Ufe@I#PjIJvxvhATvHud=0V%-@PzP4;#9ebejb z_*Q;LnZ;!h*nJwPF5CfMRR_?m-w{i3J66(>Vk*!jk-6)iQ#jXcqx5C>ofi{8DBq{N z(19umVUMzl4Iel~kG8D0vZQabXV?%LisL$4jhdFdG-c@a+h-oB;@3_xkC>$7pxy@R z#O`34+yL5Yh^o&e;`BNum;c zqYjZh&4y{}6`7af#Fn-L4|w0BwrYMUX13G$l;%SAW=Z6eFv`o^kg9+KR*TR285V!` zDjHzXPQF>LJacRu)M^*I|1=$yfH-^v5ilT6c8S+3fT6;%HV3fh-6A*3#fz}Vxmwai z{TI>IKM?P~$0&bk+y97_{`ztLfq3ZurA++yT;)IR{r^8kcGW~5E`Oh_$|1AD*Y~SB_lm4$~`~Ts_{}&JSuaJq2p6P!dGBLg(6EKJy1;C`< zwLb+$lBpJb(lXCnF^n114GzDi)pO{MSNC>l?MUs9kIk;wI%QqAkDo}}fYiJM|5180 zE8Zlf1|TmjC00kPHV1bwD3X|Dw4lGtQ2=D_mbQl^tUi+1oPjNtR%P)67%7AUXD3sy zM`@8g8`Bv|c!Bx$w!~dH$G=9WY*iBq@iBu`N&L)=dkw)v(|)JBmV3oRmPM7L?;&F^ zM-{>&4?r+>2$Ctgttr3jJ{43MUVzU)8 zt2!~%K-(uc(qd<#2RY|EjLCftQPUUJ#Q?3DttEd&i%+fK*HK5mCU1vi9-wqWx;vv=y>@p@+t8H!(eq&+e2EK4hE7E>2a)Qvj5B z!oF(M?}ILGM+RRlClsbnRls> zRP7?MQBwx42LGfo$aBOqA3^Inko{@^E!?>WS_1`^mBUFtzMOj0;yNFWqYYdf69`Py zvzV%a%8=Ld1_!y0B(*a`=9Lt~x8Si1!~u^!%DgDVCVc|_mZ4Gh?1GW&A&&Fdw@yn` zBi?NmQ~p1)^&6hU9p63TZPi*>DE>Jh23 z*Sg5*`v<;-4`N_8nDcB>4axbD1!s?0PrQ?&*5zQzJ`8=ghO)?+L4HiMw)1yvWLbL3MqAhoFe<@&Y9esua4B9A@ z3$_hNXSHk2;z3!X@!Z&16x5Sk2_b%RT++V22IzDHgSpC%w8&{`y!hzEz>X1im=I-5 z)9`*7P zQ{?hW^x0cDko5-S8f-*BY{xw@iig#5_lYsLg}=s9Rh8~+9&R)Qf-R8U-#yf$Sd8#*{Z&{-a9qdN)y&@0F}8?_&&yg>Vuve=GBkLvjK z76G_@8kOd@S?}P-wV3uR2kN&2?di#0(=;>+0wAA^0JX#C&!PSupz#vd<{iNa|^tP?Cqe49sJZHkBoN`ZwcN`omgPZq0i^tf9U^0Jsrmb3Y};vbqGPv1>B7S{6L zUeHqyq-2}J24ASMiNypvSGsx?rjEZ&JRfhQZY|R`k4~p0L(B44PVDN_y$6W&p})2( zYsYP=g3X6DA)eg;Ryj~{`F!h=Wg47ez)gnhxRa=uRXMyY!xi*8JDkNe7>Cgq0>To8 zJ@#Ne1G{Ur>DE-2H#f7~q-Fh<0-DLWmaw6STwohqR=S!`H--(YBABBaN9}M+xA4e|HI>daZz?z0 zCPnh%Vlg_8y~iKJNFk$yBLsDThRSZXnY6{`34Bj5@#+t;xk7|>MihDGQtpd6=X`J4 z!j-eAV5su+Hl4O!YHa#a3u9DT&b>18sHVeZn*=<4K%*bpvzh@7$OIm7-7fRL$FB=j z!I8RLr3YIm@Zv*m!R0Pw?1DUWiWv=E?%PMl{bfAt?X{p=3NlZaH}_H8l}?YhY)G~& zj8nktJR-6yVruHw4dP(I{NKo%0~e^+n%HtG2J7#t2sD-DX0Nn0nnh|$*V?g4vs5MK zOAf$f5S=WT0hAtSPKQl}l{u&vddmjm$s6YIr&d`qu%;i*QFln;X+$KfEYij3cywKT z%D&hXZYsOJH{FhsuSQQ}Wm?^mVc@Zf+9d{IzQafk1RgZVJHb{G5_b4?iKFq*LEM~@ z{|v!C4)=0olY}YwT}z}zVg=UDFVtO7tzBFc*Oc#FhC% z5;3-)3jAK_vDW+EO*1<|$Twljy9GE=HU17^OW6)^7Z>Dm7@&2IaO-BR7bZ}KsHnfg z{iUdeHX!t}SeNrQ$M+cCh6(E_oFBLCsgnW|$=?CfAiFO6=K-d4{>xwi7VKp#uBJYr z0%k@Nyg1sj=OzkSiB^4y<7c|b-srBiwC~&q5cg)Y^kQ$G$$>%d#BLGYks-hqk)~ImbDNvNk=*@!Qh^11f9i^U zfjeL51Q;>A4s-o?;D9bGjG(4~#t6HZWr_Qc|Cl~dOsuQpdEid=IdIjFHQXOy8a1nfQ^Y24i;AEjSj*?OPDFWl+2-3np^7V-e_*@YY_V$r zf4}QJh$`R@>%XJ}YH}C;K6lgajER}w1(6gtzn;tIrTs1SlsoPKwe;H0IaZm+aJR`w zlLhcx8xNF0F#)3rC23stzl7?1l1@jUf};^n(@v}z||V%fxs zZUcvgglPzz`&I~01R>hxRvqAl>r+xl!c9VHQ5P(=tc^XFk=|63jG={YN}XB!8LAQl zgE;GIQUEN&-rELM_LH8bIz>IYhPOm!7$EQaiuC8+EU`JkzQ1F zJ7gQbO=e^VppQA5%5ZTDfTd`%&WWq%65}oGE2TUY?N)=He}lVo(h*&a&g{166uDq% z%@(4(Rtnz$;+FK>Ox|7ZRWmMz@h)Yg<+^I70eEIkKN=1GDKx8BlqpvaE>}(P1^m@Q zD8&hPxSIDaJs{ZQ~mlN&L zx8vDgEX@oo#c34IQ2dWZKwQWZ9^hUS!j(F5b3V!yI{{E`FUW`J5{MK}T~tTlqN;%G)Io@51|xP9CSFzOiH zO_zS388bMVxI|y;8&3k_;1t$EvztxCaIPl|I(vX79si_j83kUIJI(4lyJG|>Thaav zNJlt*n!)pR7^7Pn->`?qA~U7_pYxYllp56UP6J_cghz1YN5U|3=EoElF9jg#Lo+b5 z%lP)&;RAxKe&$AG%zG;rw;1;g!JN&9C^=O%F=se%$VsBoUeS9-Q2a$liJmWvv10d- z+YSLIV4vlO@98tnP8I%>m)tYi8-N@qw|x{=3-K631{ry7iOG_D zDlLs8GsZj^L&$K7x|!7VAL1^_gt68eqaRASX2{wI$hj>aAU|=_qRA0k#Rgrs^Jkte z>zKCN@N*MVY!|=Xe`V0if5J@WHWWf5ej(*B?n-jr@4W>?wN9^W_0m{FcgkEXfT()& zmyDKu9D|_|#*@+tM=K=VOjJb$^;qI`V1c^`ZHFI2Ji3woP5N%CvJu}T0t{+1UWEGK zzwPF_(iLrm+LE<4cHL_%eJqN4+A0TRkHOAXQ`cwwFo#WB)shBHV+S?jN<=5S_K(sq zi;`md8S7b&ws3nHTTfsjVwH>)!z`^-+e(GpYT>(BUUN0lIM{{Y$c}gZGGalNg|Udw2)N*i#vt!p_pH;GFB)_Rn_*Kq z0^dF6Fs;Bkg<0}c>N|Cbvaqx17oRLx3QE=G(uF|E5^b`nMc*+Psr~*O@4G+GnANe! zTDl@T;apbZ*74{@6DJU&@#Ds`N#u?$i=t1BB@6<~#BFG+-ZDtVt$%IE0_t+9#Nj+^ z`%?_zEj2!%bXq155-4~^d}fk)j* zMVproVx5j-MM9leM01~=Zw1)~CLX)u+wxd*Ey}!SG9f@`8^2Kp2fYTY7AwS4IPXmPB+;lM=`M zGjTv?El^diuPDZgXzG7MBlxb~>k)0T1q3t8;4$7Q6SXX6o5Z^qm}!{E60Gx$BF&WD z5pYyMArXN)@wz<-I4pt$Y6#CD7}KLi`}tFCFw$5&7=+0D1f0PgAxR1sNZlCh+)t%< zSB-z6KOoJlJDzxlWg*HacO=g!m@LY0|8T_i_(Wzz?nS|r6xiJ?Z`a~r>g<;CS$+Jl zfD9AoE)=Z)9Sp%|$&*!ZcBgtNO)Ek3Mx--aR;K20`{v~ar7Q zR_PZ<+`Mu5sEo$z=kPqeKG4h#WO8?zFp92NI4njAJQ=xfX$Ah|DqB(t)XBz+GK42< z&8_sTpOHynug?m(DTod|`c=wI82UIHMTZl1KvB;ZDHW8Q0ul8FEsu(seS~6OwX~Jl zAYPQ`L3ZU8`yKF?2uS?}^(*T|28__mk{wM*jexF*nSA19<vD{0zx}5rLBgD2Iy?nYaMh08B@!x4DQ?%D^-~Q9Ow@HaUcS?`_{vMbJ`JUj6clG8dX-JCf zW(l*PJ|$(MNDMMnEoaC+8M?~=|7YtM1@xv$np>h2=4Ej37kiD`QZT2fXe z#^fs{D3Q2>8oaZ!FOsV^D8dm(PGDsvL>fu9uwc2?>*zT9moO3&d@{Be7JnG#q(3RB zIkK6>uMzs+mR|>#1u}+a7!$8&+rQ`sIYMXwn*mATdFMeGFvEW?!a5GT-Y-Okf&v=p znwgH-o>v!16ihJ^gNdItnP1QDOG*k9tco`YBKy58iQNWxG`rVr6H!H-xJii5 zJM!#>(k!>rrWOoE-Ozqrxt462UCEK`TKn#~xmr{6J7R)b9~p46%p^MA>$GyPvjw%G zPZ>B*gz?pO_0@0cJ65zNBN5YOQS({zPGY`w0oX>2-t5Gy-1K6&wvEkmlWa}`c_)N(~m}|YpJ64yd_+6 zHZ_s1Yj@D;^5+_HatC}$<)c4h^whQzb+U*vGzMD4NqbiU8sBc(J-aL{u@86r$jd%043B|8_H{SNOf#d5no#9p&yikTxT9njpV zhdG{mb|0GcTO7{ZSg018Nh~RL+1-{eA&b7fW%)vAw1P4*ys%mMW{HZAqDtiTbzuRh zaeYorI<-qb&@k#UC@{yX7lcHvy2DE&iibaA+ys19|5m}=>OXOj{5GHIk}}Prm9mJg zjX!8itBQmV%_t#DqZn<$I#5dKE#|Oj1h3N6h}yz>XRja_e+mz1grwltUI(d*P_7A%uaCxMTjh%)FuvJn!566ps<*}eC_axMDha&F{ zL&G4GR4GQ0CLoV1CcZ4KCFzXc#eLiR%?AXfBTGK+NRx%q*5@*{(k=3NnoSAi=a_kf z)pLcFJ~hvADHoUnU+253(T@^zEJW%kG+OfkW>dNxgGqE@|9ME$ox$T?OXDvDp? zL%+2U?mMQ8y{&E|mo|4@K7faRCw>h+HFJ}fNjiT7OyBT}n+&T2rv&>7Qcoi)q_ z_~|p!-pE|59VtK5su3p_N++Vi-HJ3^?WMXnuEThWD{~ zG@U7={Bv(y4`g|8NORxK2zGlBS@g|4Z!1^B&Rw$tow)5Z(@8IRfnM>q*Cg_{XD%pW zulf4#5qXf{skES_dlP3&^qr0F2Y?jV+uivvN*MYyv~~l1bOoJR`QOKc7wx^XMhs^= zdV>UD6m63CgYkqc3EON*D>xC6_#9w2vnvX~{jB&Oq4@e#*Jwn4AYGI}VL57Ol!+(n z#@zaG7S#1<0ZI9e$l0oj*zF7+Uc`lq%+JJyZd0LU@~nXc9csIkFD75PvKZ_l^cRBQ zZn7Xdq6-B>@UTg64RY1F;!ZT0iW7%`#N#I~CI56h?U4U?QXST_0eK#k>KP&~UwgoX z|E3=Q5-_qTbpZ}4?aK$_4u>tIJCTdXc0U}i#f=wt*3%b3URc3dR+aa~l)xJ`V>Nna z=<}3z$30W7k>d`Y<9r?oiH}F3nlGuei3jIOSL7bdBBzC|nA~wp=o*`hT*#2%HP*zH z4piLcgUU+WOsyH;F~F?_(X({4Siwl~q*fqcXu_zxz#U~Y zW>#J#M@0*@?SP}5%bJg4lGlOtjv{^xsPDl#`c?11>t9X+vC03?AS>oq8WgBQy`6;; zU|RYJX@n!11Tyk=-8ZpI>+< z^HyoSWLV5v^Zsc2{lY&z)(5o?gFlH{U2dtVl!D~F`a}VV-XXrUiI!0?iL`ILmJ@iL7g>PvMwytmAZ&tn=^=x5Ife| z*x#>c5WJ#_)2U7C@hSDY-RgR9F$|z~qQH~}QmWfc=6(;#uL59rhOi;K32eig^Za?y zUX8kH((W)9>`)K#EQH6GpR!Tr{#OZC2&6?n-$Ck9g_BwMQdd%_N6jTUOPe zxr?2ki0+rjum@ZOY~_}ay!ty{1|1*%N8;K5RYo#6_&~N6UYpj!xT&UJOpi(ovvU^3 zn9FpvHv(fxv3W`m&2gozlVlcsAf9nIoJpvQ4Zx{MJ5$B|wsY|3)$BeatFEz zB(I|+Ss;^(nI!G6wP_`T^Rmnd{E>}h@L%$)wzwzW;C(k`TQt}nl_#Ix0N+rwduelx6`;hN0R4+z} z#da4^ge;<`ZZ4*9&U(ve#Lp>BmmY%FA#l)k9n(f_3v%=J&)FJ{1nIY_PMKSETZDzi zn!X_4Fsn*ajV`<4V#UnZ;)p-|XBGkzKlx{fQxa{+E^Efin%WBWA*c~x=6d%hKWn4m z>y80J#;AfDSu>hAQj6&vy_Wp`7$ZPr#k<%QRsK@z9_BeN9Tna-m)HWi(LlUdTuCS^ z)wQY|=hOYDw3>8&!Alg2HMEHC4~HaWWm+KhyR5*FUFT1e>=4uORoZu;$1&8hzteG< ze31Kn6su@X>zm;Tp=bi+w+yXEFI1G-904=ersR{i`leySc6hGJ11|4M#=?l>@M^V#oNvSP*Y|URsg2q5PW+ za=|G2#;P!3$dwG>LdduHwb2AN^W;>JMe+r50(XR&oaPog^rF&7&#bC2V{|X%bi+@u z-8IVdV+1S<&k>O{j#&_nQ5};Qza{13%HI2kdXIwIPXzbZ8A8~m`U^a);e~rcEFf>X zLr6itdU%)@;VL;yccOl#3=6w&fhT5(L8`%ci9NYLdYKUM7WLq3OqJXq-AJJS-Kxcl zv!aZ+Es`Ts8(LnH1dIB}ndi1~dx5I>Q=M$`{h$^EexPHH<6Lpvt#rx(;uaPJ#IFc? zNXNaomIV7%01ZUM;?h8}DY1^S`bMf>gaKe8+gnnl(DIjV(9FHhIAxxa?-9Sm1Rt|G z;Jm|66Uj7KDKAzNiD*G9Lj(uOYCJtITwG7)V?p^NR1Dg4Z2f^!sML;1W+Lel^LW7G z$aRIxmF1$ET@$KClDk?06+-)&`DZYPC+dqBcG9*=JdQm)m!X`b8e*&H?67P)Q8*xB z)hP-bPWo)FBo=C#VNI_M5=F{OJ(b@KVom~ep*I&UzjV20Dnj#9_M#~nucI_Q@!XMl zM69yK81Nh_0UA+V-(^rE7=fhpv5}&ob<1@uV@*O;&^jOBHh+Zs4@W8%+cFnKD&Avh zfT&cGtqX^~!|eUXPqQ!SIR%K>ml-D-S4W{XgtZ=df7m2T1%M4uFpR9u_tt8~WS0d7L_6&u9Lk z*n`b@hMJ}U6*$BR31|K<-QfASEh;5@fg zJ+CGFwzbmMU5jdxai>MlXqltNJ@Qgh=L1Ouec^L3(KI0-0tX<*_ptuH&^*y^IKif| z-mbB0lB1m0>T8<=%%@O+S7dv6IuXZ zsa!r(4uoQ9%HW;NlGI!sw?xMFqdHouWFP%1S&tunPca%Z2F+N1|BeHkS*8msG!H5W zA|oe^0m7a1FYPIwY5ecbE#MmYG7d=);*u!2W5Ws;m;5%hxJof49OYc5wPU_bV!X(P zG(KfMehTrp!H{Z+1$)MCP;}@k>@LoV=m{|$GJNUr&PXvbG)<+^r5^9?Kdxr)N=IuM z!anvUo;^kYFzh`Z&1_1nc0vL_lfH9c2Lvoc3|B1MK&9~_IN#Y5?MQqwGQAG3J1O>f z!&JP>O2EM1?MrTHd=D$PD@9sR>J~9N8#teF`O_Em-ufE9|Ne@}VC$B3O}PZskRl3Q zh7J@c-a*?v_!96ddt*D-m?8J zD!lyww;s3d+eQ2OMK56tu1(e;)puTpy05g%G1{PcxA$$%&6Qhd#+XUd(3BViT^cJm zO_DU+cR{1p*%xOab;(#Vxl~Ur#$D7n5xC;BM4Ec}W`mz_tfUjoA=BTh*suP(7$s=D zr(8>tOiECNf%Lq63y!;_(>Q@%XSwJpiTA^Da)Pg5Y$wPT$7_-fIRjKPapbwL-oQ1n z;gbe|BZ!w4kN-1D@jCEvL(Bj-25j!7EQ4IsN;r68M|ec$u%A>bX261*ohIB4mPL?&JDNfShr11rrx4n?dICO+!-6Q-=hShcq zRQO$&Og>2KD8%nA^1@M~PFM%vwgylx5P@ zgJL3~Zr*PH+zv{xX?#Hk#|_d^S65aKlxJYHZ3t zyg&#WNYI6O)iHQltZR~|71&5FpigA9gXbvZ`rJi0D`6Le<0>d)8irwdj-AYe*pnF# zBLpI|Q|qRz{X`oxa+jjXwT%uu2|}Z{1C6OgKU!5_)=MiWku-Ou%h{g8VtSJ{$iD69 zQsO~@c%bsYFh3l?=Dcsj8p(U#XjeUD?7H;}v%?i;hv86t8*;Oq}I-bOF5S^f_sh~DsVoxO-8R@)KQ6pDK-kt8733- zBpK~m!mY__6yZNds3ikc!&x&z4vcyqgm@OfwgAVyN?z(n-}sAR>r+(V&CU6V#OpvQ zF`Q^8K`zggTq_&G%)w1C2dNUY&#sMZ=Qx77OdY?>#U6r zY*W(m1-hR|`x<%xH(1vF27Itni6_lP;GrhIV3Tm|Jk5@-@?wn#~?iT%&hEOp&+ciN~*k zQq@qO8rG~NjQJ}RupYgyl`Hrf4Pfvm*<&u(Nga2JhJoW+U0Tj&8KKNAZjxOA>RZ$P z#Z}67DC7{2t~9^h8}Xj>Jej>m_dB{)FqFu*H%g@x3 zt*zn&v_S20r@lp!934!vG($*Cxj#{l9?3io>$qF0``gL*g>pdS|sA<{K1 zf=g)sY`P?wrOImosvo*X!d5hYX~_NzEhY^S^eXrbhj?@C)O9PSjCPQReV7PphvjcH zoV~KHc*!ENwdSd&h|=G%VN>1R(ZD%QHEO(|Xg?LIrNBiJGR@ajTeC^3LEre1ipm#z z#%(cWePQrL$3WuAJcOn73$F)y5)4n15Pt+~Z-}bpuPRcC*ofw9-o@j-7wNt{DkeJ# zYi@XcNo`H_8o9*RUHB(hS8Q*#j5Y^Ve%eb4T!Wq{(#rcWUd81O1`*&W{*d%!^=aKF zaM6wTh;a$nTa4cb5%Oei-VupYy(9}Vdb*W7d2yk6SX&Q$o$?rRdA?_LGXG)yg7>8& ze*rxkZTFxBivvspjuItCZI1_a@?7}HCI(MZsjnQKTpFvBmolUyVj8NVFtP0oQAboX zvi31B%i!AoGgTU|m+*S+4U@u6`rPlbx&c8%p{nlHsmN z>>@kHInK2lV4Z~;UIbQeEWv=tgBnrxSu2cFU*c(;u*pnPrXG{z_1xV#@LInp%hUb* zeRU1?d+()Xm7F_XF-b3|QlV%}BOpT-yg>QMrj|Z5U`RKxe&>%3746)Fsi zQ&dr)Gq>%mlzmT(L8T|Y^X5X}oS!&}h8|#Hm3NK>bCdMTFgj?c1Bl%$)%t=VxSYAJ z-c|bUWhk;rOpGb?thC^y$Sd-E_MBs##cuWyV^O`H^?4F=#-qC?22}h6?&P>Br7a*D z3r#m=4yP}OYA4$~B5Vf_?tsOag0+j1AWHNj83XzzxKz3!nuNS%=C>msw<6?qXAoDg z2}BessG1N#7z9p%2&CF6t#An+3dGV+3>7{98L;AYSL=-8hamiCWZiX9&8ybg1w}?x zD4QtY?KWOYuVo%t(a%T#J#9#qm z-hjO?c5@(dFj}wXaw*vUjB8doFpXSXpwO>4k_!|Z78mX%MT_WwPqYGKUZk0# zC*DA%t`lM>)#F>C3ED~lM?E|gH)PYAc77R4Do_KoEYt(E5=)~$zws2iy2*Pf+%oSr zRO33ub|e##ZQB2!9Ic;vezP2$a-AC51-!Tx4Wh}B?VVL(2Ih(nsAo^`{K!p$a#?9MPjBO8;5 z!RRDR4wBeiOrqaNeT*`IqIjEHnkq)5s=xoyh7l|o+Ycq$gB0R9eL{^ZXNHzW&{-^| z^%|(J^8QEv!Zbw>5=F^M$P5U)E=i}*C_=LgjfuEajw4Vac1I{bIK%VK77@OXNdyRg z?h$J&`4*NbUwH%nbx#+SqH0Zg3iBq^M^R9oe+Alf3;)pcTE8rX98O)Nk`NxX>sNaS z4I2r9kGXaH@244GM^T0XXAwk+K2j;Y^b#)iT;__TnmAV<;MOOY3LLls-pB005RL(g zTlNUIkv5eCxN-2iv*S0{rWN8{ewc^g` z2!d*3FCN~2PE6VA3?qe*Z30lVdSqu6J`Y*(Y49X8BR6U`3Y(w1^2{Q8Mij>;d2V*J z4V(m>xU{2iLhNC$>{Ff2#_kS`0Tk_5A!#Y*tZ_%fDo6GqHIB$rpv;zJ zhEtT#_-m>QJiQ=9cDK8@f>b&$FjpA4C=X+Pr`{3m8mB2)OXIpt@`#NNVm(tDG=@bd zW5YXUwdG`8&Cp{dE5qlNc^lAAOdnQosPR}+U-B|ePct;3>U7Wkq6$Pc6!JIP6wXKY zD;{;KQ-Ibm#oXPC8G@V_XTSum` z=lP;HKZndjM&$Ipj966I9n|$y|9-N0bpc;^>sm*9bv=8lwG4Bp=FNLE*zpCD&#I-Hh=2Iyn<}J}+OIwA@-B)u@LGlzGWDxqV&Gh6u?~F% zOgZ#{%HKmsj>M6|Zi8py9fqNC9r2c%J8i=;FIru4?k9CW7}aTpCCH{_`a0aI;V+d$ z8t06%lE>eXdbI7*(u)d-#vXnnUw#x|(}#?xlnE1^&8K__(5$~MhqRUU1Ko-SE^40N zf=+s@T2@p^-!e7qs}bV*5krAz-?9Gy}>4I^%pd%2)>#Ad&vP{wNcGW96Is0*p z2T51?lhFyAra$2&u06(c5K$Gpx$#}4Z@AtMJqi8VgHKmel&c-{LFfQ7U zJ94Cpb-AxH10st`LAy!4Z()sq%iWuX4SG%2FIyhbBuY1_tJaS@rfNux75`qxE{Uu+ z3YNx;8O%{-vro~|*!Ik@I<=EW%Jjy>(?okRKku14i0NMJMl17%j=Dt4&3KoaKCJy? zCRu(k0Ww^rd+&=-P&v*ClVVnDyl@;4=tckIF6t(wjY@2igeMIenX#E9ld-oHDy@>Y zq-W|c!xf-8_-Jy9zX8Ninqbb=Biff&=~cPZE|IfLA&IKp;W~rw ztkfc_W)vATq*gK1F)aU2$2l2RAPv&ZrxzudhDo84VnotGam5~dE@<;mxQ^5?Ic#g# z_vnT&kfrT%LjrasUlBYdjW61BL;tpyGO;&1vTW^&>8$jax)yLemLGaF3|A`{66U)a z2EvgzIn338ipmh8jTL?2R#WWP`)?qrTc9j=qqF*XmmrC56?myTHci&-KLd@Xk}>NtwVl20J5RCeGp9oz3^cNGJl-+sE)56vcLsz66;1*75suNu8J| zKaV}cj;mv<={8Fi9;=OOa16gm*T??k4M~!C-crx6oAM(PLkF9g0{t$W^}1h(F~-aO zHGp#F1hZ`>3ttA2Zm`^a;JrrB{mODlahY?s;wi>|t&%3OLH60ET+)-K-gi$WdnwiG zLmc{LDS>OfzZm5C987I4hA=H_|C0CjQrXgtC>f3W2x51D(1CQkdfdZcLQnm7>uE}$ zy&E7Bes=w1q@v+jz=C^J_)tvt^u89n{o}-A+#l(Nr5EM5;;;{lVp94}kGTOhRVimE zq#UO)d;(}1{&+v&@-nN&1akc!jz3>ROhVdL%GoNww(G)`!Q%*V&N;F}(^;Kdv4Rxi zvbg3DwQ`2UC+bNLD8}hjH?E_#Y$nj0WaY1t7-KVey4LzIC@9mg3WUC z6YIc5j!f+ZxfV(squR@!$p>sfnKt@ARtxU}9q@P`+__u}0wnRdGV#cOjhQ4#UkKlW zv$P6dc2B=jNeW~@4#4mkgYw{-AuB@x@4|TG<-MW3qrF$s2~bBn<0w_oWq}u$Z{3HY z!#tX9AGtq}9O zvm3c*bJYT|*m&N}e!q#S^YUb7p#|iH7<4_gi@_$|p>aJw(;`c_KT`jASDpiub}8*1 zY~Qu3x3D}QTlpI!uRjO?E<9wx?41HNS}tW_p$Xsl)PvY)a+OdGjXhbeFufRQ%h~?P zjAWjG(y^&Q$4i~zC*#H_Ug9J}eTauaAd`7wQ{DNX(PQ`ppBo#k260Wddkm0`e*x3A z$&qgNh0eGbF#(q#5F^an$>e^^$h_;(W%D{v6F0Rv+Z=BhRj`cA6V6?-r+ZedsHF3HLOx`-}@ zyyk6h5jZLD@cnvK7RZ{Mdl5wqzJ;}iAQJ)?=D?G*jowu@Qi=G^KEMX06I0ok=nOFE z>o55u$;!G0ldABxm^lAQS4wVM&i6}bdjo~Ri`cYq|2}4b_2S&5gl;m1JW{FXr4{jG zQw5%_{o?KndYHX6p(Y{YVWNk$n(ekDB2qhv0dHcPSitwTMg)P2>=p)tvZvKyS5h|+7GR8pMhGZ~T}#5y z!HcR{(+ZOF>*yReyH*N@W31Zw6(V2l2l{vxGK&E6FwDMXuhN-~cVlx!1OdCWNP7>} zGp3Nbw{IRhj*Y@9#ZwMh8k8d04tSguzWA75_H;XxG!|A35~s-TB}kN8s45{=j8vTy z^7km)yy6lx&WT-xAs$K@pEZqWsM&#Jc?Xzd7KYshH|!j9r96DL=GlO8_y^CZv$_$1 zU>AOko1=g`U_fG8zUcy60vP^r`dl*cP@kQnUsM%2yoy@hI`93#!z%(9&<^Qc+(|hN z>nmrAQc7ML?;NF@1|laZZI)fz(PriU3D+?nRYioF>lEe%%aaulkt$<6z%rFVKUphw z!a|0RBt!HdBGrr+Q|;L{DdKvDQhB-JwjRa%4CBHeI!3x?6!941WcD7ifGtuD!A!-! zN3CWnRji@%p7R!UdE!Gv$mJDQc|XS?M=A>rWT305p#+H8nzgQ00kZS^0QM*d@j4<; z$Jd{9RV6V-qvXcwMiYaI+g2RCenk~s6EfNn!ur)i7{qS6dS{#j{nhgVwgk9n2@!o8 zv|m^w(Wayf8a%POit%J!-|d zS3)pi6P3gw;fnOPRC;%WJ z=A<5J-Flg4Eeob(JJF#xFkY)Xo0|oM1+dlVW$J%Wcg|0u25ovC+qP}n_8Hr@J#)sk zZQHhOow02jIp1cJ{dTjpm0yxn{)4XP?Ru-LufDIFsx0uG&vMsbJAu*-MSlhnZ*ZpK zDnq5peNRqaSOdN;CBU)R1VA9zC|^tOCOi{7{Z^%M!GMRdTs^1k{5&3)2F6MzEIf&CeK7lHx*`|AT0`sgqP&eRj2+D%{pig+Zus%hC z+#6u)_Gjw!!hD{~*7$4xI7c?XDe|F2@nn@?!U~>fGDYR~+6eWMkp|w4W<+$|)l^?K z-lZ^J#MF0VrQ}(W2V|yY84|?}`!~A#vZ(hS15FTWL_)}g_mq;mHpS2drBj%5K3MaD zE3zk#F%0)cg(4ch*N3j7Abgml^2AFRrc#fa5d}jQI3UbY+`}vNusn)o4BPl1~sWsW3MuPx>Vnr6%aUw?G&4`eJ zwA}y9An-4~>;DC|{&yAg|0m|&lf`|K{cY)gP_=H<$i@gVp|1 zl?o%{Ki2W@SS=ePGsAz$YCYqJ->2?LUhIx1<(sw%3+-?fFQ}27Vo47s!>Fm9yQGPb znsShTU)0P4{QNkaid-Il9^VriM7Jue!aj1&&H~R< zxVe;bu=!QR5c{VEaGv(01aNALlqifoVe)K$lOF~H4iETrhR}js-fKe_Qr^wrI8!9H%V1bB3l*_I3g}87JfgxT318C9h zp{s0B{q}B(G*hzPTBYK`g`H}o+GQ2FUnDc)_=vJKX|SBR=ygej1Myb-{fj<4x}1u+ z@k6d_&wlDEIC7-mQCi)4%RPoKBrm+WKC9Sp?31)9{Ybk-K_J;P`hd~le3IOk^}DW7 zf@xT%$>4p=u7)N6cwE(TX1hk9eYT@ol$+MU1^BDozu%^%Avxied!$n#LJ<0*bpFu| zoO{3sAuEioq9KTzdXdNoa@Xjj0@15E6#P04GWap6B69-REDN6^kDk=zOi*Uy+TcWF zG8+FxnDTsBT3Bu+u_|d(_z`u(Cj?V|WQ%^0x<(&MvFW7Eci$jtO9;sN8SScr9meLj zN@rps4q}=7GJQ2d1tRVyg@=!7ag9<4@o7sE!Io@HIyF60(kzHN+~^SXu8&n%DWW!J zxf>*UND1mpQu^2G%2gH5X2Fq~mNz$MBk>^=DaQO^t;{DP7}YFd6^4(rZ)c zk+dhgPem4OI<|D`m!Kp2NDqAPI7lp2?P`s`Kk(OC^Ku?4$G9slf|4J@J}z8Lq62pw zh0U)g1yp&x7SEC(CZ{KB1k*{$%khg<6YrACT{bp@SA6eklM_CB=02KeF2N$Pu`M}) z8^Fi@BljgLv09xQc0`{X2QQ~z{OF5m^+Y6%F?y=6uxtQh=30m=`5WpbZuz8tBc#IF%D5AW%wC$-k=L`M)ZC*VqeEbRp`hH-_AIGF!uV z--Go^Db<`Ed!fyU_8_Qmn-lC(IZE)f)qxtx{YwIN28s`s+uMdI@V(A(>?YN-(y#S9 zUqU1gea_hktFfDRwm$&8^CExuAEf$zeV)Nc^!l`J)OEG4KR30ZVJ8UoCwOi3C@d3r z%_EbV8eNp~e0GHmaHShSHOZ{!xK-Ky$lHC~B)Omwazu$PT$S^}g?o=y@8J%4DCv5mjcX#$3 zAClH1i9u>)>G2|P=rk#FldANObE<$Jq^d-YH>vbzU;}AY$P8lXf%FeADKZ}G+#ui> z#&gnYe+9^2zTosi;Co*NNVautdfkq>sZ17yIku@Ud>}Y=+~SZ*h#+&Ct|A%VvOOi9 zmBO4rOWw;lNP!wPu4U(gMdAK%F;+>5zIuZ>*b#S%f&KC&LAT3H+Ljm4?+K~VqJB%; z*UQ%d(!o^qL>pB(UDRmzRIu|Pn@!aYE)InKsFHL^?G_Yv3iEm%OKL3)sbj3X*OR_w z)eR#JoUBH8r`>tXrFZrJ#p?PKx?aW^JfLkh+c1X=k4nXJd#kT4*SqWGc1&>3Dad$a z44%m(-a?TCOHS0R-F3@M6#!ZG0}7;a=Ba;izSKDRQQeGqMY z;oVpyPzw!+{Q&OXp|U^*lr~4D!V7n4!HDLp|Knu7k&y?%2Ig~zFp?7sEEortp|PgQD=IfAYtmr- zVl^j9iqHy@x|TAgXTbaD(2NZcoL$hM zv2sJFkv26BrRD0(0!BHnvowm(+@Q<#TrAATefjMtF3a7{8*SCtGCnK>oyHT#Kgy$p;T~@$_0IJke#)gGCtXAxx&otMCUU7j?Gz2Xv z76+*O7jw0iVD~$*I+`6RjcpBh`8Z%+NeF}hAvEMFwZR|N-AhAIL-5&8>i~h!2GY4< zc2nyqYVMiCE<{TJM~2akEm#6Ab72NmfPVKDE%TGko|6@YqUs?~_~1&GC%nAKJ6GDMHAUz6JFIZN%l5W`9PO6c%@;K@(t zSUNQ;u!F}S06S3&pXOCFd}R_SoQ?=%spa2p^nJrxN`%edQ#LNI1Oof8Ts~qgxeGP7 zhl*rxS{w&^L3Zg~0mAwPz<)c$swONNIAKVBypC~JYuEBbSBXtr$@yxDuiHNrmj1-? zS%xd%92}(Cvtjt_ zJmh>`6(PLZHVeV;@-f3nYe!Q__t$T8qrl8CfPdg6g8+t8Nq0KzMK3dJ$$l2&gVu6#Q`J?+Gkr%tld{qPvA3~EJ?HQTHGaQc37 zFpETnH5taMd1`iQl)$$p2H<9-bC+*}X88Fkt`2dOMK4OQe(;h$cG07NA7D?X`dRR5 zrsEJ9A1C4PaG!HG^qjwSg_wXo|zE?4u?$!3IAme}N%DdFD91oBbRzSbhI3V-I= zw0M9ynj<`22eXyxs6+a5`vd z0J9L+2X*Jc8@G5030kv?3()xt1L;Wm{WsPL9wH3%I8{nftq>shZo}$u&XjOGEvQuE zD$0GU343L8cv1Rl&W=eu=Tm?FlB5j-PyVd_u;)G8_T*nnowdym%pO5`_qqe#+#$0t zH}hMQFOzI&oAA)1`0a?jzDKd@0mHsv5T?eFS$9fX+=hK)I4%T07Ru+_Jc+(tI=@S$$s$l?MB&31qmn~zrJQ=V)rsr$ zBWnKA2RGZTfWXpCM&FS0C|FNqt|k1iLn~_KO2o2V52pi>MWvu!5Y7W`Hm`78(fj?u zLWfxzA?D{7aiLQ4f&j-(Dw+!#Z)_9LX!{kptgRJtoZTH-rt(HVZKH8P3cf(#*tic! zah!9qvz?o=oHxQm!Tl?ZvdT#e!M8Y~QTOnG$pUGvB^*7D4Yl}*6Bg8dyM~&ie1Y5x znGc?jy%(>D0j$r#V2^<&5?bv%G#eY#R=gp}c_!{{#AN`le|6%-llddbG=F-dJA%_& z(C{Payw+VrI8QoP|DyYjL|)uNKL;&7M*Ou=nu&NG$1-4+|HP8FI}2GDhMb-=l0qo> zRinm6t-E$37I1#MnU>sosvF@JA7qU0^%4P)>b1CW9ZN{q zSem7t0-x`&0??wGWgRIy6Rrulm6zcft9?5NcJ?+7@#xJXT4g&~U9l)Wn_CkGG*axxJ+P{c3K zb6nn6J6D^P7`O+RG%tTA*+>Vm#GCKIv+@nWFva5htZAQhl=ZL3UnCEqfjF>{!Bj)n zw}V7Ioe;IqmT-p|dqgeFx>W2e&bT9ML%;?eD@B{UrLhr}b9VYVsxY6@!H#_BvFZo_ z9LJUEPYzWnI&h{{#l7^>a*kn~`j55TV|b28!>ofe=!Yf(C@;ViHKxmyk2eMa5i_`p z`mvbb9Ay;nxqm#ai+j7Xy`j;eS^0qrZrXVHH$0!;;jg>;JO;S5AcL)Rr!={sb|B@v z$dnU>YSwZswEr-Ai=Lfq=9#BTPXxTM*-H!tqHKWmxzTi?{v3}jd;xlc3po}F#X zgiw%hQrfYIp!OJy(3GQO` ziPhY$O>Z98pCH)4jmN;oVv!gC2odALOoy%TL(^8hifC3QNw>03kA~Zzrd=frYBoM& zS+~%)5X8ITU^@;%2$D?rn5}9E!wfw)LFzwOb{P#T#cvwyZD51IqL7gqp}TJcdkTW* zuV=jKU}oGP>JOlkHMQJIMn?|WUY`8ZNy&j~AK{+GN8xu*2OGa}V!BROB$`ep40?Z9 zV^y0Z+$4K#R1-YB3c038<5V^)S75Aptx5`Lx@O|G)Wox@uFiLp+2efcQ+~2yS@+h^ zVh=%dQ1FCGwBeCp?yN#$pa&njppptNWO>ChwTjRYa1co@;F!-36P01XbeJ(Rx44qo z>^m};{~pX{2?B~6XRFnUc(w5}0Vz&&u4(Pv53JD|dHL|xLjZvtBPj`pwJe%5%h*aW zxhMRaKR_e_V@;W3`K&8rkL&V95WCq6o|lJC&0Va+Y|0r`%!Qi^qhIlt){4j~+<}N! zVlL@u{$Sf5OU5faZDQ73z7%J!Rix^s+#_np9linc%k@-TiUD3&&SJ&eee9z74a|N- zbNVjbQ9`_HbD{Gi>V?5O^!uO!||6c{;W(D*j4W``^pS4qdC8|YF= zGg~GA6MiVnmLE8JP`f}f^Z;EzhtA==?=mQkInuCeP+*lW@+P(`>IgMpCxA~scR2%T zYvM1p44TV9Q)%*wf70B}o@Jc8EJ=JXR`afOeyp`Hr{}921o@5uRp-z_hajh1x zE$Y|5Wk(^XGstx}8gi`sV7S|iG_|GlP-s$%@`c(DWDE=yuacV;&aO2}Kh0EV@oB~! zs46*3_C=w>kIaYZ4|3Z}1DKquN)DgPK9Py*HpU- za0Nc1N#fv1&=am9E9bPL{{?VnnXlb;!@?QEf-fjAPuJCd&>kBwJTmmc1>IVxpm)|oy6Ov9o6G0P*t`3ty3^y%%L!DN%7(Lbz0HP^XXHGB0jBo7r|m7w7hlG!aU1&X zs9o+4i?R9i?|#;#nuT$A>C?K~n_}&5Ef!ZScRL!AT>!u(_2zF&~Pm=`Oj`sA`fPBV{KS_W4wANQNe9kgZY;j>(-ix67^5J$Z3r z_HGbOUQdtR0RhvHDH@v!1v7(7DY!tKDY%`TQH4up>t{%z^9S}6J^T7x8p@ISC98#w!jMxV z@zY3vGYk2X)i>MhHawb;WHXx#jTSCiD`S6RCCSPm29~3LH5HE5aS+C&K+=a9C`m4$ zRgW4U*e%BZ1+TcT#qGeCKmBKL{Wnza;?tV7*h6gArt~mbCS5XpQDe|~pd;4<%lLiFaGI<)#B5;(I= zx6tp9lb9E#r{u1CqeSgG)mjBdtxWoEV zA@rdXxJW#EIPe5GWNZC{FM-!0&L>YF4RHGCZ_lWIDnD`lR;4jJ+??2G!%<*rkj*V1 zGpz_^OLH~H`c4Yd@H?u}Aj6*dy`*Q29Uev$V&IA+B)o-{9xTHxV*x29<~0;tBb?yR z0Eri2uGFt029dXGTt5=5b;0P0d_RXj)m_Qoh$7Bi+8j#r8#2}2_5mCdT@^=`iqCI; ztb==!vu@%Sy30u`V(H*s;Rk^u=vs{-`gG9aHmb>w7seAfv_&PhBTSJyW)-2yPCezb zAPv{InE_j5UXmT9x?aca$p0yi`L~AUe+s|-E8+M*6@L5QYr_0DpzKXqhfnoVa zgZ;l$!~YA8`6vDJUmo*6+06eX9`nzwn2i6J;J@cFoE-l(j~Pb?m?s1K=2I8evBU?D zS(xk`UH6YJC3Z(52hS=tPuo?^V0C-B=>U52&<#-Xht;S_gIUESl1|@Yf||BwBK%Q@BtKOAx6hUD=-@KFK(@w zsf5%OVRw9vqCcN5Zjb{ESNK>L<+SwP`%dtjY)ODb%c^4fXg*Xq7ZR$v-t75sS^fSQ zz`eE|1yOdxXFNF@&QPezWfcij(>G`np}<+Ia5Oz3f~N!x@p^NI9oY`j##H94 z%`!1wK)b`jSlI|5Kj*Tyz}#%D}Noce#&MI1C9i!`?=U;7OJAIf73W(< zat0VoPzjN-_XjWatY2g{*jpiWp#wMxmcnH6dH%hbceg?4yq0XJ=o+c=igtLz1l5rO9ss7AM`;D%s z6p2XX=jRN36=h|(wwQ05TYF(&HLW$71ZI7C*O1IoUJTpTWnp-q*%gB|nsjQYJFgyA zrO0CrGq{89R>AIAW6{h?z!r{Y)1mP=TiF_{=W;OjotC5l?HPgp9{q)BXHOXWh0_-a_T7OFT*y(NJ!0rj$gvR9xb^SqL*OqxGfOYYM9_`et07cB5k5`3W9p`90$|*2 z-4>0ESF%WG_)nsAian%th13^Pr}keCTEQr(=$nyvqX*t^*(#cQ)_nv*k5c3v>Mce} z?PgT~?9UtxTt^wi=P*~B6^sF@F&*M@VvFA@ zW-HZ=5yUi<>YEhj@^` zZ8KF(gVV8Nf%KmiL1qCY*;*F{k5#=GwuwXgWoN7xLV-6`Gir?T%0#I}$TUv}Iw-k@ z&?g_SPT;YQ-4_`0>kmjD!N~!F4jW4s0XF&AE6x$s^$qkFCLbZ!9Enhb&Nu%cSoLyV zo@%3CO^@!IFMCQKgjdXt$ZDMZA;r2JA1=Ihy_!@$`Oo3mu3H6TrW1}bjxVpEJ%3B-FP zV1YfTHo}FjLiF4#F@&}+e%L^tc&o=_H~FSfM9o&AA{xjsoPl?%lmVX~3~&smmmuo5 zuM!&X<#o1>rC|_aJ3*ADRdyHTz#Q-Bd;G20?I`&sIe6%|cWbqTLz>qda}MDYD1Vy- zC9&8T>pfPngjByv#;j^o{cC{<4tO$*V5a@#$r7PrNUr>`(ro2T8&3c{N!0(&7@t1m z&?~U~T}qL15-_Aecwc^n08rM0ed6J>dMwQSgs2r;rfuR6Dn+ur_5~t1RST0i?_u0= zYcAi5QMYbSb{=GX{_Z9L*Hu86nA8J+`93%DrI;a5qAS4`mSPVLE!_DaC-w2)m%?IM zS{#rRhJ~Bk9S||50Tmq3z6^X-_bJC$@R*X2t9EMZqVvze_|47yH5&1?RAJb0DO?Lv zf@*P}{Ym(WOP0Spv>ntabDm4+U8&LY1VP~rIV@-0jG)FVzH(iHP)T4SIW|kSn}fVL z#?35*1L`Bhn~gj-39QRd5COLfclsg27~J_6)G?||H+Jx;&v8IyT9Ghc%SDqz7=mK0 zrXT5Ai^MHHzv8odEG7){b3!gxwTp@4`+$EgGvR|`9*NKzxbwBcO16KHzsCu4^n6dG zK*Tqd_M{5ChX#Xyz+?8NYo=cpxfengA^dcL)z^#BP?(8ipx+zIu9UDwR45q7YEi)` z&>$#jPCdj&!U2wN=!9Q|`2?AADlI_9Q5m_EhLE&gP^K}tIUPt8x$!9K)=7Gd&ChQ% zWX5~J8Z;5706kr65g8YXLAP}*JJMFlLg@{=Lo67IfGxV|Iaj2k8QZ7~DJ=DxWNmI0 zS@Z#nSiPLR*Z{HYG#+B;NZ~cmbXVMQWKuPoOq8QVVBqp(t5HjOIW&I{*xq^mm7F@t znqCRMPNbVjRW70t(zf?-9@Y{7WA$sDXm2YutpopO6hA~11WngsImxQ9iI=K z3sijmPAz51_;}O~Q4xP!XSwnL(S?8b?a?A$XFf1HHfc@p8a^Rb_X3w&4{Ijx3pLps z#q~e|ck#`>{NSGH>S|7#UryW*y}L#o{pq^l2Ibw|R{f2xe0KBq$d8q8SbHSBfsu|DEZCKbyG z8HDNDMINO;9MMDitD~2Hl;$AAa{Kh;=SbNOUEa6(vV?9gL%rT-V#IN8n0wfRy$c+n&yctGudMz@j!5hlEWK`Uxll@2R z*gcU;P!>`OgP>AI(9NZKMShw68WH%X{4fj-(mwHttIH6HQ_E93@QBGMDL+?OKL?-= zUm2TN)WxBkwKHQY$_rzO;BGwxG%m#X9#h@LBbX6?&8AZWD7WY}QGqg*sspl!^&fcA ziUZM;2MUX)=56gFJ@e)vkeR({-G%L_$q?iztV({oN+H-?8>I6wQ8$myeW!;k=v%=d z9OQ%AI>Ybd7A@raU>7cJ{xxp`6@ROu3_n1ouC) z^U7UpJbuW@GdCvhE;Y%8L{oG4zbpK!&)T1fLd3`CM#!V6)i}sR=t&zjho9Gdu68D4 zNOUCwXYok!XF+T7MqXAkF{2PGfgc(F>;j|=(f6yd4IimS3*`so61aq*m{ZcIHqt_8 z`!$#eDpx=gE)5nLQ0$lznK-AM1EP$Jb2$W$_yRbQtjT@XN%*%O(NW*>oe>4kkQf}8 z7i)t5o)>98@^mDre0oj&Bx`_3s}g-rs;O|+rJib`kNf0F5cb};LfS+d4%dGML)_nZ zH_1m3TK5>{vj-U)4B+1c!4T(6cuL=uXSyn9-u~b3&kEZG+QP-04s_ zvfO%vT+~TVfu0xEe~yDtSVU4NPd*j4hRyrzYd_-Re;bB4H<@ zRdBc{N0i^m1?=Fpo-4{r4SMr+Z`Z*Ai)n>*>(vipre*%=|A36PiR9=T!ia*q!%Itg zMuDfb=5v1aFdH-<-W82K+;Mxj@yH;xLxo zQAV8m*N_^f$fhD<#h(E$Z!c1Lnw5U9kZQ{1OYdz80j{;j)#Hpjz3SXNqXXpkh8Aed zKhhMzs|_voV|I-k0_3=FNP z1J~6ExFMq%2PhiF)+Cf+cULbLaz#+K6`}LDMHrt09S2!)x-GV*Ch9BnmWQ#F-&Te*{UBtj~&b_zB zCu6%-`8qV(v=Xz2Yw%SlBqnAro%|SM(L-1)7EtRfVgzzOix;KQ7sJ*A+tdhPnKbE@ z_D`kT3h|T}GM`FyIkiRX-Mg#d0F}#qyr^IWJpmJ-7*R9aO*hPK-y{!m(Ig-GJo0x< zGSp;dD*FAE-lw<~td{y4#yczM?uqD8O<+QiqU4oxisn6GI8GL{^-UFt%T?15a#31z z8DPo-(x)APLe*Iud=Gfp^YdD4^aI5eo;$#;t$N@xtJ@#~^}v>@H^2UNBWCS_n^PEj zDOKK1XaQ<%pgcFAmBZCo_l3i%lil~zTkRX}cxl%(dTy;XEhvgwPEaNo%T@4iW+++jFwq>Dwb(*w#q&Z+C969~!JBtIc4=^@8^9+LBzHx`?jq$~^cq`-+M( z;z*4xQo{0PVKiE-t^%7lF!k*@n${&*TVK@CTgT*wB!)OqQLY~5A5KTYNfaTLqNQ!c z=*N?SHgPYU>_Ff7qfS zc)MhN_zsUHYFG$>?uEtN%i3#VR2@8lxJWC?`rF(vi&L>P1dLOH-%F5+QDbnlaAOX? zhaQ)^m+5RtlhDCvyEGbw6aHoguPK5>9uXfwTRcgRgw<$o{ujH(cgm|-0f{uZO3@x| z9Z$!IZrC&exHjB%`@!$~22No3Vw_icfz!a>z<)%{D+yc!#}p&>{mZqAt9zj*2}zuU zL}>^bIU8rjXWr+S4YpcWA+atj&zT8gxx|lLy(wkehD4i9efU3Qs!9bbB>B>&+}i>O zZW3qRp%^pB@7EoPVfi>Zy0kj`OJueu5won$Dj)r0)4uNxF&5JHkZ!sf@=GnL>VNZW z{v_sH--osp_pU5IZTXVFBsbEGCI>CC`aZ*g}pDL5A5!?`M&=FR-+TdK&}zDq3C z>NcA1cU^7$k<_gK-GUI#6gy$C6P+v1@JNujqd^QJQ(F+=j#d~IY-|WMOsH|`V0q*; z2&6m1Kd6F)?$+zw`SA~UyxU$Z@KP4$!P@GVT8DLFi|jIl!i58vH3w8|{8m^J8>F$Nq{=DSvf=21X1nB`{?yS0X$Iu%OqKa!Y6}K}#n=uo4x33Ll z9FjlC2Ch(dO-HV{)a);hxRXB&BIwH_mS}#db>1pSZgLoPiiE2)>G50N2@8m^{qDzb zcHfT+5EZq=NV^TougM=1BMc4M9hqb7>dG0b=Sp+o$X9?eSNFa|Bo zYN6_&e-lf2toSp+sDR6Vp_M+kAWFKb2MFfgI+dE3p31kR`|7gtlG+$Q45(V*x_{K0 z|59{bHpUuSobPyJGe#;xc6&E^9Xll~=7Q7soZe=sJF+B4{RY@y+)ymqC-xb^X>jlO z#n53%mR6Cc@%%~uW+*k#JEx4+xPV_Z5&SfD}ObPkU}$a1`Iw! zrXmv{ULp-RWj2|21Jy2Yw1s^DYx@h39!Yr|cJWB}LF1hoyOKf$OOtxDaA07aD9J^P z11ZODvS_hVrt`BNc-b$BrJvzd9i_#H@*ScZ&+H!fXT<2Tp9A&KO~g5_LS0b^d2z_3 zvaIKas-A$!^Ym*o!eG&S6l*e_FLWvg*2HQ^G^cxxhP^(Tt5$BQfrNg$mWGNtFV4`g z(SCA!aejbbQ@xsX&9QfFqrim+R~{-HvGt6o}q!WNxxD44qgd!L@FF zTJ0`}f(4Ox_Jvb%$sD{$4UveaI(x>(%u0ft<9LGCK4)y`#$dhzop(rff0i7sJIi_N z?umQSb7LC>q9yhqB)Hk8Ta6m)oiYqK5LkY0jiltjng5#HGK*}Nfe438^V6snnPJ$s z*pA=mzc>R(eFiTJT&ZiG3@7R;MAp&7SluLIhS_rT+MuPcHhS?mn&c`wyTv8^S6I4br}$7I%pi zN#6A~)y3$w? zfFk~QQJ}1S%jbEYsZZ*twH&t>HVS~j@`2Fwn?|$--D>z1 zdS9!`LKb`l0?Gk?UzAh+T`>;!P62y*>*_E0Dhwi)^jx*VN+h>h2UkdqZ<_u%U=8S3 zR=LdXbwBEuY?}%_e^tjx<~0T&gGM6i0G?uB+5Rvs%!C5j&%#M2#kx4iRnP7@Z}phf zhd4(p#$-rn5UTO%P*Y*b&IsA}+qMxNq{c;LTEi$Top3RM+e%ua5bj4@yY0K+qMZW3QOrm>o_hS|ey+kU-;~ zwuUBdZ4qGbPpaQ+j>{11rp-=OIK1H#F|#|LX- zYy5YZu#AlVnBc!7oQw>N4F5IalvE-kMp?4;_W1HJO^)3iTbg`wJc@cf1)blcaL+Y6 z5;56t?ViV>m5j{3;BFcKq0IV?}a&K!d-nW z)EHW%U=o5BtI(%x{1p+IBaufiB9-B+Rb@T@XY+`&j3_r49oN{I#K>^)0EC6oL`FPu=F|+E@g@{ z$~PeZs$DsQrY^?R=MOKujLa%U;#_)K1gCrV$-}1kRVVLGy(Dd`K7jJkH{>xl*-r%5 zmg<)aDpKqCB6|ttJ?&Rgcj>RHAo)yy1W99M}jN zmccF}*A5BjY&I@^;p6dP-N%Y7OI}eGc{X`Mp*-B7@Mu5FmZAgcGN(rosH%dI*|;Sq z=OYWrERA$s9br-BMMkQ5jmax9{jZ9ojECJ9wh5YNYYb*rTd#X+OoB39V?Tuk%o3}0 zth_aW{>FI2GKyJ3%^G%;KuB=scCt5`*h0Aj=uj{#T+L*!eMqve0@$eZvwh^|wV$5Y zrylOre3?efJ|}Gy905x&(zVd@26ZjWl$W(Z{)FWf_YG2cb)UNqL(;flpq{jMe3HYr zf1z?-pxnR@A8-dp`RyRpPUsHcqe9hqlL>kS(PBGkG|N9ntA(@k#m2tXVAd7)3n56j zT4D!`|7IjA>v;+KFz){ZG6-s@eNHQ-1L55z^Pok*%t*l@^7{H^CCE^T!C*TH)}R%b zVgsG27f<>iD|rpSk}v|PtO2xBY-7POGt`UI#vKY2U2WS{q;-J1R|P`df~|lYs8DG+`gVV^FThPeGP-Wh4Pn?QGMw~{v0&S| z8;ltFIM0|mVag?_*y>JFWd@2gZ!Dm+S4H8rLcfkHUM}q?TiI@x6Vtr4L04eQ>ZM{0l9b^Xk+qg!5RDcv1e>#rSt9q^fq|$IgK0a+eIm za|^&kxi8Hf#Z`STClWLj#16Q2_{0RHK%)8t9mpENIHbzBsJVKhftrTlClbbz zC8Wlt4(Hs(z!AUPHUIUsZvh0Q2ZQg=fRlh5VB6i<4S+}$_jw!Y{FLH?-3E?F^l6Vg zA!}t6KDt52^j_ao9pA*hb$XYPCfFho|`)cWm6O&gLT_A+@&dME4}GImXMQ=lVm$`XNK5=62?cbU{Cl49NyN~>%`4orvP-H!^I-1We)(q zY;?@Mbc9)@dla#H`6b%UeYOOpr?1vcIHikc#(rqi05LZ6X9r!tNmb(-{d?D`nrwnA zm~d0C(N%n{7QWAERA6hV-|p|kBbW659M7Ha4@#MRICWQow$FFqj#-Dlo$?V7F!Tzu zENl8Wo#xP>P-z~-u4Y(%aKZeP1mzADa`k_@AZAo3yJ^$)A+A<##^9p-bpl z;TDXCGPaIb@3F`cP{ll_qxjCF*fhgD?FxDSL;IFyu$iPk+Ba|08Q-i`VMW%ogrX|5 z!OHD#NEeFu8ZE_)0CGs<+%VrUsitLg3DF!hI*3rOh+ce7zCS64 ztT6~;>53nB{;06HMdH_(`Ww-2AAEtD;MG`Gh+3jt*zlYXsk8a@MAj-ikWAG{qGC98 z`!1Xjq$9owE;-{8wH{hb(-?d2c7p*ElZXMmA-arL@Q`=|b_K5XiX7$Hqt6^x7u=VK zmpijW{sSzZ?khK+TuLnH-TsXAxq|xEwN+GA&95y5ckjXHiPig8Sc;mmN#`61%G*UB zgnIXUlT`|edETutZ75noabpfbUV4EBT(k0@!|rt%0MzT4I$=Uj=#-_uZr0iHud6|` z-AXRu+vX83T$?G)iq^&0-{C24j{^3vGUF)sTVE|`y`7ouW)b8nKiwq3MI9p|%{ay7 zHfI~InBIMkY1fP?xG&Qor3!WPMtOO0t$&7N#iJtNvR?k$o zT0#!npa3I_*S!y#LAsoTOARX{kKj!UWcpEzB`;VQbkC=SZ~3PeQ_dx=s&rZwOnG)= zS<^oI`qLwuVei}H8Q;OwBUONWIdy~UFhnQT7~93nk0hm+pXaa-w4J$<g>hK(pmf8=(NnmD4c} z)%j}DDaNJGb@kS#wBqw8XygR}jEp|*8%X8J>cw7IVAc7qmLfpPwoxI|84!-W6F5C@ z2`)O=>%!F9^cg{_i`_UKUdt^xFrm0x)_x-zkv?Vb`3(AHp8KGUuk%lKoEUPOE%D!# zs!Os+e7IhFNYrGg_8VGMeCnrgdsgHa-WCryaVnjJu2LoIT3Wc4ZuK8uvt&Q-Krb>F#R~B=NFU=lYtWk zd(KEwRb-f#-WpvIqlTbZh~^dq>>s;dwicpY$o2o41?!aqzT9xS%&47QEPb-0H2Q<9^A^`7`>_8nUXaeg8-uZ9Dy;HC#QJ|)`Z5wBsXWO=I+qP}nwr$(CZQDl9 zy~#}O)J&#Qc}YJus@Lj%=&t(y_5EFK@uA9iP5?tmwFQi(V#DYJ=j)`LAYNjKo6qo^=)`Zi!rRaDRA$^>j|c&yVA%(7fE4c|^$J$h8=^2O8IJ-SG5oF92{+6hl6Z4$yUGO1Z2?^?+@x^eiJli&b=BD=SwO zq)6zn9%a`M!^{SVI{u%rm=oR^Nv`v#w5AgfS2t8OL*X;KuXmh*0&z3nx>mz|+g+Wg zRJ-07z`60ljV^NEZi0pq%vXj5wA%J^q#2{l{!`CHj+brAyM(`}`DodDGEqa;F=`u8ypPmauaqQ2O0<=|blv6z+d z=1Z?Hq#yn=r>Sr<9;eJjQtZIS&dMe6r%;3b+F|_Jv0}_aWu~AAkG=SHUR1&)o{h&Y zzPEwrHk1kt>EKhZDZO1sHPEDafO1|!tO-uY+%RMV&8U2rUKjw9+}ty!X{&v=@)>l@ zjZKmRqn-uhd>>$j?#Q9iUmcnUP78(w;zr6VcCP0?c?7?NQNdnn=*E@rK)XnP+>~qyJTc3RFi$HgMoO{jBi6XMZ)}i}m)zx@9ERH9a;<4+gbBa4y1` zQT7JKCIw06+`xk&Y(=TF zFBFB{EaVXCMC?qgbocfY9}MB`U4_K0J4yGfP*w{iTQMz@sj)k;70%1Oj$<~(q*?uv zj}W0?OahR!d)i{QG#r7>3;V7XW-j&>y!$?4M#D*hHedkyf#wNqGnW$dUk}08BdOSp zi-WjmG8+(S)haGEh8bEOd3P+kTDI9ckfle&U76T>RdGhb*Tya)XP=G0+XbD+4H*C+x(qC_pi0g0XL4`Z zPrL7I=4y^sI4VXZTF3?Mj7|V|X7Xsg3Z8Qk;Qenu+%ws zX##C_n5xZoxjk_UUDdlb#o>e@Q)HE3ioUWv(y7jp<%RU;E&Q`$3R;i7q1bpl0b6*7 z{Km)%SFeQsN_Y=7kRk-=>+EF1(b6KUn8}5QuBl-}c2YH6J&iTh)ntDym=)K56EX zdssRhQ`E0=?tDm;0qL<$qXs4UYQTB#1>XrfOqOuLdYo_)QTwbCb{_>(m5uP4$;OA2 zisyU*9xw8#^w8kG$^pS{#(mV?8vYiZs>}k2+F1Np*uomdTt&!P*GIRQt4JNChHitm z!8p!bCOd82qB#pt9|$U;8cCZHWj-K~;kD@o8eEM!f8D*Ocd>d}SlQxgq`>?{svlU+ zo)k2At4x6B)p;r;5v0vS=hL2^+FxS3quJK*2JwTk!hxi1Z#A!Y-nQnY@+J%ijqQ#4 zKE#ndTUBu7)jbBfTUPOB?VS=pmPn#xX~ ztGpt92ORgRH=y=GN1W%r54`O|`nWRUOGJ{V3{uUbamt9VF*GHW0ePh%&E-Bq5~TaG zR@Pv5jFQofwayL9hnQ6Y^itA#@QvG%SMQ^$8uNUF@Y>H0Azb(vTkga;*np^Bw?Z;M z?_ML~wZFj^+^2l5&aa+2JqO+!rHDDS{kMd>&2Z_ab+y?~4tenL(N*;Wrpj+ks|BSU z_r8h&moGG>$PJ|OxYFxsJAdXLlagz(J<(7Xne<3?45qzc?+TG&a-RmSvu%sg6>dfE zJz^70GzRFx8M)_!!fHLsJh8$S=qPka`C*BI7P?5g`ppzFyCHZwM%7CBd0OdWPDm~G zZ;2xV7{SsCoRN)jMC+0|Hk8jnxikA~z;wTv`zmeFB6-&dwc(44Pv5qQS^oj?)Z1+O z)SBtK>in3#JT-bG`&{@)XDpWkKCFjhi8Ky`F1i=DE3ul$RMJ^78}_7#SgF!^0@<*O zQ!xW~%0e5l6so}9sgT*M3K0Z%ahA;!=Jn4nPXXnT;?E(m*-ffHnM({B`2!VrXwW$L`2L?5)MH?(MYfzQSJXB*m;QLO8 zdsA39kf=2h$TB}!kF`4dOY&3N-h0r zwCH>XIB@;wUPlM#YjwgS2biVYk^vh<4(iE*lvr$r#Gg=6srjruQRZP8C)^P$Ljhxn zZ>?=)iHIq*5!L?N>thVljKWx6GL`;N&l&eskgJBn4&a?qyR^no$f-<_aRr&<<^vsF_Tgd?L>#c}2Bx6jQ1LcUtHzugi2hwe# zkdx7}u48^xxtwKx$M3wuPaqOpnl~wq$nL%&(L$5D-lU;iD4bKNI#oaQ;I`!G1M(nV zd@83ath!=D1V&zWA*`F!AxJvfHAR;uXbR16zwD|Z3^;5^yRkdVVGNk>=)DU_WsEXJ z&-B3`e!B(*Kf~w^OVU2iMFtD6EAgLdbyBPZpMrhQ?;c3(L~sZbCaQcb(G5<-6Y^>i zms&ZZOKsZkDmvWJ>TbLjt^w|yIT}Yju#W!ne=%(`QWzH=s6-9sTL;Yc103zv>S9~Y zrblr3870C!rXXq6Y%Ryg~Bo+1X znhe)WwAXSHNZ6oRWz@DL_7FH1ra6l*+#CyHrnAI*J&0rX#{qmY+2(v)^bx&N zz>U?&n38NxEdd#2F~m>%HO3fk}YYkMk!AHFLulVXgHf;n5p`E zFAD`ETS%9Xs(S0t*zCqM7Y#*+$5mR2{xU>J=5+0dU)u)1sW-*)x}V$~oBWA^;yW>$ z^K=xtIZr$*iAE$O0ULnUiinp0 z6sOkP1YQhd0&@ls$e(QKlm(cNvlZ@^X@l@p>w!-gz87=kW}wA9Q~2!^|GW~>2nkf{ zqWe!AQ4o==x(F@>#vL_~n9q8pRV&S6$}l~!&a{iK=KmK%J`C<`!D_<9_=MeHNAHjF z@mT>hj`f;y_qnOSMJ}`O_O2!1j1>IF-j!}zt6{oH;-74~tS=a_h z4XMz#&QAHQc$QJx>|25G>+B9aG#RV=n17V(Qk6rL{{GlrqdSl zk=IxJhshDM4ZWi;OgApI-cDwGw3c}TUVF3Yhd{)=^ zYPNzSaxl`vR7HmUIME>S+Nd%L&dV!A2NlyBqj7I$aky=|c@Q_apzwBi-Tgi3a9o|>_j*5YK}hqEPf)5D$p z=aIvHC7VvJvXCt;8>1A{%?R>q&?A^eDc8Bcja7FY*R5R2?J_VPSRgC6Z+F?yz6j~> z?gR+hBq}@Z?;7_lIgEKgi+UEkD#GA~?~}>j4dVVREZ~cpKSWIqlZbU5Q+$THrFce6 zDQz;Q*i{|*MP%N(i18XcOnIozLb~ALdb*cQZGWqN6ZAyN%RJvzqgY{IN_1$64GA0* z0nllR2BFt3F?xw^#w^}6{fnw^Yml-lUpdY&BFMn`6isAg#!Kez>O8GsU7mI&)Iu<0 zw-=H$J9t8CSltG4wgfbSJe&i$cy7fVARAHl0J0N7{RD!agS}MG8RUwxsX4x9QV;AZ z$CR)c`2?WOph#2XU=enV6-1iK@+&WGcv>Z|FjvMU_qq5KlC2VrKwnTj2%#+A@e%@S z)!m1ShU?3%r^p)8Ib$)V$Dh_Y)?T>;U#yS9l43#p*FPbB1HMTK#+F$%%n0R29 z!sn(rjTKW=@oEd8qBrV{P0rr_fUT`3021>rhcz-j_q2tqAilp1s4^bw)VFJ@?!+&ju!~^wt+iixJ5vq9 zyv>C7$Q$mVrV^Fi+hP+g-{BQfAfF2>Z7hk4rslBoINz9$N9A9MNvs;_o}#2RvTBV| z2nywXz(`(D@;>2j2|4nO4JT#7uzMu~R1}djf11*|+Ys#BXC?7b zf4@PZ*IJ0+75=7k9AxXUg33+SlHKA)An+DGudp^2Q1WhCJDriXK>`? z(!=-t<;?mzvF9#yz@min@Np{O&pRVNDoCYd08#;pEw(AbiCHnQEeDnrb}-)e)x#ZW zWC7)f&p1)CraK#yTgDLg$%u@m!0{JhVhhXPJ~gs?!$~iiM+6V$UA;o-Kp@-OmVOKm zN(Et2z}MqF94UKhy*za*9FHvnaWDkHi-;N?o+EXgXY9zhBjhHU_`Ax_oJGg@$b&Nf zm}|dg8yf6Ll|Mkcz0N?4e#b#!&eF`&pg-xJmP&V^^?e=6NbVzH+d`hiMD(%{CuIw0 z;qQ)YTyS1@Fq2;`sa~Qs^Fcsy)O3T56y29}x?5X=kXzd^qm+YW*q~OI`1kPfiZJ`n zOEd>~c8L9Elx!_SSt0Tu{?eS;3>3`>s3?sM3ngA0ob<=AC>*o^LiDM?CrL2aeUnMi z5wH`G9^B4yOnC})QqP3TK`f6s$dP~XgLzMZfE_s4nmAz}0Z z`L@3zHy4#!9=iK#V+Id92eAmKBdf#SA8u8$J-IC-3R=BcA)f?MiO%d&;{lfu$@e(9;LO0NakdPzinMC($7lD1i<*`}-J4yp4aju;sB7ELkkejl=Mj%HNm+ zs8`+tEBh3yFRN{#6a_+(ZzRN)ErebR1QF8J}3^A}f3A*MqobyFLADBENR*rXln(w42`q$sTIK)^*TdyK-glo%rf0qNVYcB&~u%?`}nD>5Q1>fbwIq z$p`dIxg1Uedutcg&cQ5dO;97l9o;4HPuNz={wSc!d57k{!m6)tU-p^l0vnXoMj3 zE5#k;tCoOv)tj@=MKM67m_057Gj^zO)8hI!shH<_5VuOn{wSH- zN>Z}zGe&M009_kKNIIgu1$A73{Dx1%h&C!QRr|+$xTGFr2 zX(htd&x~_>+<_(sb8+c*rd!~a9&>pd7k#U!@xw{j?V=}wX!Mnwvcq^2St@|9Z^mp% zSSlkZo;(a}*9t4-q;!#`_OzqP$0;bZ$qenF%Aay@~?<3Gm)Xc`ODnRxJ>FQjq z;2~=yJvU!LeT{L`Q=Gr+M3JT&b!~{etY9+HL8|A3^N{Q(?$Lr!chsLUDRq?;3Y-0U zF(e|gQ_(}SdUvbnW|Lnz+Y)!ZJ{`Yyu_3IgRyw?o4N_`I=*E2cEN?K<(|EL~pb_w? z-Zi6XiA|ARPJHf|IBjd-9OeJ!1=jIhcEq8t+LR}+7DQMEyCcJS3te@lH7{#FkQlZH za98ICp6Q^K@~BRkKT&R;|H2$|D(;tA@sbDpIGO;8zo=6(40a#g(R^SKNM03NLrSLn zfCgS-0+#-IfX_VG$SJ45Zr2hxEKhzI(|1fkf=CY%Z4EqYKso(&$ya8&2kDmxOh7-Y zHt{2*{^E1{3VqLX*H*xPQB(xvu7QX`%+i4b@41paA#KL;`}Zqlv*&_B>5Nl@YFiW` zLvTgwSOH<4#_gL%@H^$m`4_0oYuszoMln?w`7B#&@1e@+JtPp+5ccqIBvja8QQZKH zhaY|3%3*Wb5FCZc1-@A(TPB>kOzFZhH(b4mEhJ(&+Wl_2)E|Va^WyPJ_#QUiZhv3b z+no=!C<3xeqpG_zIm8s{9E52}(O@#C@IC)O;wboJZl=VjDYCwEyI&_<{Q^F9w-_fd z69QgY8b$!~n!f8TOwMKEb*w&Ik6p?N;&zAdwfzT4gQlH?UGL{4M2kZLWiODbR{?(N zuhX8`0?mmzVWb}4WXVQpLi|FlUJJB&wCxQrG8bte8!nIupL)y*3tYQv8x4PeK7vIu z!qaUAQP4%&+~a~T$V}=vP(zL6TM)+3smQ>wbUJB^b-xC@p%rK2pAm(?msCUW7oWQC zikODkgt0+Hy7QUC?D)vFFv?YBAS{9Et2-}1S@-Hj z?1Sqi5kv9@G53nE*y}9<_Xjq4dzXaOplOnVk8m#DA{DywTo7%dW8K&H3BbtSi|14< zn>|y&*L2Gaq(2fJV@Juh*0b{0D~U8<0qHL!&*bmHO6z^dmb3z~T%_ERQGo>8Gj|v( zgx~t%^sz!^J1$&RP2-WpvYWpL_73m`dpjl-4Pbfv8gdjc?oc>W(o<0XQzfEf*lzac zxncI(837lZwl6W{QM;Uq%+jhGs3fdmU;rWK z3RoD+jM#t4yYJ;Bskjg+QyVtHS4cI4&8^1m6&H)*H1NM_4E$^Bp?5$Oyqwzy)gZg?f|;9MAlfO*5AV|`AvTEEs+o#*_p^=_Z=)|Cbu^+kni%Xi}_R_h~i&L z`3P8DN#G_)sl8j1c-ElaA~#b#OU2z7XYTES4VNDP_%*#!t{n+@v(_=&Ou-V&7`1N< zZKw?}{90hE1$0`$i0#;1X9H*7sJ*`3%Y?xjjO%Q+NT4=M*D#R-`| zmHm#%+ui&c^A)+KV9l8H>qa(9pzx*=BYGzm@3#bg_nk~4*tcmu#0zm25i@`;az++m zgxl#C#EN#u zg@Vc+Xwp;f{SsUVtSi)K3udTk*JkvV?r2UxlF5qdrd~J%333<*S$$*_JrUuFwdI=j zFk*G+CI>|fjIMR516RVi_M+Bx)1(arFZKHmeJhBLAw;#a^u#a%lcmRX)T4@CMlD}1 zvwdMLxwQ;YxsbRr6IaF`bXz+kYat8uOw|OYM+)z49?4iDcn&1re*i(Jy`p3;Bk*Ep zO7T$U?}CXyfQRh&Rj}lxZK<8=cT^>PoeHByC_dOKL;nIA=O_F`ZqrDPr1ue2h(Ws& zLrSnUbGT{PRmw;%868?@;X2sxz^!V@mZfmijOU{VFj+f0jEG_imKo<4h9F>A5&|-> zP}`#>JSj@ut{r}=QG^$(F8_s3-Nr5mov2EGM1UJjecXvQE?x-urpq}C-$-x+H{zra$E?n4XV%ecwU51!Me_?Gw=g&4veZ6^ata;||0AdZ~|`V9IB;LR39| za8^q=)HhW*mF8(uj4LlDM!8@zX!NDHU?UR_EjK87$4)=2b?R(zTVMbD)r&LMumq^& zt*eX5@s{go60>9Sq;8Ybanfkfi2d+Jnbga{+u$<c$LH7Ht@Xt_xZ=CQP8%S$orYed&c&i6BZ<1>Noz)Z*LGRaM zp(RY{{xl{Z+UjMoEyxG@O^8A-ScJg>h?A^*PX+$Cn+wH;OSpsXqB{0dGg|rHJu}m#GCG|`0!oIT zvcZ}E{cj;O@hS1}C!^t#4QXL)C!nE%eE+Ca3BOXrJm&1AmSQN8sWgzD0xgT~{%T$R(B$qfwDWh5mRk8VBUV3AdWp zHeOt@Iqos>Xd%J#J$25a$33aJ?08boZQR%y>WlAeXYgLCGK0Dn^Aoghu}BNiE#>Y2 zHAS4GuG*eoZ2)S_c(l|WPj7BLG4L22ch?J5Dnu&prBD(#W|;or4NfPwZkT8?{S_c| z;p=&?<4B8xXsvgc zgP$MxYn|;H`j94zS9Y_sZc#Vw^uR-Os}N>9}E zGO}Tp2p5r4C)PFU?yPRogU6VxO5Lb+oG@g_iJW-VA=(zEjk?u$>Ny{QAnOJ`H^NgA zX-P_y1K6L~C;}5A2R$bA*kRQScYH-UW4}f8kWF=#K4hjatenD&YAJQDn;Db4{r4En z$CX1x_ZDyX95k!Nmd}zh6QIHZxH!*-pEUwPs3mw#iWhRv{cQ1s2x4_J<}2iaNBVwQ zfr$p-5az#4M9xSWp`(-qq9gGCYF`Lq1BQVyEQb%8^J8@w%?Lc0Smli4AKq0nD4b8j z@`HCYGkk>47;3owX4126y9@{t;l^RtfqV%2Hvzr%higr2zZE2!6$r%(q1cWdR7&I& z*22O(4!5sUS)yIdCO0+gZ43fkwCR+0;?n@Z0}O?Ka!P;B7}Al;ip*GCQUXsW7nww= zUm$KF*}&$`B3_QvSD3bp&_*#Wt;gs3%1vZ4WqUb35^2(&h42pH%Bg61(VT;8WrNI- zR-G*wUV(g?Sun zLEhsY6=64M2MJU0kg6$E_BaaW8d3;sZK4>L##GWJ^l9%II7z!I4fJ!6O~{MC6a>6!P=9NR%l zJxpOQLPxb$t4dy;^cGceAFH55jK#Kx$?dEPZTC;a7Jq?pDNCwoS%xx7wM z+nAa4RKmcET(ic+4N^9#u30BfgCzGj+qIMwAO0>D`ztr>y^2TGm+SSGKWhYfaPY#p zY6OOdm~XS+9)SbvSg)D*T56K+wcN^spFDqE<^GmcVHTqm;qd@$%oAy>-qWj@$cPX4 zFgaADwKt7nxRncG$*uvYEQ|BP?uzo>hO))@mkSM%Pbx{3kY5vdMbjC+&I6~*nn?1x zxas|ryCcSKds&M_X39AkFy)|=lsH_tdVp5k=(|jj9na0hE$sctQGtb{nW7}Fi7+k6 z5zhwhuQ<&e%e4xzK=`yj$J}NW`hEq|aM1aDA%#vSvV4%%+xjd0CBX}~kO+$? z>QWsFR#^kqL46ZAUD#iYn?IHy%qJ)h^-2kw8VK^_c%2|I)(XnM=frwdN6k$Pc2#BH z&(&{Q(YLsXsadm;mH@~ezl5blE@u7xdwk66xKfY}*79omaK)AE$q~M1Y#LI`K7CY>p=TmCvjGlqIW3&8W|U zKD3L6P?~JQg}VxsspAoOM^|Bxtiu7wzf|qQwzmh)?;knFM%V}Fx^+$$>;DOzzfIF% z?uUtczH1jMzu8F9s*0|&(k~!GjKSq5C$v`)d71ds5gGoaENQqQc43q3Ysf7AzEZD+ z{ya>F9<|k}-d|@+0}SBTipIW_5-k}kT;g*VYSo$7HXwyV=F4ewVX^_j#eFR&ZYa8F zs8Dk~d&u?nlNU)LbkS?>TRMX2svj3M44p9lIBY6itqIF=+=APTx#h>llPRmNj3dHI zi>mFeh|1m&fZBj}dQn5hO7@I40^?F_zGoW-00FT zgPsQq+q>ceMyzQf*GI^hn*T};1RlT+J;w-mIruyHwdFxtlZM5#61EKkHP6B6Iz}yM zwqAy3CC@GQA+MM1z`A^RRLA@h@O%YR0ib-)*sA{U&rhg2e~ji>vjrr!_8q9-y2>aI z*W4bA9PcjyRqQ4QxP5t+Rj+hfe`K(S<7|^)r)BjdlwDKmtTip`bS0)I$`NSSCE!cz#yv&j8xw8-_~MssH0_%62P z9d-IiK?L`++7g|GP27^N(^JaBQ^R&&Z`O^1{ciTqeQcP^+>zdk0HH$O zKl$wO*N?8l56hbHx~3#i4C=gOh6qWTU=F3nA&LcU89y)L--`!idI7ZziI8VyGs=2v zCb&kxu%qrG;G6`zo;SorKkb)%2)D+mXcs4#mTZgJM0#8)!j?lv%L}8}WOa+M3@{vX0d^Z(k0pgx zh+#?`(@nuJP%CPOpM1P!u0b~FUBFoXwEglzJ@+0T!=?uF%?xYLt0Klu+9Z$3CLOt( zh}j<6=3%zTGu0*vDPwlE3pUAqb2-l*$iJ&Oswe?KsK-!jI_ znN#bz5!G(y1YuW_?=|8nFI6ys4&6d;0u}~JH00`26gK5ij{qAY>sl-2@)2Hjflcw@+0bs291V60*arU7 zM^QfBBYQQ6G8xGj#PrBAC1HzOiID-)!^1l8sEbU2l_y4=0rE{t!7)XY*n~8j;dM_s zaxCO9BQU&fgMDCsh6^kDTJa_8ZHj3oKY-3UNm1>+7}62l)y*t>?M9EBIIc*051S)D)taMEszY_5kwa%Fg$K z)oy!B*}sg8WGw(iutPf?R5oE>^^J|_3*7!-v#rf5(gckEbg-Y*WJh}_USBJJ2#>vk z%+&0a+i`(kLa>%&!7(h84jNA%PFe)WcRkk$lR*ri+A*4KU4T;l`t!fp8&aGvHqXit zqji)S-TzSrS}Q}pj4(ayJ$J3-NVnpN8| z-A5g+J0VMXw+)&)Kv!LRi+QrkgWpbT9cSCOQCYyBgn66J2H1wy^p<31pI1UC#vf*o z>On{$7lChnPrI;>Pw%K1hsPi#hw!r_0X1c+b6UQU?SiBpH4LH`8+E4xT}6MpRz42H z_}CTNz{1f=igPF3kY#MFL2nD*pZjzn(Kmf{=XoIo2%9JbWxB z>WBn%#~D3>8)G2Enl;w*7PzWFLYhI6DbQ2Gdqp~8;4JK}@@)J7Iguh0MEs%&=Pe0y*fdfw{^O=JvRK_w>& ztf{pdSbn707TWL@-?AvDNj;p;ak^U)KxFxcyYN21tD4_PGaA~SU-zyiP$sy7qV@&p z3PQM%oFg&&Tx%cdSG@UXy;NB#2H7_*pW?OH{ExdrzH{C;1$a&W6E?5Lx-1{_=tJ-| zJi$<)d6hG3euoyjFMixtDAESja5UD19Ld_BYFsKtFg8s~kw-C|ktbpRO^Za_J-T%% zEfZ21PC+#DLA(cXHrN0=DYJyNJN3JCZ)@t= zMCX-AcHXmCl`qGx$O9@H24fm&@SWv{qo$LWd`lhH0ykr3t2ew##;@+nQdZFo*a;+- z1+f7czU=?pF*|Xx& z&|70B{9{2H7533}*<|nz(FB)7c9Bf6cCzSoGBd?jP67q5{z$|Bu}DY z2SbE6=oGOH4dV7mSx8SVa=5*uv48E{;5%)zXuq)dJ7Fe0qP%=|#r91T;#;<_O^@xq z@SA&pgT*Zo(2n;91w56Iw}H5DFS!b%#$(jLj6%~*mD-oWkQ=fY%>`{VH;+*w#n+V_ zk$$-|zqEwM2;F21RA7y?ThgITA>Kql{SH>Vp5cy;?CF<`|jA+XP| z*%}m|ZK{M!BfzIGpM#|vzsjL^NXQhs)XJ}mf>=~gf!3Tdsw^mJZ_htA+Hi0ydyAHl z<(+N2X0ev<#UlU~S$dSrh&FJlt(``9tWIn9&58aEe!qNdh%9iPTEhdm^MiHRPL4JR z>A8Suudovy->_L9@{W>mX#jEM8xA;C(dq=uBWG5?q{l>p40S#LRIya_J3d| zE^g)dX}E;^38%)9Mh>RDWFxzjY4LuA(pr)&&!N)O4OaB4WsVY>mM8mMzk6uDmq(*{3^$FDq5>0g!^arUl@h zj?=%l7*Gz-q_Z%Ehh>kM+IqC?haXFzH^LHlE#$dh-G&)%Ik9rjh4F+E9JVE|<3h>v z_r%er34$!|d$7^{!@De(I$aTVqBf~>kq>?uuO)hCy^u-77cQ8ki&zK>(>sA{bV=$N zsZ`$`6FA`k=0N#eL3B~{eV%=yLVz$AdmKVVRM}d~g5|kSb|N3Jm_ME%Ti~=_!&yDH@(0}+e6lfJ}o%EfI@#$!# zjg8Fp1#I0k|KkFde?`Qs>tcZQ7rPdMoR8u@?e zWEN!5rTbS1@ZXrxe-r}zM`5x84-c)JgRP;Wv6CjPoRA2ulChhUHm$Imlc?f<%jV|q9xl0aijpNxwV~ zm`OO_#}byp?tp35RH03$%_GE<9eG7VemqzR#WR@YZ7k_PEcsthgvGQDqNLM z_+{{OUUg3t(e{;6;Q5a5?yeaV#wqkWB4TIfFL8Md+?2948o7wOsp%du)OG=Jh?M4~ z)Q^1#S$j8v=r0l>%)gc8+ryY%)T~o2-u-!E$$%u)P%PtBCwA*^Q>r&y^ z;N~z9@lnLPls(=4F)o6rx*t1CS#95Oyv*(BOxXgqw!4-O*kjnK!!pIPK9D*RJvr+TM4B>Xae?Hn}7^`(cR3JXC2T zW3x0eRZCvKv=mJSMVtht*K?1zZJEkiK^LJ2Wo^s$v%rz}&?cAyb5OPXiIeAzO?af8 zA?Wh!FDe-ix0TPklsAW}C*(KxmBKvu(31jTZyQ72a(_o1L*;Kgxk~^UXYC!L_D!}( z)b-@+LK}2#siKFG1K&)pFxy@Qo=B}}eK=$5PPw-3vrJJY5mx>z~D2yzRf zW=g%uOp&B&K;kMIvi?>t>37_PL^Ym@%w&iV!u67~*|T0y&9+>buIA3SGnMcFi>)Mj zFY-96oBR-?2Wn^4z8Ogn`e;j34q~F&vk@y&WG?iQBc1GQ$8T!nb~mYlF$!C1Pr37Q zX7*n*!f42bPxY!KxKvyG&M+vKSyZN9^ z=1T49wl9?ZQDS+wg7fMl6a!}nh6W$05zXjt)91KrItP0;4}cAmW48IwCHbq$%ySK4 zPoVjuZV{m!^r+!adoigCA2gac@|sHQ6(UR`8Sa(93MDj0mp_6EU7;+@!(4l1=&zga zl7c??*e!k@!*@v2Il2cg916Mmk@$GMBApVd>q#>8R~t9w8mn-rnNO65Zn3#`9v!cR za#)h~q-NS;TPWKdeoL=Koqvm=+8GIyMwkw^iKt}6Tp+XJzOP}66* zc{Z}N<6m@p_GrrM+umqx2J6f;%S>%t&p2SuZ^^HhkCOHki#L#8|EIue+NNt1cw1~@ z5f7=|fA0Q%ZSy2XrXbRIA{fk60ekMnw^fGxm%flRJOXoGZlqB)Gr=-)%^-O(p!C*$srRMwW|Hlov8)+mBlRBIIN)))>7CP>)Bsk&(40pUd$@J9-G1V90@2Xs3@;Cs6PKGAi{M+o;JHmWoU zRolUO^5gMeu}qXZiTrZ0fg1zeso)yZO*4w$SK}2!tx@3h86!&jkVAz-;nIULCeFmu zG$=lpMm4~rfBKssTHzg96@bu;a=Bk1wl%q34>QriFTAHB)ys8mQz^G}MN>1CFs5r= zvj763I9p@}47%+RvpKC`gS%^jLT-x7N^QwTYoQbuG-gtPI3n?pL4#bD2CdMigWTNF zh6?mjnJ@@Pweit;6@{^HA?934HV;E{wbRbOCEJgpo(PvZpZ+ zu;#we=er%kO}c@t57utPvcR7QI*$qv&*tksK#y!*B^}9Yb)mkg3@d#atv-b+=xdT< zx?;p=0>W=vz-wUmCvD`@YCN+qlu1g^0;4pS?qk8Bjs0R_t+OPb-)h}GD6fOlU6V(F zPxSQ5{R{ZFa1znKl*Hn67}jsxTa+D=_V{AS!z!g$VT`cWDyVla7zkGHusdjn@LJ1S zb$iAIh_vYyUSF?ix%rk0>CCG>56qbL(3*&IcqRe`IA2n&rBA~ycg)uFQm+*62>vNt7RyPQ6&iMNUgrP9{(wQU<{Z$QxMj~64nSF%u z^Mk!yiEKb)zVPNjj8q!52X6=nctk|;+lA6dT?FIZx8`CLttkC7sIMKk6VlrRwVM0b z-)WV~e99PRtXJQlaHyhpbiMw*vKt|)&g#wG?#8U2Nd(S`2TsF|Ksjr@ppq<(@cFU( zhL@A14w5wm34fG6lsjIg>L?UcB!5Wc*M;o2~BJTsX( zgshjT0KNv>=#8hbG3>|4JJuzGtT@|0nH@S}GnMA?;;ww#*)w(~uPvbWm6}2FJP&-o zc;uIRVXq{e=XTKb%2EGl2r~YN^+z!*%6ZYz{OujTx{QylSiW|KkK32IYN;mmwyGS* zkf5GHA;aKS?B_g1t1fTI82SP%0c#^ogy<@2lL#@oFT$3zLPtJt4)i5KD3aMUcDD(u zwdM4uxjh#7jTZv)Id31qejy0F$W{MqJVRrhrbEZQ-<%-wt*GAvc~0UOo%?9>ZY){uQ2Mr$60eX)uIjz9xJv zy!lA1F;&AWoCEXjx@#IM8Mu-abWr>~?T}Oz4Lw7U%Nr4;d=U;fO0M%LIB?wSAVX|F zBPi}s^1Nk?2h9;w4xM(rsr5D!gk6lJ+l^jXB@{LEJk9>9TF>qGj8oY}>YN z+qP}n7-ieGZ5v~hZCBkf=ep;twNI?QW4)YvpZd$+1xbB5c{^HMvPB-HyYq^}lE$&}hH`Ae7u73rty9DESN%NMP zrgNy>y;=XwBVU6s1w>lV@j!gMU`((CQRU{Mt+cd)ue~r#n^$B!iMRi3gS8tsOC;WC ziUc+(_PX5YaY85lNeIH;P^|pt9affr5hO;UYvj?V2FgzRrrUA0_#!h*Fxj=`CflUb zi3j5RLoe0p0Mo>&kaE5kP&WKxZ&=V^=yzY*qp+W8j4AMN#=U60c-~s}+U@f4reAn) z&SA%kx0Pa5_GF)6i6`U@$@=i*I-9evCT_ZfT#N7`8Ia-ArQO178jnnuwQ=>2A=;D- z|6#_~{T`FGuPNaky`Ka^kGii0>uy>ZufBk^&96);PvYd-&w}*oTTws0fbnNEHd2yY zjm=0*nA6t{=M)G+EH)n2_SX}N70pTDDrqQrm^N7WIMPqNc4|w?E6P9v+HHR(2d2g9 z3H%P|M$TQ6^^<eyG*#(ISnQSY&WML`Zsbh?hOGB^&N3l;2nwy)3wQ7$Ws!j)u`&N;2EI^) z8aa;n1~A`c7b=pYbhmFy@uo_|derO&{L8T}EBDKj_b52^JEO(E`pTK0!i>xl0nYC5 zAZjI7hWOVzTSTf|og>53$*Z{HOir_uMvX)nL{|mm{`!&m(kijBs@H+dlUAaW&h#ML z)d5LS5>biv(8^ogGC34;SPxrlnR-G*Y{C?z`2ntDtAX)+)17dJGh(>ki_`DYXxNc6! z1XQn1$n(u9d)bs|>E7vao?CF$s97lCO-aFHIqsNOAFv{|U& z!1@lq;-!f+M#Zz1}x!eXaF`}Ut2GYhTy}u?3e6;s%&=TR-Doo-I%#kK)^-z)EwV={U=jGhaki<}@fO#uJlt4aofs z>H~B>Fg1sAjw)vuOH6lQNLth-o7ij_zX?g5Nq*i07D{dIu3$lusz~P|Q6w#p$?0Jru|-KC@m};*_B@4!{l!){>Wy zPbYlZ=M9Cq`nn=+2t+;sOoNz>ahP{WqZtKORVht*73g!y@+Z8Gl+Ge*829P&{PkgH z4{ueXh$$$i`sDj;%!XYDolaSoH$9LX4^Zdb}7WsE3%75gIO<ornqAC!A(sKjew*vu`MnQhSx6s)m8@KSN3)9$VqCv4-g-NS zaa-L*a;E^B`$@E>#1lzdrYQI|7L285hBICB5ShZXCzR5_Aw?^IZqnWh(8gS3HC0uG zM|3@$&|JeuP>s{wKDCIu#h1RF41ZNa16gz(4W-gZ*ws5`-ZPGzZM7jSt~)K*8!St1 zpAdgg##IG}PzZjtw;qC@!xo-}O*A}r^7Nyohsw)EmzZRIp=sYtSPtRC>7U3DfB-Ug zS}{fH1OdY|-SN4OEHO2y1C@jG1pf4GOqS&I#`dZo2wS(iky!vqMtk=@R!fi^uCKK- z1n^On?HGVdN51XQ%RXFm7)*t6#JlN78&|&s{5>0^lk57d%lKJdbneOWQ`bn?-CCkH z5Y17ck&pL;40Kib9;VisnFqWDebF<70lq;LwpA)W%Nj)Rm%Ahyaw3hhW0ncC=+YGB zlEYxn%}nN&Sn0p(bTa-mEA$^-xPR$%{@n`vcf$AoFFT$84EFs$bnpL^y8jggO#fG} z_K!+mndx6gpZ@=l1G2hhEaB^_N6*6f}r`#ZnWw-)#Yn?3uiLqhj=LH$Dg_(?3VBeN;$Jm6#_Q? z;WjB;gm}bXRvfmh8=kYEap7e^pMVn!-SePeUJ|O?Hsd#LDYh%$bC*XJIFX8*Vq%d* zGby?X&Wn*O0ZnUJ9oo8!uf73S{&zCi)ZwEF;rJH11~hqZEDEJ&Tz7-Qwo<69Ncf~o z4>N86`uaQojVq&Ta`jexf-wr2Z-lS=C{A+qc0i}M#g`{K=jurgmC_OIBYAA%GBw^j zKrBn}Mc9U{MH(bD@91JJKa#3(mhJ(+cUZ_E4}5=v9aLJZAzGv~ zuo2CC5j_YlF`yaO1ST#29?ibookkNoXKzgBt|tREPb(bJIjZqP#kiP944 z)-40f%IPcLd~!dhEFO|kwLTY!1gfPt8(dKxI3a2(g@Hm9JJ?%xd_XWZ;u~_SWu_dj zPyenO$}FL&kN*nAem->*SYClw{mo?((rrcO?O;JdWo^8u)G=jn1`~wELFU<>tU>M^ z%zLxPYXVJ#JEt&VXzHrU(%2Z=%V&JR9nP`S3x|CQ%k<(gtf69APy3tz78+}~ggDWl zp%S#>=X8M33?f}C3<7l8iZgdYy!=s7iie?!cp@~0bcq5^z=PlLfpq&tA<5|P@xtDW zp7+=s0?R18#(KJD*&7`XJi>da6>a>K zKAabhssBJ}Ej#x`+88OX#c!0cSYLtkT>adXtLMm1viAwC;U$+R7qARE>LK&{ zCR=-DOppMin4jyOrU`-q_ukR**Lq0Uq>+O)LJ_hq6r6%mpX9-G5INOIr5{Wc@ZA1g zZ2zr0DHtHNPT0vtyv<1Y_YcyFZ~T1Bu(vedQ)_6i-zd2km7YsFZv|jQ5dm5PEEPo_ zk{8OY1BT|eRN}@KW}BuQ9^!Vrb_v;JNY?P~jw5Uo6ubub`?lDpGKo6&#}|X&)t6=v z&=GNn75wW=D18rrTiqMp2YdcK_T@=_yFK()p)ahPH)%ehX@dO;w{?jYa+iCFqVnmX z3rjntz6MkU_v>od(9GTx4a5p`lc}_Diqc7g3KU)nUYPv(~%P zg7Ck4uYiDLYs{iDiT8iIwQ)&x_C20vZs1842X#Jg%@rZjliYbIgBV>s3ol{dYV3)C z3&if5`dgbPE)x9k^~;QPw`Dx>yoq##59)}b;r17ZRBqN5cPk_Qt@PBQ`hynI5R@gn z;0|ceF49Y~QIG)-vI?#BPT6e%GWub^%D5W;J64pF*ID{!Qbe>_?EHXu#{zG57yIDZ zSgcwF*7@%XBeD5dZ;cd`hr-CUY9##R?|VHRTnt9k(Tm{2nZs5l$vx!E!~(-u9B|-g zvg^d>?Dk&4@z{fiT{={)YU~9LRc|oPFq4DE7HkAvuB05d8+)%Pp%({}9Xg;Ze3yWM z09i1kGnYFwk%PtVY@R+(EEIL*_hs3>R5rF8+#H3u4bWa4<@INJ|0L+p%czAenznr+ znKC^#?S@bUlkI&rq&(ZzIB{@|Rp=qp#8@guZ6V;CT}8#$^`{{yz`pyD9TKL!oHywL z4#hCQfIN|{M#663pHsvYQl6TtjZJdN7kMDZsJxIDdC9r?3b1Tv^T4NT?$RlkJz7hC zi@|>+mwNDiI|Ln2!&KKYQW_{;Kac7zbqphXkJrhRz*mP*7130qAXW@8A-+B?{e{(A^YkVQ5+Mnk`rrZ~tL`KIfCq!EfRFj;><#16iCK`0 z<3)QdRP^J5xJ8(fZmY#iaj?zsgN*FPWZ^m&MPN z@0Jw=w`ovpAM0i zcIkNtZ;HW>D)&u)XD5~rjwOHNPxiCAf%wpaf@uoM8dFbpo6!YlKqvNO&~$ZPH0J2-Th=UH+To%^ev(TD=+h$TQd9{81lOn z<}(kowQYt$>b0jd zd=vQw=9#1Eup$+t>=XrV%gxsNkOLGC>OWqsGR_2cBp0iY(H0{-tsWhsX!S*H?@%X4igo5Ldfzh9mv;`E*dg{s>T2=eb)TuOhw{&4T<+J-&nXh#>{yZM zdOeR@2fk;__RX+Xm8{v$C}cuJzkVVGSE-%Z_nkFCBrbrF+E^93XGh`l+H$c{XJdx9 z`@f*)E0$_N9w2FUdmfgnlT%2KEFj)mC)Mh-S}sT)apWwvEn?SutCXlc2SMvyf= zRd_vpZVJKsl?=x!pmWUn`B<9Ymks1;_JNLsG0NpAp6Y!%{t52t>h)LCQ!0juL>F5rJvR=_9c$(8c|cW+zek!wOq-HLmTPT{Yw@AOzbxGYr;v?Ywg` zn|d8L`k61CZ6CfNh8NU4hKOt~EC7c5Va^b$W?tVs{aKuR9VbC;kVx+oIF$(aNWIz; z$%te{R-&ak~AQ3Rg4cxp5Da(@;% z{IuqG-hj_4=C4H#*B+R)Qa5R`OCQ2xAIHbB{9 z$Wl_jl7Go%UG~lJAehX9tdOCUGlP8YsYXjD3Ro>$k5+gMbu=uCel&FRZ0;E@5fFqa zD^!ha5xjivt#V@@jM=Eb`x3*WG!SGIh85IlyV0T{tmy~dDqtCpup3X@&Yc@DUf%vN z-Zo5v9f`%n@p#_AN7k(t%qQ3% z?2@09`n_xX#yq7ArS2JhBx_D`m;Gt{h` z_wf;FUJ0(R+FB}YImQ7Fi0v}=k+Z%O?YJ;+tr~W@3ZM2RjV3TB8SZH6eDES+{$fj^8{$NpRa6Ki8*ay5B>81wH(9 z-+@pO+Ww@>^QPySoi>BKMhKpGUw8LfEfeSO>pu#o^GY&Hg--c2_MgiktTQ5Itk2sk z(s#)kaJ=;bG(!Qw<2)+wFgUp->t4*ly{QE*Z_M1X!jTVxfxZ=R4ta1=2+NB2Q~byH&|JpLy1T==zoJ6aFeNk1DuWxM(e_ z!DezwC=@r;ox-0qxP+&-Z?R8?=3a%M5d*3@tTIdRvUf^uv0yKNE#mblc;-CJx^H2n z!cdK}W1uB&v?M-U_`9oL9r>mwpl7_eb>T-jecA!KC3N%^IiO=am;uyU29?Mc`_U?>J}D~ z7FF73b-qJ>6TcR;mAg?sn-8S&#rU{y%s#|+IC5rXr(xGdIj|$0x}Oc`l|Jy1#&KgD zuD87X!yY2Nba)wg$QX-H_p#aX+eyjdA*2$GCW3uMaSfMtpNfzxV8 zUc%!Oq7!?q$3?JewR2Z~YR7W)bi(XxfM(JxM9#o`j49CqDQ=aNR>qIW!rB=*ZmvE7Im_e5 z*(}o_3$4G$f9=RjY@ADlCk6)W@Eg`WCYeop+K6~8+tlnt55XgDYfW_xi*wC#m&t{X z29zaJY?u4NahbB<1?u+r$B65Z;_(ubQPn_wz?xML#<-k%)6r5Hwrar{;I$*OP8pP* z>p4qtgt;gA+l1827lxRsfoPUKb-9Hnnn#11gpCc7`~PB^kZ}v9ks;CoLdX|C*Nf#t zG?Mhmp5y@^Zgy-;Y@Xq`UKUrMVOQean0O!#e5!&DP#H|^aB6t?i&GZ>50Bnu~>vR$=igd#T(a_g!<(L0eh#&@{8mp4*63m2fN4DE-+ilKyo5Ab0(+k@g` z<|l}syV>v>7epFFsTgKId&q8V$3r$*^;-QzGEU_;yOxL?9 z`>l7cYt{_a6WIHoNz3jie_mFGLivKChs`~55^;WD&D3sAi@jtfaQ2mK3eTV&w*2pBp6eMm zxYuB{`zCzxn!wMMEd$GSD1;9sue)gO=*J%ht4F@MkQk=aYD-u9J~7H&VYfIc!y7{n$g-hqq)*<2639*Uo{%!5P0x0CG{tc8DZS2q#dRG=T$4< z77rt)C>EYMTr{m+o2NV3O0N&s>3plS4-t7^YiP@LG_F>!2);Aax5Swa)z$IBd%B zAyq4*?>#X1skgjfv}FsB=-KJ>g={!BiDzYF_Cku={s}oc_!3X? zvsb6Ma>qIZRva{j2cO!SWD0i3Dv46fq@+};HWw_9^R7EN(Gtkz`?Det=9{n!s}(-GpG5vdi&R!T<*5JtgP)0 zDe*$8%Z)cM0NU2K8gU&~3rzYK=~Pm>Nl_G! z99vgojO>$|%cn62eM>khMXmZ==g3m#WyP#}+mR{)XM?~ljsk7Th-O{f_5a(T7x7(?fAxlR?=vWg!0xcA^7r=Iaj zhX}(-_0lb|^~A8ZN|8SidmA5>fE{GhtnIirq6Bh&$J$BRkGB0m-_1qn-G=W>Du3r7 zNUke8D?Qr-iS~V=ZB?Y6f-iatpgCZNdkro`%v>Pm$n_5}j-&KJ#(9CQ0of{5w|TC& zksB-~jrdXv?S6GYtYay@pf~RZz(Sf0*u#Tcg?)_g$0fYSL9|HxV)e%~YKxDIhP0sL z&i*lXlCJ zg(6?O@X5;@R->!^3*G5!^-EQTQwQ_&7k?~IbSE5aMAv!shxE_RRxJ1ybreXf+ci5t z_BOGU_^fXkIZ^XC?H_kCr-e+3wco2)z)--D^5f3sE_y0Qlliyp@2?K#_NNaM1EXew z{1rRPze+b9?P5cI1w!!M^*n%@JPCRbx4KHO%Rc}#(EXH44881mFINz}Bp;eimE8CB zoDnJ{ulstgP%)wLsjBFS(Hdxbm~FKc({c>U5K=cn*veVQj5wbM+Z>D>p@R5I_cp;# zOS61e85A!bx|m_OpOdS}F`!BXV;qJe;uRGhA1{B^c+aZk{VKXm&3_RDzl;6#KTotgZ{=Du%PsyT@9USY<_TGA;QiK(s0tUkZWaU?z zT(MNJ^`lS~pCjyBli{-58F)i?HMq0haL>J(DevSIk*s&Ct^*{ZIJeBQD%bbm5d;7e zw@=@Ns4}ERnF$s-ye>-ca;x(YZ3Ls=iz2;=4igkmrVYC{OEO?j9Zr-FbVj6=I$3Vu zcol0nu0L&lA#xs#6x2eQ5g%Z=C_|8I=cQfh9GvS#X2qvv|AYc}SPfPkqbHUVI`dK^ zU~yr*9Nv)AHf9AE1q!)`hEb96dHFSRnfdOg{bhN1&K`FEyv>OjP=B4Inr&-nB;BgQ;7mT2lFi)nU2QEx8xs=02<^a;#eVR-O6D4xHtAY4u~z8CMYylC+~uc++tayL zJ1~HY3H8>`?5&h!3LXY_V~c|A!G`UFO<;&R^x};Mp-7NaY^Q@6;!pZSJjqr;SY^NJ z+lvpEca6+P#lD6PDMVeOJ+IVQ%$+)+hWMd%N4oKTvbi;Rt=Y7xubu}ur=bdjWf_`S zIMkQrZDRoA;V4@kcT#yG2hW(H6||zPQH-M~9s0ms`nh(lKCYhhC4-lFLyJb!uNbsS z&Yj<1?IXeV(&KAC-=~8RQ(VUUR`lNYZl}lb?Hi$laVWURia8Mej9 z&6gn~OqD_WI${0n3#awceYVHbHHRvnXwu_JnoDKFh6zdOs$}T}t#4A*IZDGb4_;x<|-reBOAw>6<8^D%-nUT zAz(J^SDs{oS?H7yXsn3aRjWtd9U2NC^cy!f!Jx%t|I6?%jsUjUC?g-Bp3@wC8%cNC z&dI0h1&4&G2r9VVC+ZVL??N0}Tk6MGP{j8?)?5L#^ul=?)oXnL)=j$oXF)4worg83 z?563nP|ywmU=y45c7i0J(JcXM>V7iXeXH&%c@j!a`~(#Z@fI@@|J2IE-YiTg&Y*Wn zFDMSayQRUtdr2b~j07ufuC^hVC z35*?A$&4bV*3`=m<8=1LoP|t3nGIB<%G6px*V5UK{1R8Hv>C`Jf*rc7@wrq-57|PU z;|@B+X+r^9TRUebEe6KFEgJX?jDJ(Ff7ZXv6@S*h z63Z0-tbd1;{aOE}LI2oH>};L?VYXoUzwB2L{e$$!52CEh_^&MN|H0KVvi)mD8SDQt zqWsAyWB%$Kfa~^u=0PJ$o{*^|9Wcwy5JsR9zXr4}p z8TlS^6Re1W0ilol^*d8oEL#Vx>^@Idv*xe40_TocYKthehMq?Zof}4IOWkFdd}ez;m&~Orf8?fmyH?T2*%uT zbyT!jC)LDS{cil`%6JFha!&N2K2{C5A;VZt7=>&BUoL-(D$}ZS? zDP9h6VOp#Ja=MWuMMJSfx#mX->)@(3>*~};)yH{vJTgO@8SDxpxR5cHWyQn6b=D+{ z@ZmaXT>yd{&Q0!Wpu7ZJhB#;aoE!>KY_gB-FegXdgY+o0xTSNv(KBna_#>UANak9n zDPk~4XNTJ8+IH#jQ`#Eudxwf;KINU2vyrsAUNH-gvZ2aoX@?}^EB-TmJ%!U#vol{e z4Y^7M!M^+3AiC|MX4dMu$z(CFuWBFC%2QO#8zY3a9Bq=HLqcTpkOeZ~s|T`?oQ})J z_c?0)i7~;?*PniGK9yu79_&2^jtAyML*0ejk2t!dp@b^u9v2vbsMIE6q4X%(VxCc< z&z!JLxC&S0J{XRQG*;0GILRid#Rzx};C9&_Nf}ILT&C&Jg-W%Hm_c3rCs{&ij{>*c zT9iY`Hm3)J34B60?r&NMMd_!8&|oP#Z1E!0H@_thw~&1N#4QUe6^L}R1DeH_AD&rb zgk9|o1}9q~^8(>UcsJTum-*J1lp6I*or4;CLPc7Gp$kd&>?1J~Dx74G67F)Bj^EzM zMz&T&czix;mY!KfrR|!m3A>Aps6?Dr4S@a)hdU6Pm>(4rlRxA zEdqROB?0A{9GHgoTtBl_5=I-JM4+-mMiHI(^lryR$Q@YY8~VPq6Ry0WK7#OqFzdkp zroULaszGEU2I^LJ`2)RYr{GdT6R^RIVZH44tvz|s8|l1<=xu;9J4c$NY-maGGyjIK zQ+I6ew3R$dkA!+)`S{fnoZbhJbnLJHW-xuT-C`I#eGCG7POc?d*Ius)j*W)x#FfE3 zGBbQcaB?RRH@`y$VeF&aahhykk*X`v6G%1V>DxkIh;kVihHmGb60?LcR$fUT49DjW zA=~Fpq3HW1Ge!oXO6Si#uSsjg_Yq^?tym&>-r zB^+Ns5CF!Q57a~4V!=CIqXF`M`H_-lL2GD=tjwk;&7CJs`Ruc~sRPf|;h0xLrFN2B zJl0U4J`$yw?C0~HdvCY6n}U~L-Jeu2yz9fnMl?u54tyL`#9RPZ{7KN@r5gWar=n-Zqc+QlZwpYE0 zx;yX(T&Jtwf?xE1s9pvRIEk4$-n8>>Zx#f4)?=*W^aL!aB4-rjR3$V1`oX>ULGdKZO3h9YHhmbYwXPYkIBc zu<-R&TGdlh8J=L0C*YiNr^G}VMVR&PHc0~j;y`RjLoHh@lB`r$jm^$8Ju+C4GnGwG z2O_XX$EbaP@o>F&T0NzNHsdVc5@-;qX%q@VM`x7d*_q4leCnEIjf~J<>04BA;xUI+ zQnkxg9{oT@bIur;{w7RHN7vi=)aV^Gi+c@kw;6Rp5|d^{=huY z=BCF)fn{Dphv0b>Ft?<8e>*FYIl9@57db(Y243vs9w^R%SBT_#l*!69ap9`u^k3J) zfi8u_PrB3&p77NHXtIdLsYY9yG(o0k7YQgMB_FPq6sXW9A0M#+>6`d6OmY?Cb6Sll&=L_rdSd_jD@Hk ze@WP}!Cy@Kr~Kof`v+pS&1wF!`PuGdj!SsmcEeDS=v+n>kCNGS%*g@nJ{hVn6vmT< zRDHilFp7R*onZj@5lhJp$P3zMGa!0SB`cIc0JS=@yWO%M2Rzic(KBnm9mc=6r@xd0^n~&EHZoFqF;A|$WVHO;f@Fp*EJsWB9CZ6 zh{bMP!lyX{j`AM3Vs)VjHf2Xa`_)lO*}C-afF(r`Hkw6S4w(4ql@gEOzY+81a zz=m;ETm`ukId;7aEV$J}6@V4Gk6OWh)S4SIceWlQc->Grm^lTx%#!q#s3wKaUoa4S zL$Uh#=^hDiE+*Z?q}3rt)uU{ENVdGo)sP3_M%x&YctcbDQs*5mXNFB?+o+09SW|9` z9b-}Z$eLID8E+*`^=R6ZKY9S=yhZYC4WHSgato4X6eHUq;pV1ENy*{T4_uHNlz{*n z$){CKu>rlyT(tsP^|R^FnH#Mj13Gfr#+!`EFhSTK&r{I9!|`j$F@n(zV+61*v5}+J zyHZ2wgtrnV?2XFQTb^O12<%zGu~_!k@viT0#F?j#zA^%(BNn3n@}cXt7)U z+Ey0pb#DpWxW=K;QJgLEb%n`p_B8UoAz9M)1frCWp8cXI)##;U3KGhGkDZOk z;b+B0El(mZLo=4tIY_k1V~?T9Hg$rP3k=6IM9Q@$`7;mpxaA5B4Qj`C2ZiVcrr|1zBI)jm0(Yc2W;6jPyW{yo zTV{;hfncrglxb=xV|P6DDW>>fyFR8nA%9*p5*-2|(Jik9CAs^|yyDia#e`KE4Y zI=;AO%n#SCVoQFcD0WXw6MrOZt!=85aats&Uc$j#%O7E#ZrswC)u3C0Y;gXT1bfmf z_U58PvR?c_JTYGL#JA4yE5V@fcs_cVMBve3T_-fb$D~8ITUt-g`uc8@gRBJflg?1x zk$gqgvhF_WQ$|8E4Vqrb5mjtSw5Y7O zRDNG<{^VA{V9<5T*=KotXn5^WcDbMJYX)(4DQx^{Bn~Syq9##3o9_x@0k{$CFjQHx z3fLrZ+oirI?RD!ko8l|3(XzB0`UYTS-YFU<*C^$Wywp5sb$X1LrG41jAtAqY+Nkeq zCs=CP`_YYy9?1qx({Bls-nQ9~r(tJmL5ktG!kHBVr2N_RJFG#YANe+IxRA*j{LOwT zczhCHMbxq^0*W*)g63vrTMB}Ifem-)mzq8)$+_qL{=Me{#`|%R%kFKY8p*SpnP3&M zW}tzeHADcUl}m@7hYPY(NJKFVFCu6s#b!Ipq9jpO5aNUGt+f!{VOHC$p(vuofvyu+y?5>Lm2tB;uUXXT~3PxXn--LQ%Dlgq* z1xJ+*ksA|_U4f3n2F_+%;n>Tk^z+n>TR+Z=D42F%tQ-~z>Nk5+IGE1BekW5wYwBWE z1d^zEpnf|1ihsej#NC!Q()>|sLX0bJ5dSNX>Ng{oh*gl(kTo`9GG&#u*L8k#2bTf! znHykU#(MEPk;vJVdb8N=g8K>K;KHA%g)#PS+F%1~#A#{Bi1{na#R)kru{^4me(H`} z5&@4bx-42V26qJ9M2_#y{)6KsHL(dyO^oUX8px&-{lPR;^$t+kZAj@Dcuh^;xblxp zA)#rEfw|`gnUeejIpPHoZ~!*G0rzxWxtt=?tZi z_sncAP^m+oHYx}H{9%*7iwB8WcIGkr*)sj8X7k9id=<-JM#3)guSbu&nujn18Y#*o}g?8yhp?I!J zI1Whq1W0iZTPn{=IBUC373n-GJq~K+0BFf@$8nJ79urGh5J6n9W|k0M7$!>7R{TN| zVm=NnM@_cBSc@@8sdXi0hGO{+WJp!c7N(2N5Gp6sdz%q!)L{~zBZqN4yX1x)iU`Td zDX2P|OuWAPx!(VU2M@hYkY;KNEKRaW*hySNF&ZScp{s2ZkAWc!Awq&9R!mejrC{D5 z7r*OMjf+j)cTCy^;tx-o8aZd~&(j2cmKO0)%`8;bEP;7`$diG z_q1*mTF-+(36g13MZ}$JQ#1!q#X}3l{u>h2mAh)Tj@=vxdJv63MU#%l-ZzXUI-&%o z9l$`{7LiSZN7TF+RKLFcRnMySg&fBBEuPwO-@xb-s<;P7J(C~EuZMbX(aN3X7NrkA zd*dD)&r)NqcT0urPFXYi8`@so$D_ADT`7?&3tfa< zy?IU2(uSB`fcB`R0-uq3e4+I8k>{w)Y_U$sFk9p2hq6`jZtjc8GuiW8uaH~82}rL) zj|0`%cpGXKvFIW>ebCKJuk(@>Uh84L618HXxj`7Cu*;Itr7xpy$xW-n!FPn9B%o`9 z#AL?`I~>cohXUE=)Ax~J+(=MnbZeSQ9?>S zq?VlHB%uq_VT8p-!xdR8RWqZL?#u=BSWdQV!6U3!K?W%NAVf7*6tR4_#%XXx17!I<|~mmu=cFR2^9J-Vm1f`<-0W40Jswq zGuDqrZ|;^AiV^u~3~b}#CAs7;F$YZ)vTLH@IREHj5l9Hul*AJUwOgSldd6)Z7S}zoEyeN6*K@%u;CRNsuIH@l`p+Wy^2H;^Ag>&VQ$; zEiy2BvN~m9&D zyuzbD|VOFS1nCyEDK^CHTLfA&wGV+!R;aBGERg9 z)uGsW*854+xAOeVKRVjE)fcx8Fe~F9q17q*^mGjy-#4}TOp(yWCy)I(x>J}5;8;){ zT=5@SZ96yCx1TB~E*5^)oAF@IPqV3C{^HyI6oUC4U7r{1mQ{!$oU(~EwBgw5vL1Eu zD&~_EirON4Y*EOOY*WB_s9qEA`}FF!^9DFzC1UV-56TyK9@nDdkg{x<7y+>E-^U`O zzQv=l&I)*777yse!U>qU>v4a+>1<&6WVPGQHIgYludcR{M#zn^4UM=TB#UK@(lDQ} zOwTvqfKXuBSb+w&^~Ots`jHsr15Rfhm zXm|EZmpN0sJmD+me1^e>zG(U%lQ}=I#5Qb&mfdd=;p?pL-2`8I4sFn)lFwQ?;&_5v z&+wB-qj-|5e;4HI8PGe3cYNlo3+Z>vGmb%NC$Ll!FyRo7`5}19B9Z0F!_Bnl#uNPU zwR$wv+Ap!)KMBs9!7uq!_o%c)Lr~+4B6}d~RT=>~6L{?(|C;m7Ofh#!E0{!psmJ8% zab;)b`A*;L-*tX?2%>lTaVl+#6CI)DG?IaS-z#F2wd%RHQ1Amp)k9w;gtUWGXE#Zi zk9PwN)Wdmo=ygk`dD3cKwFR^IvAHON?O4o;Bei*PmntwgNX(iS8)wDhXmWXO6`G*q z@K@>)3&6yamm7E5mikN}nYjlM4CK@=?(d?4Oq0^#IvJLaL!Zq@ABQ8Lu9gid{fxp` zPtv(beeKCL!W4hwRBDcp9W=u;%ZA1rr2FyrN$aD#JoC)-r4xV1Z1|uJcu1miHR|LX zsX_=LZApF43c1?=s2;sZ0tnX`uaSe;-<0Vs377WNVM|3F5#)Yv%N{x}y18^KTHvEs z6Dj%Mi!UrLq9&6MScgYGcvd5VUl^S#w-uAnTK+^QT~%3z+Wr+EqbJgi(+m=>6C||- zbXp7Nl2B$z5mWMth+gzWXbRz~s_u@I6T1?)&xtpC?~&>{s<$17U!(&xC`YK6y~j8b z+s5mhJCp26i?pU}EXy2dge}%%5EVjCkXhPr`l|PuiSW%i`g-~PMBjy`#)HFVL&DaoMj<$RSL43(AAP zCP5!KSi0kDoOaVbslHdGqlQGFxej8I=0iscF{*c#FgJ^SK;%5~s7^@u?K7cE4HRaZ zLn6>bhvfu6?S6P*lP?>wHFYD3sHd;G304j#2qVZphlv<>D3=5E6|EvkS;9C_H!(1B zOUgw}PK|{!DgM%zgESwUV`1OaDYNm&PZ7pNQ~W`#zUo^^k1|D}NG_gKl?fT7+WMWW zJha&{v%r*AmRd7MBIc7Y|IxPtF>nSc*l5bE6Jxl?A`ClSJD!`dYuM!X8}-?9++fdb z1)H7jBHUE*gHu;~)T!=mVSW^7BL^W~;ub&WU6XtPq=3O2h^*tfY03) zxh5SmCXIxSsQmLm1ocJXAc5-Q8;CkjAe}!pr)={-J{o}eHTZ%)cN{}UA! z{RniJLjdpp!`nLri54u_w#8kxZQHhO+qSjKwySp8wr$(CZR_sFedly^zm69#qWfok ztj~cSm#E8mv-4X(b*56+= zTXq0sX%l@I^rv|YwMPmwZhOq0aJHOvYd$!TD`G%v4D1P*jk2Zb9J*Y{UOeS+Gp0hd z7~anwcpu@h%k|~>UN1t>rT;r z|MH^@ViRzO(N`h5cQgdZ$bbVtX-LUQe`OGPB0t|7K*p@?5Tnr-De;E{w!X=8zbl{0 zk+Ndf;q`?yPpdDoOx)}RKf1lO3O(2g%@NrjLjL33Uk9%e0&e~~tD9R=JJybr4_tDd z`dFk?ZmN#NWx=8sa7JW+Cki&tB09fRZsR+=8RA%9iyb%efjj2{zUi^}*!IQ=8-|j( z>4UF38L2{j+~E5tN|K7&4hVz*&*UZvKuz+O4V-?0UfX5PL@(Tff-4)rv0~`L}r7*21fLfRDO!vwD%3qZc}#E~sZcx6qCj z>ueO2mg84Du8NlbAaO0&`(RFsqwhz7uG8&+SGRZ-+*!v7ILoI4z^1LeYaP>UmC0u~ zldp{FIc9IM3p^t^ogZldhhZdoF4htn_OKkTU_8tC5Chi6)KO)aV|4Zp%`>4)(;xHH z3UjsiQa!ZoLWl9WBFBdyryA=rZ0@A|lz)+dM4Q#~8;2hL5l!Gn@Z@%sy`gstJ-`FR zcs}lWubkN6>%3~7G9A$oZUU0bTiwM$TgcjzxR4^A!2zb$a~SLSN^^r{NqH|;=L`RZ zDMs~y-hxb?dCyOfraoSTzjkr7N!%lH4g_Daz}0&b_}R0lmEq`jahsW|h65Uv}pYUSaOJy=_Jz(Kv5n_fHC2@L4l**#W|o z0cmHNYDrc%z!Fn_k!ogQ6#X8#7_e*GsL8q~BA}rN*V621)fz?CZD5C}2O7aQtKj2X zwGRmN@4v-*`TX}_RN*HFE&Oojt{y7N$WHEvm&)V=%^FKPe@+dzpDx(BzafF<$%?Wz zy2UQgtrSea*Y|8#jW57F>U9~tlKke;A3Rd@AwfN(%yl6$SvbskYZ({{W4rzM=2{Mr z-y(d!j{@0tG{+DjNMnFuS$7bx-8$ZTFvALrN94@z8ztp#0V>l{m3HY!>QF%*>w5<( z+`hbtT9v)%34lS2zxgO|Ya3B=;|gS|t%5L9m|6`oNwCI97jsR1F`9VEZ))a}g@_l^ z#St9K!qlEOTd%)>jwv_egF#&48MO|NKu7*zd!huZ0vev?V5gn0@QMWEqJJpk1wc(( zMh^FJ63aWJGpuUcB6p7ec_6v&F{Q!VfekkI6r9bDi6tT5IcQGtKvwlSd)&dPo83#$b6G;G`wLJwH?x)J& zUh~PTm!>dg2y!Lzd`LEtJ3$R^#u_XmM^CQI-@$!%Xuy#X9Ln@{`I2X6R#)t*s1GF6 z?%aVBA$cpiygt;VTtIZSClLqprL?C($8PC3Ekwq{(2j<6>$!VcvHDR34;!9oQbB?l(a;kEbG3mZ$(Q zrHn_$#5PhU56i7kskVg2T5FGlM%*t+_81{_lrs?A^hAd_m0tCP@At8Qr0HeO2W)6(@NI7 zRA;237LPQw2Ee+*DtZ(hD0{%mE|LAMenSF1YjFZVR7@DS{vfky$c5{EuHVN6b7#*+ z)RL?~to{=+k9K)qfZgX@ufPnowxtOr?A+Hn+=X4i$RoC5#APR30(leY0|RktymcQp zqn_lcB7`q|dXRL6&SsCDdcI=}dSrh?fbaKE`nT_0%&vYNG#R32^9>XDTI!fIBpHtV zU3^E!eN(7Ch+?V~aDwxEnZ`q68iU0^V%NJNmearS5H`C2I+M>nI3;Km$esV*uh{_l zD65SPcT3tC!cpXBz0$}gFMT&l9MoHNl!)z&@pI5Ea6EFe9S12WBE&r70pc$Sb==I zjI%zj@e*8U-JTH=@|6=+R_4#kTH-^7rQ;R~&Xw+^Qx1jYW$#qeAhMv>rdp>sy*8-j z1om&?S)dagD!=1UW$Z(uxGX1GRq~Q}m{vxE10-|(=C87J>;sJN__~a} zayw${UG>PAWwdhP^iVcDPRv^oD#&yGD(PsN77Dh|XmiXZ>U|0=r4^k0c|nEr=FI{!Z+nC$-&G5t4P&Obal|6S+{l-I+MMan-aKWzMOY` z2y>UZKen=Vo+S5j;>p6J2?$7UV0G(2yS7zM{$j2XT`_9-l>E3E#>4|!RZQJC%laxa z!m)DU5p!mNv}#SO+V=y}>D7V`n?$l2_ckJ=lAQVS$%w&~ny12WmV7k2JZZfXA|J2- zw}ANL*Jckzn`U*t=-*?y9Z>Mlyf<2SQHp=@*wMx`6sME$A8Cb>e5g!YtR4=vPXR9H ze)KHt0)wLsCd3yIk5#%Rr5t4*{c+|ZG|7M7J6}NCEKf$$#jxJsspy-H2ZU3RhSS>A zbLa3fX0@UWaF6}ctY`QDZNRlXkkSG(SRht_Gs@sM+vEW zkQHlA?_~y089>pT2N`NYUtbGDE)EnvLT$kV<$OY1;>MPC z(!tjyJ+$RHWtk3H>=!cJ#Otc>Fk3L+bFXu1jIo#I^LJ`NoDgsztbmr>yDvMuVxI?W z9Hgz2ansc>w~@I*uq9r?*wAQ!6_(;_1jolJ!xnl-AkqZ(2uD#p@x-Yrc-e#{8rUQ# zevXW;xl*RgIlcp_)1bdKi{wFnI+^8Yv*9j2X>Fe-$yAkOwUeOdfSk!6i`iLy)i^o3 zsB}ilFHEkQ026un1opC)b*oSxptI)c3J_)$U^rQScRTCUk0jbQ(fQW(*Gt_gwF?6v zzoxN2d|2wIk~6-Gc{>D(2_<0!;w5f4rnoszF#M_haX8L0bc3pUDE*8Oy)SR-P}*J# zi%*T$)esP1BzPuN5Ig$1^mL$bvY$bPlU=pd=`&z_gD5P0s*>aYvT{i&z;T6GtQR!F zMkGH(YPW|fqOI%;K@%0lupn5d37eWI3Jtr8LNP&jYU1b0Gg(*{z#eK9zjTTl%C9-_^e`8aw z?TiCQVCRVsW2P>1kv(E(^OYlcyIPaurT{qmfPBNLPrt!Y1nT3Bi9EJ;wUBcs5CDhA zJ9Wb!GJ4-riP|99tu3mHlvRe?_VxX+)}P>#TtBcwG7zaXhQXDF6OT^G+bX`~A0nZ- z@cg|So2nhg0nnC-W#a9LT)qD_E-gYCL3I%yHg*ZS&cPS*g^A6!Teb-?Lbp)yCSn)` z=iBlj#N3&$eTKKwfRj&JcJdVi#f}!Q#Xs5WV_m}^oI>17dh$hwk+uV6NK0mwM0}~E zh_Ibxb09`=c&f}NVWUOIbeKQ!OJnMVoX!y30n0ch*6S04G)s_f1O=Jw7$Fp@p7GNJ1`CRu<)3rLJC0 z$)oU@7tO>7zgJ%YQ~R2}s-2{n=HZe=ixP-7Ipm3I^w+LGPJB#I!y-m@6BuGHYHws$ zAJ<6Vd%y_`!KHg0J5GT~9))DYj>E|2v&6a=(dWf=fs@$<>&R)4QzjXYYId!yqOb=> z1i0o(UE7FCetPrpSWBjb0=n?n4?%Mx&oJBu@N>7WraZ4fL^}Pd+F^G3;421!ioqSF zQ@9-!7v^+kMssr_=Yg$_BIH!vw{>6+QnMZ5!#ktM3SxD8-!4H_0(iT zDM@|VHb_{>x;avlG2o;5*m0LQe?IIg<5{Hv7(K&FrJ5M7;$Q}}#PK`i^Jx-}5DKT3 zlh`&J))+d`Gz>2#+_im&^|ZLIb2kS{O>M!Ho_>i7u_71XoZ8bf zaU@An@KtflXqt#SHgef{uySSiC!VIaq`)RrwKwb^<0T)NZ=9^|!l>1^3pqxu?7n5u zhRYEX6O+wP43U5dns$9=D^_}dcY2C(W@T-s4K5wHBnYryiOC=RF|}h($cja3 zB0%3ookW2KOFsrzGv3%~=Y|pL8ELq=(5`{_E6JE^VHB8nebRo}otwM2Qhp{TEKzkN^4`Lz?91)VJ02_EP zX1BY#NfO59;h()KQQ{nfDR^V<9ubf(&&z8&LQ!1HbKOLNGnI8WaoQENvB025mkrYx ztfJ72ygjeRy>bnSh~lPA&)UN>;*G+yGM~h)h3z(Wo)LD8UcebkRzk<>Srm?-Cp9M5 zq*5T5UniRU3YRZ|3>#I*{m(v$a4w{?95TyEDSU}Yq0Sv$p?0BZtadqTveeT0y!6Lc zxVb*BLCo7W6~3ZY#?_|jARV8*YiqhZgJ1;`U9E-}$x6M8k&n!ug@(93!_HsdS#gyj z>l|95u#JrdCrNH#WQ}ooISf?zOKTz$YKpAa1 z{>)Kba&}#lIHDLJ{y*i=Il-HJKtC0|=Ei`@ve$A9oi*ucY8QgG`_OCCKO7M7bDi(* z$>fHr%ML=etnmD!-grqAZ>g<+6Ir>C@#F{DYOg-5_aW`{C7ycJZqC~Tw?bQLjO42+ ztAnvz?~p5i?Q#dKuafgW_1>}au~)rxq7ha(RUSZ#+^a2w?0@H*Fn|bNjYRWyMI%&G z<3q}_&PKEEzJ&2HW0PwGC%*=AeNsGa5Z_ZQB2a`bE|_S;FD=?t?D=y}r!sx?26)Zi zb+#~744=H!Z57Zm-kt)m_m>H)UZYKMwc1`izr-CZ-U(wyqJ z_zUk{9?NE(LJOT!d@flt*s6YOZ@|D;A^SAHpF7wn23?TsENYH#Eem1sR-+eUn#$?w z0T(n=sN>7p$a28oxQO-}I(i?5DRAFzUkCpzavcL!s|qFDStji?0^{&-fAk8Cm~&ZQ z=+OJG77FGKoc}GRrFYzXY2ftIO7^#qm6+biF$O?Eit-M{qYS|h(5kzMh>!&rUfb=6 zA@&gx7=}JJ_i@_2^#F@F{@j(hjo7>J2Bhjo@=|@sd-Z6i* ziF3Fuf2iN~nrsxjw;lRbySc}Hb&WHSBDYKji8-E$#Laf+vKako?E4axfi@fX-TiiI zq36O&+Qrf>f3!suY~9b9=ktDV z7=;k;X@U9lSZJru-qc2t8t@cPfe-XL>hmP(VOquzl1%w$n_6~7LB!DMJk$3{>LKUXTyp5;s)U>&fu}lt7t|EE zy@#qSxW2{X^1w2UIS~o8?}b6zn?7CaM`dH8peGma2D0^3W*M%u#byWJD*X_(m`1n0 z;H7xk{o0pvmn-bW$&Pfe#Wh0{Xg2@EnAlzI>hzv`PShoUbcxN%jK+x&$yb#~}p%mSTQa{`(sX2ri1>n>;{G4voAcnaP*9Gs|AI5fX-rHjHxyk=_ zOho8t?G@tl%J4N$gWPJ99ECd9-612&tt*UbvhK+lTc(*Exa!>&$XJYti2f{Q3!iva zKSHS&@kw!sVwY?wUbeW`S}D#u>zNyFMUjPRHTQai_hK)*p9%`a!82R1xRaaWD(cog zthen63(Gk@%I556ey9^&!Js~h$oKbA@MlBWAJ7}+=Hg`q^wobYj3}*fuMs6^^iEdG zI6w#vIi*~r7n)CfM1wjJaR%g~M zIb}|nKRag>n?{{;*XLQQ-e^ywC+q108j1;l#YB949&LY87>p(wQ@2pEU&Hd;7+{Cu zAg=xQ`hUMfrSR)jc0c)F2NKKuZYsRzyFdQGkRUTtY^Z6)?*}q|l-e1G8Dh^jua2~{ zM}i&FD0I)*8@kyB)U>TQ{>*p8FGALd{=8cf4rx2AP9r03*rV~oT^`U)F@=kmb9b3-1J z$8o6zt)N0J+xvHhoI1Z22Z>0rrLPp&tXgL)3XQaSO@|HP^C`kKN_{%sgnSa+k$ zv+GM*fzOx`zIsupqX-x_Qb_J>kp;3_cLaU5@R57KPc!GpnJfJ;Z))kon{)L&m*nfU z)uPZTe3P#-6_9-Y?a<@{C&O6*P92VC1p4qDPDaVKbi_Q*T=izR{rA)1qkes|bYp4A zM^E}b2NIFI*Hs5A3k=$zUyciXNqyDC@cS8y&BwPhVz+vzUShC{lOHAy6_GtIDC7a$ zo4Y+99;oxxsqh7M6UieZG;gp{?cj>jv{Bp?Wg4(JGrq>+hUf!;OgqR65W)(-FGnrO zPRG!irbzE=B#m)oI#+vd!%W(U()$Sc0!~|EF7fQqG<9W}WHV5OIXs)3g{?@!=YW)} zJRrdgPJwIs6nwJ#Us#`5jPW)lbDs>q7-lBNo^o)%&?CB zp(K*@*!u!vkKl!XebZj9tq(0MN%eA-pE1G>+^xgrcoN6gi`At^CR-i$NrZb999m7g zO&Y$``N4^bROsQZAQbw^u9W_1TMxAV!uEiF@w__dm*Mj)OT<9tsm2o$3|~^1hFa-s z?Vw)|i%ECI(54^-&Egdab)pm`PRWq957SbV__@9m>6LSf^!<13Mn!#@Ve_Oqzmh@O692lq>C>e#aVd<+&V@lTF*)xmLpi$zeqf?C~u;Wf<48ukQYc(aY zhyE;zZ4rq}g4^-P`A8D+?VSEHs*BE+?rke*V%M6=`%%tvvBxy!iv7^)Z}ROpt_@B= zc3WfO>RK$FP(3u{uW7#J91x~w{WisWbq1@J$TJ|l5Quoq#mKu&#BT~SmbOrg?jPs0 zFwL%==KH_fT96|-%dOw)XWJLgM)?WkW=iC)h2AnBU>OnI!z$A(BkTAsqyW`bPuQq{ z+>&|kT6uGmjd{r2@+116H%BI~$pKhPJ>q$)*zW|_@lJY6}hbE>M{uPe8uyl zJRIqs+R8Gq!RQ;fe2BG=FXY3BNz@$Ky+k)_oJbEH6wBpLxD(}(_*lbgy^Pv-dvi_Z zg;d}xo zT_>F)G+lg}*}XNd(Jn&QM8h;QBU#eKDT4-M0Nk6Ikd`DJ zWI3^y+A5fmbSg4PYPS)YWXTV7fs|)#a^s)6-RznN<`!$s3_!Zj4ankv8@^SRM!>&_ zWD7f;MxH<;taRE3j5e`$ zimr4jAkxDqHKDe-fG#p2fV^Rn_g`#J?qfgBX|PESMhWGfrIR3BmBXNU@v-!n8kf$b zE2!Wzs%~&Hnc=w(dL+Vs!QTjpQR}3wC!l{iRkb_#>Rxi+Mc%jyhIk>p2nb#$@)ajw zC%t!7A;M)!=8~-k)q^Y`UJTw)W~^Etxf4C9Cn=aaSxAqfzuv*g7Rade1ZgX2+QPVc zL(8;|ABVlz?lzmQKg?2y$dM}Q7PpMBa)2=wJF6QVlr83eVJ5>z-clFfPc+mQCE9W; zQ1q{9e}XZD-va&MD;xSgW}f1U)3{&657>Di%PSpp@Vk`kz^dZhL&vws-ur1sT9R6L zQ-HW7-P&hOfoPsOhLfSpW5qM>of1|l**u+@&qR*PqnE2y1dlkd+#_>6K z5B_$VjPtfn&OkDY(DODWX=TalJ4%tInLXnF>3s7A>oFsaiaN(FN>K9$Mv*=pjkC!) z>rsZfQvUTBJfrkseJ$gm6v;Z!azO>$>&$Xjylb@sH*2qamZ5wei3~rVs(Dch6M{W- z=+~KRfmOiH`iypg9K^mFuso|$eO#PwM_EeZVL*m?h@dr$4U7yUa&aAG!u$}=A6LFP zxn23@2y+1CqhhXKUr0N0k%ER&<8-#|%P=llUQRp$+Y2G+Bn%ch4zM+oP$g?|XRqp0 zJd#wwd|RU8Z5Ca>8SP{Nzjf+VnuubTG%@1J{0;~? ze5ogKg*7ifv~1JvB>p@bT)$a#1ZTAqkG!rkDTX|Z*g^GKHjfQH!|Mc&nh;Ly`?~~h z0ddP}gpPtwPmn{Bx*fbXAJ|tDN|qs}SzACIf6<}$O=?qN9bKR>KKEq2$yvoJ-2hvM zhvcdxbFb&Mp+N{Eo=$nL!chUdKiqACa?cW=1YKs(O9ys&aXy7K(6c`Q56>Mv>Ln+v zIyLNi6Pl*aq~lYY)<}?-JF)AqJYbn@B|rECeB1UZre0LOLT0ezWPb`V2>@XLMi;)B z=fls%IjqY?=3c%R)R<#wt+KV~Di@K8f~oUEL5QOvm*)?}AFo~VsbLttNW$fsI0TWL zc|l48c0HtK%V4rrCSy4S@g)eGlftCa`Z`mAjkfDJyTLz(|w(Nh8T z3WQ89s80(~r~_$T*upw@m!`LZO83O)8Hi&E4_XV`Je%fVc4Q|<-+@3P z-+_*XF=G6-C}k0h_=;+&#n;|ydO`pa(AC@od^K|q`jUj*BG9=>nm@RZGC@xXq|L6LkFSSGkm!u;K&vCr&2ox>|u-oBo!e|abHGfD&7)#GaO(s zE$K)zO}&AO0SSeXMzK!t2w(V++LX8n-uQArHQOx9yD&p9AhhA}q z%8TT*^9X-{w|-2vr4#yg(A|#j@=_TL<^B+G&r^~aF7SDdNmk;G#R)7mmv$22-MEGp z{YoJ%h}%y@S&ug$O;Bel$RqeOu|+pH#TUEtUU$$^KvCseP2wp#WpMs`=T(AT&kQ7< z|6Gb2n11*K;r0h_nGFVB)m>=zabU%Ms$YAb5OSFJc!iH4zu zRZ9>*BMe(*#~sGKgZ?mASaRc!Dpuwz1By_lpWEA_mCe<}sMZRF9#=fA9=-$z>Cs0d z+sfgzFPaS;q&bE04umW8G|Chh)aYTLrsI_hx~y*hn_&zf?O9HhYAf-~Fdjr2>K{BA zQgcEWL1+&loaP{=mDZa~;R75+?~ECZeRIx!lCuSBUCa_LO3!mwlSiqY<%r}iZ5}`0 za`3&pcMpslsEhAsn4YT3#UC)&zZ!b>+Hg%9PH}ftK%+qWl3Li7wgHeB!5FCdE?%|! z2^_d2C*fukSgK~W&xUFW|14B}^*?2dG?dGf(EZC3gPXe zz?(zAc7gryToEHvm;zry=IQkT4hLi&(NlqX0l3UK*fHtpCLL}H=d~v4Ltk;_2R@jX zTL)h5nWJf_z!2^%A!Zso=K{y4hN~Pe{9OsAyTpuCgJ=0wS9~ky<7-Y#S1t*mTen?8 zF(yAv0U<2Ttv60IBHC#eA-Wr)&Dpb{imE0^Z* zMqdBT3>a~AQFAF8=nY(i&QHI3>>u8CYenil=ztix6ZNDCyxVXrGh zq4w8f5fCzH3c*5$6xy|{jek?C@IIM~xS)pg=>tLG*e6iw;b}kD*;kAKIW`UYqp>sF!Q-gp;8PtGqGg z4DQzoU8`{W&J50E(Fr5Z{SdTOu2w}P4FiVD2l{wGU(KhDXc)iB9R#9rclHj8gd(68 z-Y-TMf}wDZG$L7svfe4InArY4Uo_1Vw2eA)PZLMCUh~YD^i4VwsNJ3=UyA5P+dHT8 z5f{D)YCm1&#ehE|J(iHCZRssfiK@v|KuL!k-}hsI4ndt0RuxqfA(K@Z(Y_$hXV;LW zeI`m|_JS64oUR{iCWw^h`aQ1c&yL6&Um6MYH5KWv#{k_3?b8=bTagqWGIAT*8} z%bfK~MA$l#;F(FL^Hb@aFxWFLRx8r!m**6x7B1!8$BfLirmri#jw>w2ex>ZzYeknX zF$2|r0r65nRnMFJ@3d?o{*t!JiP?fze-F4pMTXkRUNfR+Bh_{fQ`{>WET5RPgNz1T zi|ry{L;58yBUB{wyWd*(;n=o;c;d_m#Z$Ujj~g0%77}og;X)Cm3F9|m@M&}H%I~p_ zhD5zqdEq0JY=IgfRS^Z%2+-aZWEyd~_YMJW90Nh4imWZO1m;I|hWTi*XQqd2Ev(I& z7#|=h791-a4vm-SSRD261e3MbH=YJWBG)+gt>es)T;AN4l5VA?jJ+^w-17rKtdhJ#|&&E7m8>k_TC$+an%2Mb7nS}az##SezwPu}^We!xI> z$P?K35XgtQV&Sw=thc^>j_j114Qp+U0*TpmQ{3gO#C^Z~#2qV$Oc1XB*5asYav6^p zn2tQdwxFnPHzh_*o4oSc(8;}1qx_Pfd(C~`-i66m+Xi}(T;BZ5sxn~BjEPo*D zxjsDPSn}bB5_JS-Bi+{uF8xSuB2um%s1{c)n$Q2?d7 zq^LSmfofQs%;Rkpu_s^LoD)8%mJtVR&16r?zrFZhCY=5ur~4<#+`sDS{^zQ~{wd+~ zeFC*E ze5SBw_YLJ(5-kA1{8`p$xbL#)LZY_+p;iw#b{jekFcR2O8wM}ST=@oH#+@tA5H}17 z-o9HOZcF6vqYF{;mq(owt*&&)uVLQ;Zi-U=+E$Opc@|*_iwn;sDCE%u5_pr(FJyDy za@Z-#NMmzv&tQ4LME%YRNGgP1C$wPX(%vS7rNZGBI6us=Xp=Y`aP}Z&NDcFtCj5Yk zlBP^3>m0Mx9hSL^JpJ`+jp9~hhF3X>vjKyN?=!gRCs2f9G;1OV9#MtneG?%OFoCCJ zso~JV#9>l!5cUqCFGqmK+;L>kyj;NNiJ;(U2;yOC+ zIhRUY^ERD**HKt-?mQNhHvf$-v^6lkdQl92>bK=;D7p1Df3wKI9RwCK&13--+J3e_ zw+Vr>hIfK%ox&7p@`Pz&NwxKPh>%;ufc6>ZZ)Zd%fFy8T<&*>=)?u`w`YV^@KcsH} zPK{Pxa?D>fw4*QQw(6uT{MIO%$0~~9%QF@OwchE(<_t5&6+A+av;H_*aj1<<-XGe# zpczCCSt(;gRuqt>zBC0Ly<}Y7y%@a<6>1=&34lFBJs#J}fI-e6A|tOf$Rg))If9Wl z7A7^bkQtiJId7$Wq{c9EttGRcF_*impf2k@!YY?S4raWG$7wKCgq|Lh>DBxv0c_0C z&NAv^eLD(kr6jp&q+A1a*N23K0N6b+w~Kgxyx}n<5DHEWPWyM9{rb63*9J@EYgJ(s zif?Azv=Ep4!njuoP+#Dh-%u+TYYiJVM+coi?B7bqVele_WY`M3@;(qO2uOwNzTWu0 zD&q~12k=Nu$2s0FR8|P;SAMOyGotgmk$Ur#A9?s6Zr&9WqJtN6KZ^84*zur9*M?s| zLI#3_m(SPJHakr9(3xf+_ayR$iyge|PV;z!k7MkJbvX0vA9xBAXp?oUhlqnQc01vL zmf@e}XY@|m4-w4H3u=B`c`2x5_K+E%5sfq~T&l3K#q*0#u*{cSkIx8;iys7cwg$gv zSwJsp8|R<;D@Xhd|NP`%nyTKGS26)#9xu2(ZHw^)iv7-xlet9|{-`lpMRulI*)KrWB$eIHJ$E?-1?yN7C;OHMYnIW503b|x7`Lx zXlbjfD8e?yVT&e#f1WXgZ~Qa9d`NZ>j3(KHkh^PF*ZkQS(_ryxJy8kR#N-W>EE)Ln<^fs zS}yz%PV6;-aNxYy?1ydI1tv>%i+1L&c1O9MAfZ5Qe2AaYXJKPZ$aO}ULJP19xWzgb z0$5s6;K_0CsE{%u!trfL*-JgRl<^KqN{?!yc zlz}Q?ICgh)=Qi}fJcn66eBONd+OIv~DI*KSKBepI6<;fbO3p`QEzqO<^Dyn{TF08D zJN0T$WmNu4jQ&Ff`cD}BSF7v)4o3ei(EHch`kyfRPpa1c(5w0HuY6+-;_6sL2zbObZ^=$e-sh9)>bb2Yg{6-D2^xjN>BGtXd zK-^L-I88C}#lOfN8W{L!xVgWM^Vg&{X|v=*9a2-u2hy8UM^05`Pk7jTbNsVPXxkiQ zG(wQg4>c*!ig9A8aNYc4X9R-8U%@d$3pneiiXOpsk@~uHvCDdmd&2`hMSwBQjh4dl zgMkYXGBd+65+W9DMEoOoD-=Cs%pgvgG+s63vmp!y&yhdzn~KqIqr%yWxbE)3_SnO8 z)$Y0c_HIueAh$J!X`@YS-Z~cA86*6T|3fa`bGN}iq<}|VQGyy9I8)9FW!s72qPCHX z8I5wU;>OSCZgqfsdPNik_O#aViWCtB8W_iWG%)@ z01YPvgdtc#jb2V#p*rl*k_Sd_2CiuX+AW-NMD2f1_mrJrA&Y|#f#4AlILfyp>>DT^LY(`%qQ8W zcpkshnT=r#p$w3zH?%E^@lGPrYxt4!XXvJo{mBFHjp&yTE8>f@r+aRW`)+O0(sVLT zOQ}hXK99rVGw_-lLuQ#U-<86(co@3$J53!dH(3Z>bWB@xm)iDj)I z&>OfkYI}Z-mq5A1HF&Op??B2l>y+>ApP)IY(|bcq9QRW( z^pRcOy##sa6UGp~|ALFtMXM+3X%R_D5fXdz4o4HBsF=(SP2_)<`~E1VF;KJJvRXx1 zKci>TTW8Iw*+T>qz3JM|!0mC_Z?&4m8kZZ4^z7ze$`B442QV7QA>P8^Lrw=SfHH_f zb=8U!q(FYwxvBL8*JEDgsY+`h0qLRaa&&c5?sMldUix!IR_QQ?Gi@@#lkG-=8)OWY zYgIJAt8s{wsMOnI*G$H2g1mH%R}1e)t4Y=N3nu-YI$ONEbJRhw}wi>3Eq>jT=& z!JjXfB=m)+s1ok%*Bw4ObDCZWFtB--LvG@pv6ayp{JJQDv17KTNT~QGl(bDN^|CFr zI;$Gm@0XI}G^@VDG(1B&;e&5mUO>)azx3FqFM2>c6B7Vk{AOw7wE>e{PEE%;O!VL~ zfb%k;iL8m3Yw=msz6(Pz7N5xj7v9>`qP?*%0Y2N3(D6O*Aw0;B57)$mWc@bqflRqF zBXm7CB~aRV=8RT)vBkh!DB~Fm8h!l-p3VfX2}vf$6vQ}i#u3Tb4~n_r70Ub-l_F8u zh)Zgul%sp*jit{4!b@*&WPgB@)=6mnV{8)!4A+u1#Jlz;cVQ?F&$^9ZA00pkW6n9t zH6SaQZaGrxc;6IuVwpsf5ac5ZnCvwwLw{`I5dGtvK> z%UjXT*}&NZpPo*}#Mr_>(9Zo|<=w0djQDIEjDL0Nj&}C{>7}BHlbwsBk%`k^{rUfw z4eGzU&i}om`hR1y%J|PP{f7km|HAaI=={HhY35;^AS?UpMe8vrd9~}RqtAq3`Uhl9 zNnfEph>M({0%%SqIMMe;bvJ2Fv=&<|^^j86j zzh!M<%>&y0L7WAC_G0Ug3hV13pji73mKjcJv%zjlXRBN5aiTU+x;u%hYPJ#FhPKTi zA!QVV%|L$py2yqovg+u2rUe*MUg>w7XvBx4az}q_u~R65dOAz2>%vy7$(L4I_eRwd z?sj##=eLk|oW)lFx8;oh5=~V}ilLN7IGN_%W4QXJl@G*cXW+pCEeIg2JH%QuAPq-5K5; zq$8rdV@YZMoUjjges78g%9F1J*kOig`(}BgmjiR#2Z2?%*#k6$-!yHhOBQ!MWx{{Z zd~S)B^c_DXkAmZ>7E5%<$ON5q@I+6jaVE==P+i=7@&_ZoYdq`dTAwX;@yOBoZfXcG zLiw}&T`frp7fw8L)(8&6!i?3ZB@SZN)7cw*-}N!gg~385K9oXQpmBt9q!bBTUz0Yn zx3+qiU4Vtr;sJBz>^~!C<@A@IKP}Na#3|$I_PlQcPy(i5V)S0z$z9s6oA6a4BA8eF zBCVsaLPNa($rQx<+gkWa14*l!K9RUbH&7Cmy+Kfi)u~QNZ~6Cvj#(O8>)a{VE9K7w zSo=WbU384%EF({A_2{&gS)z_YbgKl^@*7R-MD8Pkg9*%*OivVU0QxD9D3auBsX6Zs zrw26D$VO?Y1v|{EOFWaKw^p5ata=ICCwa1#=y9U{930>Vr3XVzu$eeI>`BQ86<~Uwhx?~#A4{yp`$`j9_f{v|0(I@u`Vr0vlB(LHdTS2Hk~J8f zz6V%B&%a`HFO%Tt_%o$DiLo3u+XNx^)%E3UL?Wn9Vw9s#!=k{Yl2ADqd*Q}FrFima zDGka7lmV`NQ(W+yL4gHrSpz!tSk%+B5j)N}K8E1uBPm%K#j z{(>?qq3M#yZi8sKrGAr?>d`JxHcnia==@YOrtRmxHct?sopA`i({oa@zirr-3-?yV z^B58+x$b;Rjf8!T94VlTx>11!?K=R2bMbCyybhE4+`M8=)#7th4w8gbCaL-`!PfSF zcWpOsJiGTy_59M6`d&u03Zh5lF%lq~cv&Wbat5%^ox_N-LqpgC@S&HtKHZ8k=M*j0 zbD#Wt6&ak8B{ZJZVe+_mjS5!sb2v_2NA6N69rpeWNkl6IO4h;DyGMWAp}shserPVc~uEsBTeMx|aa0 z*`uuAmjRtJUZqC08PY^c2f1B>gFm_sTk^>+kA~PPYDrieB8NPtI88snZq9gShg`FS zu`Y(f55a_9jBYfInK((jU)cmvFl35dF`_PZK^4fSiUIFNTiMoGu z3;Y9h%>R3ZAOEjsvH$z1WBMo5{p$$)hr6SH&t=*FThxha1|v^;KC_kw+9};`0bGJS zN>9|rruX=X#0!;-W^VM^lY#8^8tyQF%*)jZN`17h4j+VQ?5eR6fat>&+I|Nk28JF; zvGH$j6-{!K_)0a97K&hqAF+!b_@jRsOjn?5K}XF+?zBeDj@(uoS{v~ibo!-g0Rl;N z`r}6K(FkvaSgYCW9a~kot} zb5({_gIMWU{~zAoDay8R$<|HV=1SYP?UlA|+qP}nwr%H1+qQ96?W$X~&$;{5%WbEg z#><>-%r<5l5%EWS(feeqJN4(9LbL1&hTEo;nz1QOpOJ;sqcHmv!={S4uK+~Poh{Iq zQn`9>6#XPF5uqW{&H&vGp-q@d=W>K`(J?pH6FMkuDR7-6pV8K`@H`18D?I2euSN)< zkNL>zCq7!>t6$w~L}&+`$-D>8o}_0z4IjHMag+cEa{QR?C6woan`(sfoAfb;s>nrcq zvrpN_d1vwKk;*OS{jggI8!@|{Hz<~!h~#7vkx%M725Lj+r;%>6X51tEC@U*C-H=7e z-AgK(6l@Pzytt>|p)Y5)9YxO5wQRJQy>_X5Ugyl_x!ap0=Fq5)z(KK&7en90T2s43 zB2({9T)#c^C=_`IqsyOl^PH2xkP>09fiiaXbm$nmz=U*SK7RdYqY0~vgshxTLN@r) zKb=b?&BS(T0I&~$SvbflTTzhy=>;(}k+3u~IJ2wIlH3IK`~FB|FQiNJo(}bUpCGog znHx7EeT!10sQ|8nz1l|cc@#AP`UCJTxvZB{6Z3>^(4bv_Q7|m^NnX_B%>odwAEAL}u&XGG$yR7=u0c!GQJnV|^(q$lt zV~$xm?r4HK;;VN~rf_8xpS#KH_Ms~gP$VjtF+usPA}ZV*SR^l49L)a91&m0Hu2LRQ z6hK)VeQL8PP^V61|9AKmi4nE#BQgh}Id z(mfS!)@8~sCV6ppg`VSmKHakn57aiZGkJ%ZZqTeFOUxhB_aqc=Q8)k?UuViQ{SYw{ zfXP=90TqvdsNH97A$3B(!1%JWNUu#%5oJNrFmV_t}= z#x~XNqt0%dlkl&yD)Yb6aQN$Q^AEv<|A7PKKQ&$dx8CeOr`7+FZY=XZXVrgu0{=@^ zWo2jmZFO8|^DEsvEx^>w0J!Ld&e ztd}^>7bB}fUt%HL{ByeDGUa-M9sJ1s=9jL0jfJ5B1Z)|{YWCl~%Y-OG)WmwK<42>g zroCZmwv)?se&-utUIua%g67z4eO4U;Qmj~`qU#H~-P#DWL_EI!wlaHRl)y-l2!lDh z?4-1V9dj?j$~}zG>aHHd(C#mc(ZFnW+C;xdk&Dmylm>c(2V&6SfNJNQ>d29ha^jDa zPpFi+QWcZWX|<$;5#pkDL9?OAZ@fj72_{zO2|o?Gy} z?VIFq25Sl3p<7c(($0HSdR^C)iG6S}&Ko|m7^|WVdp4&GNJkzoF7)3L0}{M(YmS96 z`8!s*V*3gJcOsW{(f#P1oL<6r$a92Td1 z>h~NJTy}8pob^>d%utT=^q#_lN8H!?s8Y(WNO|%4da4CCM*@nY(*CRjx10+ttSeeL zOBEff2&V}UKQ$4wI$7sw9fd#4my#J>$S2?oz4zNiO~s)Hfv$K9+%=Yj5*R4$wdzp0 zXrsUfNo>f0A@?l@x0~pm_T=IcvPgWKckCG8u?}1j7R1{)4FoUp_-NjAyvhoxLj^^G z7QGnLG-N7*Pc>@8`~oFF`8ZXokmjv!t_+saN6dL-cDQh>qPR5N!jU2>S1s196WMSs z5tIsi9%^Bh~neh9DZTZ=8px1RXUHY zhOK$QQY~TYG`$ErMAH+HQ0>%0%-Kho;3Fwh>(GFtphd)H{-66{?&CFd@%XA*Q26Mz zwG%M-gNCor!)2_>#9=kN+Y3NxrMYbxd~54L!iupU znB(f>`6={rw4#TTQ-ptzccqwjr^QsyKR>d1*89f71=24Vs{edjT&FG?$G9zttdL03 zlIu}v4^jf%?>~ROZTSVY&8_AF!f1R+1m5m<>>^o--AsB#;N}{b+6Evh7h1~UAp=Qh zrGfa%irZ(i|yWsjufh_?(`D46D2#yVs`Fb z_C&~O#S~+%?ivQAd-@-dp?^rp=(&zp|9)H|#|8oktBa8$D{}-(a`Q?f&yDu>!yE0u z*<$B07G7t{spKz#beM<53!sA*$(mc=??mR5qAdp%v*TPN2HgjXPSM~j@@OrB5DBg5 z$1tfci$d@=$W5x1Qbp#bmO~YY6t^TaP9Pv~e&TjtX9L9&2#4b{OT1|5g%G6%9|&!O zBbPs17x)1DmjU3v#HnH${#%8j@b`89r?&Gy1%&^tYWSxh!u!-aQx$E{=NRA?)rQEN1t9B*4W1AZw&&=!2Dlb{{Luav$3)M_vHxm zh7Bv%cHFYd2P4-M^2B~|V5&5W+WBP#3j>?p%9(T~{AeAZpg(SBeg)Tb!#^VaL% zcPTuW?Zut;0A4BWXyGocIgj}jZ&17MiRk)i>WTfC%KORYxQ7k=kKNYlS|7|uzLql# zIy}W$olHVjzgQdXpi|A&x+mXIhAwzg(~>p8dL@j1HV2ddsKk9&WkwxI($HZRr@EcF zrR;-!JuX-ScFqGIxFW?v=B>FeOP3p zf%8w^^u~-Eps9GhNM5oRJK6@Y zd*xWbF(nP~iS}*BLvyX~w)u7U1;O=p5y{V0?$k~&7W8Nu3HX9Vmd~Et@{92WY>&4> zE930xeu0egWM{iT8w`U>y*TNDVE4Dui$g@~)8vOJg+rQzrK1%HMqqN?=>lRu0{$8x zB}dgCE>a|j60G6f3)RMfdsi2WW3e+~VoJah)^-plFl$mAH#WX|qC>p6i8o%v` zpdH!Cd?kyC??*9dfvGEl{>cZ`>!^_>IQ-XzYDF}=05J8>mRR!f`L;9nKQX5K5i-HH z>9n};2{vEn7zOd8W;{*pMtiKOba-$CaJD8KC}j1vUYdja3w1bEeitA}kWsggd|`MC|-Xx~l}l!1=Sn+GbpY;adT9j5j)x zRO{QC$`#n^0uv}CRc%2{o+93eq~D$_*F{Y|DD^zyYQLBZKCpi}-MOY^?Z?N6-rR}y z)hR<%HPyoQ?H@dUPj)inp~<#1OzCm>mS!c|tnnrXLnP7E1&jy%Ipe5Z?3r2C{M8NW z=(FqhV*MSYkOyOK{kFfv1*KH@)#$A#>o^K*zf+@i8U_hCtnDc_17*t5Y!nelJrcv! zqmKC=ax2-S6L>gmgDehM!n!g%K??#11*I>Bj=xAsA^S|lV_?{S+4#1MsLOrQ=DhVH z&R+N?p1*(UGX$lISYoJ)47rBh&g^sT2OC72a=+ob*1B6&I&B5j#w_ECW72?3U$#7~C=DE2Szuwg{hn*nOlOH716p>%X`4_R8b-f+EfAvrd$zQvkGdM~+ ziXweJJd#ssac_|dnkVr$0wZtU7kzNrEd^VC#-~2)A6+J!BB1fLZI9pflcOT@>(|s| z---{Dq#WnY=V+1Ft!EiXQm?)w_wMqD5W>?(bd3BBC`|_aCev>M!bQQW{ykbC>a;0p zKB6A;0H+eqP_274@u@(Atu9r z5-J^aDCYGj(2bZqgsl*qw!2>PeoR)z-M`P(icn#F)U`WB^Ux{sHsPUe%UvH^ScOi{ z>mZmtnRk4$VcZxPu!SDUco&a--huGkhw^;Vd$Sw$r0H*k`dYr@O)g^{3CM{F8O&J8eszC3HjJD#hM1fFH9On2!wdO<~=KiyIxsVn;GHGnNAD3l+k!RrXm zKxPSG(2BI4GND`m-BfK8==qx^*0PR`?zXxajA9lHfnq%A^W6ks4(N5>9k0D@Xx^a; zv`Lc;o*&Bv(s*=1=M<7m^iy$8Y0ZF8x%dJd_+4D34OELq=*})BU}}685pFt4eZ3W6~zK1h2RSdQt26I?XOVX^L3V3?t5Ox z@DlHztxYbvzB!2 zQyChAG5u075nm{@IpQ>`>(bfSnn|J9o)TeHZ~L=Vo76#I%cU3F{X*{S5AEU!X25k6 zww}K~5;m||ETjgCidpg*AY`{*kHtZ0hxlRkJK;hhq{}?Ldl7mP)ptcjy(Em?Iq`yp zlA@^QX;L#$<9zOP!>H$*H5}S?ilzqq^@#UFBSRUzbzUnw~}6+fvs)qbD5!xUwUvasyw^BelVNsxc0c`P(;#D9+Naf3y5b*53wvW`;<(t01;j7 zH9wm;XR33-LSPMyJ@tjl%A@&4h#+aIV=+8L*e5HoU_ng0HZUfyrEd^&2OG;tJw+p z?5=q7pXY-Q%Ag|~xp@&vq;e%ozxNVLi?jb2y{H|V! zBGgfiwPU$J!kd31+~;h&1+H@`~5(F~Qn!hdc=%PQ5=~ z$&G5w$Ax8CH3->SDrb3BuHepY$ym}Bg^GjuhCj|o!!f>an}Joh=%c=E$%F8AD$mXZ zP{Mlk6xFO~peHOoaAwBqTlXwu;RBRoF|~Tn6O9aAlN-KpJh+T7c1GkM4R0oM|ILy`m4P1V$P#__^Hmp2Qvn3#vD53*#^Gk@y zF^Ejm_Y}xd zv3!8GMW(5szlrdmD1)MuLxOym1Z6ivfKPm6P^m$~0zy9uzVGL2+*xfvTVPps5xJuN z5XBl~%ien1n>Ke_nx6REUr+IG$!s@AM8$h$+ss(*)z)!$G`OF#UT5Yhz%8%Bqjyy0 z?R*h$ZGxWP2wpJ4?l!4-c-0W!vS|#c%_KHLTA1gPcMIy`rU%26sTPa#B-ilV%0=!H z#k=XE9yKgUB+WgHRY;C0E<|3g4I1<3hGx}i1lfeD>BJz^^3>SonQY>^$`laWzMGtg z1{*BW>1mU6Pg|WR--(|pVba*cBIg_YRvWjut|A`8;j|c+0Zr}dAW?|}&)j*>H4*#H zH)*a*J8kbeQ6F_USgIN2vw4TM*zCuV zcfBH9`6M)GZA-_1#Pyq6x^g1XugOh>!n|jE`S`wbsXVpC;fC95S>*2~!-XhpOg=p& zGUw(LVzCPpagi`n3&1%}_vQi1=zc^V$=gHwJbkH>L=f~&rcW*EF?$LZo$bxqRD zvr70%z$y?LhJKd6TwSS@U2Qv6pkM}BnRMp$X#J7!mz+>s8qx%d6Ckp4SYj-)z^=;H z=CB=ubN;Gph>G>j;Q)>JiQ5)kf2@sW($%&KKnGXWr^Z4AAK7-8l!W!;Qzh4U7zWR$ zjp8|a%=*>%YK1_(=X0%DzN*ccZqVxCW0Q50$lNwljQ%9s!7&K`Ka;4*)>n%uYlfFQzejAnyto%42Z-Aj@&WaWMMYZIz zbweb+ek}G~niq|f`*TD<;v)?l&n5L)ms$V0pWuW!O#h>Tcu9xkAG zi_Ch}^`2B+9Z*PLPOz`NUTA+^X>E=rmqNXRf5P_mC%eYvb~D1M3&%ttcIk;~w!ydT zc(DdOwJ^tNA~f(Ixsx7jt&75W9KUz+G+LZrR@|e$Inz!v@EY{2WBa$A3cfJwUgHcuM-1@EZQgqJ-5wq=U zxQH%lCgkrb;U3jd;ZoEE#$>!EnbYMNOl4AyXU-z!>m{w1bdPT?pM8CJ0o^(>^bXSk z6!cO{m!>zJr42VZXo4PRCMWy@nVDCV4Syc<(m`r@%2i;sK`T*)?1e1vl;l*{q zU*{iu?T)e8oSMp<_T2cg6)ifmx14 z?Lt%6Vk2%3bmQn-P;q#vMk8aGc7KCm%^l)0BXqS!?Bbw4V<=86(mJf4CUczy3Y46Q z(p{h6XH>;O3Y$c#o0?l$G{o^`hWLQ5K?Q20j>u`IU> z6zMK*9F4+STxzXP#Mub()VZBj&xCob&J%szvJNX4l6yk(o{%i3DTd8S|xzKM-}y1sdSq_sdZ4}(x1JB_|&Q9 z2XZwc)oFE%C|rf;UWmpW$-v$Fv!}t(C@TwfD5ukzY?-7K_Pr;6N0- zmh-BnFKxe~>Hvv80E6l(h$lH6iD=|NrX%PeVOIXMXUKg^>#n`@;v6EYyNs^AVdwV` zIGawrB;6#EOv+kM_eQI=T+yeB`Os+badb)>lYg_z(sB7GA+wB_>%#OXyYM2IVD`lC zp8Eb2FFd0bA={cC%k`-DYy0e^w7}f%c*D~t`b5$BAu}5kw6JE;%-6g zneY8=a5+~@+Z_0qmnp9{LtMT<_o7SJmz1T9%tpLD;{~%35;`m#ow9;O`u5b}+o{O* zV=PgO-tB4LC38Z}T8J;+6bGld#4sE?uJ_Ck&*g-xowoiw=Rn%^cvxn?roD#Ecrq^Z zM9^$+uTMFZ{KYFn`Z*vnxpk!^t7%W!D(Or#+`w~hZ#UW!j3Zqaiz|Z48yw4$hbzLD6y9DvWE%eKpF7MEsgkIw1;T_+^sjC0uY4lrP&R_QqfG6LLK zIrItKe(dC+M_O9gJXAKNb)C;Sh)vP5C5X3chN*%}`Fo%G6W&+j#KJf#5l?gFRB~eI zumpZTIy06Fxn=)tNpy#BcFJZ?#(j1*OMCA|77R(!U2P^Yy?>{ogr>=bZh-le`OzVc z74>w&@0XQ4>scmqXH z-YPRtz{5yc6Yc!k2ZaunnJ1q}eec(>lp-7`E`1{{tyH53|Mre8;n;}VPglZ}%5I>Y zAg&^m73ZvJ$(wj$t6y#!==@jn_7NBiLBV|SYt+OT<~QHNDS*+#C_?b#_neYLjn*1t z5|1EId1SpnetZ!cvskx|RccoCUy*XL_3lCepQ@ga6-Z~-E-Y;h6RQ_tIFfV5f>!E7 z`=r$RV7Uk!WgNP1EdVu<(5V&t1jXYZo}$&IPs%&N^+2RWYeL|V6;rzl#fYz$M$Fxqr;St0jF)fdWrx?~sQ;%MT}5 zrH4trGI1~mb?jlRAGdH_0@(hwZkP2Lb?m;JvCW=IjhAy zob_oSh9v))A_E_3BgOER+o1FrN|!4|E7J2aImc>$lO8%KmIJXhlec}EN&lR$_2c6G z)S^#K!L9e&)zuw4OP47-0RmXsKX8A~yA>l1S=aJn6l;|RC;Hv)^Wr@!3C(fTib|%S(8V1Y z-EG>$;u$T8NXr4r%00i?f>{W4_0-y&PG=9MlKZx`_sHQ&Od}^6>U8WJvOA^IsS)9q z4Z6XFBZc@qA!CVms37LnX36ojtHE2{F(qfHFo~o##^-IrGHq+TdNF}^8z?mR``+kK@tn`X}wB%<#hBF7>b1i#O|5% z`{l7)BM#)ce5yuv<}s*}ol~8Vjl4H4$aWfPI!*KY)Sp zj&O9@+(ckNpW7Ow>Lb*91LY)>w{RYh(0&jtgbxm>m-gHWTO~6xEc53F_I$E!xGL}wa!WA=cMPcs z)O$TujdFbPk1_VAG^~;F3^#HhOUh>M1P{aZ{NUI{ZW=220Ji+Z+TgqS^5YH__?6K& zGV_i-u{y2<5H&%E#OX`Ad*~a^P@Ss>1fMx&A=9Ghe0BsK)%!R2Gc~z<+}obH0?+%f zIzJPVk=E4pfNIa!5U96#fJch2(Meo9hpJI{AMf>P$+DNP3m2v&dlLO$*V{xMGFKaD zzghcHdk)#ZAWkeIGC|Q_$m|kXtM=J?)*ChGCpaVt&VID)sFdCt?6&-tXmEp11~M4Z7S4tm z{=xS6Zt!)n$&iXyLWitiGr*knORKGN?5x#pxWlKc(Mw)Uy5^(`(x|+v7aL;iVw}$}+sgHsbr*sRRVPw|t zwrxnW%e%A6`~2bcf~pCfvvjWIFz~o_y9WP~8u+hWtN)}1{xMOf`!8yM<^PE3|4&i_ z|7HI4-$4Wa#1{O8jsBA$`0E$-pIhXte<7s*KqQse{$C)8?thFXVEX61apwP6i_m1G z{|6|6&q)6dn&7|afqy*w|Al2_r)Q=AZ(&Adxld+o%}A{h$v`oMZN8j`DO!KA=VPn$ zJ8gTS$VQq79&$%k+Z#uZYA(Ky`2JjlN%m80enBVplvP<3d78gIm^^)oJuohZKx+9W zQ$@?Ba}V%_32)owK(wkA6qn~$7NjUtj6!ZGrWy8|{2K$^+5BuP+(DJFuLs%@m1eoc zK`J6y0t~rM&sAThe=NFiuauDW+OU>=7rT->AgLhL z_O<*w{}A{}`L?f`frOO>l9TwLY51aI%TC)%axT4@%yJ)NPL00XI;vEEUDzIK2LmcU z!}_Li#}uZ9nqhJ^Uu3;j*u&(0Z5vZa)kK(+@9%yBaRlC5+oUye_ote|`oJ0T=at^& zVo};gFhBMoCPk#21Cv9Q?sZrc5GG zb5iNZ??22Moc_HHNc}*Wt7ZHx!|_?#cGQ(Q`1mD3mlos@NIlDQd=B-(OwzFU`^ivE zEYa+c1_ZVhkLVsij6(i`TWA{V|NFaw6SNIaqf)9 z?7hNErd2z^5d?4mR>}@%(xrhAt8q~m?QlVt1^)AkWW2?1A_*6I5dYx5-!Yr$lJe>WMD8BV!fw+&pnw~sPM#~Te*DOl?io_5_9E`@v zLnXDu2-8XGw|re~cmytecWaU!@hPx*Xp^B7D!$v4kAeIskKrDHu7lRzmE%XhzPgwp zfKvijoQ|%_!O=d3g=FxiYZzck4^{52UfqD&OBeF*mR`{vB#?=CL`CX`n;48j6Bwh% zfWUw9<`~)VoF|8q0V5a$NiHLaCHzf*TyJn@=RM$fTs`D^0 zk=MpjhY{UwCcWi=#`T}Mz?u{(PUe?+1~*e96$)tKx1U2+<4XHq21648mGbnCzr%$B zf~4ffR=v;*o<_W?Qluu&@5MXvE0D<{^prawp8&{|HJGrG=xM2CjnH0qipzeX2 zvG{D(Uvply;4>X1JWBv+7rdotq4MeQG8G~P2h;JCEzEf>=q02Hu7o!1gqSqMiBeMxpEn?aB1z7@>oHVBQG@-9P2qs zM!1a|WQg58lfKrdTfP_mkUU!jRbkC{`vKm7#+p5oRpLSC6T=3$`YfVa_ID@?I$^1v zs1a2wvzR6JYA~ljU(yf(Il{6On4j{1_)8(ADzHvZ`!8!S9&%ZA5M3BpgRLs6850Nk{b-YXN3z!n<`kPpG{L@P|} zhpoc!n{^B77R07~wZz&|O?*o_g2OEA#N!^Jk_PB9cVFu#7^Lz0Nb;`uxf{;)zH$c98M6-s(Ga%8f3^l-gjRXf)xv1cvpY zEJwzl$+u91v~n{yF@V)8%W}Xn-aqx=vk9k_o@e~}pSVV#m!1ZPa#x1a{9nFBHhchO zc!z}@j@D^)s0u()Ao<3nAChbBxfb=+vRVQhWRkPRiAWIW2IxB!B28yIxlJ%;$l_c@ z2M~K+_M+@nYu8m!(zDr{SRCFJw?=KtcsoLoi@^3PZzZt(q724tr5AwT2m-tb@lq=AWbOf&;K zEV-2&*HNkT<`Q_bT4c1LYIXo90rWCDfh-uX=$j}j7Ja$&$bygvsxCgXV~lvd*w4qU z)Ncftw9vgq{yK=|+?6$7nYM!E+nj}vWs_vsQmy~PQ1;p$gHdj*YI5hL#h8-&C=_xg ztuOUy64qf{{e8jjiT2?D5CScoicTO+$$UUvdNGwDpo1*~liT(c;j@GP;y72C=1;K z{E_%H4Pop>j#hTnRzWea6N1-JU9>Jey=2cvKXB4tF1NJNGYp@uO~?HNnO1X?ZNS$n z!|^hlc3s4>b&nWEhAu9Viw>{39tI7sZ>G#opiSq{n;aDt@2 zafM|o`kht3?~&I=9^eR-k=`SH^8NVv_?MGY)kw&Vqh4fn*_G3KYYQS?u zhZM|$`TN~|e~#n;{)&nRI%JjAuM1|H;4IX6=pHlus6cl)K|M@q6mV* zY$lAWC{slEYLnr`_fnWt;r$VCLEvOWPOk2-s`(SM`Ddai#^V^c9$+2wuyf>xd=5!6>&Cv*2Dp7kt$Y^<9e3FW; zAEd0BPi$3TBKr4|n?b=GRJ|i5X|+YS$`=Q{xwxW!r2b`r8<$x?Ad!>S<4sZ&uTK@o zP_3}d47y^FKXhX#YJv%?cQuv7;dkP~U*ShAOW#LDdOG^89{)Nfjr0ZaOmK7&Gh#7c z#Y)Oz0_niPFDhcyG3bY$zR}(MQEV{9Qwi}-G6b%iSc)9=Y)cRrg5{b+2goawRa2$u zkxw_as?y`m%hA_)@4VO%IEdIgY^1kbQfxabJN4&Ql1R#>m%RaTnFGnATa9bIm*WpQ z0##NuwIQd(0e*nOh2aF|bAWaU;}&LmOs|PG=Z(n|%dTu9m>b!JuomwTgvZ}*T;z>0YmlKX zR8Luv(1EByMFwtAe;Pe5}d(L2zZeS%rpxeBcKKfutY>ohpPt{TUmpV1p} z)`oq09$;jIucAR=Rf>C1Qh;-1s9I9%pXAZ;$zt9HM`PvtfO1a>s(&g(N43$K+%Ei8 z69||#sP&y2xQBLlePy$bnmZWLx(-5R-_?PD5qXx_)jDc-5MTWrrS`D5wNj}(b0mV% zTY#FF%{gPcJ@rCnBSU$KXu0zgt}DF&XfJ|;bP&{ld!TKu<(#ew;mT4u-VZWfD|dHq zLB~;d2?c$zgx9>)`?iQ0uqEeKPF-(Bq{5eWr90a7wzngc%m@CSETR3=dw@5 zpNV<%4Zxw?V_#LRZUfv8JBvdsOvA1H_4x_lb)l}*LCD-f!%Ye)u0AAkub+g5SNx!w zhUt*iYjFh0^Vx#1ds|BsEsjuG=NmLu^v0sHoCMsjeqZAq57Qd>73u`TqhBVHaLW*` z#Jcfyw3Q()YE4dFc3_@{Q&pR!ToEeIfA}5C7PEat&8i60K+8|X{5#{`$D)QPRrT;} zT^Tek3p+Be>`CFbqD3T++}a`c>ix|K>RLI#^dl@$ZK@;Owz;pYV6l8 zD%Ze1g$-`#u>v@(G1Q|#=Q4BF5PAckVx#X7<4^vwdb5jdMc<$O@pOlZa~%;gFR)kn zCxkFhCFvgGiS{?DOuNb9u&Gk*&%!u*sC0QR8OFNZyA;pecj}GVTFz*@a?(@uLap#a zNOh~3hh7l*ySLKizM)x3gjXa$?iVdIGD#Rr{X7u!93xC#0Slb*K)81|BP3}TN!;ci zhBhH2%Z3=YO?}h3-Qm3|U~*NqL2!0`(LA0fhe^N)Al7KTbrWw!vbp6?_(CFEebBBO z+Z?8D6PBha^zxraalRs`j}{Wk$b#JguS-N@*j7g3T;1lYEZc5T5uF}B^;4hfT!Ji9 zGjJkrSXc5yGA&i5BPy-7=Ytr@2+V*`UfRkH$Bs8P`;nO}2EJ$XJ7~5_vUbc*IAHGWCCaem7LO zIJS(%bV^q7dfsUC$8SZYPCSw!Q?eMcjXa3d_AU`C>B?U zH<}6W8!mu*@64<95-n%P^XLqqohF{ICQOM?EW zzL>d9WPSBzwtL9#7mm@gdjGN3!r<3W-muWetx46q``;SqWq zeVG4Y0u>3grKid~v9tEkSDtY+K#^B-hY@LW3gy?zh8j(~c;sp!wotOT=u;yf*dD;8 zA>qg=6Vxf=Vo3DqBtQy(>T9?s1b5L>y!SvDr;{Ikm*lOG<71tyn6^$~#=9qO?sY&d ze)I#ai?h|6f0`Yb&s_QdJKl&y*ET(>O?SdJtLL9%L1ymGr)R8WP1+H_D0n;$yzaBj(f){IB%qi!aLJkereDFaauQEr!qsg zwN#PAmz0^;!tEaDJzoBF6Rs)8#e6Bj|Afs9gI=OThcXmc1f7ikNhkPfh{oWV?G*D{ zDQP_*of9f7ilC^0(kg?a;aK8$hBZs*w>+PzZ&QWV&1hBN_=Y6$h!^RGr{P+`$C+k| zlVz#B6I!$jHQBb@8emfsF?-c_4Nl$-OPb`&sY2dlZqAv zqiBLu<;!;H&r&HEcK`?6NWv4GJUY`VfA_KKG3V+k0nFKF6lTS@@QE7b3d1u(;ibaG zZXr#B#KFDE=X{hq5zShMCqgz*hbRjpb6P>z$%W|G;JjP$^IXbnkL^_L?P&Y=y@4wy z!6925IIsQL%xT`V*4F#tDf-&TqrGRi0s!(5DpieK`I3zfW_ldo+<6is7$_B z+V6~;@%pU_aVNUW)~}JU@$?W|v^Ek&8|f|6)gNpI3r(6efJB2w-kb+ijqWYd_Bipn zP$6)3UQS<}^0EjE++4uqmqC0-xsJpIS4$a2rd++MA*8yw@2Y`1{TM|+3Cr@Q1J(SP z1~9=JeY5Kx+EaL{vp=&pK|CeXv?Fc&E|abpgBw?+sB}YYBZl|uMFnA5u!Q(%@I~XW zu=B~NV$C@z+4X0L=0sz z8q3f12l|+|yt1A$hMwiabY3VX6z&&myEod}8_O3Jm5QGJ+%Q6 zPW-%-i|1Nqo1J~>;X}-Beu-6FO75rLr@j^ybxU*kuCmMlZr?nj=e+A7J^afIDI#~f z$8IU$s{P7DVFsD6kL>+!pz}?+3yF&1(hSk!Qp^8C+&cx?);3z2Y1_7K?X+#%wr$(C zZQGeUojYyYc4qDGKj(D)9d){*FRG*OrXt>nm~*Xo#~9BbgL6kPHv>nXyv>>QOisaI z>lI4+7-=@4(g?&gdaw$X>W-Q`pKG=#7G{V;;?F)qZ`ANNoD{Skgo9t68sLS$R#R6B zY>Q5uax`Vl-g#Y-_`)KBh+qCwIB%T`B#lw;V8_?%B6D$-AxUarh6P`r zn40ES0i#-!%VW0Kv_I#M)3M{S1FziQ5I^NdLOnF$4NWGWBr|-@;js3 z5x3YW7M>s4{YBTBpneLm94z3-ZAugh0n%=(#BVu6%z2?RBI*eU29k3>1L=+KZlDop zW!DZoXtmKp|F+tgHM948Sm#f>qn zsvF4uY@FS;ffWKCY(^;>w5@zPWc1o~eiL6nq{pRL%Y8;$-QjU7UV_bL-v!S5Gh97x z(I1j)JPyV5S?pU3*AF8QtURoqS96yJBegb9i)i=$$amzKbB(|*HRHQsk}mR+tUrF^?qVo)k_vvKFN!(|{1>Laa&milGFdFzP;eXF$R~=* zBXkIO@xC{@H73$?ItW&FAVd3 zmuZrP3>T{DEMldaO`uI~jJqPk?vth9^?tT0=#=VuVLd}z;doyHx@aZY)xIO!tjRI- z5}~K&#wWivffKgs6*>)Qt+z^3$E0MDUlUC}-ez75I*WolIYySpy~FzEJq5zgu(KTU zywZK(v+}SVRG_dV2}U>uXk+mW_4MW78q=>u@qO@zP??A=1bB=Bw(sRW8hCC#cLQ(h z+#g|}t_{lp1AZ(~mZ>NRk62`oE#p~=-SZsbpi|)PWwLmlJ>j79&CTe$5C91QDDMuXm`e6!&x z-&KHKXhI_1I%!te@7U+F1!4BSQArg!D*6yOlDqD^_GU@Wbg(t4Avt+=)TI}Sp}Qe` zn%HcQw}obX>D$Dp_t&&VJBDtsAN(fWe^_>c8n^|+Xh^`~(Gu5@s={=$y@MGg1Sh{q zUb_!4!rdrXK39A@1Qn6~yw~Q{&O>`aIreM^d1S|~|45$9-Mj;J;H73@EO=76RR1!- z-h73+qiuAX3LQFY(@urqtuTnZBI}%^?U#S);^=Fc?pMtEJiXT=iwyBJ9Uwjp&l4HB z)Jv7=2X#Xz2^L(0Ws(1IK^3K6YPFH*6li@q8g;v8fh1uaL+m;e;$09B=TM=Z-{;?= zy-$0oSW855tmU=QWj1WwMctmHRR9Y(oP(T(wu3(WThJ)AW_PS?TSzmp0elYtaW(3`t~HnL`*^d6_3G z?9>VNse<|XsX1U1>$%WY3|T&vj?5iO*1bU7rfSq=3aKbW$^1Ivs|}Sx@Xwt4pGhuw z`*7Weom5c61V4_?3C95MDRSem*=>qUC?bI>xq&;e0G`kmj?$WrECDKj^0fu!?6i?2 zo`H0c2RYY@kKg8}`-3i*^)f%ONpXL+R)Ay1So8!Pyt;-cQ(0P(Tyeldz$D%ePS z?_Mln$Qtz7uwR7(4Z(7b>Z7VzS^`O*wc1s4dJl)r-&$hUikCzj6BHkIcVw2Zha^3+ zh+6!8PgX)DquR^yc#0&UOG<)=RVvW@x7h_OeJ^At)AS$&*&1~t!tIy9&oh!8XhNQK z^b5O<`2prjB{m<#VRJ{lXNa3s$~W%eqzeR4aZ+Hh8GiB(2c%>v|MMG2|s}(u!8g+&1e$Q z=}dViF*cuViRK5mqg55$(d`t!y`}+^rLXGC#$bCp2{71Jp*Y0mt7v0)EC^8^v%=}` zy8w6porV2#4ME4$nvl^d6lG%^(?Oe%>0(9ve7;>Un>Wxf9pXzhmbO<(>yNMeO$rF1 zhZpOr#nzU~S=?e0D>q!&q}-Wl|1z)wdspf}wDBQGtJO??4nbS*ac}?kci4xT`Qdd; zaF$i65^A@79V+cmgQ7pf?YiSCCb$|B=XO{Tc>XCzRoP4tw3=ppX;NwKZ=lz>%|dN1t%FX3wocSg?!%l`{Qn z%4TspJIF+BT`3^L&t>@5JDRQE~BX!NQE4<5K67!Xc2$hH7__!26YkC3uBd8|sU! z8g<*=hfhfP&%?W*S zE<`vV0askejKju3uhkUkjxY14dmHViznOx@W)Is6>>oiH;zu$_OnEcPn;}Rd8+T7w zMrN(SgI1}6z0VQ^u{x0^YmZbV?fp`IA5}fpwpp|u`Saw4?uv|)H0mskD&UuU-`)-h zVTm7yT+-f{$mx?aqbK=MUO6FGw8TwpSf6q`wYg$LP1X_8-!5y&FXfa_NL{w zm(Wf~-#wpngYDyquE1<8?_Ebf|C6x@jh%yQ3_!jkOlw5Rja*a4iwx2C-1MRRRBgIRBs$P>m)$zby?S z@C**xBJ_x_bxd4+BiX|kpGz-?e34YO`~lp!o(Q2B^xufHlq4awgzxblgXE7dvr#t7U44wr~uT9OpAbT z1r@F{L<75H(=e{qdA{)u_m|sk69*^v?(I;l7PjcRCmF%6R$wov*btefXoZgT(;vf` znC}fFZMoshqWA()aPK||U{{rZF>D&9l_iiyq#s9lyA5xl*C7e2hHEzqzo1Vh{yIbw zW=uLw--n6_Bd^@H*EeEvHvkS~?`%&JSHT?_we_MR80%hiuqmVK;4J!_^Oin7c z>~E5wIkclB`_2$lMkn-MsTV$#;a*tl@mAB%{HB+>$wt0}XX4TXhpnAggLmddPAJG$ zs$hKYF)g3w+_x-)6RNu_O@|;^MXuvysV-)s5qX31#-)eaEzpkc3^(aKAdEJ}-S=Zz zRHn;+3g%Y-Bf_i+*hjv?4PC^Vvx5Gdiz4BGxECf;>~W8QP8~Th71-Wlm={v@@K+Jh=_FaTY{gDPtNYNeCO~!0Je1+_lBL?afSq|cA48WL&a7u07uDgfT-;=Wn>pG>-!lB zEZBbI@2iO3Ve{3uvs;S5U7SYDlbTW33{e!e0TB_pj>0*ofr`^XH*%EKM40R%u;Nf) ze^oO6qm@@oHDOBPI}%069T=@>1}!0^J{?J3n|TJ^!UPx6ry*u0+F5Wt+= z%d|487F-ztFHQ0KwSSd#9@!U$*9;k{ILT?|f2llJg<#CfXqqi^&)o8F4Pwh?S%gU-5O03o2&!x2%=i5 zls3CPyO3pvN%os(Ac{QP(C`AvTVFt}_9O_gd*-y0W=2=F4KMPum8-e*gbjrRl+Jd( zzO>Z(LEs>c$mKK=0s<+z-pNxO2s%aqh0=myN4-M_7LCD*{)z0eK>F%lCg#&o>(g~Vru=p zp0BGl=aEJ6&c|obg|m6B+b6P*c6Bdrt79Og)E%@)bkmV4vjsj&F3jd|YXYnDrACae z%x~@}c*#ZnK;})eOYb-kgVfKb{Gabkk@y@=*}H7F;TSE_(p7 zkaZ$hEb57$c0*37-O8Ykb*40vk@KIxHS9%HuHVKTA^ed`hpItgAG4x<6BZ1Rs)?5G za1f!D%mWV$4IPB=P*-B#!V)e!gPRBt&L$w8Q|pWzxCjdClGZVoaPj&8G>P4gPdCk! zV&_aailqk9`%{|l&R2~;@+0nN zn-?5992S;}58m_A4W6SKlj0~Y3mnY<>BTVus0+5&2d%3pFS&E-48%MUSEv|r^4Kix zoQHW%gvdkQkc95%kgZyaKo;>J#KKRNQ6+C5+6S`ss}!OjnES?QVJDbxTB%F(0Er?= zanZd-+Q7ozlV?6n){g}uK9CR9*(?&RrwXiADxB0;U5|>W0HkLnuH8G7u++IBkYGG5 z4$C}x?3g9iX2}DHiOhI*?wy+O3w?aqViTn101MxMx!$$B*J9g38T>CkVNBq0Rs%5o zAeWT%uYo8UW!ctTtuPX}q6&bA*2Ew7Lt;%<*jEB_XCtR}hBeMv=X+SYcqx5~)oFQQ z5SZJCLNrEZ%)D?GhwbvmPinh)ekS2&iZ0T$xEhiB?o)i%spZ7_jzbUVC?xE+fD8e# z${sgOJxZ6I9MgDMC9VB4DyWQUt%O`9gDY!s47hF~F7B~Wt)m0G3^QE7bdk%C3^0(H zJ`RUq3yBmQ1#rULl>}-?0_k-gY_xeecSFL1dTHSzv2Aivs&ou?P@hNB2)hSRbHb&W z&$Gb^pn{E|%_5Pdk0e`H(=q~lO&9Rsc_c|54KKPA2WP6#!5ao7q3GI(R$s#J4yEn; zRFAw578jwVgAT3m(DFM7yLlw!04lE!0kVsP^0iw>vZ^2z{-K}cvCEUI-vv|Ae9}OTB#2snJNL_d%(M!DY%2pQE5@awpq(b zQcp!hv>n%JH_xFC z*!(y6rK5n{k2r|_X%)r%r}jenOXTGlvj^$>ybM7=f|sB`af2*;<;S7fW}rB z1j$geP*s&b*LbhtS|kqdgO_0fh}o94VQoKS z_AalNXn_2*t`|YbzETsL%&toj=AlNjG=vjE-ry`o$2P7fAtr9IB%IAZiRk+iH0!cmoIA>=I2b`$liT!@8 z1n~ob8U7TD_ujn616ta-#%{wkfd!TcWR<5DvFNQlo5Tr3C+7#$4G9`0h0aryrZH>e zz4F$Dg-%YOD|PRDpRt5!^z7{8q6%C(SeAb+kImilh77 zp92l$KSrDD(bZ~a_Fyp)U%MW|TD&Fk$}h%YoGlMQ-qaVqD?VDJD)>3GyW4;8TsPwMSg!?Y(LPog1^-jG9zrM`U!0c*HZpEibJ}o z$>%}WWJ{m0f5*WMj2Z+R-Uun@B(~w=_nnxo56&F4H!4~pU}hmBPYt?^ z`=?9y=!@PkYY6UsQP>k5&eqPKdYf@j_CgIaV!~j^l+)rq#us%`fC~K-P7jL8E=Gj} zjGh7le|t;pAv#vjQKZR`H0$j5v!OeH#P#cX^|W%eg&es)M`}mqyq~<)685Diw%RWw z@!+X-b>wcsc+xITTYD(4XJiqeAXaW=7(M=xazaZ`%JAWSNmEKJUHDI0Zg52;`~6R8 z4yzj&^WUU3&JP&b6+n)dWP33orT`1}{cytVPh(&81nkQl_1~EO;yDETPdOIcuir&% zFi4jpE?_^Kq2yBUu9XWxex~CzLj%)5Kgz(g;?JBe9GG4i`9S9H3T^f&ccE#??-pAS z^##KSchQb@N+&)K&fJA}<<&q`4?|Is(S07F)V|>7-Ti#l1CtQxPP#_=GH}|h|ncn)rEnx~LGDa`F zDmGQ$XCvkMZ)GN3u`rJKYZvG?20L3~>L7S-k-ao@K5pa7T`5x4)yLuAalXK@-&!6>orGtpU;^vjca~Yei4|by z$C}ENCYK0Y<4ucFt#I4XQ}(r|9LJ+vc)^IQ*P2CZ&NBoT;hj^I-!s@=Y^Y!&@ye0G z723IQw-}&K#A2d@$A?a#Wn>JcP2Jgu=*jDfl_lLCu>G7mw3ot1*i_Ra@C};FDsZz2 zpg$qePR_NBAULim|KU-gViXsRy!V4xo=RbgLF?ul4>~+~gph9af}-lpO`*bXm%4>c zSY&TLI0rpFW(JG-HR5=AgnJ=ZONkf@ugvMpCC?S6Bl*p(rfRbo5FZap>l?3hEA`T2 zYl-!GVsNFz=aWFuk=rCnH|Ks*)fkn;w>zyiFTQUHx4o9HxmvG}zXSn16O;e5-mu%e zRaBGFldkw{IlmEAF#!v_GOoJrU{e{_t@GEF!uB5MrjCpwHAQjl&X#UOKwQnZrPGxTF zvMxw_2pnXSQ&wA-z8KaSzy{`U6ABQGMhk#yOh|2U53pj;Oi$Qx$fPhc{@_oepnt2t zm8hzHb1>pHEW2oKLxu#r+yx>9RmXGlhm70aZ$HGa4o*OfRq{j;seC?0Y>pJfXtFA0 zbIAZ(T?+|!SvbSh!ca>^y5opA z5BaepN-L1e&)%;HnFHRGT-w!|DH5_dLmAk}l0cophm)undu2JH?QVD{Nabi*&R&qRYjKlaL%d5F^kxZRS9< zQ+rJ1H5BoYMehX#$Wax>?RxCIy;4&>ayX$BIvpgk@?PDMV!kJ+CWsOW7@6>X+t91r zY&q&L%ZuYBscn>6Cv(iwa>|G^DAZ&RS6UH_f7rj~e=BzoST6zXES1yPAHUeh= zs`b0ql9BWL5;!7peWhrHxozCcAT)71q`5y)`;$dFmhpkL&5S>WfXr0GJ#Av!NE`tbYNov{$64>MX5LHHhv^mGt(O5nmtVl03&hS{^ zbDLSc1I93s#G`;5u9fyPCSV()GM2lBj%U2~Ge2gXqg|KEYY*p`UdSK|7)rS`_aq9m zpT~$tC6S`x+;I#%4bx;OE{q-istu7_sK$vSL(*yw?i6Wl!kN2*FSMuR2!`!YX*gc$ zSZF?l8EOBjOV)2|uA78R)rT#3J5fvxdD|P?n9tZLX%obRY?#6}OG#(fz0t5jhnX=r z=|B4kytxhnLY(O_XjurFhU3jxIF;N4643Rq{J!iZzc&2{kl#U5NlMDxZn)bJfY)%Y zZ~sp8zCp1|rxW|M#f#94H&Ax#Xv&Zt=1*SFV|p`S|=Qy zAO5vd!@*9vd}SsBIKQv_%1gB50SB&5aGn}NG!t@3e2TS*W@!ix4|pm%th`8+6-6)@ za_~|Cd0|`8eFclrRa-dOLu;O^Kx{tm)yGGFcBD0(oQY@QW8W7Ki8mu4Afg?4Npbf< zj+Jdd%>3ScwB5Lt5;#R}l*?GupHTPQq8U#4wegVmBQawaBk|O-9_UEqR5&%s!p9}D z=M5pcdayd)9V$CZ4`A33<(1*hibN{KJYl!;P$2&M1Q@SzI~NA2#?8n}{L1y%)jF$C zcbX4x!U5^2Dyl{$mu=VRj`#+egi=(1hM-((A>Xqy)wx8!eEs2YjiW#@Q_WmhJoxu_ zPJF$IfB$0rveq9-;}S`(N0)?^pQo?K*?B7=leqceCxK3HNGCbeGqw9)RXr z`79soVjRIX<$#3_TD87>IkvmhUry!Zw%48CeZDs?ri3|gx)urb7|iltrrTSOEw24k zuveD~JU`_sebnM^Edrk{MkaITNnf{e34jYJu&5eU@=2x@@#je&Zp|o@hAZj;Fmr+a z6tT2n91d!WByL>sk$&~-(xnE>y?ZU|h6%8e+dHqYeVCsMMk^^$XLXK)$|!$|wN9Vd zP=_BZd?!5+2%AFn{en=Q$diNP$m-U)YiY|9XkES<8*>j2xGyixsLowqWJC)8)~U=) zOK=jZs+))m__)6^AiWc<`zSAhz zw<@0?_5H??6hhPKdY?8UGFL7 zCuYc5UYwcoIe~qWORA(owWsghUyJ`T;lRNZAOMQC9K%_mjiV-(ig&+DZt6nL7re3= z?mHhO4FD8jQb_71Kjal^(iX^fTz^A99aatcT!OtbPt2E@&;AJ1oqbY?bEXI)CZ9sq zUTVU5sm}iCk&YTdu?Tw!iW3kZfXHCU{Bf-Apdo?}zzaM(9Oc0Vw^++^vvAhEvPnMg zpAVZ!KI}XRxj*#DgX#49zm@g=N$UQG==86$&VLj)VG}1KM+tz`?BZuf4JcHYW4}jur;iw1U(Z;~~Uz^naV>A{9 zhJS;ev;HIW{l}<P*xP`bhtqqSF5}3g-V?nEZd#lm4&u;QzDo?H`u>e@T`9q{9D` zg0K8fD*Rt@Yx@61+x)*G;{OJj|0g5P`1h&&>$?9xCC)SddxHh*{{;L0R~;$?C(HjH zAU~PqTjS(CFB_}#gz98xhPYXt#;|_g_8u+*&Eq=T_Ha8Bkzu_m3HDtUlvPw5gnQJV z_`1%Y|LfJ3$zxq7@|Y+f_xF1sO-+c2G5O|(LC;{qHVfe*l`R9%vumd)7-Eml`VmfwAR|&R)oZW%5om+n zMw_!n5pWJ9KOLFiyWyDQ-84*0Lfv!*m&ug9=#r2wz(wFd&U}%U9%`P9rq&?uL zdy%LzH^CRPOa+*zchA6ZjZ}{BDqvh1(WrU#Un9azKtEALfz}qb=w%2s=Shtd5?u(s zG!ZH+9={bMP5ze0w4LCOx-9JcwF;^Xl*C0P9DNIi`s9epSwU_w z{Fdo7PGzahlI(f2FP&r~mb31_re)<1x%uU2zb}BeY7=^yrDz^*Wf<{s@1^rl&JY!q z2#~(LG+W~$YNTK_3UALRJY8rUfgRPQZV(Q)uw()rkvs=k;9$bVsWk!owiZu#cf+V` z`u2;nfSV|4)hWgE87fs>JB4l6Sk*EMF|(Q%)RB`@{uv$q$}K0QfZl14lO%UdI6cvR zfTkHNZ^Ya=uZLgwTO4tY2Am*!^TZdYlo4ii3E8Y;Ab{+g*vb^SS=J8HIhfxsqbon| z9f$qdG2nL0x|%TpgcU#Zq(B$*zQh_Rx0<3`dt)S&ZhIQ4Kxsvsp_-_yfe8N!jdy*` z-H$Z%sC0@4P09}7T55PpRRp#M$j$ol?vA16WfON#LJjy88~-%+hG->?-+(Nos&&Ue z#+&Z683VgfbZDi7&4$p8>EhXztTma5bugo2WRk}xzW^##;{^Fq<`)t1e(7%FiR zVNZ%8zZTEIKJvr>2Ys49058=#H3|k`(%KzVW`Ushoeal@#Ga20SU|Zr8O$t(Z;{|x zxE>GTUpVp*Vjc>bc_7J4^bhWxam0^`ol=o*e1iJv+WR|Ft=mKO%y6x{$d5)P1uK-k zxi+8xb7Lxs7kQCN7s3l+$5p7Br-935gYAy$aEJ{)lLFC^DlF7ZAEyXoesre5y}U4F zjDsb@qj6sQdHW#EqzwYoQL?;JPW;A#H(UM*sz3JyaW?Lv4bPOFLoGip0zx4$2$@3I zR0=#vc&4#bg@%2miLjQ(SQ8)D0aFJ!V)|5;NeafTPxzBT-u0`}07lm8; z+NiB)FPYs-(W0GQ;^xblsknLy8G8;_4ZJdaPkXdnt=1C#3c?HGF`{gJOp$Gg{GdIY z?-ed<4R|E7kq{@X#%p4nC7voBtm5YZT|F7hy3VkMF!A3kIM;POlZPu_-<`57))&x$2|86sFzLs(fx18l z6>u>n9x5TLOGbMPzw9b#`PAr8?qE=Rt(?jqe+9zOoU7ZW{>Uc+1v-_^l2pm;)k1$Y zs|7pq_=kd=6`p_L{(c$SAJQyFR=J=Qrak0p;7h<)iU&yaDJ{QudJ8KFcj%eG1(T znS->Oml$*oR)doM@J?gI>-_aymQbo@I^uaTIz9UP?l*Ly=1O#%db%3HHUBh1lgcoO71Ao%Tr^ z{l#i7r$4B(Cm=7^40o|$ID>D%K5*w0?|Rghk=aVl&SCp8xhE z7-W$vx-V$_M^EIb8KSzUxU(^`S~d97uLrV%Moqa#IRmRkfI?v5af+n9QjQIg(qFd= zkH$&qyuwoPKML&+W z!c|hIate3_ONo72vEmXorUoiGaC~t~fwJxTAH=;4fSvopMVlmRCC&|I=u3aVA7Pz_ z^Rjxhpkq)fb^%$FUsszJqN3q4oS>5A zwL?^-&fkZl{pEcS_dmjxN>{0XN`(HRzo{Iyfl5~B9B7ftwctOEe6%Nl8#d}&gmNyT zS=Q`MKI7ZOTe|?LfSx$ADIYdNZTZrl;7ONEf4O1ivFHcRRWEjUlU`~9c!}#Z|Iv2W zT{vZXqVji5VT_@5KNBj7fv#qEnr36moDVghh{rit4HY|_{CvSSC(BM_H*F&9h43eoWh-Hv6tHN9@P^Sv}XOa`OE zf=dn}(eflb%IRs!=Cp%lQUj^~*GF9j)V)fSm9PHZTNmPpM!me%VQ+9?q`(2QhK)zS8c9bm8SE7x zKaD^Ot|J(V#m!AXCbgHSWcqs`2kGm{WpaZkzeBpQd3+ms(4s#LX&&79bQc5s_AZGW zkf_ptBu9zjXfU-DI&KUc!7D*g?wp52czmdVmke62tX<7l(FKHfiDpQb}Eli61 zV5=aJ3D>fvLv{z|>PVZEI}oZeVH2pfQS#3x{^~ZcA%oU$$7;9aixON8$O^HtlcgTp zso>u)v0l$!r;+L3QemFb09vbDb^9zlMowHGP`{UW$2?$U#b$342LniSXt-+6b zk!)V@fiBvRblktD_v9Q&x&qbgFL#WY zn}(^z;g^H<23~5tPe1m8PK94|=cD$C(;Hz{CnDlP1r-#G96T&(5zSj3X~T4vMG|fY zvGg(OQ6U0+H72am%KzxiBr8CpfL$MvA_4so0%drgCyvlX>|J>c*Y}}EPiXh&M1-N< zDCV&8^4)nw;>Shw;oq-J^gLnkXFkV&)&v&f)V4wS$u}Mb=}Isr{g4(hzIYJ_2yn!Y z{w(a`E=E0TRVY13?#k*faI~n4N9))^Ac|AY0#cB3=o}4N2GU_iA4A63C6V#U5Z_=t z=G?K|dYi{x2Tok3TgD`#EQZp{Xga6fCuHM2T9w^wt+q6&bC75JN@aqnU~T{yzm0iy z?RIyO69y_00#vQLI;UAyTIic&OxNEk?^Tom=ZChtnY#75VkJ1`X4E!40$-(_ zxFXaCyh4y2Xm|4Uf+8jm>~U)%pne#4(9yi}5M%Z?6QkbU+T0gPSCEapz)w)BcGEL| zG`aW(?6Y(AygZ9V%)ywFG0B2lYO&?hzGOCr!}9baEwjd4z-U=FNkBkPAdUvs0pJc- zHC(01(xSXljQ2MZ#Y9qzfErX(Va2rdMW8z6haAkvt>m?*P?n&a5cZiG4=>M_(m^8H zgC@iWQvur;5bWXAt?LF>->$f#w=L9!)?0pk$-B-3O%~rRzDGCuJ<9Hsy)&2vUzKlO ziwq}?osgloe8~(jhd0uzII4--@4L=Pb_qUY4G$lqX8d>a; z)V-{ZDH>}&YV4h*!Jounx)ugQEfUJ&)SR8MqCYwtpdOXZx(~Okl@rg^MdBb)cDB4v zUHx~w8JOut7fyckwdh*@5Wm(!cBv_)0KsBL#FiKjJl4BW0kbc zMwljLJzQO9Dr=#Gl_T?Au>&X5K75@1jSZ}rw|^ammvotgSdC}nacJc#9T)USszVuo z^f~52=EQioZsyGk-cBmTvph{F{5i=P3wMy#qp3flza05T>N#0nxwvB@azIYzLxRtk zKKde1D8-O*{D*I;*db&QO%Vg;NUa`7wJz~jQe~C@EEGekZfT_PrOIo#P)!`tPMzFMoiTlebRFFD6)c~= z%IG~r3Y_7WP-x5N7uzuF_2#iDKj#<`LVC`XY=f_XgDq&g?Z)~8C+l}&Sb+P)pwI^1 zB3840qO#;W({A>n6oyvny}@6epIFi+hIeL%C2J2VLuotb1dx7ShitRocv$WmHd^DK z>y^?Ne8ksF70wB1F#}gttabzBSt)@3p$=3SU+HsyA=}K}J~z{~EvuJgYXcS3tVRaW z@uAuqKQou&t^wISX&ApsKaIpS&Nw1jBS9Z!Czxv|f00}I)}xc!7tr{0&q*_lD>l#v zyGJ|ub5wlOo(SM;H4e?Pc`Pwar+=?WBbW&OCF37M)XaQ@aMggBl!88V8n?R2FfvRi z&6klFk(ysFxvdOGR8h`P2PNKpF1Nx%T=tUaS&Mc;aC5yFA|7Ll|0d)v5saNzi}th$ zTl)0WzGTeD#BEsPuNcjbU<5m+^;_vVEMc^4R!16<*+NUFgLej=cKAdPbg6*_+CMpD z4I3eus&V|Qhi=qNR8g*R*G}NsO8nk3Rng3cF_oa#T5+J7_4@YooM(yM+~QOu3c%7K zO#L;T-=G5W0^!84fL#o-_o0}M8P$ol?}-Ywys|mU^P^RX;*X1cpwHI*so-kxW=@7D z{c#jV>I|UETW*m(+PkEtz2)(_5;>hioroy`J`V1e3o}6e4^MgZ#{0EtUMVovjAqUh z>1B?%WCfV0UO;YEEv_W<3NH+;EKmR?Jd{qe;(lMSJx#P#W(Z28s;o^YdK^dfqm)~# zP^ZZ>cT*m*5#{ZsGDPD&rXUH4xu>rSf@-FSl7nfA9MisUa;>;>nVpCrw=5?T1r6Z! zpZ?5Q)uCH5;C*H+7>#XyQMpO0NpRP?Eh8Nm^EpcF>v@ONG>BF!Re*TQwC4MrcT2?h zOivPd@a);!Z}Agfb1Bu{HF-Dh*=q9d#V*X&n;2^LfnlObLOaslis0no-xY&>{POemurTrQPb3#_nQn8!12$4>AjzriwP#X1Vso?f3ix>o=p1A8gqC=x&EvbB+_jL?Y z>!E?n@>6k{@T=X+(K^NU-9R;hp-VuTt^JRkQh?&qCX2S!)7vttCq7PBB4eGB;uDuO zOG1$KrJ`XzwfGb?^eX_FhRN3xkf~+esla=<6uf9BgzjS8o>rAVkQ5RvQ%j?R8!2y% zdFBdtcp}B>dcO^Jd$!{VK8E(`?QHt|&{Lq+6$mftYbsL@nc{t6s#E|YD?-YNu+dxz zjvMG&d>BSqV2pLcA5~`c;Nf2 zy*~ldLKu{DKmsv`@40t_`9@uo_2V(Afc{#yu~g^=+)@HyFl!i|^MimTr+d+V>125( z7`Xs8Gb>?h!V=kWOQMn4)=gL^b|Zm(%F>>4gb(A^DYYRNF&6fhkq{b{gsQcH9SA>}9e=FP=ref0d)a7D*ywy#HD5|#p3+%6zb^*C zc#CCAN`sUUR|{%LS*()aZwP^1Ye5CgO+gY?zZ)YAV+DU*!CJ$>0SEunYPAb*wwhmj zJph-9e#wbiJI=V9K_cLi#3M=am^}j~wFvjl1X_vZc5t2)YfWI^?I+UL&w^kY=|Ziv zwl$cZ&mpQoZgwB$PUf&=W0auc{3od^^(Oh z-l`+qz;`xf`%Cb(3QZ=!2FL|KR4G3w=eJ@~+Yb1{{J=8Z_ICk@5AEfE)uJJGz``~% z?lFHv{*G(IGG4x?5To_!Rb+gcgE$1&BSdKV8!;Gb^CnUpq7T|10`6mU2cAv~CHd*% zw^Y@^XpoZ78dCWmnDH94D+P;fnA6J&@b=Hl4{&yNI_ z{Qjd(|GltxGS0>3mMyK1g7K?wCHM1-x%KNey6FK(RqB&(Av3Tw{fp5sTfZY1?NUCz z&qFQ@vnaZmT3pu(0G@zG6svj6mASNTxudtm5gLl#h4@^BXnG7kDiIGCi&Y1KL6gCS z-$@{4ZwsElKn-Nh*UW4Sk9I1_pf%ErM(fzxT5-43G8K<9z4xueQFI9vgbZX3&CKwXG5KmOLM4-cN zLDSsU`Lpb*&^>5}i+{*)#n-+aR-m$^1f8fauwo>SRPQ`E|gx%9kOT; zN$7Iv%TL~ATz|7%n9mBqj|brV(Ag)bF`C_T4r{^~vf_LEy$S4qwE6U}gTc9EWNKfy z&%!2y)t`ikc~ke#?MXuRZ5KYnT)b90WO$GWhR1G-6U`h-{=hoT#FYuGn#t-3o0vcV znbYcaEe6)zzz8kPw_Tf$2z6BVw!$nmw!E*9HEPax4AR#0d^l-j+SZ9qEl27_F}=b^ zHePX~@@`hwS34TH4NC{oNmVPZxj=_Im&GY)cNBYb!BACCm>z>}mxae9v%mLLjo!-y ztHtWosy&&|wn5Rv4B`M-3s3Bl+^xo0;OE)%KgjU1%f>0X(oC^ z&uC|@YVpAXCh)4*=N7JN{d-gj_E%#_H+)y_qk=Hf<8Nm&4V&Us0*O z`dEbT2RkcV4ACA*NCDR{<$E9|!u$D{3#W#-w9bEd zhV4jUQepVm9{5Mc*?JzP__mMNpm;7nvlKvr9*P_u{5iLMblMF8P{rTHRXpaAAW6nk zAFU2~q$P^vGt&@#xroV;(%+B>Zwu6?b+wA`_Qpem54_ErB(OJt1#5Bg%#5l2#Z8)( z7lEB9MDaNTK8VqA!2zscYizA1@ishyEn{ah2D80c96Elf(G|wvgZMxLXv!?;DmyCDRa#oeK}ySux)JH=g!Lvf0`Lvg1RcXxMpFHp3&+xMeA z?|FO9J%73DTX$t;Ws-~}lRcBn^X%+V(!Jn5x;tpH&t+|68+!@wkg>K3--n3-GLGsZ z1U)^WlcxJ3S14&pcP-i}JqtZIjt{?hmLVJ+FpenBL?Yx&)dl`dV6Cj8mk}DG+)=q> z;nZD3aIw9x{I#a)N_*Ae8@r#dlV|$aAt&X+t%-f3ohQU{jehicVp>km6*zsot#38#=c;wPX$4LyJ5e?prS&nK zkC<8vT5L}W1tK7_XYv|aLD0<>D!O7DtIf_Nv?IkUZm+aszq*QNf*IYbve8TP5rHK;jeNn*aF7YMZT|lnQ&_b*EaRK}Umw|%^ zedWNvxM!r{Rn#3}=&t~#aZ;aH`L33Gifb7$nZq<=`W$j`EBG}|OIxMAH%?iQSbU=4 znS%zkU%2OzqlOHaI)ceqEOq*pz3N(h92k4Iyz{%+U9hg}zJYBZGBX{Iu%Z^a8G~IP z{rP9NXBD@E*`Kt)Sq<6=UFgO>w>z?>ONJa#5s`E~5PMnPO{f*qQJJDt?ueA5I^q!? zj3duN6xnL7$t6klN$txKu=V2}T+`F=m8ndrDUz=mQoBMw{h%HIUm&OPi zcoBH5LV1jztV?M(Xma7~BedO`X;%mXj}|>z6v);=RsiU%8}EaObm1`kn^F%R_J3Q zOC#(0B?GS84oL%m;YT0GVvE+W{iObr#J&6nVGZ(-ylcRuFRnp%`wDmmM=WPN!Y3gN z6}UUP`_L9^+Lrptj$-;m?9asVT$+{@bZY|hcYE0VC{Y(TcRdmYC-MfELTmNk@6aaf zE1WuPPRkSE%rixjeAKQsmDviKgm9%{fVt5~Og5VTS$(I_z z8;V`JzRt(CW%xYG-0M?=xth^xVtDeie%M;>Ma45i;czGOwt=lY7<6r|d7LHYs)MT9 z;L&y!>UYh}rwvP++%G`=90Gw26N?yPcSsiht&J8O)psUbV*3ClTF7b3GMd?4z?FPa zR2kAa)A2%CLc-}zf0_IMHa&fuW$=FOy&W&lwLV(GPH&tE`O>8Ve0y>u#2S90G7+i7 zLEEn53|@Qi1CbKJD6XD|S`yw}RzID1smAl#Dk*&WIqFaMx{kuTa#J1;q9p||>BD}4 z8>4$GG9v=?82TJxWo{Z0O+|${RC^QXD5=7a<7?n2kb^9z z5*SYEqLpk?4yMAaUz9~wW(tnmK3~DCX(4Dd&3y(|gg4aL2=&|%R=*W872>*&{u9a z#(u2UmIopx26uclgYJDC7x7n^nl?7M=k5(W z^1_uY?b<2}lhBfW{bYO7L9^|6uP14|DbhhjYhDc@cY6O^-&Qy6u3U>tZEp~l86u4RsvL~Rp z>}PkNDfP>INa~u#c6gZXgj3utHS-@*sxlUpRAU=?E9zVxr_kDP0s>wf32}Rdp8`W% z4z1Yf_t5xVov}4X8$S6oQvbYeFvZyBcBFFyvi9x0D;p5R%b$-mQVX%vqSxn39WmW` z%pzsT9dXR>@OHs0bDuiwxfSGP-i( zmhx(E;|of-P^CTfD)yYbP?$TO_$=mWg<`F`G%B~QKtv(wTCrUlOSL8G_f?|}OsJn+ zMTT6&5WsgW>h?Klk z3FEl9%?v{{M2efydq5;~Y^-rgW}SsN$j47=0BRQd-t5Nyj5ywKoH=e`1JCU-f zC3K-8d~z2W_r(@RChdag6N5vG-|3LErK!7a$_gYL)smOn(13O1{J~6Q0LkYHv}FQO zvGijdxGY5+wZ5m_!)o2miYcDcj=s@Pv$ey9T+H%~D1&3lDZ6_1X`)|@O4YeOlpIu_ z)scjLa$C~WgJ5DS^(eF8IQI9TAx`ZeVZV5iL8nBJsoRnNde` zZt=&)Z^%TT`5Vvxnv4dTF9DJ8JDVm0(#MvegSgM?m>Jnxr&T_D@dvZFVkF+KdA?N@ zub5xQ4c_lXA} zEr*aw_orl#Glw-{!tX19IMmG0IJ6YpE{r=RvNPFsEq7kB${IH%OhwAmj={ki$Wg|@J1iCnARw4C6P;#`g5*I-wzBz-ME5WC% z2AbtEPupb{^2)h>YZn@$D=~(rc;WGhcak0c93aID20V}h%SZTaX9hLg9YxOQ@pM(X zNS0M-43v$%2?_K%Pr9PXgMOqyMn0^s8$&@U6vCMQ2cs7~e zZpfH+6lgdWKa6f+cJ>XclAvy-W^LnWD^%K%P@4C5fR!qEH|*zzSXi&O+>lmp`(Wc& zLQqbivf@Hv-|%tpv=zO1?Yg2hFXsmaM0^y>QnOOB=1v6in)pmezCxQRotX+aaDXb- zf-y?PEi_7mVu7wV-VpY@ADQ*l=efMvyP+oNVK;S2LhEtdHR%XzH>CY^T10hXo#ij2 z=%GVpv`a+PwCNU=DtN_~WH$oi84jB#E#F@Hv##Xk={vFX7W1vVo;Z2y95t!9WA8{u zRfVX5j0RUMfTozSTGXyL2Ma zvg^n~RPOVm3>g!D5DUB^i616Usu9yOeSXZ}wiz0nBOSj;)}BX7j1zCW^5iyyDZT#( zk{IHx7pOa3W3IM`c8DY;W2;%Hk1hpY*7k*cWJJhu1@a_l> zq%^77BudU)?4^*(9XsTrkW-W|oDM7GdUo)>!Iw+Mu?{{uBn*P}%^*$jU-|>>$sQb{ zz5~H#^)7&@SnMyv>MN48k5{hfoo0WRat+tlbL&M%WShBdCMVOAA$|wgPPzcR$*;LNy_;B+qQ1^mzzj~HqIE#K!or7{owA^YBbS zvAkE8E8vTP8C;X(lmTt5d`Er|Jh*-}6@Hn>Pvq)ezeB+>@)i*Goz>T4u9Rs<8zJ{tVT%6nry|MzrtKuwwe z_|dGt`P*;I@qZB58JP)anE*3Uu>gT5{&B_t{#N-b>X>|kNyKr3WtZTt@! zI};ldBRl6msO*dkY`;Ph1RN}XaN1efnEuIWXJO|2i_^}=#P&C(osos<-ze?E<^~SR zCQcN4%582;6O@1Q)c>B%><^y$@A=IBpYhcHRNDII#A5&59A$qK(3uJTn6C`LMrZpq z)7t-AYB}4V_4SYG$9QW1G|OKl*P3l*SvluEie~ z6yuA9>mIKc-G5v>p#8SrwI&8)1;=TK*<-?CQbw#!8BHmY6?I)8qdUq72Q(*=U0E|Y z9JPzQBV!b8us{0oJ@sbY;FP%{Dxz(q#rOc;5T*T(+A;U%qr0M=yTHqj)J-=l_T2oJ zuf}>(2kCR$UBy{nHNk%VJgY~YyCyVeyt8%u@-u-H>V&(X14f7>Lq_ofMGA!#A5W39 zb9IJU1aMc0=c+|XVp!J`UjF8I{z`ZTjRu>BRIo0e;I`CZ6mG_+a7P$9!yCfyl{Vhs z0R8H57Tx>VjI_=n^@zmHlAI(S+fc-%Os?*uhD>p_H-`b*Dx%C!s1bjp zNF#~k88m+@I`)NuMNDQY!qW=GMt@?V|t7*oG>C>bijeL_a*1Ic{32v?oSes8CT zY;jcR9L3v%fKz(XhR+5o3GaXq@CDDz%D&Jko5A0>1(7!$)V4@F7^ zb-qZsbQEZW%Z8*b_pbViN{5W5@tse?KlJA2_r1f+$n8IL0eVi)sXAte8^W;*m~&nS zOlpzwc|7-_0$FG=(v9pvR>l6_vn+vKVNmV-J_Q-o5p*ij&DyhHMLb;dwANK!{_{zX zo}HWRG+vl4S^fBWt%{crC=N&`$+au4%w+Ba2GfS(1j`HvbB1apaqj?OK6>;Q3@EF8 zC{(9r)nlxK4m;I4_VJ-Jm$a`f_UHQjPlsZ`JGQ~!c3m#i`tWT8jA^QN<=GPw916dh z*LAGnr*0}bYA@ze_e*CN4Jmhi{=DJ=b9>%@>?fOMZr2iD<1XLQLUSna5cVES2ZuuG z_0|?+$>7p-TGqg+Np69z(vp61r!CuZwKyPTvwEk~UqeyzmZ~rz1pLw4UU4~jyeSBq zQ{L&J6UHZ2Oc-DDBc#{va15%22x8Uv*~}x3smB0KjBnJ8)dFf6^cW%CYf;G2wVBkq z4s%jxD2E!SD|}u#1q~5x+^FwrF=eOUJoMRvef2C4KEyzr&Z$Z>?6dn|nDT}}#)V{R zusx9cYxu+upjeJ@vkd&>PZ;;w06N(ThtfhXVZPKjJRG-HN>|V3SDWFJLDbl*SJnm8 zYkRrDkyiMQQB!UwXFY7?$Ye`2=@fQzW3L8Vs`C|T z%UO`s2NLNpv_|96^%{>eDJA zZIuraozt8AqDH!GadHEpa;*?b4K3zKFdyy3lyw}ez!=Wns7CT*>(srXt-p z?sLA#XmfGrWK$Z)1U8q)8FvfN1CK)ZT;vPIs?R50JQ0h)u4p#JEoJ-QiL;Ib%gA8G(bvXw zJ3kJWeYpoNynnn{?h)$eBD6y7e~+4+!t9G*^JqnHT7bGBA^S*WdNAXKu3sMj;fmB4 zY$@(nxs$fFlOg8}g?&WplH4=GVYtdFk$=e{J~Krt5o+TccMqLNHCmjGn)a+;9)dt} z6WK-St965Ryahy_f|e~^;BWyyr%9i!WmhVO=8Lrhw;oTUdNOgu^fia#L1?{f+-7Ui zR}!L5fxI@nj!$gC=5B}h{D(pjWJ5gnK~V?9>2o>Z9@f@P5Rf8nrk7Pcguld{IHv^T zwM7&+q}Slo&7w-TIpdTUJL~mgQDk#EfuWqZV8IFRa$B$gO^z2b4x7gFSp{KB+~+be zz4K~l;_IDeL;*4U49-dyNp8W!_~Yc+m>x@f%rpqN4`~<}NOj4R%rK&cTjy7n$N9AZ zH@jg_A7n~MmdMq>6`;_w<M3M5aPp;54BG-*M)+*iwG&(rFXRRk+~5nWBP%@ zjE=7lt=42pP;Ej%hzQm0O4L!um#ZU<(%w45zJXrj-wdf-P3_UNI%^XX`l14PpA+t^ zq-xo~pT(ct{|V+Jm+Ts%pinM1QsSX_5nIrcgHW^(@)NAC2JIW!8;P23-Cqdi6E!qcne5HpAD_b$SHNJ}t)E(9?m7^(O7+A|!d5=(j=?tM zf|GP`qitP}0rO_5f8^IYyxN$wF&U7(*_mNFeMr{OW6M6B4@lDCQ95yEj9vERMtt zj}D5mn4gDEuZsCI!HR>SXZ7rT_IajIZ~IAecd-v8YjAbkAf5&@J9_;)|B1YcFl45U zoWlyNo%%HdZ@PdYeDOu?QK~icE5kSAMFg*SRhHO+W_u%YH>Njp zTU|2~!9&9EYw39u7PR)dKUt%{>xpXU`V}8jmoR^fp}yfo%ZjwShv2sgOrT*tgW}e= zv{7hxJ(z*goQK$uoaU2GiQLg{R8RcgV}R+GzQ=5;+GC(x%?1Jj^)0Fm#`rQMh1%gb z&#y%iD~}(zvBk+;*^c!Q4*AQDD{*i0&%~NZEV2?c-g8uj z$uV-C(u*;0>`~-m?7xBgdtKv4i&;wA^W6+X z?W9LT!~2$g--VH>#W_g#?+sFKF%c{(MKyd?!g(^J&V33L11 zX*0p;2L~vz0SRMH34;%DPwB!7#Pu7UUn5reU}VN2x~HuYd=og4ZK}*}GVshBCu}sp ztkp`^I5^7eD%tyIO;$Efq~tG+>z-Ew$7Lv6&Wy9g2tjuwHeeuJ$HA@#emvl^^XFid zp`pZ9u^wpjp=GEnF=`-|U?P?4OrK!A2Jn$AYGQmw?w##*+I(zuxoHRI6%?Wi=OJLG zJ%Pz>t5(7-)2maVhY?K^ivpz#n+$=F6x#)>K+ZxS`1pNXpT$7E(f*Qi`|8VAM^QJ1Z&!7qGpYyc-%;>^VBJcu1UzvHFv9xqo5aaC zPpTk1_@Mk~uQhAky%^7}h=sRhZ4B^5aR%pF74#jEe7WspW00c|k@J%4!nJ3zZYa|d zRE+-?CC|}#MYMv~T#`~cFvHVMUr*nqZbDSknZp+?<>6RaghY)(kv`rX0)PKW+k)t+ ze7ssRDSaA92@}hMQ)F%kqX9GosZHoT7X9^c9M*<3TVYOErzEaM=hP|w_6}QctdY`2 zv?bJtt;%xkqUE{Nin%aS;(P^x=Bo1)Vev_QTBJ$_DFo*xF2@(3@B$Ulcd2{_C~mZM z+3V+vZnCb9=;14lujy^8o0xN2<$@E{_%ehSkT0S=28m{-Unj?A46e`-5zque;4|bo zw`?w>Pdav#w5?+lap|eIGd!f{lks(PRby07py7a=__guM`lXfx9Z(! z)gCB$KybQQ(Z3q45@S!siCME3UAhB-p!x1;QxR9=kwC;&J|*hr)&to@MNp=hiFhtL|Mp3VC ztb0Uwf`CgDv#{c8AS9SU^3qmsxhj7AKAT>{p4~FR4|~fw2i+xQaQH=sZ=W3d=mVsy zi3#q4{*yWEm#O97%whDRwgB^?g{>LAx`nNvt)s<1_k|1`P2TK0zvUWaRRBgu2S=wj zL)4pGgN(sH!i;PHgV$fSM+aw}f5+hfl=Lee;N0J-{+R+0 z`z_4L@}{Ej=kj(D{-Z`-$${yP44?Cl;|0qOo39}s?9-j2Pk z|9=*MG{*mwoSm6n_YZ^EuV?dbsQCNY{SwIdZ4zZ;V+E*fFtGyUAei1XJs8;jFpB=t z^mqfwzv_8#aQtEV{4eA@I2l;~HhnTNGX9(C^9@V?Q1b{1Ql$p^zmxI!Wu5%DyZc{Y zUd6)3#8J+~RmslAz*a$-_P4;uf87WG+7$nDBlxYm@mC`N*p~lwd4t8<`upgwh5(53 z3nc#l#$N#WueSf1-y86MtpFIm0sXK2zZ%EiWxWCPccXcW!|*HSuQC8o|10HN-oK&$ zS1G@t`q#Cv02<0$_-*^=HNS=bKKhp1Un&0DGIMYeysdwwdduN=gM179Roee<`;R*O z7kt0n+rJ^;KjNE(lj9$nHH=JvSsxgf{?x4buL1E3@SGg~u==wz(y_AuRBZk<`LnUI z{nO;n@Rz}#gOl-3)U*8y>S+ODH-F$B{V3i90z=2PMuooNF0|F<|FQ|ZRpP%@z~4(@~od&@V6$ zDCyFx*s0oDyg8!?7}jsVFZNn2ApfGJgq*pRAvj8~3+$l81AfwtT0XJc9 zZ*5}prWpj#`T14o-!K5YqJDdTMAYAUwm*e{ex3NY>iaw4@5cmiA~6AO`uAJz?J9ru zm<#|9(i@T(0lp+armTN-m;YYFzq?JAe}L#u4Wxep<}HUm5%b@u99ZEnQ(gV)@`BdN9_V2oROXN>;3OTx#Hfw9k zf|{f^?zmy=szWKF@Y*a{?5&EF4YS;}YX2WH`9C}|Oswnx{QsXmPB{W*dcil(r!Bzm z38)Jf3nLRHaiPDRofMTYD}E6{=8d3iw@M7?DGs*0N41aYw^+Nu#Lh?`Um3bB2D#mm zCQyo5FSz$RTz54JRbT|bKFT${dNq9lD;JV!F;M3z2W8eOzWKW0GC3o>atw*eG2%yS z4Ax!*O+#MZ!VSISWdE-8vuM}WhQ7Ixv7#dL5)6j!7ik^XJAtB^F##mfexw*F18Yv; z87RK`M1(Y@MbE*fB+<=yL#7yHP9W!xMd-_0D*35Bc7{;E7!h7Db?Y=YBV!YllNmje z2nm#2VmK91!)-jGt}0IHDU|AwIH!U+`dCbm5Cj6J){w)k1&-5;ck{{U z+!?0V&qj$a2hO!_2fZ9$3OAMwX*DULQ(uVnj_EoJEyAD6p|&mOk8Q+t_mjwF_%)f$ zkx^F>79coOnc`g_I~{G1(_+Kh7xwr{Mx+Tv`GKsPODVi=Is>(+N6dypPFjXwMrkI% zGh7}qe^%s3NjRAgxw7KLnTg*Eotx--_&AhG=r9MO=u;xbQu;~v)b z+^toO>!XVTPN)>lb-kw&B_(O>hA7$T(O_WkRN-}?e{f|iKg@((`${GbcwqJ_R!%W-!Uyt-%9 zO^nb{a(*J?93s%WkL#VHE%KFb&prM@Z}GOJZ~@#D)>%PL`Vxtc)MBr8dVEKa0dbXD*y{+!ysA>Q9m54qSy& zQ*a?{7?!{FOHDOo8L>R5gjDs(7#&3FGhjK4bfVjDk|@4MrZz6CmEr@|Vp)E$?+J|E z@Y(I@pUH3NuSrJ5U#LD~fZ6h3u@ri$O}lA)S~NJePx;L6ZII^DNY|0g_P`d-IMuk) zpMCeq7r8s`R&1Sc5=j@YZfWHKZnXmUI<#d#w9$??k_@FObc7@bbOQ$?;4CM8Olvnt zPIy4;;;ymzhUr{mm0;!R=~e#Jb_&w0JMh|+{z_eU%;$@%a&oWu_1TRxMsy}*p#P;kc+eEnAn$itGWUcrn^(?B|p1T zO3=bNe5S#t^J3zXtqTC2g?@BE?DZ8*02MHy!iKkOzr~GnZS<98`D~GK#@R?|TDvPB z9WnZFi3+b*Avo4<+NV^Vk0%`ILgY#OS8>f5lkDS zqd^tv`vqJ>++riHob5|Id3spME2e+4y8imwmKL5c6Vz?_LuL>RtOR`RuB%|7NE9m$ zP-E8oRvC<>rW*eH1rDCnT~g2Q5uCj`y;?MEN@LO>?nR&&KFtontOZ+o<+1?#b8Y7QR2 zx}%oiw26Z6KUtYB0u2Y;Ep+dq@OvKV+c>ZVdYztd!yb^`W3~B*Rw?aygtRkR71;Jw z1~$CxtRd+tlKGzBA%eh=M%b=#VT?Drb+x<$i}ZjMRsgOZs+C+DEQ9tL^eHhy2J$4B zu!@1Jr~|35*5kJpq8Ga-zc@qaUU!Ki_jFL)^6L?5i8fLz&D_WhFCrqAF!wwQLqO-f z&VGJW`>>7v@T6}I8N=y% z>tqByI(a(2UE}uY^zQQ@Po#(Cu6%4PgYGVaF&x@EX~P*kc+k|t*;N{LD(F4L@St}D z=TPv6xHZypyDj$C=HHo`!4eXSpbMMi=Hlp0#<#nH;1me`9?Om5EUPN(n4YB?j;@3A zoxJmoX7wS@cQ|#<{IAJOPPAuxyea3$9Kah<(L&mp6T0K~)Rd1HhrqTU7);2OrHX{{ zAoeOPY~I&`+t=EXq<(AJ#@ZsG&FTaM1;XiHGKVif>uR}@MZhUO#t!GkJb^K_Wls;w z`?yJ91<#CFESAx;`K?lZy^2qToQx2hW1PR7fXNY5Hna#X&;PdlZLsz8s<-Eorg8}g z`VcRz;v#-nAKagol6&YbyWY! z2*&<4ko^70DnT##djKM6Yis8O7%&()X)`mi&@r%bastMJEDRiU>}<^J04Y-zHYPeY zR#tWfMgkTlMmkPr2EYhMmtM&3ZP=mxYiJ7CQw9t~)B*aVzXmnG&jG%el>vi|zXnh; z7PeOOf^VXzZzCqa*S>?Zk&}Xf!`qgvbyJDZFr-r7~& z&t_PcnvalSv0S_*UGundVN-L#@IVqVt|{1|LSX()e73hiXramNPFzN~wlQHz`6dVs zG^~a%Q5Z<_Rj^-r*IU6>1y7%YO^OO6O}Y3y*mtSkjSkb}qoT8b>#@St6O`!~uy#N$ zKnuBvTdic9DtR*Xr`++cn}V(LvDf0O4+ow~fvXapKf(n|4g%Ao%K8f0J3Dzv(7m$b z*9whYN2nrNZ_J$PGWcX0k{GC0KAC|M4K~L1g8S0*C|zscvlS9!4pEdab3Sf=e)oe% zBAHEF;<47V&4xeCs^c5~b3S+r5>7*`4g|z#GkLIUm@dSSSvle-zLCORF)p;|xkB|x z+jK%$em}RKihC89FB#v~bH$j&O^Ggtm^(apX!D!4EuN?<__~bIBiT~u@9FE4xOR|wENll<=RN~v2Y{hT^UMv zaRF@`1`_bda<0!b+WGK?7~+B>6DgQcm^2>=EfsW-7gjLUA)}e5aiW2UB9$Gnp0D?})e^sNB-#vnk|7EQil+#Q&LfDj zoxBg=@jyq346LOI{hYbfTC7*_#B|;{)RN>Vqu3}m2`a{U^JB0Eo%-e)ylVnK=0RHo z*A{&IdBPaCBl2ZtK-@x(6{n=LEfmP_m5zIfyw&2)?M5S=`YFoFs$HZmj(kxsG+Z7P zvn?dMf-44I1~01q86J8-J~oBgUx*Cv2LTj23_`ejFLn_(50eo*R-gaRUa|UA+*Z`d zM}$jM-=ANB-*-Z&*jf7F$j*zI?WnV54tBa>7fx-XkGD@&ndu^cvaV@#0V|vyu>7FJ z=+0;?Wr6~;uVu>I&tYNgz#hGV2gUk9*abqVbeI(cWyes}0dqijLxjZk*%jJr!G9Oa>@bqGXM_=^!dDV+I8cpo#2N0L7 z6G-kj`B`XHf&lYEi&Qa3XUviNT;!I)s`K7euthes7)@tzdEn$dO57l>+D8Z@7dZyW zoN2D0JMbUAG8i03+-RHK&ubnMneJxw*;h*Klh8-Bc`qhu+ssa7B^2i0nWg(#qm9%{ zR@c0?FHnQyyb2gurk0rGx>@IFuH6?7kvKc&H6mj)KG!o&PO6#>t;!1}Gb=x*aOFV= z3wJ*e!Ml=_JSGNrs%pWXIRkBhe6>n9NrY4YgYb$vGe?TBnCg>{m)I#)|3p{ZDFXpL zI2yyU;>Mttwj#}}*z$bE0w!VYns;h1IN}@1J`gw5RGm%aTv!B7re_LP9T*LUuVkA1 zv=3Jnk4^vTaaT!~Cfd?%&8CWiK1W;bNIGfGxej)nd68()hzdp%4aF?okeRLN6a#U^ z7L&MA&kuW`@Ys#8xhTD8hO0Cl?cnRSM^zFoE=j3we3L&M{ctz%Jib>5MUT(wQg*jp zt)z=!`bE(XjkU#6eNnbQss0|jWwU+>YyWi^bZTHgJwib96Z4%`-WFHh0Opya94Oz) zU8^7N>TFS*!j84S>7`sB8aegZm(?dZo0FeLqvt_7xHTNS@D%iNWABBW&0;6^de1-& z$Vo*=T3Z;u=M6mPnweLK3x2XePTIurvavdsJ;zlw*>SnKB>!?eFSW5hQlu7;F>{u7 z{EBUVpp= z8w!?sVLLWwc-uS*XQ#E+lN~@aT##s6cI#r3Ctt%qP?r6W%h0k_ht-&YpVxqzcs0#L zCcJEV(d*ej606{tbhqIHzA%6OHwT%CR1Fy2Z(oZszv)#~Ml(Ue2f(&vj)it}*Q8Fx zhD{FY{RpO1%HL?LaBGDyh3_Pvr?iwg33@H;PU_!=LRKjzS=16DxQ;EuO{G72nKvov zLq@?ufcREu+wHA7gyp5F5k7@>S19QHg$m7vG2RV7(&eJ?i0 zWO79w4|E4S$-UgFul8LfuXK1ZC8aaz$4`$l{W78gSHs7ERvQPc&L5}tcWZ(jkBZtR z!`{#&U$rIUQ=woZS>K5;O<_om@tUr1inY|Y=#W-!Zij$_cjZrQy03-FHwmxoFZW7Y zh_6uy`vSce8a~H@Z8?J2789*uu1Bq)UM21V#o$eog()^3{pcBF+d6nDq*f~-PjvT@ z@6)=LpEB2I-~sopyFdWZ9PzmAoN4-b|5 zDDFx}lt|2**Yds=j49&}EK;8c9f7=kXtW6AcdO|-E$F15f;8cUjP6+%i=ug3RHP?+ zaFBa+HI|{k+{P5W=)YeaR!P*r8T#^{g^vyl>HV?<_$CrM zCN(-qDT5yBkhZE*nw{GeCq9UdhZ9vZd(vwhXA?9Dy!Y3v^^MXYt0$#AFRA6tXxFpR zWUD^h%@O=ST1+<}h*2!?3I*Hfy!k3ewxE^dV?jPbw*E8-`A$e96kL_h*lX(q zG0~I=nN~HF^j!Gyj`k_pN$a|w%@C(6y_PC63*^L0rx0ruhik*WBu1}zls=f>jpfFj zBkArN{q+(=SbEYfPnT4Dfui2l(o&BxBERv39asV z#f%%cNz6cZ8f@;DCywZ!sXs+JGTj%B&GGjI)xrz5)0=itWWIpVW!4hgGc$?DuztL6 zZlT#l?I`Wh2@n?AX*f}V)Us0(Bp0wjZc@PpmCNJzOb%M~PeMjXSL?sy4!41X@6XUN zfa2uvY)Sz+rZ|Ym`X>8s4bSf^WdGb``N}h2wfayHER|fA>_;0(29MNe?>y=7+AxxH z!`F1^Q-i)O90fafp{n|!ec>GRXMQIedBo;$Nd%~O*M8gv@Tj^IaacL)4jQthMi1vj z4~oHAEV_>-(?8;OixQHF!*?({JqY2-=5Rl18S3a}Gln$|wS<%V!iurmkQn^{SnYv*-q@ z)S}RkY1>Cf^3FKwFA6TA91p;Xfi50i0_lI|r(pQ$E*41Wg;}f^1ZEEGTN1P?83YQfc?#daQ8OBF|58ym&=l%=6EhJ~*(NdmfoBd~m#%U8U` z*_{|86dLSoJH^*;-$xc2MabZ?-(gwxs05?S==Fpe5^W2*xIAIHmt?67&FR{$N_|f` zr6a|U-ZMR|sD?Kri^`ql<*?hTOi7%K~i+eVC5=g7py>j&HL9R>Fv z&aWzjb!-IOkRq<^hr)CS49ciA6*~y^s{~N_oIWP$HWX>vlN+9LcHD=LOxsUOrh0}0 zfh_KBFw!?UCokp4F|^2l!&wP<77{^ALkltC$;ghs6Jvf=mFRoa)jwbxL=sU^#+~Aq z#K|d*4HtF?XeMKQv$d53DH*5VzpJHZB>byIv}WE(2hMOQMI|wyzYXVu#vMr zrMb>dEVhY8Aw?OnuQgYNF(1Y&4?ZebpZLD4R#|?d2@AzTod$MRYj#*Z?E6F^KKSFk zET-8pBsVKD!)H6RXAR$;&6&bU?Ire6m`L1{z7Oq)6=xTt+I!8_IEX`3T_u?aHv0N(R{v&wRprFh#u=^KLnlKXWLJ;4}Osb)SG^)c# zUrpc3xYccZJSI?&7|wwxjP&{$7^FRk^=gDeDb+=bDdS*i@C^Z*w}_{owwD&P#1z_> zgH=we6M7CK#c5LVk`POk(2WK43Cw?euNJ||ER!hAM8{vB5?mfWPNn#JUROBX7iX7E z9pw+g5JpZ5kWd05Go0J6g>lo;BiMp)YYNSKX%ZfpOtD+2W^{Z>&&uhdP)Wh{&wDRi z`XnGIAo8#)fvlOAM6YZLZ~cb($a1cJ3^qK<>nWJhes*{%H>uQ(L3hXa*Xq3C&CRD zbtpV&zgNRUx#UJv6l-+Xypy;8G4r_=esbNq2ql>;_|sAp<8=qC<)Z|J%6t1-n>f(n&{0g2iA@kX@Z)jyQjIi zGH;i<)5-IYr9QDY(w*;6ifg2{l@rBu-iN#FKxoIGQfYn~V*ZY8kdK&^y>W>84eG0R zfHHBQ2)G8G?EnN9_d-}I7dlvgG$9}JKHhzO-+;jvns&&tLVxV0>8+T;>|8hK!&UK5 z>mKwZ0?{rr*}c=FSfa5BoHnvQo^o{+)Thj|zH8{+WtEDlw&iG_f{cw)YnaK+Vkqfpta! z15-(d)*pmPUTH2ksfN&CahI{=Rbqps!BRKqnXl77#&7LO>b`k#3MK2?1$I z3F(p!X%K1fS=d!})$6+N@9%y+e<bJ85<zNdc>_J?$TwBlJ1-{l6pd~u{4Vw<7%>l zvFzpK(~-Y`?MLrmy^QQCO6Qsw_(W(^Sj8FZ)Y|@yqi0mddrTF$Apd4{3E3XN-bUeb z{Sch3EmQ6fAK?PIhy~&v%PJ?!do6Y4;;0Ed3YC*$J(+xBa718lIFUjuhftd8FBym< zFh(F>=pR~KT)GhVh4$fIkmISs=+G7#i|3cPYwvZ!UDB}D#mE}t@3AoCR0^W*hxR&D zb4ARNw1htDs?(iM6D%*sww)afQR+A*76;9tG zASFdy?$*4HnJBxllzs&2R-D~a5uf~~tJJlT>(9AJd8{Y1mXGm2G504w4kYV3{lS$f zilvg%Osvh@^Ljh*jnp?+o$?*UA2bA`Ngf9n^3NX#D=D+}ntG-Uxjrj)9jJMbae`r> zp>cxmFI98jOJm{AEMjF0@{8{Wd$EjM86ikgP4W^})hWn2I$I~-I4z`Ir8FCMIdyc> zpX3Fcm1j72jr6A2O{W{-AV2BW2l^DLcNWzZQ#@4G|F*G*Bq~?`u1o6GK@i$pb4LtC zq+03;R&2OaQb{MPz4_2}w5kq_#pJOuLAfdbxO|rkL2oJqh^xFd~_jgrenq< zZifUjtHadIQe!^WS7O9gXnMl87-p{-YsM!9SA?d%xQQ=Try9iN9}6 ztma&~l}+ku=#lYdqOi6(-%U?CS;poQ;LzLt=s-OkFs2QEpX81@Jq7+Qo3fijN<+pO z3p)ztY3;+3CzS&Uf_B(8FU<~L5HAgfA;j)4X;g%vH7ac@h`IJ)<2tes_8>3EwU@VY z8)>R{-)~}g<^9&YO)kH@xw+BjR%XaGfrk~s*b+3lflv1D)lnLvHRd;Ql==0h?;pe@nSi-`^fiPvO==m z8b@ZTm*S@5hcZJ;^rv&Kmt6Pmn>-6Y>rQCq&E>G7`0#}Sy^NvyD)-{Xm3AX8ag9@& zdjhQD3KSj63~uI0zfq>xnGoYK`EK7B?l6ke-C_9#xDrowu^end`Z z_i@ZhjPeb@Z3MAU&!`%1GeeJH+i64e^0|C}&rI!yKhPqP_A{Bu)Ja>F;cj>cKk&up zXJ4L7#T;mfqn*1c+7MbEy=>%^@_>MT`h(N6ZhH{(lx6knAWK^GZX7k=*Q=|Wv@N|j7BbCSR5lXy z$b8nmc-)zvz48ZzG?7;*EYsy4=AU%svh8f#95;S4CyW=Z)||e+kTZ!=a3@xh!YkW8 z*7P)bj!p(yiuTU4N-HKCUuprXk*ASQ1}!xFXo#zjl&P+Bj%fJ2MiAtGs~Jpv&0jN{ zG;f#8T>Ef0?$b(y&|+r@jf0=aAytKa7j{(4$7aUQZU&{QPaSYb>$G0WZcxi)ZALeY zm4$RWf0y~z7vc?vsVj~ojPJjx)>l~YBbJi)>GRKihFqY-YLs8@P72*~y9&FP@#&w!~k{FZkFkrS~RD=1%CWW7b-< zL`rcQU2`*4ZS;VVgigT6^gb8-1ENhI*F@sI*$ci%tR$@0QLe8@CV z8^WODz}6WZ@YVZ~=13PS!RH#Zulq>!QX#6c%`2o?>FRog87VJM*|yB`!coR34Ex!& z5}8!)W+UsrH}~XhPgKAO(j2empd7^ej0v}hznAZL>*@Z@9@m4)>=SPFsZs|uP6Q$9 zTw*2Px)~L7cIwGI4@Qy6#A|YaPHp~2!*HAEcFwocds{wNbtEdhQ;*lQLWMW&I)qas zC$(e26VMZQe}L1P63bg;+$JNe@*?02NXtl=WX;6n4flE;m2YUzHXXW<*)Wo7Dl^<0^J z7jIyTwDyFPsoWcMy7Z_A*nj!XWijX9(wAKPd~BdZAP4AzKyCpJHXaV{^U`-7E&v-Z zH-MKPl)mKPW;@Sg{x8`}{_}+AZ`n)eBNq5BYd!yl5p*pi8$Spl=Q%JwHcl??b6h;U zY}^6>UV-ypIoP-aI5-8k{)Y@J|2cnt!^i_wxp+~a3X@^w0$n!wXU*YdO7*BK4T*fJ z%ebGHH2Xm)Q#io6^C=SDhgYZCvhKG7-ybQxr^>5h$Nv6tX8S=dLsje9 zmx755PR;Gr7YNhY&JUy$kc4Kw*Ep6U2h&z=4wmhvyM9R{*HIWop^&4CAoH;y8qfSz z*j#>d-Pv&Tv8M&eSNxc?uW#koM?YYc@g?v^CSOr%wm=SI+-JCvg{#$ro9_oC>vPBO zF3Ns7UOrji-Jhg@{MMZ+woRJ{u}-<=dU(2*HG)8yQITp*DHrOCM|csO}}rpdYa0c>2HpfowC>h=FQ zP0sfhCh|cu@v{8%Zy-6j1lYKF&n1n5n+KG&=Ldm2?_S_zo;32ImJ0{RgO=T%7*}R&Ztef7y2e>NtUPru^*Bfd2Wj3*)kP1pE%TU*r7$i+&N% zPw+dSW+zZ*2lzAmkl(;PCck%+{Cx7ypFc;1?khPT_2PX{UkbRd1l%8UZsRT*tRQ_d z;8B0|lw34y{pu)z;nbz2`o*c=YWu;xPXJKw94j}-XmD}@K$jYWbP7~4Kjc1R7>&m;Z*jK9796aDX>f~M5}Kfi-#@^8-ueF8?K zT)HH`i;I(jl^0}odAZMfDY>8znEPGGz%7+On}a}S!(HBx4&b}IAstki_-h$~ zY}omz=XHgk3(`4Yn#*7=NSBfyn6Zh6pC*@)`A-W7_I~sWW&WEU`7ag_=Gcc>?cP{^qmAhW;GvXCQxpmN|j*?_D}oMd@pSIlU(>KwzoIh<0~DbwoDe zy%(k*jul=NP|UBMm51o}|LIkMHeS#V0bsXIp=tAN8FL7E*0;nTAzL?TSwvR*AZ6U= zb_u5eTGLj}|K%ZRcJ*#tmGZi2om zz|Y15q9i}h|FE~Y5dYu!%?;hbDRAlXoX1%J8G%T#^(0xSZfV6@p^lEPk?&0C#vs{F zkaxWYT9dn1A&x!yi)ddu43Ls+E`Cm)zeEgRH5b%LtS6v~N4+ZahXyQ##&I{|9Y+;? zSgQlbmNFis+plh z8P|v7b?<4~Ic$FTkZ%8?7DGaEd;G|39e$H?C}0NjlP)G{@f~F0Hg{}(EA&Jz9VH^= zR&$*}IAu6@wl|W50B?a|(ZE8Zfy^H@$3;sGUh$H}=v}>4lR3G!+r1n7P2pR%#F}3N;!^Mp{hOw$ayVJ9w{}Yz z8Uv2>f*v>S-`{TR@!ovyD1K<0yU-Dt7>zHw)_q3y>VJ) z?l1AqA#dca*%Yd)c)yyHTc$Bl752_TsjIZU;kVVvqPo?TeZ>?tZ3da?x;y&%)xrcS zhvX(~3zA-fOw|>wWguLPYSG>B$>)jkpS{qgxQ|R7HSwtf+dD&MUJyDazOr=7{gN+w z!cIdmK|9IfNn*uF+&d?}u-V{ycKc2~LYckIfa3ZLy~@HZ#U?%ab|aBE^!}8aO*TK8 z6}h`xSb5K$?~dL>`k1yvDqeVIU_eeeDXtW>3G*&`yM{? z8yQ=#Zx}aXAI?yh>_iK4Pv=owO?u7u+{%G}&>^fIr=v6V+?&@2Tj^dr zaqVu3*3lEgSxlUU+%BE$U8PBR+{29T!#k1$7R1a>W|+E(jZw3Cc&BJOTj&p{r>{m+ z*?Z63?+x&?3Yv80pgN)tC_^+6?(r1K4#~dqNmbuJ1wDA?kx3S20xMPzvr(iBrla^* zN1|YdAF+htiPb+&9{AB0*>^Y0#WVIDmnQ^qjt7c1)tMqq&LWpS0=9oFM5}tRREjCm zwA0>JKp@G^yT^>(HdAs!;a%2N&sMcVd7i#SJ>oe0EasPQ zdLpGoTVZH0C}&ZfP){m>vdVOV1iXP-Hg8izgN#w58B*sX)@HqS5<%6ju218m^Md^i z0y#dOXl~wu1kIsi=(tk z=XzD4ln#8OXi_ z|K2>$5%ubdWH<{yv$!RNS)v-|t%cYG@~#x*&O8Nk6ECre9gA=BLY+=aBaKrrMq#X@ z$uv~#s^XFA4J5T${7H2sY7wkVcY>M*(z3ME7hhvahoJL#xECXz-IeVtcPEjznd~d! z?1)0_r+!cwiOFoE5%Z&ro?neZEb0@XOeto9*%cytJmhC%6)(Qj+MQ}uAc);46`M_+ z#XRYDG;n{^oJ!h^L$tZ9e%jp^sO6)q&K_cXZ6oCCu+uDIeiR%l@l^_kEP*HP@20JG zwx_O(l)Z1-G(o8*kOK^F>+}`8SH*7d{b+kI=Mw)|&CbzWDNIqaEc8ss3#&;aSqa?? z*FnrK@PSLBM)z|iRq@ihTctICP{)#K_vRa$fo&*9KeWiRU1xRfjMOLUzVb(+`Y@g4 zs9%kCcJ;NuaYD-t9lo$Bp*oD_id+MnG6EOqflZGS>#Qm{ZWQXc>cS4l!hg7b_e`LWWp^n|@kOThs%Xn5TggL!wJ!e?Pdud`dnfky%nj*fQ`&MB*GMXZgiJ9A zjf$_@zemqxNq$Db&y_P1#Y4=KtuBMbW?J}3ilma*qu}gaPOI61ZVCMRywQX%L=o+f z^0@_jBjs)54>Y;`+WwK=pbI3d5ub@rasuDr2Q1EtecL+oqAnKF6T70kw>d!{qZ#LY zztbXcdPi1o@!3}N?G6#rqV=T+W8m%`@5&Bc%i`;R3fpPneEJ*?MJ0lf(4GLsuPwJ`3T{`Zy3ku2yX^HjSN7_0~Rjy2*_qJ5kzg4_Av?5*>sGxu= z!DTe1Hn-$ET$C`lH88j~VHF&q7Y85n9dzAecOUB&l)mzM9)Z!T$^?7zQ+z*eK9{V6 zb1^T`{DLfdID#_C!GKygUiLPVMorudYh*4h{`$yQ`VFlyz-oAptszpR!Jg&fCU!mD za^#WK^qZ%oc<$OqSM;1+?OIWn?~2(t$x1A30Mh^|f#Vkb>Ce^lb(z!(bb41JP{i_g02y{$~u|$s6nP*?l&&ZhVA;bW=JnR zap%kM1d2eSZ^1AL=ultEcl3bM?wm)-uOg2K%8*&gP&9pu<|BqV@2=i;ZeW66Z*pB_xi=d1}4pmOealjq-=zHa@{705EW7ktEW1mG`pUF0%ur*EE z?cB=aAbq~Ot!(O;R*guYOxf_9eSax+YO-sEo}0vqpQi7lq)&YoqSw0wgW9~xi8jWz zcsiYoVnMDWI>jut1g|;Aar0jFl9BdeT&;d4?BzkEPowrPPQ;m;v%b}3zZU*1hD;#B z5RV&vs_C~Q#QOP3voz7l>gib6vff(>#Rb>qgM|1l@sx?x5D`jzclRe^-(K2?zU3V( zNB8wIEV&V1J?3LVh(jt+@!u!{n5E0#u_g@oYJoc!c(YGS<7PdG|t{>Za zvNp|3c*Gt#&(fx1m(6XzIA5KrxfU}GckAYN%$}=(8;J9g5_XUP{=h8&>ZjLkdRBwP<~yIo<&jZm$~98CK1-AZ zF5zU_x!>kDm@2$UrB9rhvn+n|B}sFUY|?hvPDt!RjYA!+y8h(;M)~yaLzJ+6u^7@Y z4rKJyExET>hFwx;(C*fIQ}Cz;4zb6?Rs`|1qi7xKX*y?o*?0M|To}OLb&A~Y@>pZ5 zcU-wh>AGem2N_vTzP4SlpJvgk44)@;Kr$keyl)ca-Idwj+Qb-+|=E4o?KBZ9TUBzej z{qD`QnMoC6&8B5S=_=@Vk8tt3wY>I=mA@sKE_U(1#SnfAmO#$u2ki~d_xrz&R$&F5 zKy`6EKQHJPe%PZ`ev2@GqbC5!(JBB?z#MdJj5G!47pO1_^r8HqllaBJp%Y#%fy*!o zDDeAR80F`o{DRLhLZeg!im|v4zSpsPB}xJ%pX?djZuh16*Tx>8e zqXNT=@mu_uoG&NNo_FM-K8~Y3sh?CAk3UWuVs{9<6XL!*hxo^)2efhfwYxjtIa$a0 z8!z9@72LUP;I{7*Ym{Uqg03;2+i9eX{oXF=H2;mU|Gd4kqIAJy0-qd&zdY_T#_+d| zH#aE%1>gj=-U?8F_J%*Vv;dCtBpm<%N*D8if(HNVmKHpx-?xigm$@*|>1HsKMtZp5 z*VI7Oxs4+0=u3ZJl5~HuG_$#6tgOTFt5W%~lD@L*R|1a}P=kG(m`rEfJj{CbfckE{t3ifH|IV#w9{(J>J z#`*6*^H@K}JO6o}2f6@r{sHh8E)FjP9isMsKe`MS0wnzf73SmOxD2)YUwHP{>q`E5 zlp}QF^RH1?Q0fad>IwtzGRgu9V1okBe4s${`8emv?2GT6pBV{yaS^(Omc`4+3iykh z?2wlD^TgBnfFPUT@DNl?aPdO(ffnc|NEJ|6Ke4m~<)px4fKME|IF}NX8w7t(-pC0w zASbwrK-J8_(uhHuMVl74Q}i~=_wEI>wuc1uG-HN7m>c-W2EjOkUwLA!Z#_|M7KPHI zV7y>G3W3M>cYHkHoG=(4FDNPngAWw*Jf8}L2H+Qpc1DgMeCM23W(VW5w6U7)d+?;9 zhw|Q#%17eKgpv(~Mz#+^h$<)8Z(8@~9q&-@l>!-;#$Hwd4s)%78ueZ@!~|d>=O7Yt z&4zS)7{fq69|i_G?Jc_88iW*=lQXjywE*84(QH+{>AP}T#d>7BOmSZs&6t_5w+*Dyih zx{=;?YnOqHoG%lc)9KCyuVQulpecW6lZd;1^t1*2%w#B zzERWRcpvq&O92aSyT$;_c$YQ}OtMR1hZz_0XfVaNK+Xn?uycZW4PK|5U_AoiEm(_z zi6qr>a%}f@6oEn|b9jczInZ7ASkb$_4g-o_v4aYY<#({{JDfQ(2 zrzYCEQFVJduRSMsipPgm9XT7!y&|7VvRjr~GNV3=;;_w{io@eXH{CVrHI05~aR7t* zcOwAu!hgXBFDfvRE)FRDDenL--ru+f)@l&$fk_6DcQB>F(*&K$cqv^#JF;fNx@Y}z z`19*%w^MCq+TNqXVJ@^IvV6`*M5`$q9AL!HI!6BRg z!-Q}Gdj4~Z)#)QDM*8IDdoqI^G{;*BxmI?hPC)B-Y*KvAUJ_`ClH)x5`q45;%*L9>dJ~2qB zV$hdPqNQ>sAOp)}BwiGKO;jIUnemiJQv^zjH(3~E#Y>q&7$W_tlwk)4uNjDT0HqP3 z#fA&KhQNc{npO~(XBetU)Lb{$37Pshu$aMNqveXt{IPMbb~mfr-xOxtOXd7iT>p7o zF7BV>LI@A0HAG^-3K|R|U6=|HZHr93!@kMo2Cu%yt5r20(()u9obngfYk-WT!RDWH zc@dU?z(?-irS~`C23zk@z`*)bCI1U7fuE}g0t-f^fK3G$Rz)Oz%azfnoV#AgYJBI` zGipZBRSByJpJc-P20BakTGYhr6>Ndi41fLDM+46uC_aJ#^`{2^XHeV#P8b0Jsh)Gy z2B8&rsewUhynC@e!D*dYndNWbLz;Zk_y&m;`IGSwA2JQQ%!g>o(peDwE- z>15rNx{bs#i3PGwQho#Fcovbd2-2661@Q3`Z|C!4(6N5B<9wzT$={;dlURoV_orU| zXXb$}gMr0RWn zkK@jOK)rc1lor|!-f}pWoJn_HfA}{FTOBlj|X$8Rst+s>qGRCDWno!QT z8xLeQ;ymwX2c_HkqU|TVf{CsrNA_Herm$g(ZYG8vkV9!Lx_B*}p6r z#Ld1qKmDi804c9?afcW?7^*?5t`(d&s!yc67M=lt^lT2|6|6ia9PD0yYikv#+$0{*GXA%-2|lR#tU0o9s8vlFB?E?uCKH8=O& z8kTw0J3@9lyG@Hdhbwi%-BKfw^;0PW;oSjMaXkb4ogWANj!n zx-c8e7?-LTvg5h5-rzM0nHBg2cq~w{JY=k&oB-<@u&2ch{wSCe5Wo=mh1NoWS>#Fg zLik9eiD?KjITl{Sy~{p3bK?{8vFO5(9Glx#g{yvp>fJ36CzwL|mOl7C4C+61HDtH= zH?*K#Ei?~6E9{a7!RBgDG8T>{t^=+0>mJ?@UBv7qo`MkZqR*$i0OPzJHq+rIlRIUHc1h6DS+yqd84R~5VnE;*_m!H3ne$N5@JPzIp&yhA z0riWojF1#y1nGhp|BWI7`$CYV#`&B0^FVJjATbgM<-w!@i$5rqekpi;pWBH1!@sI8 zVwUoC#RYs`lR_=9#cddu9;?wie#-+D!xd<-#EeHVr%=Oe+=1j0`U^`UVBey2W| zHDH=3C{DhT$02L8WM2B5A0uhP9XNIjGt!@G4t6AHKJ$P&GoY2v#SIcal@Fe@OmT`S z`qF!@m|jJxP`uy-WOLuHs@mKsNu zKxA@9<@rm?plzz=Sc_rD8x_x}?YDhiN#RH?@V>K!0d+pH|CYp{Yr$bbK|7}qu>gb0 zqb(em*h7%WSwzmw0$Q_`)4pbkVh;R#%VBw2F5w5d*_gI@;Nvm+QQaC3xlY_(T5@Zz zsL!}BtdwDP#usu8iw+b_I2WtGXg*%hz6FM4&_Od$qrs&#=F?|op1e{Z->sgSmF^6Y z>xqzf*$WaUOei*1_g?#z<`4GQ@Npa z^RST*ZN7NkohpwdZ9?5_FOmZwqg91DYK8pW86FPaz@x_#t4ZW{K9$U9xq7hbx*t|+ zX(aK`mlhC4!!Y!mKEI&@3-4b@#tG`Df<^~1W)LZZMn~S&bp5EGgA=hOIf|S66v)`s zn_oY#&H}fPjeXr+@=7W4D^;?DGPKIU4%NVf*WW;g=EI=+iyr+)R9wIL_7J-Qv8vFj z&Z+zMGa$o)vwAxH3pJqKvmYcV@~^bHo&|0Wif^7a?it}Ih!Z>WQcG!OGGT8q)2NGv zy*A^i)-%K7PJ@Pb;XeFEH0a$ttncyL77gNyf#JcpJRT)>qn@2PhXbekxJ8pdyFwhc z+>yJLh96s7qn3(`OkIWwTu$#Q8Ky*h2zuTsg1V0&27~HP=k=dGqTiiYh(`n=8d!UP z*QPAHhjA=?V2Y;PR+WK1F(vNq9b_Owa14-fNOM`QX$MDg!-Ify zS{CJLCaKgU^E@dGzCYD7MCn6B4eb7b%?KChjuU861BD(h7vwSN+(Q%@AcH`f$UP2# zcYtA~w>B}%P=D%Y*rA|x=O4}?SWSUvzk^jAD)@~zN11E~f29g$j6e1Bzl`yl5I_QM z5Fvn`Td(HcQ&i@xZi4;RQ`y!}7HK_v=1!!3WJMbWmv)2<_UTY9Nr}sq`TXx=Ys-?8|XoI@I8?!J+^Y5WYkS z@#P>nKS<~jtl%MA8)$V26P`9i+`C(*_)Y6gRGIrsJu#(=%4tbZ`*8uX-o8VVCK*XD zp^1>z>hn_>jgH_p2{C3=(Q(mF986CBpUv`UB4ixaP+;cqr{4<+Q~w1&FQ};=MwFpF z9b}2;jWj?;4`hjAwRkLF5xj2{HXrdmvQ=SX^_i&J5swZj+}wM{!E6~9faIG|9JuB` zt3H-_R5bV2FCNDB0sd6v{|pK6E5ZnoKxlL4i7?lclXb=VJ)eN$oY0M?f^bp_Z$A&3 zhS0YpmO=*s+#^87S3cY!7(E^jwH^sOpkoTNS#};)@FE}7h7e}&V2iiF(CSZJ4$1m} zX$6UAf|vazufYt3OaY7%k_Q1xBvtcQJYrk5s{5Vzh5NToYRnv2m_&PqoElnvdh0+} znKRz5vtE9hBlYf%0W=z@3kSgx$o)$KA?Z*sD%kWRsGKa}7!povS7= zV91?KV2m}RPJp&lMd@@n+})A>D%DuG%2S?Pv0GSMHjyjAOP_*)j6_6AqDhrK`A?c8 zk)&b5qEMIM{ftGxAiQAs&#VJ4s6qsc5KO9zJLZ1+nDRs0Or%x^rAD3+J#XR8>X1&a z-`#mNTlH9KBOgTc4X@DW=rC$Gig9Zy2TEAa18bVTDuu29mYS4BailpH0K_&*RE1#e- z?{pIveNKFzD^y=jqs{XuKQ-a!QnjPvQkDsfmCVDf-r zfcjZrSP!}K3k<_2F@OB&EtVy}9b)*IL!kAPYcV`!xChgTLNfF8mB=y#|1VfqGAx|> z_I%(=t4d_HiLxG}$y+FL&UC{7`qQewuomKSfdO&<0t8tSVAlx3KWKl9GTP0D#;Y>3 z#*|0ma8!k^=}yZnKzfWV(ue2q$wV(+FtgrG>-1U0LVr5_(C~Tn3xP0UrFAG#eSP*>syQ*?vMf;knsoi1|FXM z%FM(%ZG}R>w`X1kc+v7_YnrTdCuu>q#M7MOKGt}r`_jk|8VuFJOzBU%^YfCpi+U6o zt;GrA3XFV02XAdyRJz%339GUv`Wje#@FM^+l=%rgqJk$Y)n+RnAjW}vF^IvN*&#;z z(WPyW480I0^nP(y#BcHm<|{;bg2@D?D9^8e07L?y_X)%il4C}9Jb}Qw=9FXAs9CL; z$fLf9%bU*1w|9WR#jjJ$cKTL8>meW`PDegr4v?`=()E2)_qi3yw?uaSI{eTa#MAtM?^SofMf`Lu%Bm6-A0np{aqFzdSCiu{@x^d<@vEj(X%U?JlAEmRCK5D> zSD8NG1Tsut=YC=705hvgWB8wE1-iclMhYRS8^SNJK?KhV{f_L&Yq?vW(Pvr0G4Hm1 zCMVL4*nGB1wHcpm6WtR!$-;D6&QtbzR>Ld4Dw_8WDFGAdr{~W}{5PbBBsYz0e9_uY z_o>c^gZyh0YSQZSqy2(zt2#zgS;mKHtk2>C8SVw1=-*DfIsfzpO?^7^PWU$Bfp{p) zy#8Vt!TRJc{u0lxN;9w=UYx%4b3uu}qL+1CI(0+9*k1{vFl_vMx(P~0GLTum0pM&$ zk{YUJp$U(_a@kmD)sZl{rRP{qE9lt6{I&LGy!No?w^W73ml{j2{chSwldF^LA}!BZ zlhA`yMIPV|IerHz{!FOPd%Wr_dNM|*qhvtbq?=;%QiuEmV`}_67Cm>Gkl@GW9fo`oI zvDpj+-?s?en#aGQ1Ow<#`wB5Af1~bi=|hPB2|))fH90o6Bm6q*ApoU}KFt?m+R;T! zt04!PXtPgP4MYT#&f0xCyH_68j!>`<0J?1J!?CUd86s^w_eZQHkBm~_XY}9m%_8Ba z>83ip5_osRMv~R+j2YilZtewIHJz7$j9|^S_^hL|hRiTNhd=(7J984uoG#7p&y@hF z=>pFQrgoC&S7Zq+?}b!vSy|O4{LNbJyjM|U45ERI3LkcEzlkTYw)jkj+E zWFQ^3t3QAl_0mE@dSZD1{O47l=XZ3TUj^-8Bw=)ZAuRYxBn5qQ6$dLw!KMHoH@p0K z1?}YtTaV1>w3jlI#(Rt7Nk0Y`SecYDCoZx?T#Sk$PfJDxG{2aN8B44qz1IeBkfJ29gi1Xh zap?m2ZC(zk)>|CNpgkF7%94HUSUDBEh{O3dTmHpZMdEHyqOpO9YN7B_Lss=C9%+e`m9{bD8HJ9?RD|4UZ>98;9 zq6&PNmwL6Bmhz@*#WkG8WL5Rb_$>y)9epG1x%{-yw6V-Chw*yrqdK3~bfoNSWOQS3 zh`GzdBla0-jnY+x8PtT7aKR12*v^Spje9;+36jmn1=mucNNwSBPS*(95@rmmqB1&j ziH3-^O4%xg6?3Q$jh*E$1MHkkuZ2;~U9~lnRJ!rmB4pX>MjfqHuLifg5}6cwoquk_ z(aod}qf2dqy6kdXliR_`hcmac^|>-+X+z->Bj|ejx#NXKT^ShNj^I^_OGg};9=)RM z3_CapZl5Q3m*o6#aiGjE+eL_n=4jS7$odf-kZM}V^N{QM^GT%yW0l_b4|iR?Vy4)jx?+fkjZzd8E8lvs_}uJ~Lp%?Y zUGtl6bS8&0SyK6ByBk(u|o9C0{#U zatPECzOS-`o~2{lOz@B?O0}(Mmm*DQj`pf@8bru`p5B_mbpd_ zPPM6ba)P#49hg?m;WDn0RaQbG?T>~%3as6(G8`7Z|KeCX@O@nPYbV+9Z1rf=rxSLS zBYB%stAcrI@!aJpr7he0JxB@+yA--jRhq?uJ5TXH>Ix8DXFdBS%$+oukx(|%Z(88Z zR;o+a63;2c?3EO7c9a*Q@v2mLI4ORKi7EDpFR|Hm$49R-CK03&Zoa6Cn_1=(AH?OE zM&!pNaWT2^TselReaDBfI|)u-HMv|VzM-bLzb`O(P1=T1e?`VNzX|8o$;-6NT-Wt3 zii2*U$<|Xp*+m968UX1W8vetbX(r1rj|$y;-dF=ON`ll2$#$?kRCwy&SFo%$Y0xv~ zbYTR~j?_nepxFMTBOjBz#Xzz3;qB^=bVhl3X=gLa`VySNppU(ong)_1x3UpSQbN*E zR01CgC)it`5J~W-ny|n#)QKMQ^$Tzl`X+T#c%oK@=Tp?FtA9V#^Ki6!IFdYa+q1xm znKo{(I1!ij*{ipyq+iPeCu#pws@7y9SHm7r6sk|ND-JshJQ1ivP8Mk^hnQ20^ zP;R5SZF+}z7TDIi9)9~{SndE9!e87=^CT0u zTS;GJh``h3BS~ia_^Qp|6ljd$PE-=y?oT;^_mM>kZ)_ncY4rX_RO29X7Ahq8qWctcyU@kNg`?8;QztN<22?#Inud6PO+&Q}EX#v-S;+XZuv1oe4mi44t`va6r02NplwAQP(< zC0w506^eN}fjmy9ah<KSOYirxD&UnWuE9@dRHo!iMJ%}+VV2Dq z`=fN+#4nY38V=aSoThl2*%4I7_}pkmC@pBl1dl|o?z&+)O`l=6zFvPrY)jU` z^{dZPXWuw+$Pfp`eo?NfUX$M6I~5I06OYV^r_RTF4AE=x%Igbo_<5DOlZwPYLks}hWc)>8$?O{oWTbXA=O;Zd)@0dM+ZY$&$*wk7>WS&1|>WChyEAO zNeCkpHUSY%_pt}_6XoD0RZwSoxBIwtUd9Nze50Sf#)f>8p8$QNKEFmYc&j%2n=4EG z-bTbG=F{pQw9l$mOxsdAnb)Yt2s_7p`3oDrnecziCx>&&O5(T@;O*R~b-!)|U=eQLjF%`qB8=nn2W& z$KMGfpe%8vj!vL``=OL)M@!8uvKVo@_mpsD2Bimh`ejk+Vbacp_p!;Xy1%{KlCI77 zteA;XP+Z>BQ4+`vZ~5NW)q_KW!IR)lo<~aRj~ITtBI4`aRL`ESa86^2>hib3 zu{_6Yy-bxvs|f3S_w|wlUp%3ke^0oOxkr5ON0SuprV1ijEq1A{OHfqbu&Iun>pLHI zp57Jd}KI_0wE7pz&xu~fwFE*aPr@0xq4wf2qRDMj)%<$8w*(@>z(vlV_#>%RRoaslP>YhO17yU>QD zFOP2-D$EZ>a^$N&5NT;UF`8GG*@4?aFb^T8qhh-4NoE#nnxXFHZnp8XKwG#Y<9be2s};EG4v@<}LcH3o{$ z+K-c2-sscvg!^Vs@tP}~c;LoxP4E}w+3kdF)M9-KiTcOr-EFt%C%0Fu0sZJ>0*R$= zlCA0J9eozzDdO!dEASE6HSf!&keLIr<;E%b8g%=&NxEH2d%t)Gt%UHB%YP23ig-eg&7Wyf45L<|9Pvlez?-|~VEw+t`qs-mW0Huvo zfWSnifT?r=QN`3Wotlm*(QtxCc#`W%z8FS$A-Qqdh~&CEN@Zy95zZ4t-C+3Tfvvle z_f#DZgpow&D6Un=0IuX(t)vXg_{Q@Jq;qLfepw?w2?|+O=ewtn91-M8zz~{r?F##i zVl!FRs>KKPolgk)UviVqPz{^2vVra@mHsA4Zua)Bv(|bCk9AM}68aZUQdiVCyU40x zyTwJgWIh(OEVGi}8MV7P*h!KbnI}4#u`lxC^dIBtjef92VbndNYjf))R`o>Na_opR zZd%6dIlMLK6iIvdeA#8fJyQs3`aVFj-H3D)AD&M?AP=81+c8)UEgA-}{>R_bj z(ytDEWpoTu@3)^~6kyY+e_tWvI=eZ;ve1}Tx^5eQb!Erdspkm!WI3!9S)l5Uhkc|} ztTVctF7EJ|pRdMhl?Y;ef*&a_S{twKL?1#}BBlS{O)a%MZmu7wRJDTN1c?Q*zGzgS zj7xd;=9~UJ2D2}%3y~tLp1zd!J72c3?)`BsuMpm*{F`Eo zr#(l;8T#xIKQ4Mt@Y>&#sCl?!YtLQNQ1?1lP3{Kh#Am%Te}I@NMZ=vAGDBLwHT)>E zgSw3%_SgP+1(nh_CVRGI4DQ*bEqWK(hjG8wqYAy}HD^_E&)LMmL#ny9XG1^C7XuRlOW3T!E25DJGD!OMcm;e8RmS?!XBd|SL3W` zQ@ILQfA=h}bi8dYFirKPpW;T&mDcgVrVXa1cRiD0w88dJB_?xEWD&3xmVR8+8qm$6wm0JWIYFXHyV6 z^tEIB>v%(KWFkI^ipCCA4vCY6wXpYk!i6QMqhyosr4o`*OPU zvc991`Bx)8k<6s(^V+Db9FlE_cNEER=jlROC^(-DAec4qUB;QaxP58lT*HviiE63cf3Agk_MoS^QhF^1PePusJ z6V;dp(-h#VhR9>)>cljMkF%xY17b0=!O;W_TgTl5wD0dV$C`Uq=(WnaGSNNXXHu0X2WqksPmLeb1S0(?xFyhK zyIRiJPGbCBp9;CcmTq50jSLVfvfU0QyVo1s0VZ;O3 zIwrF$eSW4`EJkdbn{v^VOd~g42JelB?Kyp4_%Mz^`N4&D!NxPYR^q$Wf}ObOg7uhV z+h+1JNaNLKCeAyy<=dXv$8Sf34&PaMb2QsN5Q_$2jlQ~_HO5z25*SUR+x!T1DFIdW zY>E1tg9UQGeJL)lK`j%UwqVO&j)4H5tB4g|ia)RO`g9rehH)GhB&mW~Z%CEojp(!)46SYM~n% zn81CHy|AZmouTnk5QpuSkyH3^@Kdg2Nu$pbS%SVdi8EauuK}=a#w=N$`>fk|)cJ9x zE|HZ;Em=wstWLa0p&K9Ys=O^mmT>jj^~K(lI7$TvoFQW$B>VXrl{765%HFxOc~M;- zz3z7z(4Fnq;)ICD%GgR*RzF!kaAFsVALFrz>xu|?Rno5d&_v0^hBbQz6Ni z;EvTIWv(9YJs;%un)N2cz#*&2v&kY`x!EtY!6a?_J+VgDUm(Y!mc-HWc7%98>34Xp z?AUiN1B4NTO`@lzSj?{t&%wXD6Mxn_knr|6eN4z^7Lh4(TS*7O#O`^km|8sp18C)#Q3tY(DQe8=nS9N>?x88y<& zZ_JrI4!4yqBF|o(ZH$yQO(pBzHqDqWKEMN%B{d6QF%^jw?zBVGcMrYl=!Zxc2(;AC zvQW6zu6C8#r>%hZ<%X0*YFzH`qr{VWOmipt|ba%Ox_2fpATYGJu7jf=6Th_AmiUU>+&M$O2Vs-GXm*bpUq3HauGGS{IvUS(y+6&VB+uxx zPR8N==JbBMCByRk#DYd`N2mGwTWe)v`0G2y2o(({tMn{6%pC?N6+j;}?sbANEioOb z=ZAywAJBRt@;|?url~-}M2mL{^KtSn8GEaf0)MpP)0}o-?T6Upz8&!Ks+)AlRq_@2 zp|DN(&-I({IHkTk*`_0Jc(8dj;)Wowf@|pNRI7iQTpAO$FnX)Y4|D|*nSTCgHw}YU z_gQn2ENm?CQ6g9Pk%+g~dKn8kL!OJFj4>;uDZZAYQ>gfXa+<)}x!~v!@D~67W9%K6 z1ZkA0&9-gZwr$(CZQHhO+qP|M+U}m#G{1?By>T~o-;MkJg^H@DGEbh&6Vks~`P;SM zvE~)WbB0*#s&QDnuO7z`};ne zSqgs!!IvleTSWNSP&#-PRUv01_GqP$LDy((RJ0EQdF?RirK4D@L2Fg&a@~7%weQfHBXtu9 z|A;%ejLkfx{p(c!L4%c+vD`=A=H~>Dd!JM~566c9oE13cWFw6aa+m`MPJJy_y5@CaDy3npiBe2e12k9l-ejRut^ z@gq_#%E#5hXg~(RVKvkc_mNjSWQ-fECQhlark+K|3v&~gpCg5z%T2pJbfOR z7tUHo&ev^(rAmaslGA=?TEcjP2a2-oDOD^PSPdXMjt-$4cYPQfhLviqYiy~Kt@!g* z^LhW=V`tp&c>X+guUrLE)$TZ6wLGK@IC7}O+fEXo&|&A?Fh|>5#X5$*rR&EsC|zcZ zS1zNCg>zF8kXvGJ1f;O9C#0nSGZ}Gfg)fL@db{#jNrZ`j@n_u&@z~yZ>6jZ0gk}^y zXZ2o6Zw50^=kl?q0P{-DpE_r)c7`9Dqo~p=4sn1j*v6NQ>q1~sJe{<_S@rFO| zWcM?URM2D&wnJ9XV6PT?b--9`06qZjb-%Y*O%cTOKA{u)%ZAAA4@ZUdUldOzl|dKF za$9B4j-0wsLy*bo>|PYQ4?|ou>0KA35WJ-AgEt#CaIdq!>P@c807Z(D!!3nl&*f$F zkX)d=^fi;`G~nuvMv$LfsC-cQXLW}@Q{hKm61G{EBGdclLlmLk9l`KNeSKdIK8s@a72@spC9!g7=n$WPPSQw~#6aWFqtPX4u8YYf_2zblS`2g$UqXcvK zZ+)6o-929&ZjvqQrzXua2^-+E>cFT>q*F8lyfbrw$MKpXWZz7#uZz1R-uods`rVMc zqwe)B(ilbZCymZ)M~DogK$6|gg(_z^>`Z~YnUW@>CSd4meo4JLalh`mNm{J!WLHt` zL$wStDHoyUbq?;9k8nc7Xkkj^o}vs1n+l za15fnEUF1`O8RMSVcDV1uaH>2=4=Mc*Q7FN2av2!mmW&BJy-p*k#c5am`}k-I+jTD zikDuI16C%-K&&9cc%0;t(sV>pfgZcuobLW!l`+)hH5RhGTCa$~m&pGH9!pNaW1kCg z7X6A1N7nVnbp9Moawe*Jl@AaTnm^bPvN<*BSQH07Qf_5ZJJkPyP$IUBS zK(;Gaw_9aKM%PcW#B6H5Z{l6W zk)Ozlq90627T8)Az>Vd`aW4;dcSlZClqkfEQ`$ajj#2px;w@u^%4L*v?852Fx_zh$V_)RG03=0-b7t@<+X(x{s; zrnOA$#N#@CW6vhxJ}hpDe$MGk;c@v0wCzSthaVK-Bp9Ws^fSbd2bz}&3bQCtJzjY{ z_0m;Auzhs-8pPaT#^erx(5KbkQm}8{d|`m3Bn*9;PoHO#iHP;UP)npqTuZVW?+iXE zDArb+2`;9iAfud0?WYg$zBv7T#{R<(-*rY6F)bQ5oUh?py=WWVt^8vX39Wz)`S%jL zpzpEwWr18RYJ?Af&w7dHL55+aXgq6}_q^9La6>dlddQd>n-)G&4aDH1JKzyrEk{Mm zqY8j>fkk`>`A$AR#zOQQJ}}qk_-y&s=T=VE=`W+wYsG2lif?^;D<e*dO&pcJO3SoX9p-(En^x!Jx8YY`#BTP9DEVbXjX!K(q3~TV zNrWz`JSY%S`|P6l%vz>7^(oBX1l(~=vLE}Pn9w5BQf+)O(6k=JA+p4dr=K-!D-xlz z$f)7E8=Rlq?$sJ$W7JBN*8x*tSc!ZFcRuoe47KilyJD- z=)5(xDuVJW9yGLLvkLy^_SS!=w(az&C!QcC^ZrTv$8Yq%3mgBbV;GqKrB{LDuc_hx z@+$oQH<`br#@-iCj%<@nNDw!y+_6cXuG{Ut+!srZVmx|CI7x`KJh%mSbu|T8qv!rMh80Y09~M3oJx!689ZugAL6cHbLmExM0aI{mok<4}VFVYJB+J z%bN)oeo?$qb%8@JskEZ|z$~7SD<}7j_CDdnY`zt7?h-axa8r~zaE?VGMm?76=LRAYZ-w3O% z#uY<5Q6vsR$EnYpW!t+t`56vluG8Rg&D&WRBRM&`@Mlpk&ptHbx%=KZ-9CW5_a}-^ z^koETc!8iRQ@93tfzuRy*jNf?qNepcrYwOCo$lv_{t?zP`rhj$?(BGf!tdC|jxLdk z*VrGJ13xtL@X@cvQr2L3iE9M%r_P2?-7a$8+Ga^E6x0CZ@EzWMWLD=7=8!u77%{z# znL5~B@KmIocI$&86AvWf))VIW+*gOX#58Bt6gy*fQ#?=Dp36xvo)cyHpuc`x3cVHe?P;x24c~>+Tt=A4n7{?xo6Km?bFda*S7U) z4eV-ds3c1g~C}Vyt>zNV%$Y0HiA_B|0pg;c& z+>SjReL;Az*gUUXKHm-lq=tC0hLc@EiPx~2rkeUJJY#hbD#3Zvm|wZYyeAQ@+1Pth zld_kt54es8`e-oTtLXRs<6^(1=xowSuTw=xdR1T?E-#&~g&M z?3~^xLsE?+vD1dam29N>8NXmb+WRXW0eTl$HbaT)@f}N_5_VNw0P1noefcBc^a4xp zyRJ(dGrO&@syi<-262DL)iyf@Rdyrr36-!JbqwIrek4_GxMx3_7m@Seb?bIoD&^ej z)D21H&3cwh=z2{)xD?p{AX0&&Ft)@ze!sm=sHR;#w30lSkj#R7Q{We$EvK1!^7;d- z!?vqiK0Qgh%Pw;ozc&A#f4>EMOt_wtZq=sq)gA-}PoJy&nV#29vNQ`7;u3M`JmBF7 zkw`uVS;7%5R!8C)ko0A3HNaZAr28&5LRJ^&l7hhLvkt@9`{VTudIWDOAL9_YSN)IR z`L9XwKj2|zVg8p56#M^Fw{|IlSNgqMp0mGqWtoJQiF(ra8fq{mygna9MtFcZ zQi_;KRhQluQfs@Gl7Zv!@nsYmHZhEx`yUvPT>x?W(fUp=QWS7eh;}gzC}bUEJdoLb z-OYU@k-I(|ty+tBjh=R|&2x=uX57xg`vh*pC!)zhm98zj^|7~*5F`Mr~6VTdjnJ&)`b9R zKsST9yo*y&G+XcGYA-R(nFgN&CPJQk{&7vip)oXQy4QWhC;(UDA(`hfHQ87~6p-*9 z*n8!WLGl;*6$uIQ(o&6Z9_6T>qF0Jm$zoGrrQ8z>$X*0xY}*zHf#>pZ{waU$ya-a_ zicGtIp4>DCqqTl?K~Vkcm-q8=%KHs-h6M5mil2`DA4Vrf!1P<+7+I6?qN?JBPVUjm@yxyZsi z3O6SrvKR?#%83wK+Ps6URH<_z;$5;Z@q~iu=g8HH4+v!rMvnwH3q7}bM6aTc?U@T` zudd5hQ zec$8Bf&%#GO|PFUgQ;j=(5y|WOxWWT&5bc&0sBE&kJ`zp&u^hzC8cpi$G3)_dp=!6 zcVob{XFo$}m;?8a+B6fFAW&wOlpbde3v_s+iW;5eHDG6lSwXU&Tn~nxK z9ouY*Q(N)T1csjkKRTL0A)eV#D0e%$O6DE9)RJ%Uta}$89B5`GIr*btx-78I^{W>R z#t_Y}b!3vBfan$I4%J$}FgO6@tEOJo1$6=z|SW3<@jygqjN=$&d z2>{_%hvR?RBC;iTA?cu5nOjN}k>B+q9Tt>e%3@pADU(qTW3a9u{V8l*mi#pUB-s_p z8n)(H93eS5$PmN5kZ!LPqUMsZ5_ZY)=hO%f6MvmZC&)v$bTk<+>;yO%NWBdQgI?Aw z8=~t}5`QXDDst%OYV}65L~JzbN7?T1`g;)Y5`NdJjBzK`+3`Gib3dKi$aEM0>-22N_-yUHI>@U<^z z15wGnS+fGJaC+pCpcl8tX{~L79w_cL@eQUABPMQ--LS}WvHQ&T*-8B!b8ZPnO~2UBdF{9vF9?79KL9xOq4w|GZRKcUX

kkq835+k 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�@7~i*C%#V(q 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%0Dsyc5sBg3=S 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"EV)W0!f#XI-g32R~?Ri2Q*YyM&j5n6(^86CWV} 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%0DfchEa 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 z zw#V30+sg~hB&4o0{Ka@^$Ka#$Wxi485MaDDmX{@lI586o3F?fwi`@+R73Mi^6y^z$ zD5UjpG^#XPvSzn(M&D8MD0OtP<0gbf%}n!^|z&f`i#{bPsa4dIS!AV?E zkCF*E?)oY#H-wm6coI(uo+%dvO|aaBuQuKU_6#2RC+H$zs9wzQkG$!N)?X#U%G!7J z#c&dpc({6BR$LyzzwA~uTpX%>#nFt$BXDU*^@o{P4354S9Z?ptsYmw&MT z0%ruccIk+;kW$uzG8MYQ-2SU>cTp!UD{(-Z;*EbX_$820n`EV!ts>MTW`OFmOZ}&= zfwK$*d4HZi(lByAa?nlH^&Mi$oQxRWG`twrc@If_Q7dm<1WvC^wFr%0N40?>A>6J{h!a}l4B^tb zrv=@$ZpvlV6)u-gJSV1Ak&Z!wW+a0sQQ(gQm7ovdT=t%)2N;PCF#dh-Bham?U~`VS zg%462ZNg=ZFcLO*fn$`LzY#)aDU2u&A`_b1Qazt`rF`D>OMdQAyp%%)YW!T%C=QI$ zyp`vUhC=Vv({Y~z8Hxb;TqTU}(fH#mwl*71l@DuyMt(5^O_^oG8k_s9kPhXR+yY3( zIoCn!lpVeE+=d)1z_769L!H0H>QIAnT5YLu?UZpY7FDN;i6oEX?IC&=6G>4a7bD~# z4D**=-LM~xa7Ig;c+@i1+LMXqe+ymwYX|nfpo@PZ0(AcdUHk`I@!t&S{{IoW_^*QH z|8AoZ+rNVr|G3$IfENFtSpFTT_{WX@e)E?n`A?vNg`R``e{5UY*(8D-v{zsoem)PL zL4jivDneUdZ^KtOV76bvrQ5w=^gwe1hL%RDCsc9{^y7%~m<9yeA2;3M&9LaG(jJkt zhSV|?gx$`fQ7}KDc~!Q4Vgwv%6)$fg2&mwRU_azq%g+|6exr=WsL>RY(l!1RU|?j9 zNwU1S3X;OPG-p_*Ali6xw<>bvD8yq z4bC;Y6HC6%Fh<^jLZnBxxa@Gf&1b-F@3@o{%2J@}%7K(vcmuiC9{_p^dKC;e!{e(f zU04ON)pzr?mCEw{AE8-z zNaVm=Gsuf<;A1JYkMLz8*&(*NlqD6~%lZ_<|5^Ufe)J70<(Dac{|hN$6H*uUndpD#$czN1M7olJ4sK z8PW@w_NWwYm53kWY*H-lyxK6-Y>f^!#Hu$5Uh}!ZHg^H0^dWJ*>l|p?YHMePnIE_i zfIbt(BzD&NExjMqVZ62q)OH**M6c^JSM9(%<{2l3cnmeq*c!TpJOg zqrajHM|H}!BeugVcXLdFXO045vtXmWCnPycwz1IagekI%=pC9P;_rv7sP8TRTB{@< zE>MJd_7x+sA4aI0Jw(yAdcFXj;i$B}XXMg8Db5QJjCu5nMwd9$@-k+Emu?NBDGupT zYe7$_2h0tf!|f2x6{6czY?-%-Hw{sQ_*Do^4tH`ZS-9+ko0nlmPwa4Jrn;U{GSr{v z{)~ZmcCKzZgxv=Khk+>@Xcaaw`)-}dfJnIdxq)h;nu{=V0X(ZEMH{QGddNfEr*dq| zXyG|ectd1|sa`tyG0fwQ>TZOdKfFzMu0ld!6H5G^e$!pQ$Dc3<6s&iX8z1#8p_ubZ+7SQaHVPMb;+ zRuoHIWOS?Xtl3_^3W#Mz*OGpyf2Mt@Gc>jkMDjzm)m# z4D#q@GX_UL)9f6)GNfjM%{BXueHQpb~b?bzcMSDRpXx_|79Ns{jyF9)Ben#iL-q z`U+CtgQ=Ie6~t*13V_P79e1JMdtxGg+`4G5?`QZrqt z5v&2*AT9!smK?ufSEZvYc-VnAXu%A#nr{i<1Wc-St^g4}_j`Z7y*Fmzmsx|R#N9S?fE@n2i`CvJf(~Y{hleebV3 zn@)M9aJ?O#;q{95X-Q);LCee@K@827x7GR436)%GwSy zCmbw#RtxZWDa-`VJ6s$L-Pm|=JqsZaSzda7upvY}Utrn8!u@UfLefTA-mGZ9Es1#) z>5BwT%MF+3qyuz0-Iez|4NR#_b94)bw#v-*1dvfZ#hFZ~1jw@ov+T83b?9v~*ULg0 ztC|bZ2FK=h@1|;*wP?|0MpgUxQ>X#a&KuQ%T?d~{L~7(HDj18P&d<3u^YxZ=0?&^z zpzyZd*T-n7H=|%%S7>FVvKb9-zzpml=2$xx_*=@`-0xK|Qs9AzE9bKz zr%efFEa_@BQ`Z|3Q7q4V?^-z2ea%Iqwi-b;YgqzL>~*6&(I(i$9F|~)Z5W%Rm?WkO zSbMX(RDa<8?H^3@0S4)>@~b_7c~-1WP@rY_9P>zWj=bf_J-mRH74x-7X@*or6C zDyC#Ww~y0^S{A|x^(Kl)H9D_)!Xi|83ffWTsmk#m5Fc4%ENV!>;;a(Y7&BcPa8$I0 zEJ$yq!&4iNb#xk{5c*r>*zoXR(zPwAR0J}gS^Nf-O4#P4#TL|YL2T;@sE^@j5s>_t z?VK{viS(uXKct({N9{AMKfeq@dF(YNKQ^f3q4@<(-9<_FRyG#I+h$@`f)E>D{&ZqC zv{hrAi8Im46b&;RZ$vJ8^F%V?WCh2oNSCO5+ePli0cS?$CQQK9DeF0Qcr54JE8{3K zPHi{ZO@0K_6h_D>Zb`GR+5%r*QXC2xtyfR}OdF!u5`FvC#L-)|2(K;zF(Y^xg>H68^fTMZP z_oC;35xw(3OI#?mup864jF1;6HE)k%t0CQJs&IFO`%R@!?10f zZ#}Y~e`*t@I7m6^bLTQS9o>{02{1_GzrQi`|6^uvh8sFhWv@!uQqu*R)a2}cy2{z5 zSNKP-A;d;P!v*2ehd$R6NF)^x47bTq9@5-969Xd(5-n-3xSs|nzQwyNjMBOOdWw5+ z>l%H!7LNs{LGF8Mp2x!w_2iIoMvs>+Oo{$>jM~h(R%!fXycbV8$l_TqzwC z6Fv9Tguu%6+>#G#vzK6;?JmvTBI(+cSM01`QP854Pm603LIcv&-d9)hIi&ngF;$bo3aDZ3$O(P(`jFE^z^8!6Dp7UmS7AF?ksQ~(MQ-^CD^Aa3U1E&;UJ zm?Fkv80s<%KvTv-r0`P|b-=7HxGiqwllhCr7K#KcynqZ&oSG_w6)G38L9>*=5-mT$ zHK=gIS0@ecq_AIaYPQTN?$U1MOEOiGK1L*>UAXfLFNbnF z7M09rsmwvJZSzTDg~5tV)mv3CQjXtUs|c_vI68V*wOGWOU-PenB7xk!?&f}9zWYH5 zY2bAaqm<7`3mh$hvgt~6rHM6%gV?}@+3REh!Vbzp$9cU6EXqr*s(FTU$#AX>jpPH|hm=92`ElW)@f$29aGSky(PjFP*;h+eOCV^ni<2li8Cxh!Xt0Wl2>UZ`V)li~uIDuZThd_eXGW~oFG2ZGko7R<|;qsuM{2gG`@ zI>01{LxwkY=IN}aTGm-y2qTWW z-ivp@u6RgHO7joCaqcHo{JVyu;;PajQP7Zm50%rfzjM{>-~&i&GIKxm5x%xmLo8*d z7h2kvwSf6Elt5l6_yXIy^Y46^&65km@DKQwg>Gg-OW+IXC#TX17p=2>-9yKRV*0xg z!T3!)kw-)FHKcX_Jh2?`8%T4UE$*KHixwW@0EH{QL5fzYh89{Q1Nu@54Vh&!0ZhjubCo~TY;9q;+vfd;^s8R;xKI{wMqxC4L0a2-n# z+n_|{)8K7$tH0Y|-USFe8(!H6!BKhtqZcI=VF&M|_8Ra!oXQ;R*eSsRZy^?&wAU^L zSQ9c!WRpAXRuyUneDwwxp)EU0+EFD6DuE-RT4cVyfwb&~O@)!sRk=~Ue*?*10L}b; zy9JQf%2ya>Idn3r9o;9J7^bV_EH50^6EYfVxo5X|fdzCZN2>1u6G%L!e&+{; z#ghil_O=`|4a=B?BU9Q;qkLaYO5C9!Aemu=TXkKCHkG1Wu=d_Z+Q~_m4b2b`Va{>m zKJPSFbn`UdB`JLoxykG`Xlt6siW>s zfZ$EUrh=a|9r7lj{Jd3@Kbx1xE`T4L+lx`Dsy0%Ajcu78@DJkUttC!>)GbtEOXQESui#mQV%2OKHl`Htjj!@9fLXC@FSn&cE_yyfW4x$p*iB{Y zJ##3V9mnhvDl%36P(|0kRVsz^(-8sNiipV|Uyt>qRF#4ZQGL3WV)V!>GCk#_344od z$)f>9KdGP$T_n$?JJ4@HUVS#h3})RDbQ|s?l+|w6#ocgvY8H$tv%6!fjq`(G34j&V z97$bi8b4)O6*m5e=qsl}^u%C6u}T_kUjvvvMOYDM2p&bV1*t{}r>kk}IEzn9M_tWM zleu2A(ykau?;-Ovnq;VAr~y*c&&6&>^B-n7*RlxtdTupWQCNHDXR%67v$mz>KNDQF zvU-}yU_G`JWTC-$5C#S~;&H6|TvRh|frVv3Ak$ROeJTMj7kA>l(+aSTL0YBWK^X{S zZV5!4?BX7OFzK?uy~`Yh7pPL=^GMmGrFBMno1y9PDOf>fA$HD8%|O@@mly>udDS?b z(c_KoJ_`WQ6jdxv0h=;WH+qed(V{ye8F1JG632&v)`I%{Ad-!sSw9_3I}3vam9rud zf*XftTS>f2a^suMo(EHUNQ4>(8oxI4h%1_vZ7)J!{#J@7C;~VZ+t~4b@Y#2;hzYj379{Lo;JRg$T#m`npfFcYjwNm{!--B4Modu1e1phj{HoTd9S^#j4tWtFG(U2-IpV#2Kj8Bssl1l_1f}J|NUg zS?^jy#G8CnQsW{kvk%i%C8^wOMVx-7Ks4k9oX8|>~ z>ASo3VOJ*B?%#FzJ|D-T#%y{*~4J4H@bF4@qSIF(v%}(%=2>PG|pZJ(&5Q_xq1@_CM=y9REzN z|5bbY=RyCMl$M==^?y!jRVmc?znwctJr<3H>(sAr)I(EsY7IpOZ2SAaalLG1pSaX*ckU;Eq;(Flhrb~vRC z5!z3rFt*@ps)k50uu&C>GoptCK$fD;I29cq#hxU&-QDxANAZbN(%C%d5ZY4`8?)oA zLyg4k#le_a^B0ZVQwCvqtgx-}uAGlsTRf6Eym=oFiZYy~k-MQi*UC}ve6$KqW&LyF z$H0oD&Y*%2U-U{ux84(I)5ZV7Qhm}g6+;-2?JWNCX2y`;`n8h2vafNzt#$3=4z6t* z+~Bu7ttt>@-f7BFDyRoQ@L5rv84G>!fR8|!vvW-yUl-e}Vk_kXUmd{}jG0(E>9W+n zpRZ|mxL*sq}Aa3Fe?uN zqY)6m$U@ym7==+Ze?3``GZAH!_TD}z1GgwFG0oioYf;w=`Wpc!ONqtTsR9(zjrqv~ zipe3izyfF^T0h1ITH^^;e|fGT^day)V>8uPC>+gKy|u<4Rb@6uMnzlzPUez|>uVNwhF*^g13W625~60T`zn`4+yDnYB*K<}*hg%RvGQ2W%QkYyjB! z@!qH)>&P%dMqP`8d$x1+s3|eWm+v)e`5>r9_8c`4f)vYWM5_wKP9Sd9r`F0U2Z*<3 zvK~jB=HKF1-e1y&8Ia`0lom1>SWlDdzI-T?t-={jPnW-pF+H*w5m8p$ zge#)*m~@MHB#?En5N{vMIgMeu?EZbFkBen5NdI0&dup%M-eDiIFVC{jqZPPC4yx9u zqa18HwXXJ8b`gVdu?EGZ-Tm0xfRa0;NT^&y6!fTBBM~8+anTNc=h_9cQ3WZ2G-*nWwsDHx=U zzgp24kffSV3DOle*j-GO$MlXF1sJ`O2BklyWFw2LK;xq^Ck;tBW}yqkrYWFEwy)Z2 z9i$k2=dJQa zyy{NnCgoC)yn-c*juMmB<@^H1y@yPHT3nSFn)+j}oJc=8^lj`h;_L}X3nN29grMqk zPqn5g9BX62Q-Ecy*4Yp90?q~AK3K=E2>QVQ3H4s9>aslkEF)g-EEkDe#w3DzL$?4p(e%4-%Ut z5^{0V9uJ;BEMVH7v6`F&}ID|GKRBCM+MfeKGKTV;_aNIYI zpan`gZN7+@UI(r4KkCyHqr?W^5eG#NQm55bAxU!K%GM!>B(k*x8)?DJ+2n0Ffbq=u z8Y?iD55ry)f@{C&p}J97wPV^p7S+BUe^KZcSO9c76~vY~j>aTym?2hoXM! zn!aOPs9o`3{P5kQQq<-meODXSY?I1>ol4i7t*!`Y#vKHVjt-ZBP^q$b*#|#cCEA2FQUu^WHgr0@l(W`s50gkwUJu~I zTF9qXd@IL?1N3EEnv}&$8}y|E3WZ}+&-d<2@A^I4YZKrnK<^MK^_km#*OV%G1Jbr0 zyYw4+dqhX{1g#77%1V$KzQ_6l9fMirL8>bVv+Jw~-`-W_xm?c8avG3UZW1{fhmcl`CD`!WFTB)gRft4(94!f3Y~25Xd^qWWk2Uf(gA8xe_YCgwsDBh1_wqJ#;IQ==8nOWgHD@*X@Lc zNS0iL+AJ$YJbhR;Dq&n3)8i#T$)qU}8@Z8P3Rd5#$>g`4M{HE{ zIWPpCO1fjecjfiPoQ`A(D;)c(5ubB1J{u;tB%HR{?XF%&X)r#{>u?mXRXj|IEb%t(@dtEc(h3e^ropif4ugQddkhTldB|KNtf z$!q!c65GdYa3{Dd^17AF_JLEV0rs{?W5QpE28>nr!Uqx8IkD6s`ER?a0`WxpbwwGLx!l*>2kX7s<;d zPn;+SaE~MrNa4^h1;{+)-ytOY>ZnaXsPmMoY;0+&g$i-Va7Pmtpxt4NHVEl8_3tgO zbrZKWf@ANsQ5%gV^6A+(CnuOVmE$bxn2JTcDxdyrduIC8gL7B&YX)2yt|(Z{GsML& zJNJ8dN!~mST;Maz`jf6esQVF1-PRlY1R?U0tyRMc%;1C~=>igihuXcGLnsZ7+BH2?)PE0iOe$qnQSN&vVmxX14!3aRcrh$sza@%5NJEH`xn4PT1;rX1 z$MM>?i<5(z{DRlCeB+1?ZJn7)Oij5@Pw)!DiJ=0`d+KR*G$u(*QG%E`%~;MOFkM0= z339mY0jYo~_$#G6S)ZX|KCG1iw=Cm;^dl7Uar9VdYkK}Nw!ed_#fV@r{MS&ACC^=R zX4(^Qfxe&(P-Bph@sAp^$&s<;=KD5Xx6{W6lDW<6#BN@c;9T6H5VnH7&yq~xz+6m0 zPxwMcaWFPKReTvr6(Go`)wSEk(Yv}NZ)O)pRPA1iGFUa|)i6%aM*7z9a)O$^jH;?r zHNUu32)G#D*eCTymhA#X`oSm^o$M42Rm?3MPui@B4E=B!fNK6ye=sw!qMO3@r9F;k zYa)|BVA5R`M=L(Slo9;craNSmCUdpdvt&j+>rTb6oDQA?J$yX0aU&`ss&l}lSWyS4 zy_$}RR83Gln^l_2juW+)j+-Hh2l?H?ORreP_oQ6F2p&`ZyxSbx3aHqsfg(s88?SW+ zki`i(50dN5XN`R>f3y8J^#C~G7S)j;U}lR<(}h^WNX$0H9r-8pQ=9Bf!TjlE;r8uY zThe+3AAdhSpU9Y#o@6|f$Zo={0z~%oSl{?tG z{h8rZeIe72_9i|ie-ujf#eC^Yn?q4ZDo{H}ei_z@c~?|TH;c=w%fU>82r_;+(@7JJ zTTaGxhM5&kYWgxpe#?BTaFUJoA;aujTkrpVVxboac9|o;&uk-6rMS}2cRLL3fXJbE z#3Tm3t4i6}asaJ7MQzC)f@I=QklNXaEjmfmemIRtOvT>r6sd3X!JVgtZ)Xan%xd6~ z!_&+u1bT};M64TW?-|roDLvB}ngP{7^=A|)!^ism5^Jve%WfJoFcUbqg}c9g@NydW@PAr?IcY5P*~*QM0No;R6+fR z26GMhJi4H45|%vafP~?6x_=J8nmlUEEukr}HhO!FK_*cStiw%P&vm2-)ZM(t4t14# z-sYJZc9L8~5A8(cmgZs=J<0h_vY$yU^)nMp#d}MZzp3PY$|~Pr87i!1|DsmKYVtQa zE9r?eaLjL>v_#8uzS~%hDtSO&`Zq^$kI?%!{tcn-EycYaWq6+_2ef$;muh zGohT6VxUP?dhG&Txv#y79I^BWv0Uj^PP5Y(tnP6s^jT!pf>S8P;gXyz3iNSUw$@Uhl)BO5bdruSJD<=7LBSle3mOny-^EOVER*=VNO% z0C`YpIbWtxqAo=NO5k$pQ4fEX#Nnb{E_PFN<@r`zLfiq!r=ZA- z`mtUD(7{|ot35J1J9uZ#pCsnS6Do;9Qu<|@2v^8P`9ze*a!uFKE;XfxE6#=O+Kf{l zugg83BOEl>2^^1Ni3P){#Yi*gIgK!|4_;m9fPf4U^80|X$T%UrZF!cyOjCBP^|`L0 zOy;fTrA>hMkt1#JMnN;i@swXiI0QAmp5GwqyD$Bdi8&Z~BKqUZ_HO@R;CXh2ADer{ z?*IMaP#kq)<0k?U+XS2!rm6>vA157VWH@6?E7tjRH3-$%Y^2Pr$j3qJqiJ8U>D*H! zwrr@-bZ(WWN_QldDtbr(68DsNSnj{9H(s3zmcDCvuo6>&nx3In{W|5jh^pw|5M;t- zJ0maF%IwdWymp5%p_z0fE*vBn_I7w8fvaTc`m;`G^>cv!un!!XV3rN2%T69YKd@Gb z4ErqG+D#=y3XP49tQ6Jhq)xXn`AeGOu-ldy7K~fQFdF#XPaSTzwsH6bJ7*blR>uyW z>CY~a9+*cTAkq-kMh0j*Twe|oChf0Z87Z_@j8l4SShj2 zKHTJ0tYjeigoLsHJM63DjL5jUQ4KH*xj%2`M^PRlDU1b5fdVHv-XX?eSuGPqW4F|Y zSg;TqSOOh`io9_q2L7)doNIXvbq8+z2W4hnn48?y-2{dHoadZEYcKNuiHnGU6Zvy>@?4D!ejw-m13G&N zI1<_!Ul(!7@v~4YvhOfBprv(BWh^M;#9R>(ccBftE)Ks|#>=n5EaYHM0Q?N>lVkP{ z9nD7v-Ez#2%xJF7JHZ(F5_eiXAsXVUcASUTYwRkBCH|I%RospU?twUb6f`W|-_zx> z&KW8^au%5{dR^-8NsnSH(d;UaKqjdTaaQ_E@w!a4Q>14W@QZqrEyR=Yt!A7tKSCC& zXW=QxkPZ`kcA0gAh%w^Lm>;W?muqr6e?szw%M=A=pZ^mzH|xFem$mM;QSdKp)sK9o z8U6GmW0c+xJn6#cgNjsUyV0zgwkeb4VRdDFO}#NSR;qoo^_%tScoHdMcps)`TVHKs z>(v{`4VldYd^3^wSK7LS0%VHWCG`CV!EFp_c>))QKY=+lX!56WF~8hK>%b_;N;pNm zkh^vxLdgM7#FEdpUMxK_QqKdgQBa-A6X=`79WYs4qt0bfO4#Z7vjSKaR?@UE?c|Av z1!3+`?nq1slob?@IGc1WmX%rUMs$dsHoFzQW+x!>tUFPwm1ZteA%1t@;a}EAcOMv% zPXY7(MSNu>Pj7!wOo9}H4h?e>x8h4|VSJPs5fMk|LZ|I^16?US$PuS}q+pigGq?Bw z`2*)2Ifn}SfqZ!SP#sEKM;HQ(Jyo@S;@N$`Ptp*({L1x3;2Lbj!SRKPkZ=yUoNiHi zdi~k7F@n94fofC($A*K12y&d zR16EGo|iuOKu+6i$f?MGHJ|k3PAGc<0<)g@qAkJi*>y?P$G9l1MTA#b!t^Dv?F8&=%*{r9x9ZgNX)eQ0K+;&wTe zK5LzE5B=&%juIz0ph-@(A>z+4Wq(Y%IhOJ4DWynTKihIW7w-f+d9ZCU!_rqqQL&Q) zu$mKLpMPu`!NxJ&-B&H)Q$O0?{g?$xucnkcY2}xW!QY*PzB;jvl)($U!gg5uF2GM4 zgjrEOigWC!{cz}J(w4eb8eJ+~d&avPbt()(_oLa_b$g$C0D3f5UnIBW+Cyf)O@G`+ z+@!Ey4LoO~yT5fd#ChIRZ(V-_S%4$ngJwa(2z$j7wa$y6p)0c_++nC#n)d5&6iF(+09x^4 zS#Fney;Rv*>EsbW{Cyy^X6t6gTtipD{_ro<-wVN$`@3(&gJZGC(`o1!^9EGWq4#bHvS1c*)t`N7i~Y zBqwY}(gNROL=&PZZCHx=(f8+kse zA2y-qekY;zdcCXH@q9(D6sqn4(wdq!?tUQ?-aKWRwsL=7d~Nk>#f0@Bb@?a`t62Gh zM*3?1P-)&(C}}AUIc*N!yU<7}-p*>{2S;59y5f1~Td$TTjiRI0Zw04Nkk=q(oy2*y zhiZ(CJ(X|SENrbkrDh&Y2Q}C?IV2J1CRWf7p9Q14vW=9x{PVVn`yU_M^0rB!88c7o z{i{%iAzvTNw26?ECnb}6TM$D0j=x)sK>QtTZdzh^x05Dl^`Y#<0mIT8sEQ=7$B5fj zk4lS6WQ7gDPZ-dgE@E`^D{qi9*$}a2SoY|OE09g;*~CLi!;S7z%jy?dYrl!#Cl7Yp zeh2p$UT<>1@=nG+2$qax@`qmNXZ3tLXha+6L-c$IZAc zJ!o;D)x^lO!=Arcn*O1ugnG%%G4@^4N_w{dBb1E4vUph*47Vy@jm^;$-ixGXOVnY8 zvGWBq*#Ww1hpVfEUZyu{P468U@|$Mou^vERY7}Iv$m*Y;QdOZWku}T{Lk!u<)?gq= z-g^#tF#{$?nL0@Z5@^JRr@r4kY)82tXTNNeI-*3 zxWYM-AzF+3)KFKFwedu!!*$s#PF=P671fCuaqNnQfew5L%RN)u=pMnU7Wj)fgdMR} zjbXIG;YB0U0P6Jz0O>+i`AKm*duTNHN9rO5o25MCF?=TDK9TCh)=ma%b=e`hTv|At z?)=jhuPY&rDT_~&isR^YG!_wW{eU(vkAwZbsqJ`@*<^sRgz3^tqA->a^nqP@x#A0v zq6Blry7Nc$s3&P`DwMCH23(;n{1#wiz(SGhaNbMz z7tYTvV|MabwMib9Bo#T|q8`Rh`B(6U*CfyeiL&GnPOkA^^oG(B06gkC@g@G)`!|bO z(y^trhg*dd4^M9sI^WP|Yt^V^Q3j}GQ9Oxue@t1OxG%dQbdk7*9D(Sp^7$cI!N7_{yf&n z9Oe{yFw&I0*G(w%io3CtbG^3|WoN+xLF<0pWOfx-daxXfCc(gS%znHtWI7C*ZTfdfR{t0UuFmw(X}C#e+P!F zWn9Y9*}-#wK>0mUZim{&!aNcXwRYr88ep8>=u^lamScY&*;%D%F+jYMoC9PhNu%kU zhPeWtBwfbzlktur6QHq`rcP-)(1FW!ZrUN*Fno3U@_C&qwt)Tl8oM<{0wbuyqZroz-+r{(c=m4HAHwU9^kT$cX9-9CK`ztGz3KLBJAFn;e-2 zd!Z#`{Vfa+0Bq{s5ZP}0lA`=GEx}DHou~zMWNh=e*z2Zt#hJF>_Ya=^rD*>AlDlFt z7fVR?X&0xPye?HC3p4v0p=UH#P%Q$gLbaJ3G!87auV1m=f+LVf6H_T05cbWY#e04{ z+eS>|^pghr4|?We=1pMw%7q9yIzaE1kh)>QiG9#^FiJQMp(BcwUN;fh+EGf~WNvA; z4K^m=zGs8hHl@7f=+c~0`*eP#Bt?v3zlmLJZbJTBM&n--djG{}{ImD>3o|3n_# z?TqQ<^iBWq;b3gzgwM|SPxgTB|LYFn|M{w7_J3CuGyJFhS(AnSpR@};3;q8?P5jS; z{x6IM3j^E#%xJX9itJILr&<6V+-*~?5}tVQ3ZRDKtv4Hd#4nHq!Q_l2glYF=LZ=ku z1zux1cys~JgX9I!VUxK)THa;U>pJc&u|={(PqlBS`er&_X(aq+_DJf=)Z;1lT2uw# z+2m>L3VmK|^eeU;HE#viDFysBMG?-saV@KaA=o~}8Ndrcld_>g!dq_ z6dcr2DY1McPPhWq@U;AZAP|aQ>^bQ4PWFPXfa-VaT3dDIoWKM?hIN2p}b~z zX^SV@F{naa7}ojXBpQ;foW2>ol9K};E6yoqm%4U&iM5<`CBfh9DNfo;T=YS9+9C+z zIiy;!Wh$mS3bP4kv6b|pNByVcerJ=U)oVA`m5BR7%fMUp_w_@jqWO2{dzevheKVdq zM}$!($=SKszO|f`z!K-C!Q8FLNlb#Dr9*nv@^|3l&=a7_(Eahici1djuu6onwPY>J zx%XEYONpS1xJjr$dX#z{=i;8-b5%sd5!|_Z*t7%?;@vm#Aa=6Dt0E+!ZPrkaUFPjhQEe?PVAcS2*zSD0D&W2k+Z%PtnIumJ1;%3?!#@cC6Omr$*zNh6yf4@6g%X3*_ z8E%MLy`8KgPAMGy!k|~no!=>4OIGTmgn9cLxpqlvXqT4#&j{iS)F(}|&DS3q5Dl)Ar`m_ONFPWE z`(yTHBN~yVmL9h0(+DgKn*vqx1^u)0(&*K?7}Gx=!!-+n+_QP1$dpomddIIaMOc?d^i!?@3D0w4Z|+p5lx9>qTab^Om*&$b@D2yoQz z$%G1ct@jb(-#6nFDT#hrT@m+;i!8~I{dSwqYtPf3eOPb9?uG^{Jb3;POAljt!ckiD zSqf(xVVR4x-mjyax`$ceTyjUVau9cibV%bYp3XrEceI~c8QaE^zf z*Jc`A*qVT9e-$!#RqAUbxvYC?MbUWeAn=CAROXvgMpBw(HAt7x(c{f`ljjRj>=&Nq zI-phBuK;Qf=8164XHIvX^+qG%kK`NYQa6~YsQFd%qv zHbiBvS`3n7aPT$Vg>L1lDgrKcu2+{)h&Y)h5}Q))k6Mn83J9g6+lFq-2OM)7CU{27 z^0PH3rm}p%RX2QW{C49qJ2*MQ*RC5)>zEjU+6dr)3Tnn07TFUGxtmh9X8(_6 z8qt>|2b-5oFA9r8m>34wzK&Gm|Ds0BHE+1mD~)9&PwZOi0TIN@cNcu(9JvS{lw9-& z6?QNWVSKlX4=eT;;KgVIy9z$8CQwhwgMuCcLkZ}odC~7ssRR{}c6Y8;sb?mHPHSMf z;vf=l1k~{JXsN`dDSI3?E~yTTHdID`mitYPqW7-Se?m4SgH}UQO~NhjMTUTpjpdWy zSh;sj`ZH~Ak^bivhf_3)GUzCfr!nVlGk;5ir%If&lP(h?=6I?SbHXAkCB6<=)3KFw zC%mmARQt6TE~WfYm2rA<2$KW;$Cmlk6(^Hm=@U_TV6w_G1V3U*JyV`wp^Rh=n}A0=Il-BV8Z=4B(fQ<$%W z;adWW4_i7ymirn7TlRR`3|6C?Ffu6Vdz=+9Dn+ zXPA(0%PNt>IwzefUbJ~~rns>~J5TqrA5l%j%EwaEJ?lti_m-5{-;tB95u(lCWcNx= z;=o{93-gmZRq%`3Wx||3d3JIew6N{>VqFaI9PcWnj9jMGjURS3=@N)Uvr(EHvB=B& z0iQnmX2Bse<5oynaCU^mrGgT;>o2^240VE0WTTDK3oLd62-UmA&2>|6_o-IiECn{V~`c3!hEii zzj^Jx9zYLXSOsE2&0Xl2H4@cV1Rk=>F*iTTrZ!lcx~trZ_Tr+@HY_%6dWES#cvD}F zzF0;X)5eQDZt?p3vfDvD>uv|+;6_jYOyP;oP?_jdvPb6!ArvV`zuaa}SdFF&IB@4Y zMYp_Cl>JfeiQdN28v}mPDa&LY%Oqm{Wo$YTJUJcTSpvYN7fukJH_oe)t?44_KAA-G zT<%E&OAyyjj4wXNAElwBQ{vn(33}~v+U^_7P_y=i<$-5$)>104vuX2nU*n+E`f+PF z8S)v1Qc0C(-b^>fm;9ES`&Df8cWz8p4au5awZ6rS#HoGI-|C7Yys_oJNx2I^NNwwA z!c4`5qMi=3z|P0TeJ#Q{wd`^W`hLTDY<~=_YojTN05yuQ~~sF+}P&iCV?v01w?lJfcJ>x7eAt9az8dGfuW zoF!Q0$WAbHER7+-g}DLL9t~tr)8b{%yRRGnVL~od)DgBW_Z9ea8mE53tPCF4*}$B_ z&8<}30WB{`?To)rM?yr8jZE<_mgt-i!UB`r?zJHKsKzatWQdn_l0o3;f^5GSTq$<; zaSdP~^LMvMmiIA{4a<|SM#=B0qP#1raEe8dMA4Fz$L_-5GOdicE6=d$G;`}bZS?$-H!v~AnA&7F4U&YiYx+qP}nwr$(CGke$f*XjDZyQ1z+M|4E5yLq=_UaW}q zj(0o{Z8BgydvDEYv{J2`jY}<_ZM2sd=(&x}8D|*poMHSr^}I-*K~i4P4FH-`VD_0Q^ZxOwA|A*xJVwC z#vHb?dizIom4uFdCJ+4!lMj!v>Dl+sAyS^k++e)|&<>MppbU#Df_zRb<>vGRn8(yChy8?72? zb~?uDU&q$)(Du>=vIBLc@-H{p9$UxuAg~1$C|ar~+_v#Mu`;+RO?}SOh{GB*SkW{O z31Os`lJvpehip%saH7SV_d%0gBYDF{5&3_TEUwz4=8?dX65=#LwgI@|W{^M7CKjO{ zx;1Y83PX2_om`0ebmSfd*=! z?^LS3?33B}mf|kg-w8bia`m8DCR%XG!trjrG?EH-!%qh#HwX)SMu%HDlY5nxL{cnl z5;?qkA#p`-UbXQU3S9dB=*Yj^7G&3RHMPW{pEH6fTzup%12kY(@!_rrB`Dkc8P`KV zH#T{hX=B3WsrB2fvJ?Sj`)%U*Y!Stb)1Y!rhn^{Z1XgLjt;bnbUGkaU*1fU!&awMp zr0Qz`f0MRn1J&LJ^pwNebqVO0NvYEB;zp1bUK%{v+6n$~Mz%SI_Y>#4VO{~nFtUWK zi!a&;w{NHKoOXX|oa=^)))E@7CG1w{sK959vgCEm2B1!f9hnIV%NVrsWSHSq=lG_h z8%tR@alMVwzV~@Fawno|HGBDv>rk5IS;E(;P-xu0@s_IU1My%Db^uh2TL^K+?*LRr zhxZFbx&fd1rt>)WNLtHjyC3A#q!h5eRRg%ALs*S3;cNG+v-?ZY{wp3X!5sa@B&6`I zE*J^6Ph15$RsF<@s_BWRxy|m-h_W^O#66(MLSvU44$vm3Nnndzt7rkl;ZQ9fM7OW3 zmp85cUY8zN6pOMcah=|~v*u|MDD{dEpAzX|Ho=EjaDU+&;I@azsAFm^xw z#F;BK`;58qOlYmAg>%zvyVCotl5`qoQ{pK+eACgsBM3T`?c% zeAOMAwF!{S>mDiHCdrdMvs0%Yq?HC1bD#NYe&E%x#>Sp&$bL6c;Kt`^H9k!?}j7~&Q-r(n*DW*}ma zV@Jr8!VyMvR^F9M#Vh|(v1{scKcWxRd>sF6!PM@8**ET1_TM_q;_+uYsC^kMQbN!D zC@vL4P3{6VI(?ceomrK6mQmlB-DIz1J5E-71qYOHlBX3zx0@o!8)nqP6~&Jjx# zM(HyZUsTXzF$;g{=@%~J4hjIscor8MnlQ}rWp6Wa(>?Uevlh=RJ{DbBrZUb6Tn}ya806ujb*w|J;3=rS|>fye^vvA=FfJD`& zUC70|4HpLt_!#k1$WwK}6G~~Y%$bVTmQ&-P#oA^xD3FSchgpHl+5)VUxNU`F6HOc- zqstW0DB_AwR}c7vq#C#kCJGeW%sQh7B3rEOaGa2bLJ+)RuGh!YEI)x<0%JZI)p%L` zX_b0`KI447Z36efihVct(BP_tj1%GN$#8}bBXpryL9TO3p0PXx@K%-A!E01X$aw&R zpR7R$$<~%$D7OSF{9!=2f%3&CV#mULJtIDWVTeJw6QA+zyQJ}VTBlbL*TX;{AJ2X= zYy^=K756}=U8`!>oJ4Q;Gc|eAz(`J+>QwerS*cA{XNn7 z+FER&7+9(TAP58{ra2e34!*rDwXu4bb@$2^XeKQ9d;49|tOEi}=WEu<7k;Z;BPXc$ z+E8?5tbgsQx`?^8bqnTO^pcD!!LjoW~)3KrEwZl=7{ zr|+vQJAhP>1{i3-f3^c#(M`S>R+2qS>!5H)t#g)^6@U~q#jCIjYqQA3XQhC^(gltn zKS5oh8U$R{#a#<1VHNCu{u-t!8R-%HQw^+079685*>SjJnqGV>0Rpf5_IAewH`Eld z*v2DVe4HUZFVrL%4W+9^Fy!XMIjE&4JC_P8MW*?ISY5uNGyQc286ym@tz!|m(UfhV zOh}tLw-1bPt+q8wxqnot;7iG1K}sX zyu+YXrq*SeY_%*KrKsK$k3K|2L=$J6ICUuMx9h^J)!0=d1e%#Pi;Kc~6ZbH=1l|O0 z(q2DgTJx<*$)nvx$0A5?SfZ@lSPqU0bZ_)S6GVI%4=eFtF&l6(X7V%z*EsfAXF_9S z*VWxH7l!@IH-CSkctdu$!q?p)Uddm^EXbP~(dS!{FiBn0(OY5GL5%0coEDpN zrk}-Im6$W^m`JV)1ICWcFTD?U>F6&XTa|r1OPWZppVO4KqAkl~)$bXp#@g{F6N(T2 z+tl~J+-U!2>idsI?cY=1f5FrKKeU`J;LaYaLiBmz_HTOVmmZy2N&~^9GXC>g)V?IqJf5cR-eow z=a-N9sKG*x)kjvtsPH}&OBb_i+^k&>!$~HQr{k`xAWfK__WKb-Ai;0yQXL|zMQm&( zzOYnHqzp#VAbe+H$2a^HXS0H02Ej_?H)%XLnMCU#L(X~=LbzC2{j8Z`qo&gDi_^Y& z=>tAR1x-QVve%I0A*JUys-v;D68mN_C;lcy=xpQGQWXV9Q){(TT!w5twBF$jR&fU8 zu|}2yT3gC2>@}VE&XeNU{!#!CE#oZ_#pglbGT+88Mw^|&BI&$!t*mi3<%P+SWVz1> zuPJ}mzpZulq{o2Y&__f6tmJ@-rE>p*iteXR&49H?d#7FQOvs8%o~8L+Ey z$4GNaDEc(}t=o1w`_f*_z35Nxv#4ifQp8w?gV+FzEoRX>b!n-kUNXV6NVxreTlsn6 z*mWj@w!2}`j?K7fcdYLLJm{&3UzDPMWQD-bP8ssd@xX9!yZ2SDc?>naq||^*wY%tv zzWU^DO+t@op)-9Jg2Zh~rj+dHA0=55QYw9?Gf4RsOwK%Jzq>aNEfEuLSl~k@@mf3z zP9LjuMy85oVpXFN4ReW5df15SxnrbK_4_fdAh?=`HiFY)k;b`%7>3=C=P$;gE3~2! zh#OtErzDe3n1;H(si{ghzMqk?;1ZU5@;ko@VM|OF295q2GGVLJJzWkp;2JKzGtur6 z$wilLn@S~G(hzrvc&3yDxLXRBH}j(HbBA_gL7q$r?U}KMBa!jXY)prDfV&y*et=jb zva*^C$+Uqe7v+3ZsSO308Id;x zoKVk)wf*L3_I0!}Y=s z>P|5=v!foH?XZtsCwtDOOn&LB)1L3Fe>0c5V0tXZ)VdtN0w~hh8^Kw(`B4(c4@H=z zXpbHSL+zHOey`Nqs1{)HY;c zO>SwfrhLRVE?13tYm1#~en{*^Y*y_=F0(jjIF3*cO^wgQ=ETgFoi(t731j3**wV|+ zJ{E>VX<`DXfeB-gu!uS-;4-nsLw8*oS}aM&aNWYs(G7N4fk8~=>ua#so#y@W{|Y8~ z!?F=ZW`*Zmm-EjcO!0@sd0R2(R66NRixzHV(BLxH#2)wARo0-#U67xKAZp`(+9pg= zRm_;xv&rMMEOwhaZ~cC6-;{d3VuCmAz@3x%vV#LwCDOCytRnV#Gth>-=;REy+zwxg zO-~u?pb^_RO>5c8;U54Xguz@WA^G&D4tICG#yhRSHwBKF~>-U-}(} zYOBt<1zv)DR)>%rk@I$=^+hnB4Tcp`9SO6NS(T!I{pH$^G=JJG{z4X;4mh8mz#yi+F7#LeO-FD=Q#lFsNy4cFyE zP@3h3xo;1^>0;&!JFnbP2Nuvx267YXv(l<~@er$3+mj)gN7 zvDpb$^zM@wk&HXssD)x?LU!8|v1k^ZGOj?V*17tgy~lv72NH>GZZ0w+$EdWU0v-#8Nk?zfu2gtkJ% zPoIF2c%Qr2UnaxblsE%VZa1PhV7R$pwoR3ZnRr}Wnbkdn_7lw)RW$jV8%yX0!K|K0S78#9!FLh?cdFI%OLH-sD2ZzF|+oNVlg;F*4H)PO^*V^(&eRI4O& ze2Rc0SnD|nMl|uixY|!KH=EzTaNZR+XqC_qxKqyvYA1_+*T|)?>))F?zF^~>TJC~K zIxVRTY+8PXZBfahPUi~^d3NoN8cBA}Lw+cqXYU7IrE@g|1$i(oP*$0^X~Jm;BV3%2 zDz@N^py6_-l!yz$GrA{__(mSoNiu-w-YLst^jgqV6$YzqxwAGtlW8WJ!Mo#=26Z5- zQ1mrD-&r|f9cL+H1QHJ%x&ebjE{>=aaqq%6XceMVzh>enCzIuv5k315b((CP($Y9y zUi0sLo9vlpZkLvjW`3Gng((wx)M&hy*L4rehSpFunqxJp!j^}@CZRxKI1MXh9KG;T zFRH}OZmSCB6Q4%)f;?IZ$}+ZZmyye54ER^?<+Mk$QfZe$eHl^mW?$*lRpyeJGx1%T z=1F^+eh3c4Ufm6iFh3l|4lrs-5_%*wKc3cDRM0LP7KOyMz3S=OZrW!#Ut+VKx)lne z^-%+-9_pQb=oFt*=S{0uF_(>G@tUNh1go?jp+&s>}Plq7KKB3z+8p#6*8_|OA3t1zm_zQeFGS7HX^mp9o&J@vz1#sA%005P)|a`es;xo{FwO%GCy? z@LhKQOi#9=`dd8r)*|EAQFG^b!+i<(fXfMUTxT1y{wZ`K2d5@zQeV{MpHX;QAA3?- zq3T&t4y!JAMNaOD_*6F|bTQgLT=_h%mW(N)y`Ca~r(y1B&p3jrx&|2)cLoeIQrID2 zA2MF8M0r&<-InHs{K=csD~kjku&7Jd3g2#IHsDYcZ3WLyI~S6YoV*ev{gba*)cyxp zZ&#edUEwl*FXo{-$(&~TmtB+_Z0Z8j@o@9csMByD$g`VyQOl}F=cSM<$C;^1!v?k= zpV4|eFr~@qy=&5+}Jq|DokV;BancUP

H!e!_M+elj{u&+EbIg1YA0uV;n=1bZ!?shS$ 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 Rg~Ak?sHCK8tS2<_{{h1Xp#T5? literal 0 HcmV?d00001 diff --git a/docs/MediaRenderer1.0_000.pdf b/docs/MediaRenderer1.0_000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0fb0c7fafb49296bf244f1aa8db6651150736710 GIT binary patch literal 96205 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 literal 0 HcmV?d00001 diff --git a/docs/MediaServer1.0.pdf b/docs/MediaServer1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b45bee7874662cdc73d3f343b9f0068fdf7095f7 GIT binary patch literal 114157 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

H)WEaIzZHhy4ha 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

VvEC9-@49j$^|3r--2)Os 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�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%0AbeN*}>?}QiXJ9B-YM}wCjs!7OV(t?J;dm<6 zQeW&QVWQ-jXhHZAVmT@&O>iwPz#ajtmFNqBVIOq0nR!)?i-t3AX-8!gidH51^mfrZ z-1*qD!B3Fm`M73N#g;!7o?dZy1?J{!_TlO`Ql;la&LNrIl{vF#2%#s5OK6k2L*tLe z$3=KU(pm>de(+aNjIoPoCly~2xfkiPT{i_%dkV*aGlQ$lR%S?>?kK8UBIc0j`KB<3 z?@3e2B;Khe9?cCGk5KevHg(1fpD0LqF?l&w=ODE(Gdrh#tdMAKQ=Ikx9vtKct0PGjXlLLs|tR=J_!DIYf0XUGCs&y{haqzD zZf0B#C15R0Q((Qvko~BzsPj+-u^P-jb=+3$ENl3{m{ZpVHE9bI3diu9w(aSJSskIo zIxiViWappw%S_gEkQMuE=@XF(-0$M<@xa;xvSKHM=j60DEqSS_WmzzrgAm*2!Ayf% z5u24qiE5J|k86C6L4L2lQ@+`FWGRJ`b(Lcvmr!N(xuxWmP(4rw>VD;%MjCx-o2zTd zJjF+#`WRe$ibYT){4r^f3;kk59;2ErdrHPK{xW_FR;#4^viWpmODacgAnB)1aoYc} zY!wYW)4`dfWvsOexXNN&CJ8?t4Y>%K9Vwl5@SaDN&BCi#+wtw){^R`nl)Vk!^jE5b z8m`}V>rrxT|6QTj;}~J@!B88_kdiTzmfWVW+cBmt$%p0Ub;D3VP&M~M`L-E-p~&Bp_v zxjqP1ztw{c)DIt8gDV8`*|~VU?AWP_zi#V@nuoluOsU-!Y*;}Z;E?wyTU?yg2^nPT zS_209@RRZhMo{LEX4wtd%K>JDtxV+3RTtvYa!B6aeSV+7cPySsiH2>kGEgb8by4m3 zfyJ&j&ZgTqkh&f(jFT3s_B8d7=5b5kFMDex&E4Kfy%sd*jQBea^A1jk-Bxwf_4XRY zolm6)A%G74VbR!P7Rl(-1It)j2?IqKf|i2DYLX^EvVqolr6|tB@o6Cx6H+uv$6~*6 zQNy4l3|FGPr{5@;LP@y&t_!D_oS%(%ilP0;o`G>P-ejwciQ=2zGs_6u9q-st5j@oJ z6`5+Z>O)QYNBCuJH#UgB$qc4Z4Dd^76a{|iZc<|j>JU~6-=L>^me-4bB`~G`BG?3z zL*zv8;IkCCMl%yic}jZ>ih6M-T|Y@sxeK~FQ~*8=-2UMyI1S}rf�!4aWUVRQo_TgJ%TA^K~b4+O+T|k;odQ_ z!3chDa)stgV~k$2-xY#9FIL5W#j5kg?nAoGZU$1K8J>`cDwmMjqH&yUIN49SDqTL?mYEuNC}gTQ>-Th<{^h!}=qi6@jlkR|Mm{wdS416^(j2nL1t zQe#KS9`Pv-4=RCts+=~tyPISVh&9TY_q=X&Ar9u~6O|2pmI|>uIOhay22_&NfZ4kQ zGL}vAyJuHhX6XF5Q;s42xLQWqG^#Qf0_>YbE#w`p@ z%o_PkVQdN01p(%Xw(m0Fb_utZAGm;Qyi+8*E$R@4$`@2Ol2cWFsD`r0;!zNrcd?-` z){$>!>lff5#q_SYt;WoWn@=pS>pAx>1LJ2=^$ydbj8v4;c|XCmr`K6hzRcdvV%~S4 z)8=n@y&GnLOtObmEnlm_6e~uL-V4<^^7#mV=XE(`d2B%bM=!=Nxa)9*c}mztXb{EQ zoRLINQ_E47R2O~9DevD@^HAtfbZY}_rTYgtf~G-e5{|2Cp(Ylp-i|HX185&FgWWtPQtXq$8p(q>1F)0w?L9i~_o(A#kfYWAi z;3o!x>5Z%3t-lrI8-xHprMtFN23=m^pq@!4@B#14=#OkeHQ7Dc109_iiwq9y27wvhu6*WvkoTDF%>i)eKrZ}jDb7Us7?d*ltZp-wck51ssd zlj4l$-0;23Y@iA0uauC|DzeOw2Tgd!`d1@jH~=M2q1)}8{?o;wMI#hQ!q1Y{hGD8r z`Fm^I@cnuADY^liiUa3es+7;`TVg(@m8MUFtr-k*gXFhR+^X;GdVA(x4c z*dr81`)z7$f?jJdc9<&6lT4LT!Pb%Gy3G2S)c1)Z_$+D(#0t2XHB!-_e%=9;hU6IV zdShPA8KVa2KDh{cbK-}geU@o+lehCDLadCfMDL8})0X;7CXk7KN~ee9o#e{ma92+6&~C5b@O@%a=U)_Ve#Ls>;_c z=0@n5hZh~8{gY-KgIB%po~VQv)&(Mr=8J~`XrdbyiMHH@>#3?;YrFdis{&o6y5ka4 z1i5j`+%@S%fL+V4(7!5?hrAGf4ZVlcm$)6ynG5#YCyb5Dd~~- z%3{5UgDX*YIgpHJw1D|o2rrHyTQg{;&@yG;(({c0-C#oGu|7JgKtA6kJ^0ML>~$0a zF~XeSgw}q`(zfZrIbL~l5;aZx@DbH}j!jk4$z}BK{U}9p`RSio+9G}arR==2ueRDG z?FaZaW5W?j+}6F|0{Q5#-G2FKvG$QkNmEP2$ge|EB9VJO?hhxq3N@;vyT<6KFSRpA zSJ>J&GP-wYuRG+9ZbO8ga%hL-bR~IzIb|o)IAuYxg*~?R>Ei-F5!p{kZtZIuHdKP7 zyDU9nA8o60P1qNb7=8e8j1_*YVoXi&`v@~DE!xZ|ajIX9PYL+cO2{k)8wN5Ou{|Mp zD~Q1xJj&7rwC�kQf1|KpK5)8=e}%HwOj_rM+*}OUo;16swG;YOXyG|K0d4u0Vpm z7@T zsY^A+L@uefAmYfUI&rq~VK9r1{%SDt&F}C>ckWfY^B&*#5XH>BykKl_7G+kCE2mD9 zf)L6hfw07NTpANLf*eDC(x#HYQb)B&|AgLJ+VrOST9gYDlCtlt( z)ygTVD)DgjY9Ez#_1#qI{#Sr0CLm$NEC0;qg#U(~XJaCaloyq~Wd+hD6PIEJ&i(4e zEB){4XX&c-6`P=YpGdU5VotPLCKIw7 z5MqLLkQ`pP{ngw_{5M$as2y_8obF0&4j@jap#@dhB2Y%2YKlBz%!%V+4?5NROatik~>5q|3AU$hqdP-*Tjt?))90QiG6W4Gb! zMeB!u|67zQQ}Q1FJ+EQ?B!KL>`~Wm+gzSnV>O2Q0#gO%Ei)#j#&+L&X{iy3DTp|#5&`CDy;g1Rk5;jZNJ*2q zpm(q4R$ii_U}-b*lj`ZcFjTFL?8_0n(t?doHX41JXEKmdaC=*ZwVbnSXl50D zGR)3EX!*{hExmm#Zgp@LIxTuFCg`c=FH|r`&>~90q56T_SIRfb(!y^}768_*!h=e* z!#OlX_9EGIPzxnxv%V3kN@kmQIflK%yDlf_ly!(~Vo<>2iF@%^14|-0j zeUYkmesaZbyfz&wRYkOBl2{ca%bRL{H`#;sGb;@`(3Cv0l|&lsSv><9Uq1TZ!HJ6` zmb&T4(&Xe22^i3-z<~DBiN(^7lVzLK#f!S^V-5nx-uX;?-M>vrhnx+FWzTH}@ELJA zPGH=_s9ot1x1tmR26)Yn7Qf{km8;tdM^6dF#U+f2?x1S6{Sx5#W22T*&`j#n&^ww- zoMvUnR+%472Y5YU&L!kUZRuatEbC0>+<7Rsg-M~NW9)zu7$(Xg9*>xU#Mv27*Er!3 zxvbhHo#TFTcn#Xg#`sO?i|U9IPuzTtD#+Smc=FuIP|FD;ol`FANfsR=E1c}`;BJqp zaJt4+L69L5?Uv4r&$<-x5l*;Nc>{b^X!kXTk60yTdo;N* z5*aBD)lK)!y6UlIcgS_HLZw6x-On4$ljS}7|DSpJP&szMhqL|UT?;fq?y~rod zOJhpMpkZ41flOp7#hdleol9UNXRKi|((kK^q54(zrR7(rMa<@`3D52vY-cYmdt

kOe0|DJeNHOu-qsnfRbi^ggMa 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
%s
' % exc.read()).render(self.request)) + self.request.finish() + self.request = None + + def startNextConnection(self, request): + url = self.urls[self.urlpos] + self.urlpos = (self.urlpos + 1) % len(self.urls) + log.msg('starting transfer for:', `url`) + scheme, host, port, path = _parse(url) + protocol.ClientCreator(reactor, ShoutTransfer, request, + self.startNextConnection).connectTCP(host, port) + + def gotPLS(self, page): + try: + pls = ConfigParser.SafeConfigParser() + pls.readfp(StringIO.StringIO(page)) + assert pls.getint(PLSsection, 'Version') == 2 + assert pls.has_option(PLSsection, 'numberofentries') + cnt = pls.getint(PLSsection, 'numberofentries') + self.urls = [] + for i in range(cnt): + i += 1 # stupid one based arrays + self.urls.append(pls.get(PLSsection, + 'File%d' % i)) + self.urlpos = random.randrange(len(self.urls)) + log.msg('urls:', `self.urls`, 'urlpos:', self.urlpos) + except: + self.dump_exc() + return + + log.msg('waking up reqests') + self.afterurls.callback('foo') + self.afterurls = None + + def errPLS(self, failure): + log.msg('errPLS:', `failure`) + self.request.write(failure.render(self.request)) + self.request.finish() + self.request = None + + def processRequest(self, ign, request): + log.msg('processRequest:', `request`) + self.startNextConnection(request) + + def render(self, request): + request.setHeader('content-type', self.mt) + + if request.method == 'HEAD': + return '' + + # need to start the state machine + # a) fetch the playlist + # b) choose a random starting point + # c) connect to the server + # d) select next server and goto c + # return data + if self.urls is None: + if not self.fetchingurls: + # Get the PLS + self.fetchingurls = True + log.msg('starting page fetch:', `self.shoutpls`) + # Not really sure if ascii is the correct one, + # shouldn't getPage do proper escaping for me? + getPage(self.shoutpls.encode('ascii')) \ + .addCallbacks(self.gotPLS, self.errPLS) + self.afterurls = defer.Deferred() + # Always add the callback if we don't have urls + self.afterurls.addCallback(self.processRequest, request) + else: + self.startNextConnection(request) + # and make sure the connection doesn't get closed + return server.NOT_DONE_YET + + synchronized = [ 'render', 'gotPLS', 'startNextConnection' ] +threadable.synchronize(ShoutProxy) + +class ShoutStation(AudioItem): + def __init__(self, *args, **kwargs): + self.station = kwargs['station'] + del kwargs['station'] + + kwargs['content'] = ShoutProxy(self.station['PLS_URL'], + self.station['MimeType'].encode('ascii')) + AudioItem.__init__(self, *args, **kwargs) + self.url = '%s/%s' % (self.cd.urlbase, self.id) + self.res = Resource(self.url, 'http-get:*:%s:*' % \ + self.station['MimeType'].encode('ascii')) + self.bitrate = self.station['Bitrate'] * 128 # 1024k / 8bit + +class ShoutGenre(MusicGenre): + def __init__(self, *args, **kwargs): + log.msg('shoutcast genre created') + self.genre = kwargs['genre'] + del kwargs['genre'] + self.feeds = ShoutcastFeedAsync(self.genre) + self.sl = None + self.pathObjmap = {} + + MusicGenre.__init__(self, *args, **kwargs) + + def genStations(self, stations): + ret = {} + dupcnt = {} + + for i in stations: + name = i['Name'] + if name in ret: + # got a dup + if name not in dupcnt: + dupcnt[name] = 2 + + ret['%s - %d' % (name, dupcnt[name])] = i + dupcnt[name] += 1 + else: + ret[name] = i + + return ret + + def checkUpdate(self): + self.doUpdate() + return self + + def doUpdate(self): + #traceback.print_stack(file=log.logfile) + stations = self.feeds.parse_stations() + if stations == self.sl: + return + + nl = self.genStations(stations) + + doupdate = False + for i in self.pathObjmap.keys(): + if i not in nl: + # delete + doupdate = True + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for name, i in nl.iteritems(): + if name in self.pathObjmap: + if cmpStation(i, self.cd[self.pathObjmap[name]].station): + continue + # Didn't match, readd + self.cd.delItem(self.pathObjmap[name]) + del self.pathObjmap[name] + + doupdate = True + self.pathObjmap[name] = self.cd.addItem(self.id, + ShoutStation, name, station = i) + + self.sl = stations + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + Container.doUpdate(self) + +class ShoutCast(Container): + def __init__(self, *args, **kwargs): + log.msg('shoutcast created') + Container.__init__(self, *args, **kwargs) + + self.genres = GenreFeedAsync() + self.genre_list = None + self.pathObjmap = {} + + def checkUpdate(self): + self.doUpdate() + return self + + def doUpdate(self): + #traceback.print_stack(file=log.logfile) + nl = self.genres.parse_genres()[:30] + if nl == self.genre_list: + return + + doupdate = False + for i in self.pathObjmap.keys(): + if i not in nl: + # delete + doupdate = True + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in nl: + if i in self.pathObjmap: + continue + doupdate = True + self.pathObjmap[i] = self.cd.addItem(self.id, + ShoutGenre, i, genre = i) + + self.genre_list = nl + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + Container.doUpdate(self) + +def detectshoutcastfile(path, fobj): + path = os.path.basename(path) + if path == 'SHOUTcast Radio': + log.msg('matched shoutcast') + return ShoutCast, { } + return None, None + +registerklassfun(detectshoutcastfile) From e64b88ac3b56b0bd4fa22db83bf072dead42dd26 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 6 Jul 2006 18:02:44 -0800 Subject: [PATCH 073/179] acidentally added... [git-p4: depot-paths = "//depot/": change = 825] --- iterzipfile.pyc | Bin 2554 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 iterzipfile.pyc diff --git a/iterzipfile.pyc b/iterzipfile.pyc deleted file mode 100644 index 28e5008d58ffb9f6f89068078cd6ba714db0917f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2554 zcmZ`)&2k$>5boKP^=rirPGSNiY)le1R3%j;ha5PNA176zC_~xCCc3EB+EG06YInUe zBC$)lBs>8xz?};Z!F%uu6udzAx>vFkD#)JRnV$anx_hSQtAEG z>`RcC=!mFOP84;Na6IaG6e~LNX!oQoET1|)?WdQiqAN6LQr0GgpI%~q>XG_Udt|EA zsZ#9G&#+me*e6}5K5SN)^M>eor_R=PLI$xFDu%)2iyl)C!^e1xVK+e>(HPJaz42(7 zJvzYh=(R_w!onw0A*M?#2Iuhb2EvLaipGj|#1&iIvQ^N&NpzaotC$W))&&PT$Z}mo z&ZIAbEDZ`BB>@YCb%@v+$YEq7=L*Zv`nhf5vlk^J{iGg-q-@5aV=lYH~(#CqEGku*XZ@wG52ZdDT`|m27rQ{uG-%=JStz zJi@RSK#)JKDE?6rRM(^Jolx>&=mAlWr)>-d!xro|)H#(irM^dln$(&z@6R&NBL2K0 zl|_DqGtVVxk*kR@UzR?NQK>qOTVxs(FL6y3FPh|9H1H^UUapr#q|L0nhAN+<*C;j= zCUtuCyBe1!mT5qgU4sg&u97=XV^0*JUZ)RX92oYFel}aSOM7na|cOkZtWoMJjhJI5=_I24Q4_D6p=; z9lRCvvm!{Np}r$sp%5C`Poass8HcxUMUO|OfZi~Rb+A!v1kl)sHtapfJakSEa~HUb zuW}r8o_!xgMeor3qyu*tx!@%`OL*@j=p~uev4I-dFF`i-?Ory_VcQz%1ye`vPzT}A zfXe_+6LY}6M~OCnzkT~w5O(Y(7hjkx5DOKTjORNx*YN20|cv6IawPrrS*3pX4!=U5u(C}l{(lL>>2^$ccqFpy>% z_e5eVOSSmu6+MamX_Q!9Hqfk}jO?LZfj-+rHHJFwy2vEbP)mz|$Vro9DHeB&QJIFh zPmw5%aqq-)A_fjj8rhyPvJLx3+Fj@eUcSgwj9vimHrQ$c}BIb4vgcNy~@ZPjk+gnj9 zYE7-Gk5pCpw5o1mURQ0uiuDRc$!+1giggoO=e&lh`B%ITR0X`YTJzTNz39s;B!P6h zoPlmvGS%&tcMHo!Fmu@di=7iNeGB>Jlaovmsy9 z@&xl~lyk+>-ENd504Av}pJbU&y@t#e#!QeSI6E0<2Yb;m&!_6|m@P5Rqkdnpxb9zb VS>>f~DE_M{pL4ESUc+lt{{_!K9dZBw From ddc672456ea90fe7da4c4e85c975a405e79f85a2 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 6 Jul 2006 21:24:33 -0800 Subject: [PATCH 074/179] prevent an exception because of a missing handleResponse... [git-p4: depot-paths = "//depot/": change = 826] --- shoutcast.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shoutcast.py b/shoutcast.py index 0011645..2c7e8e8 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -114,6 +114,11 @@ class ShoutTransfer(shoutcast.ShoutcastClient): self.passback = None self.request = None + def handleResponse(self, response): + #Drop the data, the parts get the important data, if we got + #here, the connection closed and we are going to die anyways. + pass + def stopProducing(self): log.msg('stopProducing:', `self.request`, `self.passback`) shoutcast.ShoutcastClient.stopProducing(self) From 3daff0a894a36865651771d38a1f5046674923d8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 6 Jul 2006 23:46:53 -0800 Subject: [PATCH 075/179] move the repr from zip to FSStorage where it belongs, it will now cover all FSObject's and include the path... [git-p4: depot-paths = "//depot/": change = 828] --- FSStorage.py | 4 ++++ ZipStorage.py | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 8f28de8..eaa838a 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -65,6 +65,10 @@ class FSObject(object): def doUpdate(self): raise NotImplementedError + def __repr__(self): + return '<%s.%s: path: %s>' % (self.__class__.__module__, + self.__class__.__name__, self.FSpath) + class FSItem(FSObject, Item): def __init__(self, *args, **kwargs): FSObject.__init__(self, kwargs['path']) diff --git a/ZipStorage.py b/ZipStorage.py index 536b897..804ab25 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -286,9 +286,6 @@ class ZipObject(FSObject, StorageFolder): if doupdate: StorageFolder.doUpdate(self) - def __repr__(self): - return '' % self.FSpath - def detectzipfile(path, fobj): try: genZipFile(path) From bb23c79b89f587ec830791928c47d58d4246d405 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Jul 2006 01:50:53 -0800 Subject: [PATCH 076/179] drop some debugging.. [git-p4: depot-paths = "//depot/": change = 829] --- shoutcast.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/shoutcast.py b/shoutcast.py index 2c7e8e8..de2904c 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -262,7 +262,6 @@ class ShoutStation(AudioItem): class ShoutGenre(MusicGenre): def __init__(self, *args, **kwargs): - log.msg('shoutcast genre created') self.genre = kwargs['genre'] del kwargs['genre'] self.feeds = ShoutcastFeedAsync(self.genre) @@ -372,7 +371,6 @@ class ShoutCast(Container): def detectshoutcastfile(path, fobj): path = os.path.basename(path) if path == 'SHOUTcast Radio': - log.msg('matched shoutcast') return ShoutCast, { } return None, None From 9d5bc2b3889cc9b53eb9238a7f989283682c0210 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Jul 2006 01:51:38 -0800 Subject: [PATCH 077/179] add dvd support through my pydvdread wrapper around libdvdread... it seems to work, though direct from disk seems to be too slow... [git-p4: depot-paths = "//depot/": change = 830] --- dvd.py | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pymediaserv | 1 + 2 files changed, 214 insertions(+) create mode 100644 dvd.py diff --git a/dvd.py b/dvd.py new file mode 100644 index 0000000..21684b4 --- /dev/null +++ b/dvd.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python + +'''DVD Handling''' + +import os +import sets + +from pydvdread import * + +from DIDLLite import StorageFolder, Movie, VideoItem, Resource +from FSStorage import FSObject, registerklassfun + +from twisted.python import log, threadable +from twisted.spread import pb +from twisted.web import resource, server + +def gennameindexes(pref, item): + ret = [] + d = {} + for i, title in enumerate(item): + t = '%s %d (%s)' % (pref, i + 1, title.time) + ret.append(t) + d[t] = i + + return ret, d + +class DVDChapterTransfer(pb.Viewable): + def __init__(self, iterable, request): + self.iter = iter(iterable) + self.request = request + request.registerProducer(self, 0) + + def resumeProducing(self): + if not self.request: + return + # get data and write to request. + try: + data = self.iter.next() + if data: + # this .write will spin the reactor, calling + # .doWrite and then .resumeProducing again, so + # be prepared for a re-entrant call + self.request.write(data) + except StopIteration: + if self.request: + self.request.unregisterProducer() + self.request.finish() + self.request = None + + def pauseProducing(self): + pass + + def stopProducing(self): + # close zipfile + self.request = None + + # Remotely relay producer interface. + + def view_resumeProducing(self, issuer): + self.resumeProducing() + + def view_pauseProducing(self, issuer): + self.pauseProducing() + + def view_stopProducing(self, issuer): + self.stopProducing() + + synchronized = ['resumeProducing', 'stopProducing'] + +threadable.synchronize(DVDChapterTransfer) + +class DVDChapterResource(resource.Resource): + isLeaf = True + + def __init__(self, chapter): + resource.Resource.__init__(self) + + self.chapter = chapter + + def getFileSize(self): + return self.chapter.size + + def render(self, request): + request.setHeader('content-type', 'video/mpeg') + + request.setHeader('content-length', str(self.getFileSize())) + if request.method == 'HEAD': + return '' + + # return data + DVDChapterTransfer(self.chapter, request) + # and make sure the connection doesn't get closed + return server.NOT_DONE_YET + +class DVDChapter(VideoItem): + def __init__(self, *args, **kwargs): + self.dvdtitle = kwargs['dvdtitle'] + self.chapter = kwargs['chapter'] + del kwargs['dvdtitle'], kwargs['chapter'] + + kwargs['content'] = DVDChapterResource(self.chapter) + VideoItem.__init__(self, *args, **kwargs) + + self.url = '%s/%s' % (self.cd.urlbase, self.id) + self.res = Resource(self.url, 'http-get:*:video/mpeg:*') + self.res.size = self.chapter.size + + def doUpdate(self): + pass + +class DVDTitle(StorageFolder): + def __init__(self, *args, **kwargs): + self.dvdtitle = kwargs['dvdtitle'] + self.dvddisc = kwargs['dvddisc'] + del kwargs['dvdtitle'], kwargs['dvddisc'] + + StorageFolder.__init__(self, *args, **kwargs) + + # mapping from path to objectID + self.pathObjmap = {} + + def checkUpdate(self): + self.doUpdate() + #return self.dvddisc.checkUpdate() + return self + + def doUpdate(self): + doupdate = False + children, toindex = gennameindexes('Chapter', self.dvdtitle) + children = sets.Set(children) + for i in self.pathObjmap.keys(): + if i not in children: + doupdate = True + # delete + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in children: + if i in self.pathObjmap: + continue + + # new object + self.pathObjmap[i] = self.cd.addItem(self.id, + DVDChapter, i, dvdtitle = self.dvdtitle, + chapter = self.dvdtitle[toindex[i]]) + doupdate = True + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + + if doupdate: + StorageFolder.doUpdate(self) + + +class DVDDisc(FSObject, StorageFolder): + def __init__(self, *args, **kwargs): + path = kwargs['path'] + del kwargs['path'] + + StorageFolder.__init__(self, *args, **kwargs) + FSObject.__init__(self, path) + + # mapping from path to objectID + self.pathObjmap = {} + + def doUpdate(self): + # open the DVD as necessary. + self.dvd = DVD(self.FSpath) + + doupdate = False + children, toindex = gennameindexes('Title', self.dvd) + children = sets.Set(children) + for i in self.pathObjmap.keys(): + if i not in children: + doupdate = True + # delete + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in children: + if i in self.pathObjmap: + continue + + # new object + self.pathObjmap[i] = self.cd.addItem(self.id, DVDTitle, + i, dvdtitle = self.dvd[toindex[i]], dvddisc = self) + doupdate = True + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + + if doupdate: + StorageFolder.doUpdate(self) + +def detectdvd(path, fobj): + if os.path.isdir(path): + log.msg('dvd isdir') + # Make sure we there is only a VIDEO_TS in there, even + # if there is a VIDEO_TS w/ other files, we will open + # the VIDEO_TS as a DVD (if it is one) + ld = os.listdir(path) + if ld == ['VIDEO_TS' ]: + pass + elif not filter(lambda x: x[:4] != 'VTS_' and + x[:9] != 'VIDEO_TS.', ld): + pass + else: + return None, None + + d = DVD(path) + return DVDDisc, { 'path': path } + +registerklassfun(detectdvd) diff --git a/pymediaserv b/pymediaserv index 1cb3e18..580512f 100755 --- a/pymediaserv +++ b/pymediaserv @@ -9,6 +9,7 @@ # # Modules to import, maybe config file or something? +import dvd import shoutcast import ZipStorage # w/ tarfile support, it will gobble up empty files! From e34305af0a149daf7c24c5c302936e2bce8c515a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Jul 2006 13:03:17 -0800 Subject: [PATCH 078/179] use bare raise when possible.. [git-p4: depot-paths = "//depot/": change = 832] --- FSStorage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FSStorage.py b/FSStorage.py index eaa838a..48abd9a 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -58,7 +58,7 @@ class FSObject(object): self.cd.delItem(self.id) return None else: - raise x + raise return self From f0a251badb62aaeda3070694aac896bd5c379ffa Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Jul 2006 13:03:56 -0800 Subject: [PATCH 079/179] make basic removal work again... forgot to get the id to pass to delItem... [git-p4: depot-paths = "//depot/": change = 833] --- ContentDirectory.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 836a6ab..3d4af5f 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -105,18 +105,23 @@ class ContentDirectoryControl(UPnPPublisher, dict): i = klass(self, nid, parent, title, *args, **kwargs) if hasattr(i, 'content'): self.webbase.putChild(nid, i.content) + #log.msg('children:', `self.children[parent]`, `i`) self.children[parent].append(i) self[i.id] = i return i.id + def has_key(self, key): + return dict.has_key(self, key) + def delItem(self, id): if not self.has_key(id): log.msg('already removed:', id) return - log.msg('removing:', id) + #log.msg('removing:', id) if isinstance(self[id], Container): + #log.msg('children:', Container.__repr__(self.children[id]), map(None, self.children[id])) while self.children[id]: - self.delItem(self.children[id][0]) + self.delItem(self.children[id][0].id) assert len(self.children[id]) == 0 del self.children[id] # Remove from parent @@ -205,11 +210,11 @@ class ContentDirectoryControl(UPnPPublisher, dict): # XXX - technically if list changed, we need to get # some new ones by looping till we have a complete # list. - ochup = filter(lambda x, s = self: + ochup = filter(lambda x, s = self: s.has_key(x.id) and s[x.id].checkUpdate() is not None, ch) - # XXX - are we suppose to be calling addContainer - # for Containers instead of always addItem? - #log.msg('ochup:', `ochup`) + if len(ochup) != len(ch): + log.msg('ch:', `ch`, 'ochup:', `ochup`) + raise RuntimeError, 'something disappeared' filter(lambda x, d = didl: d.addItem(x) and None, ochup) total = len(self.getchildren(ObjectID)) else: From 52684cb1440a14f6f3fed2f7d9d0d4ac4fd7c7ec Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 01:05:56 -0800 Subject: [PATCH 080/179] add filtering of invalid audio tracks out, it really doesn't help that much... keep items in original order which is numerical order, if we sort them, we end up w/ the 10-19 between 1 and 2 which is anoying.. especially w/ track switch... [git-p4: depot-paths = "//depot/": change = 835] --- dvd.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/dvd.py b/dvd.py index 21684b4..485aacc 100644 --- a/dvd.py +++ b/dvd.py @@ -2,9 +2,15 @@ '''DVD Handling''' +default_audio_lang = 'en' + import os import sets +import sys +sys.path.append('/Users/jgurney/p4/bktrau/info') +import mpegts + from pydvdread import * from DIDLLite import StorageFolder, Movie, VideoItem, Resource @@ -83,7 +89,7 @@ class DVDChapterResource(resource.Resource): def render(self, request): request.setHeader('content-type', 'video/mpeg') - request.setHeader('content-length', str(self.getFileSize())) + #request.setHeader('content-length', str(self.getFileSize())) if request.method == 'HEAD': return '' @@ -98,12 +104,14 @@ class DVDChapter(VideoItem): self.chapter = kwargs['chapter'] del kwargs['dvdtitle'], kwargs['chapter'] - kwargs['content'] = DVDChapterResource(self.chapter) + audio = self.dvdtitle.selectaudio(default_audio_lang) + kwargs['content'] = DVDChapterResource(mpegts.DVDAudioFilter( + self.chapter, 0x80 + audio.pos)) VideoItem.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) self.res = Resource(self.url, 'http-get:*:video/mpeg:*') - self.res.size = self.chapter.size + #self.res.size = self.chapter.size def doUpdate(self): pass @@ -126,8 +134,8 @@ class DVDTitle(StorageFolder): def doUpdate(self): doupdate = False - children, toindex = gennameindexes('Chapter', self.dvdtitle) - children = sets.Set(children) + origchildren, toindex = gennameindexes('Chapter', self.dvdtitle) + children = sets.Set(origchildren) for i in self.pathObjmap.keys(): if i not in children: doupdate = True @@ -135,7 +143,7 @@ class DVDTitle(StorageFolder): self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] - for i in children: + for i in origchildren: if i in self.pathObjmap: continue @@ -145,9 +153,6 @@ class DVDTitle(StorageFolder): chapter = self.dvdtitle[toindex[i]]) doupdate = True - # sort our children - self.sort(lambda x, y: cmp(x.title, y.title)) - if doupdate: StorageFolder.doUpdate(self) @@ -168,8 +173,8 @@ class DVDDisc(FSObject, StorageFolder): self.dvd = DVD(self.FSpath) doupdate = False - children, toindex = gennameindexes('Title', self.dvd) - children = sets.Set(children) + origchildren, toindex = gennameindexes('Title', self.dvd) + children = sets.Set(origchildren) for i in self.pathObjmap.keys(): if i not in children: doupdate = True @@ -177,7 +182,7 @@ class DVDDisc(FSObject, StorageFolder): self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] - for i in children: + for i in origchildren: if i in self.pathObjmap: continue @@ -186,9 +191,6 @@ class DVDDisc(FSObject, StorageFolder): i, dvdtitle = self.dvd[toindex[i]], dvddisc = self) doupdate = True - # sort our children - self.sort(lambda x, y: cmp(x.title, y.title)) - if doupdate: StorageFolder.doUpdate(self) From 99d646f46177a04c1e1eeaceb3fc62f0888bdfd8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 04:48:59 -0800 Subject: [PATCH 081/179] doesn't take an arg.. [git-p4: depot-paths = "//depot/": change = 836] --- shoutcast.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index de2904c..3b04157 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -108,9 +108,10 @@ class ShoutTransfer(shoutcast.ShoutcastClient): log.msg('connectionLost:', `self.request`, `self.passback`) shoutcast.ShoutcastClient.connectionLost(self, reason) if self.request: - self.request.unregisterProducer(self) + self.request.unregisterProducer() if self.passback: self.passback(self.request) + self.passback = None self.request = None From 31ddad6041b10bf2c859fd1e5ed18049147f6254 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 04:49:49 -0800 Subject: [PATCH 082/179] support multiple res elements... add code to dynamicly transcode to mpeg2 or xvid via additional res elements.. document this and other new features in the README... [git-p4: depot-paths = "//depot/": change = 837] --- DIDLLite.py | 6 ++- FSStorage.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++- README | 7 ++++ 3 files changed, 113 insertions(+), 3 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index b029f55..e5e64ab 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -82,7 +82,11 @@ class Object(object): SubElement(root, 'dc:creator').text = self.creator if self.res is not None: - root.append(self.res.toElement()) + try: + for res in iter(self.res): + root.append(res.toElement()) + except TypeError: + root.append(self.res.toElement()) if self.writeStatus is not None: SubElement(root, 'upnp:writeStatus').text = self.writeStatus diff --git a/FSStorage.py b/FSStorage.py index 48abd9a..817cb88 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -4,6 +4,8 @@ # $Id$ # +ffmpeg_path = '/Users/jgurney/src/ffmpeg/ffmpeg' + import FileDIDL import errno import itertools @@ -12,8 +14,10 @@ import sets import stat from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource -from twisted.web import static +from twisted.web import resource, server, static from twisted.python import log +from twisted.internet import abstract, interfaces, process, protocol, reactor +from zope.interface import implements __all__ = [ 'registerklassfun', 'FSObject', 'FSItem', 'FSVideoItem', 'FSAudioItem', 'FSTextItem', 'FSImageItem', 'mimetoklass', @@ -69,13 +73,105 @@ class FSObject(object): return '<%s.%s: path: %s>' % (self.__class__.__module__, self.__class__.__name__, self.FSpath) +class NullConsumer(file, abstract.FileDescriptor): + implements(interfaces.IConsumer) + + def __init__(self): + file.__init__(self, '/dev/null', 'w') + abstract.FileDescriptor.__init__(self) + + def write(self, data): + pass + +class DynamTransfer(protocol.ProcessProtocol): + def __init__(self, path, mods, request): + self.path = path + self.mods = mods + self.request = request + + def outReceived(self, data): + self.request.write(data) + + def outConnectionLost(self): + if self.request: + self.request.unregisterProducer() + self.request.finish() + self.request = None + + def errReceived(self, data): + pass + #log.msg(data) + + def stopProducing(self): + if self.request: + self.request.unregisterProducer() + self.request.finish() + + if self.proc: + self.proc.loseConnection() + self.proc.signalProcess('INT') + + self.request = None + self.proc = None + + pauseProducing = lambda x: x.proc.pauseProducing() + resumeProducing = lambda x: x.proc.resumeProducing() + + def render(self): + mods = self.mods + path = self.path + request = self.request + + vcodec = mods[0] + if mods[0] not in ('xvid', 'mpeg2', ): + vcodec = 'xvid' + + mimetype = { 'xvid': 'video/avi', 'mpeg2': 'video/mpeg', } + request.setHeader('content-type', mimetype[vcodec]) + if request.method == 'HEAD': + return '' + + optdict = { + 'xvid': [ '-vcodec', 'xvid', + #'-mv4', '-gmc', '-g', '240', + '-f', 'avi', ], + 'mpeg2': [ '-vcodec', 'mpeg2video', #'-g', '60', + '-f', 'mpeg', ], + } + audio = [ '-acodec', 'mp3', '-ab', '192', ] + args = [ 'ffmpeg', '-i', path, '-b', '8000', + #'-sc_threshold', '500000', '-b_strategy', '1', '-max_b_frames', '6', + ] + optdict[vcodec] + audio + [ '-', ] + #log.msg(*args) + self.proc = process.Process(reactor, ffmpeg_path, args, + None, None, self) + self.proc.closeStdin() + request.registerProducer(self, 1) + + return server.NOT_DONE_YET + +class DynamicTrans(resource.Resource): + isLeaf = True + + def __init__(self, path, notrans): + self.path = path + self.notrans = notrans + + def render(self, request): + if request.postpath: + # Translation request + return DynamTransfer(self.path, request.postpath, request).render() + else: + return self.notrans.render(request) + class FSItem(FSObject, Item): def __init__(self, *args, **kwargs): FSObject.__init__(self, kwargs['path']) del kwargs['path'] mimetype = kwargs['mimetype'] del kwargs['mimetype'] - kwargs['content'] = static.File(self.FSpath) + kwargs['content'] = DynamicTrans(self.FSpath, + static.File(self.FSpath, mimetype)) Item.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) self.mimetype = mimetype @@ -83,6 +179,9 @@ class FSItem(FSObject, Item): def doUpdate(self): self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = os.path.getsize(self.FSpath) + self.res = [ self.res ] + self.res.append(Resource(self.url + '/mpeg2', 'http-get:*:%s:*' % 'video/mpeg')) + self.res.append(Resource(self.url + '/xvid', 'http-get:*:%s:*' % 'video/avi')) Item.doUpdate(self) def defFS(path, fobj): diff --git a/README b/README index 0417103..6cc5c58 100644 --- a/README +++ b/README @@ -25,10 +25,17 @@ Good Luck! John-Mark Gurney Ideas for future improvements: + Figure out how to rearchitect ContentDirectoryControl so I don't + need to use doRecall. This may be helped by not necessarily + figuring out all the children of a member just to fetch it. + childCount isn't a required attribute. Autodetect IP address. Support sorting by other attributes. v0.x: + Add support for multiple res elements and automatic transcoding + to either avi/xvid or mpeg2 using ffmpeg. + Look inside DVDs and handle titles and chapters. Empty dirs w/ no content would disappear, and cause a short response to BrowseDirectChildren. The DSM-520 askes for one more than displayed, and uses the existant of the extra item From d4e43188b922d38fd012278f40eb84e94422b9be Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 11:16:18 -0800 Subject: [PATCH 083/179] add support for interactive debugging via manhole.telnet... add some modules and provide functions to add to the namespace... drop the media server since we now serve all of our content though content.. [git-p4: depot-paths = "//depot/": change = 838] --- debug.py | 35 +++++++++++++++++++++++++++++++++++ pymediaserv | 28 +++++++++------------------- 2 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 debug.py diff --git a/debug.py b/debug.py new file mode 100644 index 0000000..bf71002 --- /dev/null +++ b/debug.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +from twisted.internet import reactor + +__all__ = [ 'appendnamespace', 'insertnamespace', ] + +appendnamespace = lambda k, v: [] +insertnamespace = lambda k, v: None + +def doDebugging(opt): + if not opt: + return + + from twisted.manhole import telnet + + class Debug(telnet.Shell): + def welcomeMessage(self): + data = [ '', 'PyMedS Debugging Console', '', '' ] + return '\r\n'.join(data) + + sf = telnet.ShellFactory() + sf.protocol = Debug + reactor.listenTCP(56283, sf) + + global insertnamespace, appendnamespace + + def insertnamespace(k, v): + assert isinstance(k, basestring) + sf.namespace[k] = v + + def appendnamespace(k, v): + try: + sf.namespace[k].append(v) + except KeyError: + sf.namespace[k] = [ v ] diff --git a/pymediaserv b/pymediaserv index 580512f..55a2b94 100755 --- a/pymediaserv +++ b/pymediaserv @@ -13,6 +13,12 @@ import dvd import shoutcast import ZipStorage # w/ tarfile support, it will gobble up empty files! +import debug # my debugging module +debug.doDebugging(True) # open up debugging port +debug.insertnamespace('dvd', dvd) +debug.insertnamespace('shoutcast', shoutcast) +debug.insertnamespace('ZipStorage', ZipStorage) + from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder from FSStorage import FSDirectory import os @@ -44,6 +50,7 @@ log.startLogging(sys.stdout) from SSDP import SSDPServer, SSDP_PORT, SSDP_ADDR s = SSDPServer() +debug.insertnamespace('s', s) port = reactor.listenMulticast(SSDP_PORT, s) port.joinGroup(SSDP_ADDR) @@ -73,8 +80,10 @@ class RootDevice(static.Data): static.Data.__init__(self, d, 'text/xml') root = WebServer() +debug.insertnamespace('root', root) content = resource.Resource() cds = ContentDirectoryServer('My Media Server', klass = FSDirectory, path = 'media', urlbase = os.path.join(urlbase, 'content'), webbase = content) # This sets up the root to be the media dir so we don't have to enumerate the directory +debug.insertnamespace('cds', cds) root.putChild('ContentDirectory', cds) cds = cds.control root.putChild('ConnectionManager', ConnectionManagerServer()) @@ -82,25 +91,6 @@ root.putChild('root-device.xml', RootDevice()) root.putChild('content', content) -# Area of server to serve media files from - -from MediaServer import MediaServer - -medianode = static.File('media') -medianode.contentTypes.update( { - '.wmv': 'video/x-ms-wmv', - #'.ts': 'video/mp2t', - '.ts': 'video/mpeg', # we may want this instead of mp2t - '.m2t': 'video/mpeg', - #'.mp4': 'video/mp4', - '.mp4': 'video/mpeg', - '.dat': 'video/mpeg', # VCD tracks - '.ogm': 'application/ogg', - '.vob': 'video/mpeg', - #'.m4a': 'audio/mp4', # D-Link can't seem to play AAC files. -}) -root.putChild('media', medianode) - site = server.Site(root) reactor.listenTCP(listenPort, site) From 6bfd3280e734efa3517b214f55beda6412962c88 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 12:35:42 -0800 Subject: [PATCH 084/179] move the browse later so that restarts don't print it soo many times.. [git-p4: depot-paths = "//depot/": change = 839] --- ContentDirectory.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 3d4af5f..7e8695b 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -187,11 +187,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): StartingIndex = int(StartingIndex) RequestedCount = int(RequestedCount) - log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' - 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % - (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, - `RequestedCount`, `SortCriteria`)) - didl = DIDLElement() result = {} @@ -228,6 +223,11 @@ class ContentDirectoryControl(UPnPPublisher, dict): #log.msg('Returning: %s' % result) + log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' + 'StartingIndex=%s RequestedCount=%s SortCriteria=%s) = %s' % + (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, + `RequestedCount`, `SortCriteria`, `result`)) + return result # Optional actions From 0a06c32ab7e6e764349b5f49977341aa8bbc8aa6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 14:45:25 -0800 Subject: [PATCH 085/179] remove dependancy on mpegts... just won't get audio filtering if it doesn't exist.. (not even sure how good audio filtering is..) [git-p4: depot-paths = "//depot/": change = 840] --- dvd.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dvd.py b/dvd.py index 485aacc..aacf7b8 100644 --- a/dvd.py +++ b/dvd.py @@ -9,7 +9,12 @@ import sets import sys sys.path.append('/Users/jgurney/p4/bktrau/info') -import mpegts +try: + import mpegts + audiofilter = lambda x, y: mpegts.DVDAudioFilter(x, y) +except ImportError: + print >>sys.stderr, 'module mpegts could not be loaded, not filtering audio' + audiofilter = lambda x, y: x from pydvdread import * @@ -105,8 +110,8 @@ class DVDChapter(VideoItem): del kwargs['dvdtitle'], kwargs['chapter'] audio = self.dvdtitle.selectaudio(default_audio_lang) - kwargs['content'] = DVDChapterResource(mpegts.DVDAudioFilter( - self.chapter, 0x80 + audio.pos)) + kwargs['content'] = DVDChapterResource( + audiofilter(self.chapter, 0x80 + audio.pos)) VideoItem.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) From fffa530e2eda1c42ac1c4c72e17ea2ddf61f112c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 14:45:59 -0800 Subject: [PATCH 086/179] add bitrate in front of the name, and when comparing, skip over it.. [git-p4: depot-paths = "//depot/": change = 841] --- shoutcast.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index 3b04157..c4718a7 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -261,6 +261,10 @@ class ShoutStation(AudioItem): self.station['MimeType'].encode('ascii')) self.bitrate = self.station['Bitrate'] * 128 # 1024k / 8bit +def stationwbitratecmp(x, y): + x, y = map(lambda x: x.split('-', 1)[1], (x, y)) + return cmp(x, y) + class ShoutGenre(MusicGenre): def __init__(self, *args, **kwargs): self.genre = kwargs['genre'] @@ -319,7 +323,8 @@ class ShoutGenre(MusicGenre): doupdate = True self.pathObjmap[name] = self.cd.addItem(self.id, - ShoutStation, name, station = i) + ShoutStation, '%sk-%s' % (i['Bitrate'], name), + station = i) self.sl = stations From e553e7808f9ce558a36a7bf2cc94322860aa01fe Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 14:46:19 -0800 Subject: [PATCH 087/179] make it so that things don't go belly up when importing the optional modules... [git-p4: depot-paths = "//depot/": change = 842] --- pymediaserv | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pymediaserv b/pymediaserv index 55a2b94..8215546 100755 --- a/pymediaserv +++ b/pymediaserv @@ -9,15 +9,24 @@ # # Modules to import, maybe config file or something? -import dvd -import shoutcast -import ZipStorage # w/ tarfile support, it will gobble up empty files! +def tryloadmodule(mod): + try: + return __import__(mod) + except ImportError: + import traceback + traceback.print_exc() + pass + +# ZipStorage w/ tar support should be last as it will gobble up empty files. +modules = [ 'dvd', 'shoutcast', 'ZipStorage' ] +modmap = {} +for i in modules: + modmap[i] = tryloadmodule(i) import debug # my debugging module debug.doDebugging(True) # open up debugging port -debug.insertnamespace('dvd', dvd) -debug.insertnamespace('shoutcast', shoutcast) -debug.insertnamespace('ZipStorage', ZipStorage) +for i in modules: + debug.insertnamespace(i, modmap[i]) from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder from FSStorage import FSDirectory From 08205e5989772c1cd2eed0cd529095d1c331b959 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 14:48:29 -0800 Subject: [PATCH 088/179] readd back the custom mime-types.. these are necessary on MacOSX as these are missing.. I thought I committed this already, guess I didn't (or submitted the wrong file).. [git-p4: depot-paths = "//depot/": change = 843] --- pymediaserv | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pymediaserv b/pymediaserv index 8215546..1257c21 100755 --- a/pymediaserv +++ b/pymediaserv @@ -100,6 +100,22 @@ root.putChild('root-device.xml', RootDevice()) root.putChild('content', content) +# Purely to ensure some sane mime-types. On MacOSX I need these. +medianode = static.File('pymediaserv') +medianode.contentTypes.update( { + '.wmv': 'video/x-ms-wmv', + #'.ts': 'video/mp2t', + '.ts': 'video/mpeg', # we may want this instead of mp2t + '.m2t': 'video/mpeg', + '.mp4': 'video/mp4', + #'.mp4': 'video/mpeg', + '.dat': 'video/mpeg', # VCD tracks + '.ogm': 'application/ogg', + '.vob': 'video/mpeg', + #'.m4a': 'audio/mp4', # D-Link can't seem to play AAC files. +}) +del medianode + site = server.Site(root) reactor.listenTCP(listenPort, site) From a3db9c0f5ef59786765230d975dc75d405173db1 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:10:45 -0800 Subject: [PATCH 089/179] add support for ring buffers for debugging, this lets you more easily keep state on what has happened recently w/o having to spam the log as much... we default to 50 entries... add comment to make sure you update the global line when adding new functions otherwise when you try to overwrite them, it won't... [git-p4: depot-paths = "//depot/": change = 844] --- debug.py | 57 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/debug.py b/debug.py index bf71002..bf2b132 100644 --- a/debug.py +++ b/debug.py @@ -2,27 +2,44 @@ from twisted.internet import reactor -__all__ = [ 'appendnamespace', 'insertnamespace', ] +# Make sure to update the global line when adding a new function +__all__ = [ 'appendnamespace', 'insertnamespace', 'insertringbuf' ] + +DEFAULTRINGSIZE = 50 appendnamespace = lambda k, v: [] insertnamespace = lambda k, v: None +insertringbuf = lambda k, l = DEFAULTRINGSIZE: None + +# This code from: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68429 +class RingBuffer: + def __init__(self,size_max): + self.max = size_max + self.data = [] + def append(self,x): + """append an element at the end of the buffer""" + self.data.append(x) + if len(self.data) == self.max: + self.cur=0 + self.__class__ = RingBufferFull + def get(self): + """ return a list of elements from the oldest to the newest""" + return self.data + +class RingBufferFull: + def __init__(self,n): + raise "you should use RingBuffer" + def append(self,x): + self.data[self.cur]=x + self.cur=(self.cur+1) % self.max + def get(self): + return self.data[self.cur:]+self.data[:self.cur] def doDebugging(opt): if not opt: return - from twisted.manhole import telnet - - class Debug(telnet.Shell): - def welcomeMessage(self): - data = [ '', 'PyMedS Debugging Console', '', '' ] - return '\r\n'.join(data) - - sf = telnet.ShellFactory() - sf.protocol = Debug - reactor.listenTCP(56283, sf) - - global insertnamespace, appendnamespace + global insertnamespace, appendnamespace, insertringbuf def insertnamespace(k, v): assert isinstance(k, basestring) @@ -33,3 +50,17 @@ def doDebugging(opt): sf.namespace[k].append(v) except KeyError: sf.namespace[k] = [ v ] + + def insertringbuf(k, l = DEFAULTRINGSIZE): + insertnamespace(k, RingBuffer(l)) + + from twisted.manhole import telnet + + class Debug(telnet.Shell): + def welcomeMessage(self): + data = [ '', 'PyMedS Debugging Console', '', '' ] + return '\r\n'.join(data) + + sf = telnet.ShellFactory() + sf.protocol = Debug + reactor.listenTCP(56283, sf) From 23084a3ccd8753ce41c7f00cffebedcbf9453b48 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:10:59 -0800 Subject: [PATCH 090/179] add idea about persistance... [git-p4: depot-paths = "//depot/": change = 845] --- README | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README b/README index 6cc5c58..06b6ce5 100644 --- a/README +++ b/README @@ -25,6 +25,8 @@ Good Luck! John-Mark Gurney Ideas for future improvements: + Make the directory persistant so that the server's UUID can not change + each run and we don't have to recreate the objects. Figure out how to rearchitect ContentDirectoryControl so I don't need to use doRecall. This may be helped by not necessarily figuring out all the children of a member just to fetch it. From 074483d73926f2ebd4b78c9139001c28882e082a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:11:33 -0800 Subject: [PATCH 091/179] drop some debugging now that this seems to be working.. [git-p4: depot-paths = "//depot/": change = 846] --- shoutcast.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/shoutcast.py b/shoutcast.py index c4718a7..97108b4 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -101,7 +101,6 @@ class ShoutTransfer(shoutcast.ShoutcastClient): shoutcast.ShoutcastClient.__init__(self) self.request = request self.passback = passback - log.msg('ShoutTransfer:', `request`, `passback`) request.registerProducer(self, 1) def connectionLost(self, reason): @@ -121,7 +120,6 @@ class ShoutTransfer(shoutcast.ShoutcastClient): pass def stopProducing(self): - log.msg('stopProducing:', `self.request`, `self.passback`) shoutcast.ShoutcastClient.stopProducing(self) self.request = None self.passback = None @@ -179,7 +177,6 @@ class ShoutProxy(resource.Resource): def startNextConnection(self, request): url = self.urls[self.urlpos] self.urlpos = (self.urlpos + 1) % len(self.urls) - log.msg('starting transfer for:', `url`) scheme, host, port, path = _parse(url) protocol.ClientCreator(reactor, ShoutTransfer, request, self.startNextConnection).connectTCP(host, port) @@ -197,23 +194,19 @@ class ShoutProxy(resource.Resource): self.urls.append(pls.get(PLSsection, 'File%d' % i)) self.urlpos = random.randrange(len(self.urls)) - log.msg('urls:', `self.urls`, 'urlpos:', self.urlpos) except: self.dump_exc() return - log.msg('waking up reqests') - self.afterurls.callback('foo') + self.afterurls.callback(None) self.afterurls = None def errPLS(self, failure): - log.msg('errPLS:', `failure`) self.request.write(failure.render(self.request)) self.request.finish() self.request = None def processRequest(self, ign, request): - log.msg('processRequest:', `request`) self.startNextConnection(request) def render(self, request): @@ -232,7 +225,6 @@ class ShoutProxy(resource.Resource): if not self.fetchingurls: # Get the PLS self.fetchingurls = True - log.msg('starting page fetch:', `self.shoutpls`) # Not really sure if ascii is the correct one, # shouldn't getPage do proper escaping for me? getPage(self.shoutpls.encode('ascii')) \ @@ -335,7 +327,6 @@ class ShoutGenre(MusicGenre): class ShoutCast(Container): def __init__(self, *args, **kwargs): - log.msg('shoutcast created') Container.__init__(self, *args, **kwargs) self.genres = GenreFeedAsync() From 22c953346778a9079bf68f8121040f3b396e998d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:12:20 -0800 Subject: [PATCH 092/179] move debugging a bit earlier, turns out that the trouble was a missing global, but this is good anyways, it means that the submodules can use this too now... [git-p4: depot-paths = "//depot/": change = 847] --- pymediaserv | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pymediaserv b/pymediaserv index 1257c21..51bc220 100755 --- a/pymediaserv +++ b/pymediaserv @@ -8,13 +8,20 @@ # $Id$ # +# make sure debugging is initalized first, other modules can be pulled in +# before the "real" debug stuff is setup. (hmm I could make this a two +# stage, where we simulate a namespace to either be thrown away when the +# time comes, or merge into the correct one) +import debug # my debugging module +debug.doDebugging(True) # open up debugging port + # Modules to import, maybe config file or something? def tryloadmodule(mod): try: return __import__(mod) except ImportError: - import traceback - traceback.print_exc() + #import traceback + #traceback.print_exc() pass # ZipStorage w/ tar support should be last as it will gobble up empty files. @@ -23,8 +30,6 @@ modmap = {} for i in modules: modmap[i] = tryloadmodule(i) -import debug # my debugging module -debug.doDebugging(True) # open up debugging port for i in modules: debug.insertnamespace(i, modmap[i]) From 35d5e9a3b450c288fb5dd736b24cbf84d345122c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:13:04 -0800 Subject: [PATCH 093/179] keep track of the last few requests that we have processed, we now don't need to print out the browse lines to log, we can just take a peak at the ring buffer to see what's happened... [git-p4: depot-paths = "//depot/": change = 848] --- ContentDirectory.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 7e8695b..d31df57 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -22,6 +22,8 @@ # traceback.print_exc(file = log.logfile) # +reqname = 'requests' + from twisted.python import log from twisted.web import resource, static @@ -32,6 +34,7 @@ from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack from twisted.internet import defer from twisted.python import failure +import debug import traceback from urllib import quote @@ -136,6 +139,9 @@ class ContentDirectoryControl(UPnPPublisher, dict): return self.children[item][:] def __init__(self, title, *args, **kwargs): + log.msg('ringbuf') + debug.insertringbuf(reqname) + print `debug.insertringbuf` super(ContentDirectoryControl, self).__init__(*args) self.webbase = kwargs['webbase'] self._urlbase = kwargs['urlbase'] @@ -173,10 +179,21 @@ class ContentDirectoryControl(UPnPPublisher, dict): BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') def soap_Browse(self, *args): + l = {} + log.msg('ringbuf append') + debug.appendnamespace(reqname, l) + l['query'] = 'Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' \ + 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % \ + tuple(map(repr, args)) + try: - return self.thereal_soap_Browse(*args) + ret = self.thereal_soap_Browse(*args) except defer.Deferred, x: - return doRecallgen(x, self.soap_Browse, *args) + ret = doRecallgen(x, self.soap_Browse, *args) + + l['response'] = `ret` + + return ret def thereal_soap_Browse(self, *args): """Required: Incrementally browse the native heirachy of the Content @@ -223,11 +240,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): #log.msg('Returning: %s' % result) - log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' - 'StartingIndex=%s RequestedCount=%s SortCriteria=%s) = %s' % - (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, - `RequestedCount`, `SortCriteria`, `result`)) - return result # Optional actions From 74a78e79e39888f501fb57e1aa22e261a8b05f8c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 19:22:07 -0800 Subject: [PATCH 094/179] drop debugging statements.. [git-p4: depot-paths = "//depot/": change = 849] --- ContentDirectory.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index d31df57..2da39ab 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -139,9 +139,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): return self.children[item][:] def __init__(self, title, *args, **kwargs): - log.msg('ringbuf') debug.insertringbuf(reqname) - print `debug.insertringbuf` super(ContentDirectoryControl, self).__init__(*args) self.webbase = kwargs['webbase'] self._urlbase = kwargs['urlbase'] @@ -180,7 +178,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): def soap_Browse(self, *args): l = {} - log.msg('ringbuf append') debug.appendnamespace(reqname, l) l['query'] = 'Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' \ 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % \ From c956e14610e11d8c73b8be478a798e7f08f9692e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 20:00:12 -0800 Subject: [PATCH 095/179] make title sorting skip the bit rate I prepend... callbacks require a value to be triggered for some reason... (I should probably investigate this)... let loose all the genre's... an upcoming commit doesn't explore children, so it's much quicker now.. [git-p4: depot-paths = "//depot/": change = 850] --- shoutcast.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/shoutcast.py b/shoutcast.py index 97108b4..bcb4923 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -27,6 +27,10 @@ def cmpStation(a, b, keys = ( 'MimeType', 'Name', 'PLS_URL', 'Bitrate' )): return False return True +def stationwbitratecmp(x, y): + x, y = map(lambda a: a.title.split('-', 1)[1], (x, y)) + return cmp(x, y) + class GenreFeedAsync(feeds.GenreFeed): genre_url = 'http://www.shoutcast.com/sbin/newxml.phtml' @@ -40,7 +44,7 @@ class GenreFeedAsync(feeds.GenreFeed): self.havegenre = True # Wake everyone up - self.fetchinggenre.callback(None) + self.fetchinggenre.callback(1) def errGenre(self, failure): raise NotImplementedError, failure @@ -76,7 +80,7 @@ class ShoutcastFeedAsync(feeds.ShoutcastFeed): self.havestations = True # Wake everyone up - self.fetchingstations.callback(None) + self.fetchingstations.callback(1) def errStations(self, failure): raise NotImplementedError, failure @@ -198,7 +202,7 @@ class ShoutProxy(resource.Resource): self.dump_exc() return - self.afterurls.callback(None) + self.afterurls.callback(1) self.afterurls = None def errPLS(self, failure): @@ -253,10 +257,6 @@ class ShoutStation(AudioItem): self.station['MimeType'].encode('ascii')) self.bitrate = self.station['Bitrate'] * 128 # 1024k / 8bit -def stationwbitratecmp(x, y): - x, y = map(lambda x: x.split('-', 1)[1], (x, y)) - return cmp(x, y) - class ShoutGenre(MusicGenre): def __init__(self, *args, **kwargs): self.genre = kwargs['genre'] @@ -321,7 +321,7 @@ class ShoutGenre(MusicGenre): self.sl = stations # sort our children - self.sort(lambda x, y: cmp(x.title, y.title)) + self.sort(lambda *a: stationwbitratecmp(*a)) if doupdate: Container.doUpdate(self) @@ -339,7 +339,7 @@ class ShoutCast(Container): def doUpdate(self): #traceback.print_stack(file=log.logfile) - nl = self.genres.parse_genres()[:30] + nl = self.genres.parse_genres() if nl == self.genre_list: return From 5041928b3e6498b92f02e43e7c0317fe5f3b12b0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 20:00:50 -0800 Subject: [PATCH 096/179] only include childCount if it's non-zero, we can't tell (yet) between an empty container an one that has been "explored"... [git-p4: depot-paths = "//depot/": change = 851] --- DIDLLite.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DIDLLite.py b/DIDLLite.py index e5e64ab..580d0e1 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -252,7 +252,10 @@ class Container(Object, list): root = Object.toElement(self) - root.attrib['childCount'] = str(self.childCount) + # only include if we have children, it's possible we don't + # have our children yet, and childCount is optional. + if self.childCount: + root.attrib['childCount'] = str(self.childCount) if self.createClass is not None: SubElement(root, 'upnp:createclass').text = self.createClass From 9eb753bf56f10f52549614d2a44f8f6c4fdd83f2 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 20:05:15 -0800 Subject: [PATCH 097/179] include object in result buffer if it exists... don't repr the return value, the dict containing it will do that for me... don't go into subchildren and update them to pull in there children just to find out the childCount... DIDLLite now doesn't include it if there aren't any... (This may need to be tested w/ the Intel software, but works great w/ the D-Link DSM-520)... It makes browsing shoutcast genres doable now.. [git-p4: depot-paths = "//depot/": change = 852] --- ContentDirectory.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 2da39ab..bef2b5b 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -179,6 +179,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): def soap_Browse(self, *args): l = {} debug.appendnamespace(reqname, l) + if self.has_key(args[0]): + l['object'] = self[args[0]] l['query'] = 'Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' \ 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % \ tuple(map(repr, args)) @@ -188,7 +190,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): except defer.Deferred, x: ret = doRecallgen(x, self.soap_Browse, *args) - l['response'] = `ret` + l['response'] = ret return ret @@ -207,24 +209,13 @@ class ContentDirectoryControl(UPnPPublisher, dict): # check to see if object needs to be updated self[ObjectID].checkUpdate() - # return error code if we don't exist + # return error code if we don't exist anymore if ObjectID not in self: raise errorCode(701) if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - # filter out the ones that don't exist anymore, we need - # to check against None, since some dirs might be empty - # (of valid content) but exist. - # XXX - technically if list changed, we need to get - # some new ones by looping till we have a complete - # list. - ochup = filter(lambda x, s = self: s.has_key(x.id) and - s[x.id].checkUpdate() is not None, ch) - if len(ochup) != len(ch): - log.msg('ch:', `ch`, 'ochup:', `ochup`) - raise RuntimeError, 'something disappeared' - filter(lambda x, d = didl: d.addItem(x) and None, ochup) + filter(lambda x, d = didl: d.addItem(x) and None, ch) total = len(self.getchildren(ObjectID)) else: didl.addItem(self[ObjectID]) From e1fa3f4326508378dcfac3a5063245d3ff78ee29 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 21:03:30 -0800 Subject: [PATCH 098/179] change to ktext, and add $Change$ to the files.. [git-p4: depot-paths = "//depot/": change = 853] --- DIDLLite.py | 4 ++-- FSStorage.py | 4 ++-- FileDIDL.py | 4 ++-- SSDP.py | 4 ++-- ZipStorage.py | 4 ++-- upnp.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index 580d0e1..f9994dd 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -3,9 +3,9 @@ # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface diff --git a/FSStorage.py b/FSStorage.py index 817cb88..24962eb 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -1,8 +1,8 @@ #!/usr/bin/env python # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# ffmpeg_path = '/Users/jgurney/src/ffmpeg/ffmpeg' diff --git a/FileDIDL.py b/FileDIDL.py index 6a9e3f0..67c4341 100644 --- a/FileDIDL.py +++ b/FileDIDL.py @@ -1,8 +1,8 @@ #!/usr/bin/env python # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# # # Convert file information into a DIDL class. Dynamicly generate a new class diff --git a/SSDP.py b/SSDP.py index eb3a71c..c4a9bd1 100644 --- a/SSDP.py +++ b/SSDP.py @@ -2,9 +2,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# # # Implementation of SSDP server under Twisted Python. diff --git a/ZipStorage.py b/ZipStorage.py index 804ab25..8e5b981 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -1,8 +1,8 @@ #!/usr/bin/env python # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# import itertools import os.path diff --git a/upnp.py b/upnp.py index dc4e025..a0a406b 100644 --- a/upnp.py +++ b/upnp.py @@ -3,9 +3,9 @@ # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# from twisted.web import soap from twisted.python import log From 78a80b612f6d5a65626139c2ddb036842170b78d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 21:10:14 -0800 Subject: [PATCH 099/179] add revision and copyright stuff to these files... [git-p4: depot-paths = "//depot/": change = 854] --- ContentDirectory.py | 4 ++-- debug.py | 4 ++++ dvd.py | 5 ++++- itertarfile.py | 4 ++++ iterzipfile.py | 4 ++++ pymediaserv | 4 ++-- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index bef2b5b..54e687f 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -2,9 +2,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# # # This module implements the Content Directory Service (CDS) service diff --git a/debug.py b/debug.py index bf2b132..4c01609 100644 --- a/debug.py +++ b/debug.py @@ -1,4 +1,8 @@ #!/usr/bin/env python +# Copyright 2006 John-Mark Gurney + +__version__ = '$Change$' +# $Id$ from twisted.internet import reactor diff --git a/dvd.py b/dvd.py index aacf7b8..c017158 100644 --- a/dvd.py +++ b/dvd.py @@ -1,7 +1,10 @@ #!/usr/bin/env python - +# Copyright 2006 John-Mark Gurney '''DVD Handling''' +__version__ = '$Change$' +# $Id$ + default_audio_lang = 'en' import os diff --git a/itertarfile.py b/itertarfile.py index 906c97c..5248ca9 100644 --- a/itertarfile.py +++ b/itertarfile.py @@ -1,4 +1,8 @@ #!/usr/bin/env python +# Copyright 2006 John-Mark Gurney + +__version__ = '$Change$' +# $Id$ import tarfile from tarfile import * diff --git a/iterzipfile.py b/iterzipfile.py index fd7557c..118dce0 100644 --- a/iterzipfile.py +++ b/iterzipfile.py @@ -1,4 +1,8 @@ #!/usr/bin/env python +# Copyright 2006 John-Mark Gurney + +__version__ = '$Change$' +# $Id$ import binascii import os diff --git a/pymediaserv b/pymediaserv index 51bc220..17bd2fb 100755 --- a/pymediaserv +++ b/pymediaserv @@ -4,9 +4,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -# + +__version__ = '$Change$' # $Id$ -# # make sure debugging is initalized first, other modules can be pulled in # before the "real" debug stuff is setup. (hmm I could make this a two From eb6b0fa20ef2f90592297009f3169bab6b4159b0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 21:10:45 -0800 Subject: [PATCH 100/179] add copyright and stuff... [git-p4: depot-paths = "//depot/": change = 855] --- shoutcast.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index bcb4923..da03b7d 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -1,7 +1,10 @@ #!/usr/bin/env python - +# Copyright 2006 John-Mark Gurney '''Shoutcast Radio Feed''' +__version__ = '$Change$' +# $Id$ + import ConfigParser import StringIO import os.path From 9f90fb01ce68a21effc2aaa6df7686632ee4d719 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 8 Jul 2006 21:10:57 -0800 Subject: [PATCH 101/179] drop an unused file.. [git-p4: depot-paths = "//depot/": change = 856] --- MediaServer.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 MediaServer.py diff --git a/MediaServer.py b/MediaServer.py deleted file mode 100644 index 57396c4..0000000 --- a/MediaServer.py +++ /dev/null @@ -1,9 +0,0 @@ -# Licensed under the MIT license -# http://opensource.org/licenses/mit-license.php - -# Copyright 2005, Tim Potter - -from twisted.web import static - -class MediaServer(static.File): - pass From 7a52990bca7d43f9da44590b44521714419d4655 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 01:51:15 -0800 Subject: [PATCH 102/179] fix files... turns out we do need the checkUpdate on items, just not containers.. so put it back in so that the res element reappears and things work again... [git-p4: depot-paths = "//depot/": change = 857] --- ContentDirectory.py | 6 +++++- DIDLLite.py | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 54e687f..621ab88 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -215,7 +215,11 @@ class ContentDirectoryControl(UPnPPublisher, dict): if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, d = didl: d.addItem(x) and None, ch) + for i in ch: + log.msg('i:', `i`, i.needupdate) + if i.needupdate: + i.checkUpdate() + didl.addItem(i) total = len(self.getchildren(ObjectID)) else: didl.addItem(self[ObjectID]) diff --git a/DIDLLite.py b/DIDLLite.py index f9994dd..6907f34 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -40,6 +40,7 @@ class Object(object): res = None writeStatus = None content = property(lambda x: x._content) + needupdate = None # do we update before sending? (for res) def __init__(self, cd, id, parentID, title, restricted = False, creator = None, **kwargs): @@ -103,6 +104,7 @@ class Item(Object): klass = Object.klass + '.item' elementName = 'item' refID = None + needupdate = True def doUpdate(self): # Update parent container @@ -240,6 +242,7 @@ class Container(Object, list): searchClass = None searchable = None updateID = 0 + needupdate = False def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): Object.__init__(self, cd, id, parentID, title, restricted, creator) From be108d0648796d989036b6b65e0b2e620e5908a8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 01:52:30 -0800 Subject: [PATCH 103/179] add the mpegtsmod module which looks inside and sees what streams are available.. the PID demuxer currently isn't fast enough (it's written in python), but once fixed should be interesting... [git-p4: depot-paths = "//depot/": change = 858] --- mpegtsmod.py | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++ pymediaserv | 2 +- 2 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 mpegtsmod.py diff --git a/mpegtsmod.py b/mpegtsmod.py new file mode 100644 index 0000000..ff5a9de --- /dev/null +++ b/mpegtsmod.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# Copyright 2006 John-Mark Gurney +'''MPEG-TS Handling''' + +__version__ = '$Change$' +# $Id$ + +default_audio_lang = 'eng' + +import os +import sets + +import sys +mpegtspath = '/Users/jgurney/p4/bktrau/info' +if mpegtspath not in sys.path: + sys.path.append(mpegtspath) +import mpegts + +from DIDLLite import StorageFolder, VideoItem, Resource +from FSStorage import FSObject, registerklassfun + +from twisted.python import log, threadable +from twisted.spread import pb +from twisted.web import resource, server + +class _LimitedFile(file): + def __init__(self, *args, **kwargs): + self.__size = kwargs['size'] + del kwargs['size'] + file.__init__(self, *args, **kwargs) + + def remain(self): + pos = self.tell() + if pos > self.__size: + return 0 + return self.__size - pos + + def read(self, size=-1): + if size < 0: + return file.read(self, self.remain()) + + return file.read(self, min(size, self.remain())) + +def _gennameindexes(chan): + ret = [] + d = {} + + for i in chan: + t = '%s %s.%s' % (i['name'], i['major'], i['minor']) + ret.append(t) + d[t] = i + + return ret, d + +class MPEGTSTransfer(pb.Viewable): + def __init__(self, iterable, request): + self.iter = iter(iterable) + self.request = request + request.registerProducer(self, 0) + + def resumeProducing(self): + if not self.request: + return + # get data and write to request. + try: + data = self.iter.next() + if data: + # this .write will spin the reactor, calling + # .doWrite and then .resumeProducing again, so + # be prepared for a re-entrant call + self.request.write(data) + except StopIteration: + if self.request: + self.request.unregisterProducer() + self.request.finish() + self.request = None + + def pauseProducing(self): + pass + + def stopProducing(self): + # close zipfile + self.request = None + + # Remotely relay producer interface. + + def view_resumeProducing(self, issuer): + self.resumeProducing() + + def view_pauseProducing(self, issuer): + self.pauseProducing() + + def view_stopProducing(self, issuer): + self.stopProducing() + + synchronized = ['resumeProducing', 'stopProducing'] + +threadable.synchronize(MPEGTSTransfer) + +class MPEGTSResource(resource.Resource): + isLeaf = True + + def __init__(self, iter_): + resource.Resource.__init__(self) + + self.iter = iter_ + + def render(self, request): + request.setHeader('content-type', 'video/mpeg') + + if request.method == 'HEAD': + return '' + + # return data + MPEGTSTransfer(self.iter, request) + # and make sure the connection doesn't get closed + return server.NOT_DONE_YET + +class MPEGTS(FSObject, VideoItem): + def __init__(self, *args, **kwargs): + path = kwargs['path'] + del kwargs['path'] + self.tvct = kwargs['tvct'] + del kwargs['tvct'] + + log.msg('MPEGTS tvct:', self.tvct) + + kwargs['content'] = MPEGTSResource( + mpegts.iteravpids(mpegts.TSPStream(open(path)), + sum(mpegts.getaudiovideopids(self.tvct['PMT']), []))) + VideoItem.__init__(self, *args, **kwargs) + FSObject.__init__(self, path) + + self.url = '%s/%s' % (self.cd.urlbase, self.id) + self.res = Resource(self.url, 'http-get:*:video/mpeg:*') + + def doUpdate(self): + pass + +class MultiMPEGTS(FSObject, StorageFolder): + def __init__(self, *args, **kwargs): + path = kwargs['path'] + del kwargs['path'] + + StorageFolder.__init__(self, *args, **kwargs) + FSObject.__init__(self, path) + + # mapping from path to objectID + self.pathObjmap = {} + + def doUpdate(self): + f = mpegts.TSPStream(_LimitedFile(self.FSpath, + size= 2*1024*1024)) + self.tvct = mpegts.GetTVCT(f) + + doupdate = False + origchildren, toindex = _gennameindexes(self.tvct['channels']) + children = sets.Set(origchildren) + for i in self.pathObjmap.keys(): + if i not in children: + doupdate = True + # delete + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in origchildren: + if i in self.pathObjmap: + continue + + # new object + self.pathObjmap[i] = self.cd.addItem(self.id, MPEGTS, + i, path = self.FSpath, tvct = toindex[i]) + doupdate = True + + if doupdate: + StorageFolder.doUpdate(self) + +def detectmpegts(path, fobj): + try: + f = mpegts.TSPStream(_LimitedFile(path, size= 2*1024*1024)) + tvct = mpegts.GetTVCT(f) + except: + import traceback + traceback.print_exc(file=log.logfile) + raise + + log.msg('tvct:', tvct) + if len(tvct['channels']) == 1: + return None, None + return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } + elif len(tvct['channels']) > 1: + return MultiMPEGTS, { 'path': path } + + return None, None + +registerklassfun(detectmpegts) diff --git a/pymediaserv b/pymediaserv index 17bd2fb..8b8983e 100755 --- a/pymediaserv +++ b/pymediaserv @@ -25,7 +25,7 @@ def tryloadmodule(mod): pass # ZipStorage w/ tar support should be last as it will gobble up empty files. -modules = [ 'dvd', 'shoutcast', 'ZipStorage' ] +modules = [ 'dvd', 'mpegtsmod', 'shoutcast', 'ZipStorage' ] modmap = {} for i in modules: modmap[i] = tryloadmodule(i) From 328eb877739401ff87c77012186b34f33d82b772 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 01:54:27 -0800 Subject: [PATCH 104/179] document new mpegtsmod [git-p4: depot-paths = "//depot/": change = 859] --- README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README b/README index 06b6ce5..5b0ee05 100644 --- a/README +++ b/README @@ -35,6 +35,9 @@ Ideas for future improvements: Support sorting by other attributes. v0.x: + Look inside MPEG-TS for TVCT and/or PAT and if there is more + than one program, make it a container w/ the different + programs. Add support for multiple res elements and automatic transcoding to either avi/xvid or mpeg2 using ffmpeg. Look inside DVDs and handle titles and chapters. From 296b666ec657fca8edb54ea83e02e52274e7f87f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 11:41:57 -0800 Subject: [PATCH 105/179] drop debugging of needupdate flag.. [git-p4: depot-paths = "//depot/": change = 860] --- ContentDirectory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 621ab88..01dfc3c 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -216,7 +216,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] for i in ch: - log.msg('i:', `i`, i.needupdate) if i.needupdate: i.checkUpdate() didl.addItem(i) From 04122f05dd63357dc51c7dcf784f9abbdf11106c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 11:44:34 -0800 Subject: [PATCH 106/179] I believe I had improved the error handling now.. we now trigger the waiting clients when an error occures to be passed back up... we also clear the fetchingurls flag so that if an error occures, then next query will try again... [git-p4: depot-paths = "//depot/": change = 861] --- shoutcast.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/shoutcast.py b/shoutcast.py index da03b7d..31196a7 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -5,6 +5,12 @@ __version__ = '$Change$' # $Id$ +# The handling of defers and state in this module is not very good. It +# needs some work to ensure that error cases are properly handled. What +# do we do if we get no URLs for a PLS? Do we delete ourselves just to be +# readded (when we get PLS refeshing working)? Do we set a content-length +# to zero till we get one? + import ConfigParser import StringIO import os.path @@ -188,7 +194,12 @@ class ShoutProxy(resource.Resource): protocol.ClientCreator(reactor, ShoutTransfer, request, self.startNextConnection).connectTCP(host, port) + def triggerdefered(self, fun): + map(fun, self.afterurls) + self.afterurls = None + def gotPLS(self, page): + self.fetchingurls = False try: pls = ConfigParser.SafeConfigParser() pls.readfp(StringIO.StringIO(page)) @@ -203,19 +214,23 @@ class ShoutProxy(resource.Resource): self.urlpos = random.randrange(len(self.urls)) except: self.dump_exc() + self.urls = None + self.triggerdefered(lambda x: x.errback(1)) return - self.afterurls.callback(1) - self.afterurls = None + self.triggerdefered(lambda x: x.callback(1)) def errPLS(self, failure): - self.request.write(failure.render(self.request)) - self.request.finish() - self.request = None + self.fetchingurls = False + self.triggerdefered(lambda x: x.errback(1)) def processRequest(self, ign, request): self.startNextConnection(request) + def errRequest(self, ign, request): + request.write(failure.render(self.request)) + request.finish() + def render(self, request): request.setHeader('content-type', self.mt) @@ -236,15 +251,20 @@ class ShoutProxy(resource.Resource): # shouldn't getPage do proper escaping for me? getPage(self.shoutpls.encode('ascii')) \ .addCallbacks(self.gotPLS, self.errPLS) - self.afterurls = defer.Deferred() + self.afterurls = [ defer.Deferred() ] + else: + self.afterurls.append(defer.Deferred()) # Always add the callback if we don't have urls - self.afterurls.addCallback(self.processRequest, request) + self.afterurls[-1].addCallbacks(self.processRequest, + errback=self.errRequest, callbackArgs=(request, ), + errbackArgs=(request, )) else: self.startNextConnection(request) # and make sure the connection doesn't get closed return server.NOT_DONE_YET - synchronized = [ 'render', 'gotPLS', 'startNextConnection' ] + synchronized = [ 'gotPLS', 'render', 'startNextConnection', + 'triggerdefered', ] threadable.synchronize(ShoutProxy) class ShoutStation(AudioItem): From 43cc28bd1bd37a580c36b42b6c173e7082333900 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 11:46:03 -0800 Subject: [PATCH 107/179] add idea.. [git-p4: depot-paths = "//depot/": change = 862] --- README | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README b/README index 5b0ee05..c9b7d08 100644 --- a/README +++ b/README @@ -25,8 +25,10 @@ Good Luck! John-Mark Gurney Ideas for future improvements: - Make the directory persistant so that the server's UUID can not change - each run and we don't have to recreate the objects. + Add res to the DVDTitle container to play the title, and for other + containers that it makes sense for. + Make the directory persistant so that the server's UUID can not + change each run and we don't have to recreate the objects. Figure out how to rearchitect ContentDirectoryControl so I don't need to use doRecall. This may be helped by not necessarily figuring out all the children of a member just to fetch it. From cffd2f474b6273503de6dcf1e012ff27ddd626c3 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:29:42 -0800 Subject: [PATCH 108/179] add new attribute updateID which is the system update id.. currently maps to object 0's id, but we need to fix that... when an object doesn't have an updateID, use the system's ID... this means music presets work w/ the DSM-520 now... [git-p4: depot-paths = "//depot/": change = 863] --- ContentDirectory.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 01dfc3c..93b96b1 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -83,6 +83,7 @@ def doRecallgen(defer, fun, *args, **kwargs): class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" + updateID = property(lambda x: x['0'].updateID) urlbase = property(lambda x: x._urlbase) def getnextID(self): @@ -172,7 +173,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): """Required: Return the current value of state variable SystemUpdateID.""" log.msg('GetSystemUpdateID()') - return { 'SystemUpdateIdResponse': { 'Id': self['0'].updateID }} + return { 'SystemUpdateIdResponse': { 'Id': self.updateID }} BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') @@ -224,12 +225,14 @@ class ContentDirectoryControl(UPnPPublisher, dict): didl.addItem(self[ObjectID]) total = 1 - result = {'BrowseResponse': {'Result': didl.toString() , - 'NumberReturned': didl.numItems(), - 'TotalMatches': total, - 'UpdateID': self[ObjectID].updateID }} + r = { 'Result': didl.toString(), 'TotalMatches': total, + 'NumberReturned': didl.numItems(), } + result = { 'BrowseResponse': r } - #log.msg('Returning: %s' % result) + if hasattr(self[ObjectID], 'updateID'): + r['UpdateID'] = self[ObjectID].updateID + else: + r['UpdateID'] = self.updateID return result From 8dfacf44f6983fe547362969c325d63a003e5cca Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:30:17 -0800 Subject: [PATCH 109/179] drop debugging.. [git-p4: depot-paths = "//depot/": change = 864] --- dvd.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dvd.py b/dvd.py index c017158..7375e43 100644 --- a/dvd.py +++ b/dvd.py @@ -204,7 +204,6 @@ class DVDDisc(FSObject, StorageFolder): def detectdvd(path, fobj): if os.path.isdir(path): - log.msg('dvd isdir') # Make sure we there is only a VIDEO_TS in there, even # if there is a VIDEO_TS w/ other files, we will open # the VIDEO_TS as a DVD (if it is one) From d7df045134667c6e8d1d669236c4f10bc1e2d743 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:32:00 -0800 Subject: [PATCH 110/179] add function to register files that should be ignore... make this the first function called in the chain, this mean no more anoying 'no mime-type for: media/.DS_Store' messages... should we just ignore dot files? [git-p4: depot-paths = "//depot/": change = 865] --- FSStorage.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 24962eb..8e781b4 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -19,17 +19,31 @@ from twisted.python import log from twisted.internet import abstract, interfaces, process, protocol, reactor from zope.interface import implements -__all__ = [ 'registerklassfun', 'FSObject', 'FSItem', 'FSVideoItem', - 'FSAudioItem', 'FSTextItem', 'FSImageItem', 'mimetoklass', - 'FSDirectory', +__all__ = [ 'registerklassfun', 'registerfiletoignore', + 'FSObject', 'FSItem', 'FSDirectory', + 'FSVideoItem', 'FSAudioItem', 'FSTextItem', 'FSImageItem', + 'mimetoklass', ] mimedict = static.loadMimeTypes() -klassfuns = [] +_klassfuns = [] def registerklassfun(fun): - klassfuns.append(fun) + _klassfuns.append(fun) + +_filestoignore = { + '.DS_Store': None + } + +def registerfiletoignore(f): + _filestoignore[f] = None + +# Return this class when you want the file to be skipped. If you return this, +# no other modules will be applied, and it won't be added. Useful for things +# like .DS_Store which are known to useless on a media server. +class IgnoreFile: + pass def statcmp(a, b, cmpattrs = [ 'st_ino', 'st_dev', 'st_size', 'st_mtime', ]): if a is None or b is None: @@ -184,6 +198,12 @@ class FSItem(FSObject, Item): self.res.append(Resource(self.url + '/xvid', 'http-get:*:%s:*' % 'video/avi')) Item.doUpdate(self) +def ignoreFiles(path, fobj): + if os.path.basename(path) in _filestoignore: + return IgnoreFile, None + + return None, None + def defFS(path, fobj): if os.path.isdir(path): # new dir @@ -206,7 +226,7 @@ def dofileadd(cd, parent, path, name): fobj = open(fsname) except: fobj = None - for i in itertools.chain(klassfuns, ( defFS, )): + for i in itertools.chain(( ignoreFiles, ), _klassfuns, ( defFS, )): try: try: fobj.seek(0) # incase the call expects a clean file @@ -222,7 +242,7 @@ def dofileadd(cd, parent, path, name): #traceback.print_exc(file=log.logfile) pass - if klass is None: + if klass is None or klass is IgnoreFile: return #log.msg('matched:', os.path.join(path, name), `i`, `klass`) From e521c874be0631b759f5fe8cb106f183754f0ab1 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:32:24 -0800 Subject: [PATCH 111/179] drop debugging, and don't print out the backtrace on failure.. [git-p4: depot-paths = "//depot/": change = 866] --- mpegtsmod.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/mpegtsmod.py b/mpegtsmod.py index ff5a9de..97fd86d 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -123,8 +123,6 @@ class MPEGTS(FSObject, VideoItem): self.tvct = kwargs['tvct'] del kwargs['tvct'] - log.msg('MPEGTS tvct:', self.tvct) - kwargs['content'] = MPEGTSResource( mpegts.iteravpids(mpegts.TSPStream(open(path)), sum(mpegts.getaudiovideopids(self.tvct['PMT']), []))) @@ -176,18 +174,14 @@ class MultiMPEGTS(FSObject, StorageFolder): StorageFolder.doUpdate(self) def detectmpegts(path, fobj): - try: - f = mpegts.TSPStream(_LimitedFile(path, size= 2*1024*1024)) - tvct = mpegts.GetTVCT(f) - except: - import traceback - traceback.print_exc(file=log.logfile) - raise - - log.msg('tvct:', tvct) + f = mpegts.TSPStream(_LimitedFile(path, size= 2*1024*1024)) + tvct = mpegts.GetTVCT(f) + if len(tvct['channels']) == 1: return None, None - return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } + # We might reenable this once we have pid filtering working + # fast enough. + #return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } elif len(tvct['channels']) > 1: return MultiMPEGTS, { 'path': path } From e98be0c1b4ae337f1199c9e02bc83ad497ab10f7 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:32:46 -0800 Subject: [PATCH 112/179] fix construction of the backtrace printer.. [git-p4: depot-paths = "//depot/": change = 867] --- shoutcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index 31196a7..8c73145 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -177,7 +177,7 @@ class ShoutProxy(resource.Resource): self.fetchingurls = False def dump_exc(self): - exc = StringIO() + exc = StringIO.StringIO() traceback.print_exc(file=exc) exc.seek(0) self.request.setHeader('content-type', 'text/html') From 8e6c2d0c842b7356aae2ec8192ba627669b7dad2 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 9 Jul 2006 12:33:53 -0800 Subject: [PATCH 113/179] put the modules in a more sane order, so that the ones that do the most work (or are most "destructive") are last, and the short and simple ones first... maybe we should do a sort on an attribute the implies how many bytes are read or requires http access or something.. [git-p4: depot-paths = "//depot/": change = 868] --- pymediaserv | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pymediaserv b/pymediaserv index 8b8983e..f293b69 100755 --- a/pymediaserv +++ b/pymediaserv @@ -25,7 +25,9 @@ def tryloadmodule(mod): pass # ZipStorage w/ tar support should be last as it will gobble up empty files. -modules = [ 'dvd', 'mpegtsmod', 'shoutcast', 'ZipStorage' ] +# These should be sorted by how much work they do, the least work the earlier. +# mpegtsmod can be really expensive. +modules = [ 'shoutcast', 'dvd', 'ZipStorage', 'mpegtsmod' ] modmap = {} for i in modules: modmap[i] = tryloadmodule(i) From 4d4e2b80de244056fd359d7ca74d83695d3b67f4 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 18 Jul 2006 17:52:02 -0800 Subject: [PATCH 114/179] support dynamicly isolating the pid's of the ts... [git-p4: depot-paths = "//depot/": change = 869] --- mpegtsmod.py | 84 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/mpegtsmod.py b/mpegtsmod.py index 97fd86d..00563a1 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -5,6 +5,7 @@ __version__ = '$Change$' # $Id$ +tsselpypath = '/Users/jgurney/p4/bktrau/info/tssel.py' default_audio_lang = 'eng' import os @@ -15,12 +16,14 @@ mpegtspath = '/Users/jgurney/p4/bktrau/info' if mpegtspath not in sys.path: sys.path.append(mpegtspath) import mpegts +import tssel from DIDLLite import StorageFolder, VideoItem, Resource from FSStorage import FSObject, registerklassfun from twisted.python import log, threadable from twisted.spread import pb +from twisted.internet import process, protocol, reactor from twisted.web import resource, server class _LimitedFile(file): @@ -97,13 +100,65 @@ class MPEGTSTransfer(pb.Viewable): threadable.synchronize(MPEGTSTransfer) +class DynamTSTransfer(protocol.ProcessProtocol): + def __init__(self, path, pmt, *pids): + self.path = path + self.pmt = pmt + self.pids = pids + + def outReceived(self, data): + self.request.write(data) + + def outConnectionLost(self): + if self.request: + self.request.unregisterProducer() + self.request.finish() + self.request = None + + def errReceived(self, data): + pass + #log.msg(data) + + def stopProducing(self): + if self.request: + self.request.unregisterProducer() + self.request.finish() + + if self.proc: + self.proc.loseConnection() + self.proc.signalProcess('INT') + + self.request = None + self.proc = None + + pauseProducing = lambda x: x.proc.pauseProducing() + resumeProducing = lambda x: x.proc.resumeProducing() + + def render(self, request): + path = self.path + pmt = self.pmt + pids = self.pids + self.request = request + + request.setHeader('content-type', 'video/mpeg') + if request.method == 'HEAD': + return '' + + args = [ 'tssel.py', path, str(pmt), ] + map(str, pids) + self.proc = process.Process(reactor, tsselpypath, args, + None, None, self) + self.proc.closeStdin() + request.registerProducer(self, 1) + + return server.NOT_DONE_YET + class MPEGTSResource(resource.Resource): isLeaf = True - def __init__(self, iter_): + def __init__(self, *args): resource.Resource.__init__(self) - self.iter = iter_ + self.args = args def render(self, request): request.setHeader('content-type', 'video/mpeg') @@ -112,20 +167,19 @@ class MPEGTSResource(resource.Resource): return '' # return data - MPEGTSTransfer(self.iter, request) - # and make sure the connection doesn't get closed - return server.NOT_DONE_YET + return DynamTSTransfer(*self.args).render(request) class MPEGTS(FSObject, VideoItem): def __init__(self, *args, **kwargs): - path = kwargs['path'] + self.path = path = kwargs['path'] del kwargs['path'] - self.tvct = kwargs['tvct'] + self.tvct = tvct = kwargs['tvct'] del kwargs['tvct'] - kwargs['content'] = MPEGTSResource( - mpegts.iteravpids(mpegts.TSPStream(open(path)), - sum(mpegts.getaudiovideopids(self.tvct['PMT']), []))) + #log.msg('tvct w/ keys:', tvct, tvct.keys()) + + kwargs['content'] = MPEGTSResource(path, tvct['PMTpid'], + *sum(mpegts.getaudiovideopids(tvct['PMT']), [])) VideoItem.__init__(self, *args, **kwargs) FSObject.__init__(self, path) @@ -166,6 +220,12 @@ class MultiMPEGTS(FSObject, StorageFolder): continue # new object + if toindex[i]['prog_num'] == 0: + log.msg('bogus:', toindex[i]) + continue + + #log.msg('real tvct:', toindex[i], toindex.keys(), + self.tvct) self.pathObjmap[i] = self.cd.addItem(self.id, MPEGTS, i, path = self.FSpath, tvct = toindex[i]) doupdate = True @@ -178,10 +238,10 @@ def detectmpegts(path, fobj): tvct = mpegts.GetTVCT(f) if len(tvct['channels']) == 1: - return None, None + #return None, None # We might reenable this once we have pid filtering working # fast enough. - #return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } + return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } elif len(tvct['channels']) > 1: return MultiMPEGTS, { 'path': path } From 2c59e2b8c5f9b4fe3bb330d1986761584a3777ca Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 18 Jul 2006 22:52:49 -0800 Subject: [PATCH 115/179] pass kwargs through Container... This probably means I don't need to del the kwargs stuff anymore... [git-p4: depot-paths = "//depot/": change = 870] --- DIDLLite.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index 6907f34..865cf59 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -244,8 +244,10 @@ class Container(Object, list): updateID = 0 needupdate = False - def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): - Object.__init__(self, cd, id, parentID, title, restricted, creator) + def __init__(self, cd, id, parentID, title, restricted = 0, + creator = None, **kwargs): + Object.__init__(self, cd, id, parentID, title, restricted, + creator, **kwargs) list.__init__(self) def doUpdate(self): From 9f8318cbb6f860df5868ead9ca7cfc7be114e0aa Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 18 Jul 2006 22:53:22 -0800 Subject: [PATCH 116/179] forgot to comment out second part of line.. [git-p4: depot-paths = "//depot/": change = 871] --- mpegtsmod.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpegtsmod.py b/mpegtsmod.py index 00563a1..63fbe62 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -225,7 +225,7 @@ class MultiMPEGTS(FSObject, StorageFolder): continue #log.msg('real tvct:', toindex[i], toindex.keys(), - self.tvct) + # self.tvct) self.pathObjmap[i] = self.cd.addItem(self.id, MPEGTS, i, path = self.FSpath, tvct = toindex[i]) doupdate = True From a11d16a2255f1dcd3675db435f936521fe2c504e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 18 Jul 2006 22:56:28 -0800 Subject: [PATCH 117/179] rename a few of the classes to better match what they are... support doing the entire title as a resource on the container now that didllite stuff supports the pass through... just chain the chapter iters together for this.. [git-p4: depot-paths = "//depot/": change = 872] --- dvd.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dvd.py b/dvd.py index 7375e43..3855252 100644 --- a/dvd.py +++ b/dvd.py @@ -7,6 +7,7 @@ __version__ = '$Change$' default_audio_lang = 'en' +import itertools import os import sets @@ -38,7 +39,7 @@ def gennameindexes(pref, item): return ret, d -class DVDChapterTransfer(pb.Viewable): +class IterTransfer(pb.Viewable): def __init__(self, iterable, request): self.iter = iter(iterable) self.request = request @@ -81,28 +82,24 @@ class DVDChapterTransfer(pb.Viewable): synchronized = ['resumeProducing', 'stopProducing'] -threadable.synchronize(DVDChapterTransfer) +threadable.synchronize(IterTransfer) -class DVDChapterResource(resource.Resource): +class IterGenResource(resource.Resource): isLeaf = True - def __init__(self, chapter): + def __init__(self, itergen): resource.Resource.__init__(self) - self.chapter = chapter - - def getFileSize(self): - return self.chapter.size + self.itergen = itergen def render(self, request): request.setHeader('content-type', 'video/mpeg') - #request.setHeader('content-length', str(self.getFileSize())) if request.method == 'HEAD': return '' # return data - DVDChapterTransfer(self.chapter, request) + IterTransfer(self.itergen(), request) # and make sure the connection doesn't get closed return server.NOT_DONE_YET @@ -113,8 +110,8 @@ class DVDChapter(VideoItem): del kwargs['dvdtitle'], kwargs['chapter'] audio = self.dvdtitle.selectaudio(default_audio_lang) - kwargs['content'] = DVDChapterResource( - audiofilter(self.chapter, 0x80 + audio.pos)) + kwargs['content'] = IterGenResource(lambda i = self.chapter, + p = audio.pos: audiofilter(i, 0x80 + p)) VideoItem.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) @@ -130,8 +127,14 @@ class DVDTitle(StorageFolder): self.dvddisc = kwargs['dvddisc'] del kwargs['dvdtitle'], kwargs['dvddisc'] + audio = self.dvdtitle.selectaudio(default_audio_lang) + kwargs['content'] = IterGenResource(lambda dt = self.dvdtitle, + p = audio.pos: audiofilter(itertools.chain(*dt), 0x80 + p)) StorageFolder.__init__(self, *args, **kwargs) + self.url = '%s/%s' % (self.cd.urlbase, self.id) + self.res = Resource(self.url, 'http-get:*:video/mpeg:*') + # mapping from path to objectID self.pathObjmap = {} From e2b3d7d0f02510f5658a8f8306e3f2e18d7bc554 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 5 Sep 2006 11:33:55 -0800 Subject: [PATCH 118/179] spell port properly Reported by: Jens Nie Message-Id: <200609052014.38286.jneines@web.de> [git-p4: depot-paths = "//depot/": change = 882] --- SSDP.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SSDP.py b/SSDP.py index c4a9bd1..728fb87 100644 --- a/SSDP.py +++ b/SSDP.py @@ -81,7 +81,7 @@ class SSDPServer(DatagramProtocol): for i in self.known: hcopy = dict(headers.iteritems()) hcopy['st'] = i - self.discoveryRequest(hcopy, (host, post)) + self.discoveryRequest(hcopy, (host, port)) return if not self.known.has_key(headers['st']): return From 3250e2e28633d6a2ae7f280c521ebca8e7577c96 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 5 Sep 2006 22:22:38 -0800 Subject: [PATCH 119/179] This seems to have fixed the problem of things appearing and disappearing... [git-p4: depot-paths = "//depot/": change = 883] --- ContentDirectory.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 93b96b1..9ae5734 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -207,10 +207,14 @@ class ContentDirectoryControl(UPnPPublisher, dict): didl = DIDLElement() result = {} + # return error code if we don't exist anymore + if ObjectID not in self: + raise errorCode(701) + # check to see if object needs to be updated self[ObjectID].checkUpdate() - # return error code if we don't exist anymore + # make sure we still exist, we could of deleted ourself if ObjectID not in self: raise errorCode(701) From 0e77d25b167ffc09da0e4b7aa884f4e9909fc5f9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 5 Sep 2006 23:31:31 -0800 Subject: [PATCH 120/179] add comparision opperators, this is a major bug fix.. previously two empty containers would compare equal causing the removal of the first one if a later one was really removed... The problems of inheriting from list.. :( It was previously masked because I would expand everything by default and now that I don't, more items are empty exposing the bug... [git-p4: depot-paths = "//depot/": change = 884] --- DIDLLite.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/DIDLLite.py b/DIDLLite.py index 865cf59..ea11b40 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -59,6 +59,29 @@ class Object(object): if kwargs.has_key('content'): self._content = kwargs['content'] + def __lt__(self, other): + return self.__cmp__(other) < 0 + + def __le__(self, other): + return self.__cmp__(other) <= 0 + + def __eq__(self, other): + return self.__cmp__(other) == 0 + + def __ne__(self, other): + return self.__cmp__(other) != 0 + + def __gt__(self, other): + return self.__cmp__(other) > 0 + + def __ge__(self, other): + return self.__cmp__(other) >= 0 + + def __cmp__(self, other): + if not isinstance(other, self.__class__): + return 1 + return cmp(self.id, other.id) + def __repr__(self): cls = self.__class__ return '<%s.%s: id: %s, parent: %s, title: %s>' % \ From 7cefb1b6add41be4037e00c6427fe95517250f91 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 5 Sep 2006 23:53:54 -0800 Subject: [PATCH 121/179] expand the repr's.. [git-p4: depot-paths = "//depot/": change = 885] --- FSStorage.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 8e781b4..55049fb 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -83,9 +83,11 @@ class FSObject(object): def doUpdate(self): raise NotImplementedError + def __repr__(self): - return '<%s.%s: path: %s>' % (self.__class__.__module__, - self.__class__.__name__, self.FSpath) + return '<%s.%s: path: %s, id: %s, parent: %s, title: %s>' % \ + (self.__class__.__module__, self.__class__.__name__, + self.FSpath, self.id, self.parentID, self.title) class NullConsumer(file, abstract.FileDescriptor): implements(interfaces.IConsumer) @@ -287,3 +289,9 @@ class FSDirectory(FSObject, StorageFolder): # Pass up to handle UpdateID if doupdate: StorageFolder.doUpdate(self) + + def __repr__(self): + return ('<%s.%s: path: %s, id: %s, parent: %s, title: %s, ' + \ + 'cnt: %d>') % (self.__class__.__module__, + self.__class__.__name__, self.FSpath, self.id, + self.parentID, self.title, len(self)) From f2e4485467c37bbecf0ed3f45e382176f0c449f5 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 5 Sep 2006 23:54:13 -0800 Subject: [PATCH 122/179] update w/ latest fixes.. [git-p4: depot-paths = "//depot/": change = 886] --- README | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README b/README index c9b7d08..0d5648e 100644 --- a/README +++ b/README @@ -27,14 +27,16 @@ John-Mark Gurney Ideas for future improvements: Add res to the DVDTitle container to play the title, and for other containers that it makes sense for. - Make the directory persistant so that the server's UUID can not - change each run and we don't have to recreate the objects. + Make the directory persistant so that the server's UUID does not + change each run and we don't have to recreate the objects. This + will mean we can add additional meta data. Figure out how to rearchitect ContentDirectoryControl so I don't need to use doRecall. This may be helped by not necessarily figuring out all the children of a member just to fetch it. childCount isn't a required attribute. Autodetect IP address. Support sorting by other attributes. + Finish support for playing DVD stream. v0.x: Look inside MPEG-TS for TVCT and/or PAT and if there is more @@ -42,7 +44,8 @@ v0.x: programs. Add support for multiple res elements and automatic transcoding to either avi/xvid or mpeg2 using ffmpeg. - Look inside DVDs and handle titles and chapters. + Look inside DVDs and handle titles and chapters. We can not yet + play the streams. Empty dirs w/ no content would disappear, and cause a short response to BrowseDirectChildren. The DSM-520 askes for one more than displayed, and uses the existant of the extra item @@ -54,6 +57,10 @@ v0.x: installed in the web server. Don't send 'foobar' when exiting, stops a traceback on another instance of PyMedS. + Properly fix deleting items. If you had another item with zero + children which was before the deleted item, it would get removed + from the list instead of the deleted item. + v0.2: No longer require restarting to see new files/dirs in hierarchy. Add FSStorage which is a set of classes for handling filesystem From 1e0d18c9324945c6c1342a2ce9066c8bd92d2b14 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 00:16:55 -0800 Subject: [PATCH 123/179] add dependencies to the README, and include a couple patches... [git-p4: depot-paths = "//depot/": change = 887] --- README | 11 +++ patches/twisted.internet.tcp.py.patch | 34 ++++++++++ patches/twisted.web.static.py.patch | 98 +++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 patches/twisted.internet.tcp.py.patch create mode 100644 patches/twisted.web.static.py.patch diff --git a/README b/README index 0d5648e..839b8b9 100644 --- a/README +++ b/README @@ -20,6 +20,15 @@ Either make a directory media and put the files there, or make a symlink named media to your media files. Either will work. Run it as: ./pymediaserv [ ] +The following packages are required to run the media server: + * Twisted (only core and web necessary), Optional: patch to handle byte servering + * ElementTree + * SOAPpy available from Python Web Services + * fpconst (required by SOAPpy) + +For more information, check out the software page at: +http://resnet.uoregon.edu/~gurney_j/jmpc/pymeds.html + Good Luck! John-Mark Gurney @@ -39,6 +48,8 @@ Ideas for future improvements: Finish support for playing DVD stream. v0.x: + Include some patches for twisted in the distro, in the directory + patches. Look inside MPEG-TS for TVCT and/or PAT and if there is more than one program, make it a container w/ the different programs. diff --git a/patches/twisted.internet.tcp.py.patch b/patches/twisted.internet.tcp.py.patch new file mode 100644 index 0000000..31cfbb6 --- /dev/null +++ b/patches/twisted.internet.tcp.py.patch @@ -0,0 +1,34 @@ +--- Twisted-2.1.0/twisted/internet/tcp.py Sat Oct 8 21:10:44 2005 ++++ /usr/local/lib/python2.4/site-packages/twisted/internet/tcp.py Tue Sep 5 23:33:41 2006 +@@ -43,6 +43,7 @@ + from errno import WSAEINPROGRESS as EINPROGRESS + from errno import WSAEALREADY as EALREADY + from errno import WSAECONNRESET as ECONNRESET ++ from errno import WSAECONNRESET as ECONNABORTED + from errno import WSAEISCONN as EISCONN + from errno import WSAENOTCONN as ENOTCONN + from errno import WSAEINTR as EINTR +@@ -55,6 +56,7 @@ + from errno import EINPROGRESS + from errno import EALREADY + from errno import ECONNRESET ++ from errno import ECONNABORTED + from errno import EISCONN + from errno import ENOTCONN + from errno import EINTR +@@ -752,10 +754,13 @@ + try: + skt, addr = self.socket.accept() + except socket.error, e: +- if e.args[0] in (EWOULDBLOCK, EAGAIN): ++ errno = e.args[0] ++ if not isinstance(errno, type(EAGAIN)): ++ errno = errno[0] ++ if errno in (EWOULDBLOCK, EAGAIN, ECONNABORTED): + self.numberAccepts = i + break +- elif e.args[0] == EPERM: ++ elif errno == EPERM: + continue + raise + diff --git a/patches/twisted.web.static.py.patch b/patches/twisted.web.static.py.patch new file mode 100644 index 0000000..e34d1dc --- /dev/null +++ b/patches/twisted.web.static.py.patch @@ -0,0 +1,98 @@ +--- TwistedWeb-0.5.0/twisted/web/static.py Sun Jan 2 15:33:41 2005 ++++ /usr/local/lib/python2.4/site-packages/twisted/web/static.py Fri Feb 17 23:55:04 2006 +@@ -306,7 +306,7 @@ + #for content-length + fsize = size = self.getFileSize() + +-# request.setHeader('accept-ranges','bytes') ++ request.setHeader('accept-ranges','bytes') + + if self.type: + request.setHeader('content-type', self.type) +@@ -325,39 +325,59 @@ + if request.setLastModified(self.getmtime()) is http.CACHED: + return '' + ++ trans = True + # Commented out because it's totally broken. --jknight 11/29/04 +-# try: +-# range = request.getHeader('range') +-# +-# if range is not None: +-# # This is a request for partial data... +-# bytesrange = string.split(range, '=') +-# assert bytesrange[0] == 'bytes',\ +-# "Syntactically invalid http range header!" +-# start, end = string.split(bytesrange[1],'-') +-# if start: +-# f.seek(int(start)) +-# if end: +-# end = int(end) +-# size = end +-# else: +-# end = size +-# request.setResponseCode(http.PARTIAL_CONTENT) +-# request.setHeader('content-range',"bytes %s-%s/%s " % ( +-# str(start), str(end), str(size))) +-# #content-length should be the actual size of the stuff we're +-# #sending, not the full size of the on-server entity. +-# fsize = end - int(start) +-# +-# request.setHeader('content-length', str(fsize)) +-# except: +-# traceback.print_exc(file=log.logfile) ++# XXX - fixed? jmg 2/17/06 ++ try: ++ range = request.getHeader('range') ++ ++ tsize = size ++ if range is not None: ++ # This is a request for partial data... ++ bytesrange = string.split(range, '=') ++ assert bytesrange[0] == 'bytes',\ ++ "Syntactically invalid http range header!" ++ start, end = string.split(bytesrange[1],'-', 1) ++ if start: ++ f.seek(int(start)) ++ if end: ++ end = int(end) ++ else: ++ end = size - 1 ++ else: ++ lastbytes = int(end) ++ if size < lastbytes: ++ lastbytes = size ++ start = size - lastbytes ++ f.seek(start) ++ fsize = lastbytes ++ end = size - 1 ++ size = end + 1 ++ fsize = end - int(start) + 1 ++ # start is the byte offset to begin, and end is the byte offset ++ # to end.. fsize is size to send, tsize is the real size of ++ # the file, and size is the byte position to stop sending. ++ ++ if fsize <= 0: ++ request.setResponseCode(http.REQUESTED_RANGE_NOT_SATISFIABLE) ++ fsize = tsize ++ trans = False ++ else: ++ request.setResponseCode(http.PARTIAL_CONTENT) ++ request.setHeader('content-range',"bytes %s-%s/%s " % ( ++ str(start), str(end), str(tsize))) ++ except: ++ traceback.print_exc(file=log.logfile) + + request.setHeader('content-length', str(fsize)) +- if request.method == 'HEAD': ++ if request.method == 'HEAD' or trans == False: ++ # pretend we're a HEAD request, so content-length ++ # won't be overwritten. ++ request.method = 'HEAD' + return '' + + # return data ++ # size is the byte position to stop sending, not how many bytes to send + FileTransfer(f, size, request) + # and make sure the connection doesn't get closed + return server.NOT_DONE_YET From 02296bec0f3216af3bbc6e96855ee5360ae001f8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 00:22:09 -0800 Subject: [PATCH 124/179] add versions, and prep for v0.3.. [git-p4: depot-paths = "//depot/": change = 888] --- README | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README b/README index 839b8b9..a155253 100644 --- a/README +++ b/README @@ -21,7 +21,8 @@ named media to your media files. Either will work. Run it as: ./pymediaserv [ ] The following packages are required to run the media server: - * Twisted (only core and web necessary), Optional: patch to handle byte servering + * Twisted (only core and web necessary, tested w/ 2.1.0 and + Web 0.5.0) * ElementTree * SOAPpy available from Python Web Services * fpconst (required by SOAPpy) @@ -47,7 +48,7 @@ Ideas for future improvements: Support sorting by other attributes. Finish support for playing DVD stream. -v0.x: +v0.3: Include some patches for twisted in the distro, in the directory patches. Look inside MPEG-TS for TVCT and/or PAT and if there is more From 6715bb6857fcaff1a3b3280e031dcef10f22c434 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 00:24:47 -0800 Subject: [PATCH 125/179] include the mpeg-ts helper programs, and comment on their location, update the module to point to the current location... document pydvdread... [git-p4: depot-paths = "//depot/": change = 889] --- README | 7 +- mpegts/mpegts.py | 1619 ++++++++++++++++++++++++++++++++++++++++++++++ mpegts/tssel.py | 68 ++ mpegtsmod.py | 4 +- 4 files changed, 1694 insertions(+), 4 deletions(-) create mode 100644 mpegts/mpegts.py create mode 100644 mpegts/tssel.py diff --git a/README b/README index a155253..ddce248 100644 --- a/README +++ b/README @@ -53,11 +53,14 @@ v0.3: patches. Look inside MPEG-TS for TVCT and/or PAT and if there is more than one program, make it a container w/ the different - programs. + programs. Includes the program and MPEG-TS python module in + the mpegts directory. Add support for multiple res elements and automatic transcoding to either avi/xvid or mpeg2 using ffmpeg. Look inside DVDs and handle titles and chapters. We can not yet - play the streams. + play the streams. This requires pydvdread which is included + in the directory pydvdread. It depends upon libdvdread and + requires a C compiler to build. Empty dirs w/ no content would disappear, and cause a short response to BrowseDirectChildren. The DSM-520 askes for one more than displayed, and uses the existant of the extra item diff --git a/mpegts/mpegts.py b/mpegts/mpegts.py new file mode 100644 index 0000000..9a4dc49 --- /dev/null +++ b/mpegts/mpegts.py @@ -0,0 +1,1619 @@ +#!/usr/bin/env python +# + +import itertools +import sets +import struct +import traceback + +TSSYNC = '\x47' +TSPKTLEN = 188 +READBLK = 1024 + +def attribreprlist(obj, attrs): + return map(lambda x, y = obj: '%s: %s' % (x, repr(getattr(y, x))), itertools.ifilter(lambda x, y = obj: hasattr(y, x), attrs)) + +class UnReadSTR: + def __init__(self, s): + self.s = s + self.pos = 0 + + self._buf = [] + self._buftot = 0 + + def __nonzero__(self): + return self._buftot or self.pos < len(self.s) + + def tell(self): + return self.pos - self._buftot + + def unread(self, buf): + self._buf.append(buf) + self._buftot += len(buf) + + def peek(self, size): + r = self.read(size) + self.unread(r) + return r + + def sread(self, cnt = -1): + oldpos = self.pos + if cnt == -1: + self.pos = len(self.s) + return self.s[oldpos:] + + self.pos += cnt + if self.pos > len(self.s): + self.pos = len(self.s) + + return self.s[oldpos:self.pos] + + def read(self, size = None): + if size is None and self._buf: + ret = self._buf.pop() + self._buftot -= len(ret) + elif size is None: + ret = self.sread() + else: + ret = [] + while size and self._buftot: + ret.append(self._buf[-1][:size]) + l = len(ret[-1]) + if size > l: + assert len(self._buf[-1]) == l + self._buf.pop() + else: + self._buf[-1] = self._buf[-1][size:] + self._buftot -= l + size -= l + + if size: + ret.append(self.sread(size)) + + ret = ''.join(ret) + + return ret + +def DVDAudioFilter(itr, subchan): + '''subchan should be in the range [0x80, 0x8f], this will filter out all other subchannels in that range that do not match subchan.''' + assert subchan >= 0x80 and subchan <= 0x8f + + def checksubchan(pes, sc = subchan): + if pes.stream_id != 0xbd: + return False + + subchan = ord(pes.data[0]) + if subchan == sc or subchan < 0x80 or subchan > 0x8f: + return True + + return False + + # XXX - I probably should mess w/ muxr so SCR is stable. + for i in itr: + j = Pack(UnReadSTR(i)) + + if filter(checksubchan, j): + yield i + +def findcodes(buf): + ret = [] + + i = 0 + l = len(buf) + while i < l: + j = buf.find('\x00\x00\x01', i) + if j == -1 or (i + 4) >= l: + break + ret.append((j, buf[j + 3])) + i = j + 4 + return ret + +class UnRead(file): + def __init__(self, *args, **kwargs): + super(UnRead, self).__init__(*args, **kwargs) + self._buf = [] + self._buftot = 0 + + def unread(self, buf): + self._buf.append(buf) + self._buftot += len(buf) + + def peek(self, size): + r = self.read(size) + self.unread(r) + return r + + def read(self, size = None): + if size is None and self._buf: + ret = self._buf.pop() + self._buftot -= len(ret) + elif size is None: + ret = super(UnRead, self).read() + else: + ret = [] + while size and self._buftot: + ret.append(self._buf[-1][:size]) + l = len(ret[-1]) + if size > l: + assert len(self._buf[-1]) == l + self._buf.pop() + else: + self._buf[-1] = self._buf[-1][size:] + self._buftot -= l + size -= l + + if size: + ret.append(super(UnRead, self).read(size)) + + ret = ''.join(ret) + + return ret + +def read_timestamp(buf): + assert len(buf) == 5 + assert (ord(buf[0]) & 0x1) == 1 + assert (ord(buf[2]) & 0x1) == 1 + assert (ord(buf[4]) & 0x1) == 1 + return (long(ord(buf[0]) & 0xe) << 29) | (ord(buf[1]) << 21) | \ + ((ord(buf[2]) & 0xfe) << 14) | (ord(buf[3]) << 7) | \ + ((ord(buf[4]) & 0xfe) >> 1) + +def read_escr(buf): + assert len(buf) == 6 + assert (ord(buf[0]) & 0x4) == 0x4 and (ord(buf[2]) & 0x4) == 0x4 + assert (ord(buf[4]) & 0x4) == 0x4 and (ord(buf[5]) & 0x1) == 0x1 + + base = (long(ord(buf[0]) & 0x38) << 27) | ((ord(buf[0]) & 0x3) << 28) |\ + (ord(buf[1]) << 20) | ((ord(buf[2]) & 0xf8) << 15) | \ + ((ord(buf[2]) & 0x3) << 13) | (ord(buf[3]) << 5) | \ + ((ord(buf[4]) & 0xf8) >> 3) + extension = ((ord(buf[4]) & 0x3) << 7) | (ord(buf[5]) >> 1) + + return (base, extension) + +class MPEGWriter: + END_CODE = '\xb9' + + def __init__(self, f): + self.f = f + self.SCR = (0, 0) + + def write_header(self, header): + self.f.write('\x00\x00\x01' + header) + + def close(self): + self.write_header(self.END_CODE) + + def __del__(self): + self.close() + +class PES: + PROGRAM_STREAM_MAP_ID = 0xbc + PRIVATE_1_ID = 0xbd + PADDING_ID = 0xbe + PRIVATE_2_ID = 0xbf + IS_AUDIO_ID = lambda x: (x & 0xe0) == 0xc0 + IS_VIDEO_ID = lambda x: (x & 0xf0) == 0xe0 + ECM_ID = 0xf0 + EMM_ID = 0xf1 + DSMCC_ID = 0xf2 + H2221_TYPE_E_ID = 0xf8 + PROGRAM_STREAM_DIRECTORY_ID = 0xff + + def __init__(self, buf): + # Pull out an IndexError first + assert buf[0] == '\x00' and buf[:3] == '\x00\x00\x01' + self.stream_id = ord(buf[3]) + self.length = (ord(buf[4]) << 8) | ord(buf[5]) + if self.length == 0: + self.length = len(buf) + else: + self.length += 6 + if len(buf) < self.length: + raise IndexError, 'not enough data' + + if self.stream_id == self.PADDING_ID: + # Validate padding? + #self.length -= 6 + pass + elif self.stream_id in (self.PROGRAM_STREAM_MAP_ID, + self.PRIVATE_2_ID, self.ECM_ID, self.EMM_ID, self.DSMCC_ID, + self.H2221_TYPE_E_ID, self.PROGRAM_STREAM_DIRECTORY_ID, ): + self.data = buf[6:self.length] + else: + i = 6 + assert (ord(buf[i]) & 0xc0) == 0x80 + self.scrambling_control = (ord(buf[i]) & 0x30) >> 4 + self.priority = bool(ord(buf[i]) & 0x8) + self.data_alignment = bool(ord(buf[i]) & 0x4) + self.copyright = bool(ord(buf[i]) & 0x2) + self.originalcopy = bool(ord(buf[i]) & 0x1) + i +=1 + ptsdts_flag = (ord(buf[i]) & 0xc0) >> 6 + escr_flag = bool(ord(buf[i]) & 0x20) + es_rate_flag = bool(ord(buf[i]) & 0x10) + dsm_trick_mode_flag = bool(ord(buf[i]) & 0x8) + additional_copy_info_flag = bool(ord(buf[i]) & 0x4) + crc_flag = bool(ord(buf[i]) & 0x2) + extension_flag = bool(ord(buf[i]) & 0x1) + header_end = i + 2 + ord(buf[i + 1]) + i += 2 + if ptsdts_flag == 0x2: + assert (ord(buf[i]) & 0xf0) == 0x20 + self.PTS = read_timestamp(buf[i:i + 5]) + i += 5 + elif ptsdts_flag == 0x3: + assert (ord(buf[i]) & 0xf0) == 0x30 + self.PTS = read_timestamp(buf[i:i + 5]) + i += 5 + assert (ord(buf[i]) & 0xf0) == 0x10 + self.DTS = read_timestamp(buf[i:i + 5]) + i += 5 + elif ptsdts_flag == 0x1: + raise ValueError, "ptsdts flag forbidden: %d" % ptsdts_flag + if escr_flag: + self.ESCR = read_escr(buf[i:i + 6]) + i += 6 + if es_rate_flag: + assert (ord(buf[i]) & 0x80) == 0x80 + assert (ord(buf[i + 2]) & 0x01) == 0x01 + self.ES_rate = ((ord(buf[i]) & 0x7f) << 15) | \ + (ord(buf[i + 1]) << 7) | \ + (ord(buf[i + 2]) >> 1) + i += 3 + if dsm_trick_mode_flag: + self.trick_mode_control = ord(buf[i]) >> 5 + self.trick_mode_bits = ord(buf[i]) & 0x1f + i += 1 + if additional_copy_info_flag: + assert (ord(buf[i]) & 0x80) == 0x80 + self.additional_copy_info = ord(buf[i]) & 0x7f + i += 1 + if crc_flag: + self.prev_crc = (ord(buf[i]) << 8) | ord(buf[i + 1]) + i += 2 + if extension_flag: + private_data_flag = bool(ord(buf[i]) & 0x80) + pack_header_field_flag = bool(ord(buf[i]) & 0x40) + program_packet_sequence_counter_flag = bool(ord(buf[i]) & 0x20) + pstd_buffer_flag = bool(ord(buf[i]) & 0x10) + pes_extension_flag_2 = bool(ord(buf[i]) & 0x01) + i += 1 + if private_data_flag: + self.private_data = buf[i:i + 16] + i += 16 + if pack_header_field_flag: + pack_field_length = ord(buf[i]) + self.pack_header = buf[i + 1:i + 1 + pack_field_length] + i += 1 + pack_field_length + if program_packet_sequence_counter_flag: + assert (ord(buf[i]) & 0x80) == 0x80 + self.sequence_counter = ord(buf[i]) & 0x7f + i += 1 + assert (ord(buf[i]) & 0x80) == 0x80 + self.mpeg1_mpeg2_ident = bool(ord(buf[i]) & 0x4) + self.original_stuff_len = ord(buf[i]) & 0x3f + i += 1 + if pstd_buffer_flag: + assert (ord(buf[i]) & 0xc0) == 0x40 + self.pstd_buffer_scale = bool(ord(buf[i]) & 0x20) + self.pstd_buffer_size = ((ord(buf[i]) & 0x1f) << 8) | ord(buf[i + 1]) + i += 2 + if pes_extension_flag_2: + assert (ord(buf[i]) & 0x80) == 0x80 + extension_field_length = ord(buf[i]) & 0x7f + self.extension_field = buf[i + 1: i + 1 + extension_field_length] + i += 1 + extension_field_length + + assert i <= header_end + self.data = buf[header_end:self.length] + + def __repr__(self): + # XXX - data length + v = [ 'length', 'scrambling_control', + 'priority', 'data_alignment', 'copyright', + 'originalcopy', 'PTS', 'DTS', 'ESCR', 'ES_rate', + 'trick_mode_control', 'trick_mode_bits', + 'additional_copy_info', 'pack_header', + 'sequence_counter', 'mpeg1_mpeg2_ident', + 'original_stuff_len', 'pstd_buffer_scale', + 'pstd_buffer_size', 'extension_field', ] + return '' % (self.stream_id, ', '.join(attribreprlist(self, v)), ) + +class Pack(list): + def __init__(self, f = None, **keyw): + super(Pack, self).__init__() + if f is not None: + d = f.read(14) + assert d[:4] == '\x00\x00\x01\xba' + assert (ord(d[4]) & 0xc0) == 0x40 + self.SCR = read_escr(d[4:10]) + assert ord(d[12]) & 0x3 == 0x3 + m = map(ord, d[10:13]) + self.muxr = (m[0] << 14) | (m[1] << 6) | (m[2] >> 2) + self.stuff_len = ord(d[13]) & 0x7 + f.read(self.stuff_len) + + # system header + d = f.peek(6) + if d[:4] == '\x00\x00\x01\xbb': + f.read(6) + hlen = (ord(d[4]) << 8) | ord(d[5]) + header = f.read(hlen) + oh = map(ord, header) + assert (oh[0] & 0x80) == 0x80 and (oh[2] & 0x1) == 0x1 + self.rate_bound = ((oh[0] & 0x7f) << 15) | (oh[1] << 7) | (oh[2] >> 1) + self.audio_bound = oh[3] >> 2 + self.fixed = bool(oh[3] & 0x2) + self.CSPS = bool(oh[3] & 0x1) + self.system_audio_lock = bool(oh[4] & 0x80) + self.system_video_lock = bool(oh[4] & 0x40) + assert (oh[4] & 0x20) == 0x20 + self.video_bound = oh[4] & 0x1f + self.packet_rate_restriction = bool(oh[5] & 0x80) + d = f.peek(1) + self.streams = {} + while ord(d) & 0x80: + d = map(ord, f.read(3)) + assert (d[1] & 0xc0) == 0xc0 + scaleflag = bool(d[1] & 0x20) + self.streams[d[0]] = (((d[1] & 0x1f) << 8) | d[2]) * (128, 1024)[scaleflag] + d = f.peek(1) + # PES packets + d = f.peek(3) + bytestoread = 2048 + while (f or d) and d == '\x00\x00\x01': + try: + d = f.read(bytestoread) + self.append(PES(d)) + f.unread(d[self[-1].length:]) + except IndexError: + f.unread(d) + bytestoread <<= 2 + d = f.peek(4) + else: + self.SCR = keyw['SCR'] + self.muxr = keyw['muxr'] # in bps (converts to 50 bytes/sec) + self.stuff_len = 0 + + def __repr__(self): + v = [ 'SCR', 'muxr', 'stuff_len', + 'rate_bound', 'audio_bound', 'fixed', 'CSPS', + 'system_audio_lock', 'system_video_lock', + 'video_bound', 'packet_rate_restriction', + 'streams', + ] + return '' % (', '.join(attribreprlist(self, v)), list.__repr__(self)) + + def __str__(self): + buf = [] + buf.append('\x00\x00\x01\xba') + clock = (1l << 46) | (((self.SCR[0] >> 30) & 0x7) << 43) | (1l << 42) | (((self.SCR[0] >> 15) & 0x7ffff) << 27) | (1 << 26) | ((self.SCR[0] & 0x7fff) << 11) | (1 << 10) | ((self.SCR[1] << 1) & 0x3fe) | 0x1 + for i in range(6): + buf.append(chr(clock >> ((5 - i) * 8) & 0xff)) + muxr = self.muxr / 50 / 8 + buf.append(chr((muxr >> 14) & 0xff)) + buf.append(chr((muxr >> 6) & 0xff)) + buf.append(chr(((muxr << 2) & 0xfc) | 0x3)) + buf.append(chr(0xf8 | (self.stuff_len & 7))) + buf.append('\xff' * self.stuff_len) + buf.extend(map(str, self)) + return ''.join(buf) + +# These are strings due to the floating point numbers +frame_rate_code = { + 0x0: 'forbidden', 0x1: '23.976', 0x2: '24', 0x3: '25', + 0x4: '29.97', 0x5: '30', 0x6: '50', 0x7: '59.95', + 0x8: '60', 0x9: 'reserved', 0xa: 'reserved', + 0xb: 'reserved', 0xc: 'reserved', 0xd: 'reserved', + 0xe: 'reserved', 0xf: 'reserved', +} +chroma_format = { + 0x0: 'reserved', 0x1: '4:2:0', 0x2: '4:2:2', 0x3: '4:4:4', +} + +class BitRate(int): + def __init__(self, bitrate): + super(BitRate, self).__init__(bitrate) + + def __str__(self): + return repr(self) + + def __repr__(self): + return '%dbps' % self + +def max_bitrate_descriptor(b): + assert len(b) == 3 + return BitRate((((ord(b[0]) & 0x3f) << 16) | ((ord(b[1]) & 0xff) << 8) | (ord(b[0]) & 0xff)) * 50 * 8) + +class ISO639LangDescriptor(list): + atypedict = { + 0: 'undefined', + 1: 'clean effects', + 2: 'hearing impaired', + 3: 'visual impaired commentary', + } + + def __init__(self, b): + assert len(b) % 4 == 0 + + for i in range(len(b) / 4): + lang = unicode(b[i * 4:i * 4 + 3], 'iso8859-1') + atype = self.atypedict[ord(b[i * 4 + 3])] + self.append((lang, atype)) + +class VStreamDescriptor: + def __init__(self, b): + fb = ord(b[0]) + # XXX - libdvbpsi says no not for mpeg2 flag, but my data + # seems to say otherwise. + self.mpeg2 = not bool(fb & 0x04) + assert (not self.mpeg2 and len(b) == 1) or (self.mpeg2 and len(b) == 3) + self.multiple_frame_rate = bool(fb & 0x80) + self.frame_rate_code = frame_rate_code[(fb & 0x78) >> 3] + self.constrained_parameter = bool(fb & 0x02) + self.still_picture = bool(fb & 0x01) + if self.mpeg2: + self.profile_level_indication = ord(b[1]) + tb = ord(b[2]) + self.chroma_format = chroma_format[(tb & 0xc0) >> 6] + self.frame_rate_extension = bool(tb & 0x20) + + def __repr__(self): + v = ['mpeg2', 'multiple_frame_rate', 'frame_rate_code', + 'constrained_parameter', 'still_picture', + 'profile_level_indication', 'chroma_format', + 'frame_rate_extension', ] + + return '' % (', '.join(attribreprlist(self, v)), ) + +class AC3Descriptor: + src_dict = { 0: '48k', 1: '44.1k', 2: '32k', 3: None, 4: '48k or 44.1k', + 5: '48k or 32k', 6: '44.1k or 32k', 7: '48k or 44.1k or 32k' } + + brc_dict = { 0: 32, 1: 40, 2: 48, 3: 56, 4: 64, 5: 80, 6: 96, 7: 112, + 8: 128, 9: 160, 10: 192, 11: 224, 12: 256, 13: 320, 14: 384, + 15: 448, 16: 512, 17: 576, 18: 640, } + + sm_dict = { 0: 'Not indicated', 1: 'NOT Dolby surround encoded', + 2: 'Dolby surround encoded', 3: 'Reserved', } + + numchan_dict = { 0: '1+1', 1: '1/0', 2: '2/0', 3: '3/0', 4: '2/1', + 5: '3/1', 6: '2/2', 7: '3/2', 8: '1', 9: '<=2', 10: '<=3', + 11: '<=4', 12: '<=5', 13: '<=6', 14: 'Reserved', + 15: 'Reserved', } + + def __init__(self, data): + srcbsid = ord(data[0]) + self.sample_rate = self.src_dict[srcbsid >> 5] + self.bsid = srcbsid & 0x1f + brcsm = ord(data[1]) + self.br_exact = (brcsm & 0x80) == 0x80 + self.bitrate = self.brc_dict[(brcsm >> 2) & 0x1f] + self.surround_mode = self.sm_dict[brcsm & 0x3] + bsmodnumchanfullsvc = ord(data[2]) + self.bsmod = bsmodnumchanfullsvc >> 6 + self.num_channels = \ + self.numchan_dict[bsmodnumchanfullsvc >> 1 & 0xf] + i = 4 + # dropped langcod as not used per A/52a 3.4 + if (bsmodnumchanfullsvc >> 1 & 0xf) == 0: + i += 1 + if self.bsmod < 2: + self.mainid = ord(data[i]) >> 5 + else: + self.asvcflags = ord(data[i]) + i += 1 + textlangcode = ord(data[i]) + textlen = textlangcode >> 1 + i += 1 + txt = data[i:i + textlen] + if textlangcode & 1: + self.text = txt.decode('latin-1') + else: + assert NotImplementedError, 'the following code is untested' + self.text = ''.join(map(lambda x: + unichr(ord(x[0]) * 256 + ord(x[1])), + [txt[i:i+2] for i in range(0, len(txt), 2)])) + + def __repr__(self): + v = ['sample_rate', 'bsid', 'br_exact', 'bitrate', + 'surround_mode', 'bsmod', 'num_channels', 'mainid', + 'asvcflags', 'text', ] + + return '' % (', '.join(attribreprlist(self, + v)), ) + +class ServiceLocationDescriptor(list): + tag = 0xa1 + sldel = '>BH3c' + + def __init__(self, data): + step = struct.calcsize(self.sldel) + assert ((len(data) - 3) % step) == 0 + + list.__init__(self) + + self.pcr_pid, cnt = struct.unpack('>HB', data[:3]) + self.pcr_pid &= 0x1fff + for i in range(cnt): + type, pid, a, b, c = struct.unpack(self.sldel, + data[3 + i * step:3 + (i + 1) * step]) + pid &= 0x1fff + lang = a + b + c + if lang == '\x00' * 3: + lang = None + self.append({ 'type': type, 'pid': pid, 'lang': lang }) + + def __repr__(self): + return '' % \ + (self.pcr_pid, list.__repr__(self)) + +class MultiStringStruct(dict): + def decode(self, comp, mode, data): + assert (mode == 0 and comp in (1, 2)) or comp == 0 + if comp == 0: + return ''.join(map(lambda x, y = mode * 256: + unichr(ord(x) + y), data)) + + raise NotImplementedError, 'no code for comp type %d' % comp + + def __init__(self, data): + cnt = ord(data[0]) + off = 1 + for i in range(cnt): + lang = data[off:off + 3] + nseg = ord(data[off + 3]) + segs = [] + self[lang] = segs + off += 4 + for j in range(nseg): + comp_type = ord(data[off]) + mode = ord(data[off + 1]) + nbytes = ord(data[off + 2]) + segs.append(self.decode(comp_type, mode, + data[off + 3: off + 3 + nbytes])) + +class ComponentNameDescriptor(MultiStringStruct): + def __repr__(self): + return '' % \ + MultiStringStruct.__repr__(self) + +Descriptors = { + 2: VStreamDescriptor, + 10: ISO639LangDescriptor, + 14: max_bitrate_descriptor, + 0x81: AC3Descriptor, + 0xa1: ServiceLocationDescriptor, + 0xa3: ComponentNameDescriptor, +} + +PIDs = { + 0x00: ('PAT', 'Program Association Table'), + 0x01: ('CAT', 'Conditional Access Table'), + 0x02: ('TSDT', 'Program Stream Descriptor Table'), + 0x10: ('NIT', 'Network Information Table'), + 0x11: ('BAT', 'Bouquet Association Table'), + 0x11: ('SDT', 'Service Descriptor Table'), + 0x12: ('EIT', 'Event Information Table'), + 0x13: ('RST', 'running Status Table'), + 0x14: ('TOT', 'Time Offset Table'), +} + +def psip_calc_crc32(data, verbose = False, table = ( + 0x00000000l, 0x04c11db7l, 0x09823b6el, 0x0d4326d9l, + 0x130476dcl, 0x17c56b6bl, 0x1a864db2l, 0x1e475005l, + 0x2608edb8l, 0x22c9f00fl, 0x2f8ad6d6l, 0x2b4bcb61l, + 0x350c9b64l, 0x31cd86d3l, 0x3c8ea00al, 0x384fbdbdl, + 0x4c11db70l, 0x48d0c6c7l, 0x4593e01el, 0x4152fda9l, + 0x5f15adacl, 0x5bd4b01bl, 0x569796c2l, 0x52568b75l, + 0x6a1936c8l, 0x6ed82b7fl, 0x639b0da6l, 0x675a1011l, + 0x791d4014l, 0x7ddc5da3l, 0x709f7b7al, 0x745e66cdl, + 0x9823b6e0l, 0x9ce2ab57l, 0x91a18d8el, 0x95609039l, + 0x8b27c03cl, 0x8fe6dd8bl, 0x82a5fb52l, 0x8664e6e5l, + 0xbe2b5b58l, 0xbaea46efl, 0xb7a96036l, 0xb3687d81l, + 0xad2f2d84l, 0xa9ee3033l, 0xa4ad16eal, 0xa06c0b5dl, + 0xd4326d90l, 0xd0f37027l, 0xddb056fel, 0xd9714b49l, + 0xc7361b4cl, 0xc3f706fbl, 0xceb42022l, 0xca753d95l, + 0xf23a8028l, 0xf6fb9d9fl, 0xfbb8bb46l, 0xff79a6f1l, + 0xe13ef6f4l, 0xe5ffeb43l, 0xe8bccd9al, 0xec7dd02dl, + 0x34867077l, 0x30476dc0l, 0x3d044b19l, 0x39c556ael, + 0x278206abl, 0x23431b1cl, 0x2e003dc5l, 0x2ac12072l, + 0x128e9dcfl, 0x164f8078l, 0x1b0ca6a1l, 0x1fcdbb16l, + 0x018aeb13l, 0x054bf6a4l, 0x0808d07dl, 0x0cc9cdcal, + 0x7897ab07l, 0x7c56b6b0l, 0x71159069l, 0x75d48ddel, + 0x6b93dddbl, 0x6f52c06cl, 0x6211e6b5l, 0x66d0fb02l, + 0x5e9f46bfl, 0x5a5e5b08l, 0x571d7dd1l, 0x53dc6066l, + 0x4d9b3063l, 0x495a2dd4l, 0x44190b0dl, 0x40d816bal, + 0xaca5c697l, 0xa864db20l, 0xa527fdf9l, 0xa1e6e04el, + 0xbfa1b04bl, 0xbb60adfcl, 0xb6238b25l, 0xb2e29692l, + 0x8aad2b2fl, 0x8e6c3698l, 0x832f1041l, 0x87ee0df6l, + 0x99a95df3l, 0x9d684044l, 0x902b669dl, 0x94ea7b2al, + 0xe0b41de7l, 0xe4750050l, 0xe9362689l, 0xedf73b3el, + 0xf3b06b3bl, 0xf771768cl, 0xfa325055l, 0xfef34de2l, + 0xc6bcf05fl, 0xc27dede8l, 0xcf3ecb31l, 0xcbffd686l, + 0xd5b88683l, 0xd1799b34l, 0xdc3abdedl, 0xd8fba05al, + 0x690ce0eel, 0x6dcdfd59l, 0x608edb80l, 0x644fc637l, + 0x7a089632l, 0x7ec98b85l, 0x738aad5cl, 0x774bb0ebl, + 0x4f040d56l, 0x4bc510e1l, 0x46863638l, 0x42472b8fl, + 0x5c007b8al, 0x58c1663dl, 0x558240e4l, 0x51435d53l, + 0x251d3b9el, 0x21dc2629l, 0x2c9f00f0l, 0x285e1d47l, + 0x36194d42l, 0x32d850f5l, 0x3f9b762cl, 0x3b5a6b9bl, + 0x0315d626l, 0x07d4cb91l, 0x0a97ed48l, 0x0e56f0ffl, + 0x1011a0fal, 0x14d0bd4dl, 0x19939b94l, 0x1d528623l, + 0xf12f560el, 0xf5ee4bb9l, 0xf8ad6d60l, 0xfc6c70d7l, + 0xe22b20d2l, 0xe6ea3d65l, 0xeba91bbcl, 0xef68060bl, + 0xd727bbb6l, 0xd3e6a601l, 0xdea580d8l, 0xda649d6fl, + 0xc423cd6al, 0xc0e2d0ddl, 0xcda1f604l, 0xc960ebb3l, + 0xbd3e8d7el, 0xb9ff90c9l, 0xb4bcb610l, 0xb07daba7l, + 0xae3afba2l, 0xaafbe615l, 0xa7b8c0ccl, 0xa379dd7bl, + 0x9b3660c6l, 0x9ff77d71l, 0x92b45ba8l, 0x9675461fl, + 0x8832161al, 0x8cf30badl, 0x81b02d74l, 0x857130c3l, + 0x5d8a9099l, 0x594b8d2el, 0x5408abf7l, 0x50c9b640l, + 0x4e8ee645l, 0x4a4ffbf2l, 0x470cdd2bl, 0x43cdc09cl, + 0x7b827d21l, 0x7f436096l, 0x7200464fl, 0x76c15bf8l, + 0x68860bfdl, 0x6c47164al, 0x61043093l, 0x65c52d24l, + 0x119b4be9l, 0x155a565el, 0x18197087l, 0x1cd86d30l, + 0x029f3d35l, 0x065e2082l, 0x0b1d065bl, 0x0fdc1becl, + 0x3793a651l, 0x3352bbe6l, 0x3e119d3fl, 0x3ad08088l, + 0x2497d08dl, 0x2056cd3al, 0x2d15ebe3l, 0x29d4f654l, + 0xc5a92679l, 0xc1683bcel, 0xcc2b1d17l, 0xc8ea00a0l, + 0xd6ad50a5l, 0xd26c4d12l, 0xdf2f6bcbl, 0xdbee767cl, + 0xe3a1cbc1l, 0xe760d676l, 0xea23f0afl, 0xeee2ed18l, + 0xf0a5bd1dl, 0xf464a0aal, 0xf9278673l, 0xfde69bc4l, + 0x89b8fd09l, 0x8d79e0bel, 0x803ac667l, 0x84fbdbd0l, + 0x9abc8bd5l, 0x9e7d9662l, 0x933eb0bbl, 0x97ffad0cl, + 0xafb010b1l, 0xab710d06l, 0xa6322bdfl, 0xa2f33668l, + 0xbcb4666dl, 0xb8757bdal, 0xb5365d03l, 0xb1f740b4l +)): + '''Validate a PSIP CRC. Include the CRC in the data. The return value will be the valid data, or an exception will be raised if invalid.''' + + if verbose: + i_crc = 0xffffffffl + for i in data: + i_crc = ((i_crc << 8) & 0xffffffffl) ^ table[(i_crc >> 24) ^ ord(i)] + print hex(i_crc) + + i_crc = reduce(lambda x, y: ((x << 8) & 0xffffffffl) ^ table[(x >> 24) ^ ord(y)], data, 0xffffffffl) + return i_crc + +def psip_crc32(data): + return psip_calc_crc32(data) == 0 + +def getdescriptors(tb): + d = {} + i = 0 + while i < len(tb): + t = ord(tb[i]) + if d.has_key(t): + l = ord(tb[i + 1]) + data = tb[i + 2: i + 2 + l] + #print repr(d[t]), t, repr(data) + #assert not d.has_key(t) + l = ord(tb[i + 1]) + data = tb[i + 2: i + 2 + l] + try: + item = Descriptors[t](data) + except KeyError: + item = data + + try: + d[t].append(item) + except KeyError: + d[t] = [ item ] + + i += 2 + l + + return d + +class TSPSIPHandler(dict): + '''This object is used to represent the tables that come in on a +specific PID. Since there can be multiple tables on a specific PID +(ATSC's 0x1ffb), a dictionary of callable objects must be passed in, +and the key is the table number.''' + + def __init__(self, *t): + super(TSPSIPHandler, self).__init__() + self.update(*t) + self.discontinuity = True + self.complete = False + self.last_continuity = None + + # config knobs + self.current_only = True + self.ignerror = False + + def next_continuity(self, nc): + if self.last_continuity is None: + return True + + return ((self.last_continuity + 1) % 16) != nc + + def get_table_id(self): + if self.complete: + return self._table_id + + return None + + table_id = property(get_table_id) + + def decode_section_header(self, payload, i): + self._table_id = ord(payload[i]) + self.syntax = bool(ord(payload[i + 1]) & 0x80) + self.private = bool(ord(payload[i + 1]) & 0x40) + self.sect_len = (((ord(payload[i + 1]) & 0xf) << 8) | ord(payload[i + 2])) + 3 + self.stored_sects = [ payload[i:] ] + #print 'bar', i, repr(payload) + self.stored_len = len(self.stored_sects[0]) + self.discontinuity = False + + def __call__(self, p): + '''Pass in a TSPacket instance.''' + + if p.error and not self.ignerror: + return + + if p.start: + payload = p.payload + i = ord(payload[0]) + 1 + self.decode_section_header(payload, i) + else: + if self.discontinuity or self.next_continuity(p.continuity): + self.discontinuity = True + return + self.stored_sects.append(p.payload) + self.stored_len += len(p.payload) + + while self.table_id != 0xff: + if self.stored_len < self.sect_len: + # we need more data + self.last_continuity = p.continuity + return + + payload = ''.join(self.stored_sects) + assert len(payload) == self.stored_len + + if self.syntax: + # XXX I may need to include the skipped part above in + # the crc calculations. + if not psip_crc32(payload[:self.sect_len]): + raise ValueError, 'CRC check failed: %s' % `payload[:self.sect_len]` + self.extension = (ord(payload[3]) << 8) | ord(payload[4]) + self.version = (ord(payload[5]) & 0x3e) >> 1 + self.current_next = bool(ord(payload[5]) & 1) + self.section_number = ord(payload[6]) + self.last_section_number = ord(payload[7]) + self.protocol_version = ord(payload[8]) + # don't include the CRC + self.table = payload[8:self.sect_len - 4] + #if self.last_section_number: + # print repr(self), repr(p) + else: + self.table = payload[3:self.sect_len] + + self.complete = True + if self.current_only and not self.current_next: + continue + + # If this fails there are multiple sections + try: + self[self.table_id].clean_up() + self[self.table_id](self) + except KeyError: + pass # No handler, ignore or raise exception? + + # hmm. I had a packet with some low bits clear + # the spec seems to imply that there can be multiple sections, + # but every case I've seen in the world there isn't. + if ord(payload[self.sect_len]) != 0xff: + #print 'prev:', self.last_section_number + # I should make sure there is enough data + self.decode_section_header(payload, self.sect_len) + #print 'starting next section:', repr(self), repr(payload) + continue + else: + break + + def __repr__(self): + v = ('table_id', 'syntax', 'private', 'table', + 'extension', 'version', 'current_next', 'section_number', + 'last_section_number', 'protocol_version', ) + return '' % (', '.join(attribreprlist(self, v)), super(TSPSIPHandler, self).__repr__()) + +class PAT(dict): + def __init__(self): + '''In order to prevent confusion, you can't init w/ a packet.''' + + super(PAT, self).__init__() + self.pid_dict = {} + + def clean_up(self): + self.pid_dict = {} + self.clear() + + def has_pid(self, pid): + return self.pid_dict.has_key(pid) + + def get_prog(self, pid): + return self.pid_dict[pid] + + def __call__(self, psip, s = '>HH', sl = struct.calcsize('>HH')): + assert psip.table_id == 0x00 + + for i in range(len(psip.table) / sl): + prog, pid = struct.unpack(s, psip.table[i * sl:(i + 1) * sl]) + pid &= 0x1fff + self.pid_dict[pid] = prog + self[prog] = pid + + def __repr__(self): + return '' % dict.__repr__(self) + +def getaudiovideopids(pmt, lang = None): + anapid = None + apids = [] + vpids = [] + for i in pmt.es: + cpid = i[1] + j = i[2] + if i[0] == 2: + vpids.append(cpid) + elif j.has_key(5): + assert 'AC-3' in map(lambda x: x[:4], j[5]) + if lang is None or lang == j[10][0][0]: + apids.append(cpid) + else: + anapid = cpid + + if not apids and anapid is not None: + apids.append(anapid) + + return (apids, vpids) + +def iteravpids(stream, avpids): + avpids = sets.ImmutableSet(avpids) + + for i in stream: + if SimpleTSPacket(i).pid in avpids: + yield i + +class PMT(dict): + def __init__(self): + super(PMT, self).__init__() + self.es = [] + + def clean_up(self): + self.clear() + del self.es[:] + + def __nonzero__(self): + return len(self) or bool(self.es) + + def __call__(self, psip): + assert psip.table_id == 0x02 + + tb = psip.table + ltmp = ((ord(tb[2]) & 0xf) << 8) | ord(tb[3]) + 4 + self.update(getdescriptors(tb[4:ltmp])) + i = ltmp + + es = self.es + while i < len(tb): + t = ord(tb[i]) + p = ((ord(tb[i + 1]) & 0x1f) << 8) | ord(tb[i + 2]) + l = ((ord(tb[i + 3]) & 0x0f) << 8) | ord(tb[i + 4]) + i += 5 + d = getdescriptors(tb[i:i + l]) + i += l + es.append((t, p, d)) + + def __repr__(self): + return '' % (dict.__repr__(self), repr(self.es)) + +def channelmajorminorsort(x, y): + if x['major'] != y['major']: + return cmp(x['major'], y['major']) + + return cmp(x['minor'], y['minor']) + +class TVCT(dict): + def __init__(self): + '''In order to prevent confusion, you can't init w/ a packet.''' + + super(TVCT, self).__init__() + + def clean_up(self): + self.clear() + + def __call__(self, psip): + assert psip.table_id == 0xc8 + + self['channels'] = [] + tb = psip.table + i = ord(tb[0]) + 1 + chancnt = ord(tb[i]) + i += 1 + for foo in range(chancnt): + shrtnm = ''.join(map(lambda x: unichr((ord(x[0]) << 8) | ord(x[1])), [tb[i + x * 2:i + (x + 1) * 2] for x in range(7)])).rstrip(unichr(0)) + i += 7 * 2 + major = (((ord(tb[i]) << 8) | ord(tb[i + 1])) >> 2) & 0x3ff + minor = ((ord(tb[i + 1]) & 0x3) << 8) | ord(tb[i + 2]) + mode = ord(tb[i + 3]) + i += 4 + carrier, tsid, prog_num, flagsa, source, desc_len = struct.unpack('>IHHHHH', tb[i:i + 14]) + i += 14 + etm_loc = (flagsa & 0xc000) >> 14 + access_control = bool(flagsa & 0x2000) + hidden = bool(flagsa & 0x1000) + hide_guide = bool(flagsa & 0x200) + service = flagsa & 0x3f + desc_len &= 0x3ff + descs = getdescriptors(tb[i:i + desc_len]) + i += desc_len + self['channels'].append({ 'name': shrtnm, + 'major': major, 'minor': minor, 'mode': mode, + 'carrier': carrier, 'tsid': tsid, + 'prog_num': prog_num, 'source': source, + 'etm_loc': etm_loc, + 'access_control': access_control, 'hidden': hidden, + 'service': service, 'descriptors': descs }) + + desc_len = ((ord(tb[i]) & 0x3) << 8) | ord(tb[i + 1]) + i += 2 + self['descriptors'] = getdescriptors(tb[i:i + desc_len]) + + def __repr__(self): + return '' % (dict.__repr__(self), ) + +class TSPESHandler: + def __init__(self, cb): + self.cb = cb + self.discontinuity = True + self.complete = False + self.last_continuity = None + self.pes_len = None + + def next_continuity(self, nc): + if self.last_continuity is None: + return True + + return ((self.last_continuity + 1) % 16) == nc + + def is_video(self): + return (self.stream_id & 0xf0) == 0xe0 + + def __call__(self, p): + if p.error: + #print 'got error:', `p` + return + + if p.start: + if self.pes_len == 0: + assert self.is_video() + # if we were unbounded, dump the last one + if self.next_continuity(p.continuity): + self.cb(''.join(self.stored_sects)) + + payload = p.payload + if payload[:3] != '\x00\x00\x01': + raise ValueError, 'packet start code invalid' + self.stream_id = ord(payload[3]) + self.pes_len = (ord(payload[4]) << 8) | ord(payload[5]) + if not self.is_video(): + #print 'pes', hex(self.stream_id), repr(p) + assert self.pes_len != 0 + # A value of 0 indicates that the PES packet + # length is neither specified nor bounded and is + # allowed only in PES packets whose payload is a + # video elementary stream contained in Transport + # Stream packets. -- iso-13818-1 Sect. 2.4.3.7 + if self.pes_len != 0: + self.pes_len += 6 # add in header + self.stored_sects = [ payload ] + self.stored_len = len(self.stored_sects[0]) + self.discontinuity = False + else: + if self.discontinuity or not self.next_continuity(p.continuity): + self.discontinuity = True + return + self.stored_sects.append(p.payload) + self.stored_len += len(p.payload) + + self.last_continuity = p.continuity + if self.stored_len < self.pes_len or self.pes_len == 0: + return + + ps = ''.join(self.stored_sects) + assert self.stored_len == self.pes_len and self.pes_len == len(ps) + self.cb(ps) + +def read_clock(buf): + assert len(buf) == 6 + + base = (long(ord(buf[0])) << 25) | (ord(buf[1]) << 17) | \ + (ord(buf[2]) << 9) | (ord(buf[3]) << 1) | \ + (ord(buf[4]) >> 7) + extension = ((ord(buf[4]) & 0x1) << 8) | ord(buf[5]) + + return (base, extension) + +class SimpleTSPacket: + def __init__(self, p): + assert len(p) == TSPKTLEN + assert p[0] == TSSYNC + + f = ord(p[1]) + self.error = bool(f & 0x80) + self.start = bool(f & 0x40) + self.priority = bool(f & 0x20) + self.pid = ((f & 0x1f) << 8) + ord(p[2]) + if self.pid == 0x1fff: + return + f = ord(p[3]) + self.scramble = (f & 0xc0) >> 6 + adapt = (f & 0x30) >> 4 + self.continuity = f & 0xf + if self.error: + return + +class TSPacket: + def __init__(self, *p): + assert len(p) <= 1 + if len(p) == 0: + return + p = p[0] + origp = p + + assert len(p) == TSPKTLEN + assert p[0] == TSSYNC + + f = ord(p[1]) + self.error = bool(f & 0x80) + self.start = bool(f & 0x40) + self.priority = bool(f & 0x20) + self.pid = ((f & 0x1f) << 8) + ord(p[2]) + if self.pid == 0x1fff: + return + f = ord(p[3]) + self.scramble = (f & 0xc0) >> 6 + adapt = (f & 0x30) >> 4 + self.continuity = f & 0xf + if self.error: + return + i = 4 + if adapt >= 2: + adapt_len = ord(p[4]) + buf = p[i + 1:i + 1 + adapt_len] + assert len(buf) == adapt_len + self.decode_adaptation(buf) + # XXX - handle adpatation + i += 1 + adapt_len + self.payload = p[i:] + + def decode_adaptation(self, adp): + if len(adp) == 0: + return + + self.discontinuity_indicator = bool(ord(adp[0]) & 0x80) + self.random_access_indicator = bool(ord(adp[0]) & 0x40) + self.elementary_stream_priority = bool(ord(adp[0]) & 0x20) + PCR_flag = bool(ord(adp[0]) & 0x10) + OPCR_flag = bool(ord(adp[0]) & 0x08) + splicing_point_flag = bool(ord(adp[0]) & 0x04) + transport_private_data_flag = bool(ord(adp[0]) & 0x02) + adaptation_field_extension_flag = bool(ord(adp[0]) & 0x01) + + i = 1 + if PCR_flag: + self.PCR = read_clock(adp[i: i + 6]) + i += 6 + if OPCR_flag: + self.OPCR = read_clock(adp[i: i + 6]) + i += 6 + if splicing_point_flag: + self.splice_countdown = ord(adp[i]) + i += 1 + if transport_private_data_flag: + plen = ord(adp[i]) + self.private_data = adp[i + 1: i + 1 + plen] + i += 1 + plen + if adaptation_field_extension_flag: + alen = ord(adp[i]) + ltw_flag = ord(adp[i + 1]) & 0x80 + piecewise_rate_flag = ord(adp[i + 1]) & 0x40 + seamless_splice_flag = ord(adp[i + 1]) & 0x20 + i += 2 + if ltw_flag: + self.ltw_valid = bool(ord(adp[i]) & 0x80) + self.ltw_offset = ((ord(adp[i]) & 0x7f) << 8) |\ + ord(adp[i + 1]) + i += 2 + if piecewise_rate_flag: + self.piecewise_rate = ((ord(adp[i]) & 0x3f) << + 16) | (ord(adp[i + 1]) << 8) | \ + ord(adp[i + 2]) + i += 3 + if seamless_splice_flag: + self.splice_type = (ord(adp[i]) & 0xf0) >> 4 + self.DTS_next_AU = read_timestamp(adp[i:i + 5]) + + def __repr__(self): + v = ('pid', 'error', 'start', 'continuity', 'priority', + 'scramble', 'payload', 'discontinuity_indicator', + 'random_access_indicator', 'elementary_stream_priority', + 'PCR', 'OPCR', 'splice_countdown', 'private_data', + 'ltw_valid', 'ltw_offset', 'piecewise_rate', 'splice_type', + 'DTS_next_AU', ) + return '' % ', '.join(attribreprlist(self, v)) + + def __str__(self): + '''We may want to save the original packet, and return it until the +data gets modified.''' + if self.error: + return '%c%s' % (TSSYNC, '\xff' * 187) + sb = (self.pid >> 8) & 0x1f + if self.error: + sb |= 0x80 + if self.start: + sb |= 0x40 + if self.priority: + sb |= 0x20 + tb = self.pid & 0xff + fb = ((self.scramble & 0x3) << 6) | (self.continuity & 0xf) + alenstr = '' + if self.adaptation: + fb |= 1 << 5 + alenstr = chr(len(self.adaptation)) + if self.payload: + fb |= 1 << 4 + ret = '%c%c%c%c%s%s%s' % (TSSYNC, sb, tb, fb, alenstr, self.adaptation, self.payload) + if len(ret) != TSPKTLEN: + pass + #print >>sys.stderr, repr(self) + #print >>sys.stderr, len(self.adaptation), len(self.payload) + assert len(ret) == TSPKTLEN + return ret + +class TSPStream: + '''This class takes a file object, and outputs TS packets.''' + + def __init__(self, f): + self.f = f + + def __iter__(self): + foundsync = False + buf = self.f.read(READBLK) + while buf: + if not foundsync: + try: + start = buf.index(TSSYNC) + except ValueError: + buf = self.f.read(READBLK) + continue + + try: + if buf[start + TSPKTLEN] == '\x47': + #if start != 0: + # print >>sys.stderr, 'sync off:', start, 'data:', repr(buf[:start]) + foundsync = True + else: + #print >>sys.stderr, 'drop to sync:', start, 'data:', repr(buf[:start]) + buf = buf[start + 1:] + continue + except IndexError: + buf += self.f.read(READBLK) + + continue + + if buf[start] != '\x47': + #print >>sys.stderr, 'sync failed' + foundsync = False + continue + + t = buf[start:start + TSPKTLEN] + if len(t) != TSPKTLEN: + r = self.f.read(READBLK) + if not r: + #No more data + break + buf = buf[start:] + r + start = 0 + if not buf: + buf = self.f.read(READBLK) + continue + + yield t + buf = buf[start + TSPKTLEN:] + start = 0 + if not buf: + buf = self.f.read(READBLK) + +import getopt +import re +import sys + +def usage(): + print 'Usage: %s -lmty ' % sys.argv[0] + print ' %s -b [ -p ] ' % sys.argv[0] + print ' %s -c -o ' % sys.argv[0] + print '' + print ' -l list channels' + print ' -m print PAT and PMT' + print ' -t print TVCT' + print ' -y file offset when done' + +def findchannel(tvct, chan): + for i in tvct['channels']: + if isinstance(chan, int): + if i['minor'] == chan: + return i + elif isinstance(chan, tuple): + assert len(chan) == 2 + if i['major'] == chan[0] and i['minor'] == chan[1]: + return i + else: + if i['name'] == chan: + return i + + return None + +def GetTVCT(tsstream): + listchan = True + needtvct = True + + needpat = False + needpmts = {} + + pat = PAT() + pmts = {} + tvct = TVCT() + + psippids = { 0x00: TSPSIPHandler({ 0x00: pat }), + 0x1ffb: TSPSIPHandler({ 0xc8: tvct, }), + } + + def getpmt(pid, pm = pmts, psp = psippids): + if not pm.has_key(pid): + pm[pid] = PMT() + psp[pid] = TSPSIPHandler({ 0x02: pm[pid] }) + + def needpmts(pm = pmts): + for i in pm.itervalues(): + if not i: + return True + + return False + + for i in itertools.imap(TSPacket, tsstream): + try: + psippids[i.pid](i) + except ValueError: + continue + except KeyError: + pass + + # XXX - we need to give up finding the TVCT after a while, and + # pretend we found it w/ some defaults. KCSM doesn't + # broadcast a TVCT. + if needtvct and tvct: + needtvct = False + needpat = True + + if needpat and pat: + needpat = False + for j in pat.itervalues(): + getpmt(j) + + if not (needtvct or needpat or needpmts()): + break + + try: + lst = tvct['channels'] + lst.sort(channelmajorminorsort) + except KeyError: + # unable to find TVCT + lst = pat.items() + lst.sort() + lst = map(lambda x, y: { 'name': 'PAT%d' % x[1], 'prog_num': x[1], 'major': '?', 'minor': y}, lst, range(1, len(pat) + 1)) + tvct = { 'channels': lst } + + for i in lst: + if i['prog_num'] != 0: + i['PMT'] = pmts[pat[i['prog_num']]] + i['PMTpid'] = pat[i['prog_num']] + + return tvct + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "bc:hlmo:pty") + except getopt.GetoptError: + # print help information and exit: + usage() + sys.exit(2) + + printbyteoffset = False + printbandwidth = False + printbandwidthpercent = False + listchan = False + channelsel = None + output = None + allmaps = False + printtvct = False + + needtvct = False + needpat = False + needpmts = {} + channelfnd = False + needallmaps = False + + for o, a in opts: + if o == '-b': + printbandwidth = True + elif o == "-c": + try: + channelsel = int(a) + except ValueError: + try: + channelsel = tuple(map(int, re.split('[-.]', a, 1))) + except ValueError: + channelsel = a + if channelsel is not None: + needpat = True + needtvct = True + elif o == "-m": + allmaps = True + needallmaps = True + needpat = True + elif o == '-t': + printtvct = True + needtvct = True + elif o == "-l": + listchan = True + needpat = True + needtvct = True + elif o in ("-h", "--help"): + usage() + sys.exit() + elif o == '-o': + output = file(a, 'w') + elif o == '-p': + printbandwidthpercent = True + elif o == '-y': + printbyteoffset = True + + if len(args) != 1: + usage() + sys.exit() + + inp = open(args[0]) + s = TSPStream(inp) + pat = PAT() + pmts = {} + tvct = TVCT() + + def null(p): + #print 'null', repr(p) + pass + null.clean_up = lambda: None + + psippids = { 0x00: TSPSIPHandler({ 0x00: pat }), + 0x1ffb: TSPSIPHandler({ + #0xc7: null, + 0xc8: tvct, + }), + } + pidcnt = {} + + def getpmt(pid, pm = pmts, psp = psippids): + if not pm.has_key(pid): + pm[pid] = PMT() + psp[pid] = TSPSIPHandler({ 0x02: pm[pid] }) + + def needpmts(pm = pmts): + for i in pm.itervalues(): + if not i: + return True + + return False + + for i in itertools.imap(TSPacket, s): + if hasattr(i, 'splice_countdown') or hasattr(i, 'DTS_next_AU'): + print 'splice_countdown:', repr(i) + #if hasattr(i, 'PCR'): + # print 'PCR:', repr(i) + #if i.pid in (48, 64, 80, 112): + # print `i` + + try: + psippids[i.pid](i) + except ValueError, x: + #import traceback + #print traceback.print_exc() + print >>sys.stderr, 'bad crc:', repr(i) + continue + except KeyError: + pass + + try: + pidcnt[i.pid] += 1 + except KeyError: + pidcnt[i.pid] = 1 + + # XXX - we need to give up finding the TVCT after a while, and + # pretend we found it w/ some defaults. KCSM doesn't + # broadcast a TVCT. + if needtvct and tvct: + # Handle TVCT + needtvct = False + + if needpat and pat: + needpat = False + for j in pat.itervalues(): + if listchan or allmaps: + getpmt(j) + if channelsel is not None: + channelfnd = findchannel(tvct, channelsel) + if channelfnd is None: + sys.stderr.write("Unable to find channel: %s\n" % channelsel) + channelsel = None + else: + channelfnd = pat[channelfnd['prog_num']] + getpmt(channelfnd) + + if channelfnd and pmts[channelfnd]: + av = getaudiovideopids(pmts[channelfnd]) + for j in itertools.chain(*av): + print j + + if needallmaps and pat and pmts: + for i in pat.itervalues(): + if not pmts.has_key(i): + break + needallmaps = False + + #print repr(tvct), repr(pat), repr(pmts) + #print needtvct, needpat, needpmts(), printbandwidth, needallmaps + if not (needtvct or needpat or needpmts() or printbandwidth or needallmaps): + break + + if allmaps: + print repr(pat) + print repr(pmts) + + if printtvct: + print repr(tvct) + + if listchan: + #List channels + #try: + lst = tvct['channels'] + lst.sort(channelmajorminorsort) + #except KeyError: + # # unable to find TVCT + # sys.stderr.write("unable to find TVCT table, faking it.\n") + # lst = pat.items() + # lst.sort() + # lst = map(lambda x, y: { 'prog_num': x[1], 'major': '?', 'minor': y}, lst, range(1, len(pat) + 1)) + for i in lst: + if i['prog_num'] != 0: + #print repr(pmts[pat[i['prog_num']]]) + av = getaudiovideopids(pmts[pat[i['prog_num']]]) + prog_info = '\t'.join(map(lambda x: ','.join(map(str, x)), av)) + else: + prog_info = '' + print ('%(major)d.%(minor)d\t%(name)s\t' % i) + prog_info + + if printbandwidth: + totpkts = sum(pidcnt.itervalues()) + i = pidcnt.items() + if printbandwidthpercent: + def secondfirst(x, y): + if x[1] == y[1]: + return cmp(x[0], y[0]) + return cmp(x[1], y[1]) + i.sort(secondfirst) + else: + i.sort() + for pid, cnt in i: + print '%4d\t%d\t%5.2f' % (pid, cnt, float(cnt) * 100 / totpkts) + + if printbyteoffset: + print inp.tell() + +def justprint(v, p): + '''v is pid, p is the data''' + if v != 49: + return + pes = PES(p) + if pes.data[3] != '\x00': + print `pes` + return + fc = findcodes(pes.data) + print 'justprint', v, len(p), repr(pes), repr(pes.data[:20]), fc + for i in filter(lambda x: x[1] == '\x00', fc): + print `pes.data[i[0] + 3: i[0] + 7]` + if ((ord(pes.data[i[0] + 5]) & 0x38) >> 3) in (2, 3): + print 'non I frame found: %d' % ((ord(pes.data[i[0] + 5]) & 0x38) >> 3) + +if __name__ == '__main__': + if True: + main() + sys.exit(0) + + if False: + ps = UnRead(sys.argv[1]) + while ps: + print `Pack(ps)` + sys.exit() + + s = TSPStream(open(sys.argv[1])) + if False: + cleaned = open(sys.argv[2], 'w') + for j in s: + cleaned.write(str(j)) + continue + sys.exit() + + pids = {} + skipped = 0 + cont = {} + count = 0 + pat = PAT() + pmts = {} + pesstreams = {} + tvct = TVCT() + pidhandlers = { 0x00: TSPSIPHandler({ 0x00: pat }), + 0x1ffb: TSPSIPHandler({ 0xc8: tvct }), + } + first = last = None + for j in itertools.imap(TSPacket, s): + count += 1 + if j.pid == 8191 or (j.pid != 0 and j.pid != 48): + skipped += 1 + continue + else: + #if j.pid > 4000: + #print `j` + try: + pidhandlers[j.pid](j) + except KeyError: + pass + except ValueError, x: + print 'VE:', x + #if pidhandlers[0x1ffb][0xc8]: + # print repr(pidhandlers[0x1ffb][0xc8]) + # We should probably cache which ones we've added, and remove + # Ones that aren't there. Or do a clean_up callback. + for k in pidhandlers[0][0].itervalues(): + if pmts.has_key(k): + continue + pmts[k] = PMT() + pidhandlers[k] = TSPSIPHandler({ 0x02: pmts[k] }) + + for k in itertools.ifilter(lambda x: x.es, pmts.itervalues()): + #print repr(k) + for l in k.es: + if pesstreams.has_key(l[1]): + continue + print repr(l) + pesstreams[l[1]] = TSPESHandler(lambda x, y = l[1]: justprint(y, x)) + pidhandlers[l[1]] = pesstreams[l[1]] + + try: + if (cont[j.pid] + 1) % 16 != j.continuity: + pass + #print 'continuity failed' + cont[j.pid] = j.continuity + except KeyError: + cont[j.pid] = j.continuity + + try: + pids[j.pid] += 1 + except KeyError: + pids[j.pid] = 1 + p = pids.items() + p.sort() + print p + print 'skipped:', skipped + print 'total:', count diff --git a/mpegts/tssel.py b/mpegts/tssel.py new file mode 100644 index 0000000..8999f33 --- /dev/null +++ b/mpegts/tssel.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +import sys +sys.path.append('/Users/jgurney/p4/bktrau/info') + +import itertools +import mpegts +import sys +import sets + +def usage(): + print >>sys.stderr, 'Usage: %s ...' % sys.argv[0] + sys.exit(1) + +def genpats(pmt): + BASEPAT = map(None, "G@\x00\x10\x00\x00\xb0\r\x00\x00\xc1\x00\x00\x00\x01\xe0\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff") + + patidx = 4 + 1 # TS header + pointer table + BASEPAT[patidx + 10] = chr(0xe0 | ((pmt >> 8) & 0x1f)) + BASEPAT[patidx + 11] = chr(pmt & 0xff) + newcrc = mpegts.psip_calc_crc32(''.join(BASEPAT[patidx:patidx + 12])) + newcrc = map(lambda x, crc = newcrc: chr((crc >> (8 * (3 - x))) & 0xff), range(4)) + BASEPAT[patidx + 12:patidx + 16] = newcrc + + assert len(BASEPAT) == mpegts.TSPKTLEN + + ret = [] + old = ord(BASEPAT[3]) & 0xf0 + for i in range(16): # continuity + BASEPAT[3] = chr(old | i) + ret.append(''.join(BASEPAT)) + + return ret + +def producets(inp, pmtpid, *pids): + print `inp`, `pmtpid`, `pids` + pats = itertools.cycle(genpats(pmtpid)) + # XXX - check if all pids are ints? in range? + pids = sets.Set(pids) + + stream = mpegts.TSPStream(inp) + for i in stream: + frst = ord(i[1]) + # Get first and error bits for testing. + pid = (frst & 0x1f) << 8 | ord(i[2]) + if pid == pmtpid and (frst & 0xc0) == 0x40: + yield pats.next() + # XXX - we probably want to rewrite the PMT to only + # include the pids we are sending. + yield i + elif pid in pids: + yield i + +def main(): + if len(sys.argv) < 3: + usage() + + pmtpid = int(sys.argv[2]) + pids = map(int, sys.argv[3:]) + + inp = open(sys.argv[1]) + out = sys.stdout + + producer = producets(inp, pmtpid, *pids) + filter(lambda x: out.write(x), producer) + +if __name__ == '__main__': + main() diff --git a/mpegtsmod.py b/mpegtsmod.py index 63fbe62..0863051 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -5,14 +5,14 @@ __version__ = '$Change$' # $Id$ -tsselpypath = '/Users/jgurney/p4/bktrau/info/tssel.py' +tsselpypath = 'mpegts/tssel.py' default_audio_lang = 'eng' import os import sets import sys -mpegtspath = '/Users/jgurney/p4/bktrau/info' +mpegtspath = 'mpegts' if mpegtspath not in sys.path: sys.path.append(mpegtspath) import mpegts From 0732637c5b34d82b0b4d1812fbe121c439912fd1 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 00:51:13 -0800 Subject: [PATCH 126/179] comment on requiring swig to build... comment about ECONNABORTED patch.. [git-p4: depot-paths = "//depot/": change = 891] --- README | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README b/README index ddce248..38a8fb5 100644 --- a/README +++ b/README @@ -35,6 +35,9 @@ Good Luck! John-Mark Gurney Ideas for future improvements: + I have received a few ECONNABORTED errors at times. The patch + twisted.internet.tcp.py.patch catches this error, and handles + it properly. Add res to the DVDTitle container to play the title, and for other containers that it makes sense for. Make the directory persistant so that the server's UUID does not @@ -60,7 +63,7 @@ v0.3: Look inside DVDs and handle titles and chapters. We can not yet play the streams. This requires pydvdread which is included in the directory pydvdread. It depends upon libdvdread and - requires a C compiler to build. + requires swig and a C compiler to build. Empty dirs w/ no content would disappear, and cause a short response to BrowseDirectChildren. The DSM-520 askes for one more than displayed, and uses the existant of the extra item From f22bd74700facec58f0678d4f9f32a296729b50c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 01:10:22 -0800 Subject: [PATCH 127/179] include where to update the ffmpeg path.. [git-p4: depot-paths = "//depot/": change = 892] --- README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index 38a8fb5..a67ed1d 100644 --- a/README +++ b/README @@ -59,7 +59,8 @@ v0.3: programs. Includes the program and MPEG-TS python module in the mpegts directory. Add support for multiple res elements and automatic transcoding - to either avi/xvid or mpeg2 using ffmpeg. + to either avi/xvid or mpeg2 using ffmpeg. Update the path to + ffmpeg in the FSStorage.py file. Look inside DVDs and handle titles and chapters. We can not yet play the streams. This requires pydvdread which is included in the directory pydvdread. It depends upon libdvdread and From 9415d81c5f938907815b11cdb8be3c52ad7debbf Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 13 Sep 2006 20:41:16 -0800 Subject: [PATCH 128/179] prevent a traceback if we've already stopProcducing... [git-p4: depot-paths = "//depot/": change = 896] --- shoutcast.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index 8c73145..1e92f92 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -133,7 +133,8 @@ class ShoutTransfer(shoutcast.ShoutcastClient): pass def stopProducing(self): - shoutcast.ShoutcastClient.stopProducing(self) + if self.transport is not None: + shoutcast.ShoutcastClient.stopProducing(self) self.request = None self.passback = None From c731b5d3908e9b4fa428531211aa44256bbb4230 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 30 Sep 2006 10:17:42 -0800 Subject: [PATCH 129/179] make execute [git-p4: depot-paths = "//depot/": change = 906] --- mpegts/tssel.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 mpegts/tssel.py diff --git a/mpegts/tssel.py b/mpegts/tssel.py old mode 100644 new mode 100755 From e00154fede0eb21af6a4b9de46e7698648df7d9b Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 15 Oct 2006 10:27:43 -0800 Subject: [PATCH 130/179] add media type for asf files... import: https://core.fluendo.com/elisa/trac/ticket/96 [git-p4: depot-paths = "//depot/": change = 917] --- pymediaserv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pymediaserv b/pymediaserv index f293b69..f7168d8 100755 --- a/pymediaserv +++ b/pymediaserv @@ -68,7 +68,7 @@ from SSDP import SSDPServer, SSDP_PORT, SSDP_ADDR s = SSDPServer() debug.insertnamespace('s', s) -port = reactor.listenMulticast(SSDP_PORT, s) +port = reactor.listenMulticast(SSDP_PORT, s, listenMultiple=True) port.joinGroup(SSDP_ADDR) port.setLoopbackMode(0) # don't get our own sends @@ -111,6 +111,7 @@ root.putChild('content', content) medianode = static.File('pymediaserv') medianode.contentTypes.update( { '.wmv': 'video/x-ms-wmv', + '.asf': 'video/x-ms-asf', #'.ts': 'video/mp2t', '.ts': 'video/mpeg', # we may want this instead of mp2t '.m2t': 'video/mpeg', From 9d674339433ad900e858e9bd28a7a050eb1f363d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 15 Oct 2006 10:28:43 -0800 Subject: [PATCH 131/179] add changes for next version.. [git-p4: depot-paths = "//depot/": change = 918] --- README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README b/README index a67ed1d..1555b9f 100644 --- a/README +++ b/README @@ -51,6 +51,9 @@ Ideas for future improvements: Support sorting by other attributes. Finish support for playing DVD stream. +v0.x: + Support multiple SSDP servers on the same box. + v0.3: Include some patches for twisted in the distro, in the directory patches. From 0e98eb436ae924442417c2dba3233ee1c4ad6be5 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 15 Oct 2006 10:51:46 -0800 Subject: [PATCH 132/179] if we can't read anymore, return.. [git-p4: depot-paths = "//depot/": change = 919] --- mpegts/mpegts.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mpegts/mpegts.py b/mpegts/mpegts.py index 9a4dc49..f948ffc 100644 --- a/mpegts/mpegts.py +++ b/mpegts/mpegts.py @@ -1201,7 +1201,10 @@ class TSPStream: buf = buf[start + 1:] continue except IndexError: - buf += self.f.read(READBLK) + nbuf = self.f.read(READBLK) + if not nbuf: + return + buf += nbuf continue From b40c80de250519bf80bed59aaa6eb6f720d8535b Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 4 Nov 2006 12:32:10 -0800 Subject: [PATCH 133/179] add Microsoft's audio/video mimetypes.. [git-p4: depot-paths = "//depot/": change = 920] --- pymediaserv | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pymediaserv b/pymediaserv index f7168d8..ca41ed2 100755 --- a/pymediaserv +++ b/pymediaserv @@ -110,8 +110,16 @@ root.putChild('content', content) # Purely to ensure some sane mime-types. On MacOSX I need these. medianode = static.File('pymediaserv') medianode.contentTypes.update( { - '.wmv': 'video/x-ms-wmv', + # From: http://support.microsoft.com/kb/288102 '.asf': 'video/x-ms-asf', + '.asx': 'video/x-ms-asf', + '.wma': 'audio/x-ms-wma', + '.wax': 'audio/x-ms-wax', + '.wmv': 'video/x-ms-wmv', + '.wvx': 'video/x-ms-wvx', + '.wm': 'video/x-ms-wm', + '.wmx': 'video/x-ms-wmx', + #'.ts': 'video/mp2t', '.ts': 'video/mpeg', # we may want this instead of mp2t '.m2t': 'video/mpeg', From 71098bcb2ef1f98256876be6e35d72997c8ca0a5 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 20 May 2007 10:04:08 -0800 Subject: [PATCH 134/179] sync w/ FreeBSD's p4 repository... This includes enhancements to mpegts.py, and makes tssel.py work by properly inserting program_number into the PAT that matches the one in the PMT... [git-p4: depot-paths = "//depot/": change = 1068] --- mpegts/mpegts.py | 134 +++++++++++++++++++++++++++++++++++++---------- mpegts/tssel.py | 50 +++++++++++++++--- 2 files changed, 151 insertions(+), 33 deletions(-) mode change 100644 => 100755 mpegts/mpegts.py diff --git a/mpegts/mpegts.py b/mpegts/mpegts.py old mode 100644 new mode 100755 index f948ffc..5d47e7c --- a/mpegts/mpegts.py +++ b/mpegts/mpegts.py @@ -1,7 +1,34 @@ #!/usr/bin/env python # +# Copyright 2006-2007 John-Mark Gurney. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# import itertools +import os import sets import struct import traceback @@ -478,6 +505,23 @@ class AC3Descriptor: sm_dict = { 0: 'Not indicated', 1: 'NOT Dolby surround encoded', 2: 'Dolby surround encoded', 3: 'Reserved', } + bsmod_dict = { 0: 'main: complete', 1: 'main: music and effects', + 2: 'associated: visually imparied', + 3: 'associated: hearing imparied', 4: 'associated: dialogue', + 5: 'associated: commentary', 6: 'associated: emergency', } + + bs_mod = property(lambda x: x.bsmoddesc()) + num_channels = property(lambda x: x.numchan_dict[x.numchan]) + + def bsmoddesc(self): + if self.bsmod == 7: + if (self.numchan & 0x8) and self.numchan == 1: + return 'associated: voice over' + else: + return 'main: karaoke' + else: + return self.bsmod_dict[self.bsmod] + numchan_dict = { 0: '1+1', 1: '1/0', 2: '2/0', 3: '3/0', 4: '2/1', 5: '3/1', 6: '2/2', 7: '3/2', 8: '1', 9: '<=2', 10: '<=3', 11: '<=4', 12: '<=5', 13: '<=6', 14: 'Reserved', @@ -493,11 +537,16 @@ class AC3Descriptor: self.surround_mode = self.sm_dict[brcsm & 0x3] bsmodnumchanfullsvc = ord(data[2]) self.bsmod = bsmodnumchanfullsvc >> 6 - self.num_channels = \ - self.numchan_dict[bsmodnumchanfullsvc >> 1 & 0xf] + numchan = (bsmodnumchanfullsvc >> 1) & 0xf + self.numchan = numchan + + # KTVU only puts 3 bytes here + if len(data) == 3: + return + i = 4 # dropped langcod as not used per A/52a 3.4 - if (bsmodnumchanfullsvc >> 1 & 0xf) == 0: + if numchan == 0: i += 1 if self.bsmod < 2: self.mainid = ord(data[i]) >> 5 @@ -518,7 +567,7 @@ class AC3Descriptor: def __repr__(self): v = ['sample_rate', 'bsid', 'br_exact', 'bitrate', - 'surround_mode', 'bsmod', 'num_channels', 'mainid', + 'surround_mode', 'bs_mod', 'num_channels', 'mainid', 'asvcflags', 'text', ] return '' % (', '.join(attribreprlist(self, @@ -880,6 +929,7 @@ def iteravpids(stream, avpids): class PMT(dict): def __init__(self): super(PMT, self).__init__() + self.pcrpid = None self.es = [] def clean_up(self): @@ -893,6 +943,8 @@ class PMT(dict): assert psip.table_id == 0x02 tb = psip.table + pcrpid = ((ord(tb[0]) & 0x1f) << 8) | ord(tb[1]) + self.pcrpid = pcrpid ltmp = ((ord(tb[2]) & 0xf) << 8) | ord(tb[3]) + 4 self.update(getdescriptors(tb[4:ltmp])) i = ltmp @@ -1081,11 +1133,26 @@ class TSPacket: if self.error: return i = 4 + adapt_len = ord(p[4]) + # XXX - this is a large adapt, is it real? + if adapt >= 2 and adapt_len >= 188: + return + if adapt >= 2: - adapt_len = ord(p[4]) + if adapt == 3: + assert adapt_len >= 0 and adapt_len <= 182 + else: + pass + # my reading of the spec says this, but in + # practice this isn't the case + #assert adapt == 2 and adapt_len == 183 buf = p[i + 1:i + 1 + adapt_len] - assert len(buf) == adapt_len - self.decode_adaptation(buf) + #print self.error, self.start, self.priority, self.pid, self.scramble, adapt, self.continuity, adapt_len, i + assert len(buf) == adapt_len, 'lengths: %d, %d' % (len(buf), adapt_len) + try: + self.decode_adaptation(buf) + except: + pass # XXX - handle adpatation i += 1 + adapt_len self.payload = p[i:] @@ -1177,13 +1244,17 @@ data gets modified.''' class TSPStream: '''This class takes a file object, and outputs TS packets.''' - def __init__(self, f): + def __init__(self, f, endpos = None): self.f = f + self.endpos = endpos def __iter__(self): foundsync = False buf = self.f.read(READBLK) while buf: + if self.endpos is not None and self.f.tell() > self.endpos: + break + if not foundsync: try: start = buf.index(TSSYNC) @@ -1244,6 +1315,8 @@ def usage(): print ' -m print PAT and PMT' print ' -t print TVCT' print ' -y file offset when done' + print ' -s Starting pos' + print ' -e Ending pos' def findchannel(tvct, chan): for i in tvct['channels']: @@ -1329,7 +1402,7 @@ def GetTVCT(tsstream): def main(): try: - opts, args = getopt.getopt(sys.argv[1:], "bc:hlmo:pty") + opts, args = getopt.getopt(sys.argv[1:], "bc:e:hlmo:ps:ty") except getopt.GetoptError: # print help information and exit: usage() @@ -1343,6 +1416,8 @@ def main(): output = None allmaps = False printtvct = False + startpos = None + endpos = None needtvct = False needpat = False @@ -1364,10 +1439,14 @@ def main(): if channelsel is not None: needpat = True needtvct = True + elif o == '-e': + endpos = int(a) elif o == "-m": allmaps = True needallmaps = True needpat = True + elif o == '-s': + startpos = int(a) elif o == '-t': printtvct = True needtvct = True @@ -1379,18 +1458,20 @@ def main(): usage() sys.exit() elif o == '-o': - output = file(a, 'w') + output = a elif o == '-p': printbandwidthpercent = True elif o == '-y': printbyteoffset = True - if len(args) != 1: + if len(args) != 1 or (channelsel and not output): usage() sys.exit() inp = open(args[0]) - s = TSPStream(inp) + if startpos is not None: + inp.seek(startpos) + s = TSPStream(inp, endpos) pat = PAT() pmts = {} tvct = TVCT() @@ -1421,8 +1502,8 @@ def main(): return False for i in itertools.imap(TSPacket, s): - if hasattr(i, 'splice_countdown') or hasattr(i, 'DTS_next_AU'): - print 'splice_countdown:', repr(i) + #if hasattr(i, 'splice_countdown') or hasattr(i, 'DTS_next_AU'): + # print 'splice_countdown:', repr(i) #if hasattr(i, 'PCR'): # print 'PCR:', repr(i) #if i.pid in (48, 64, 80, 112): @@ -1449,25 +1530,20 @@ def main(): if needtvct and tvct: # Handle TVCT needtvct = False + if channelsel is not None: + channelfnd = findchannel(tvct, channelsel) + if channelfnd is None: + sys.stderr.write("Unable to find channel: %s\n" % channelsel) + channelsel = None + else: + channelfnd = pat[channelfnd['prog_num']] + getpmt(channelfnd) if needpat and pat: needpat = False for j in pat.itervalues(): if listchan or allmaps: getpmt(j) - if channelsel is not None: - channelfnd = findchannel(tvct, channelsel) - if channelfnd is None: - sys.stderr.write("Unable to find channel: %s\n" % channelsel) - channelsel = None - else: - channelfnd = pat[channelfnd['prog_num']] - getpmt(channelfnd) - - if channelfnd and pmts[channelfnd]: - av = getaudiovideopids(pmts[channelfnd]) - for j in itertools.chain(*av): - print j if needallmaps and pat and pmts: for i in pat.itervalues(): @@ -1480,6 +1556,10 @@ def main(): if not (needtvct or needpat or needpmts() or printbandwidth or needallmaps): break + if channelfnd and pmts[channelfnd]: + av = getaudiovideopids(pmts[channelfnd]) + os.system("python tssel.py %s %s %s > '%s'" % (args[0], channelfnd, ' '.join(map(str, itertools.chain(*av))), output)) + if allmaps: print repr(pat) print repr(pmts) diff --git a/mpegts/tssel.py b/mpegts/tssel.py index 8999f33..6f8e306 100755 --- a/mpegts/tssel.py +++ b/mpegts/tssel.py @@ -1,4 +1,31 @@ #!/usr/bin/env python +# +# Copyright 2006-2007 John-Mark Gurney. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# import sys sys.path.append('/Users/jgurney/p4/bktrau/info') @@ -7,15 +34,18 @@ import itertools import mpegts import sys import sets +import struct def usage(): print >>sys.stderr, 'Usage: %s ...' % sys.argv[0] sys.exit(1) -def genpats(pmt): - BASEPAT = map(None, "G@\x00\x10\x00\x00\xb0\r\x00\x00\xc1\x00\x00\x00\x01\xe0\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff") +def genpats(pmt, prognum): + BASEPAT = map(None, "\x47\x40\x00\x10\x00\x00\xb0\x0d\x00\x00\xc1\x00\x00\x00\x00\xe0\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff") patidx = 4 + 1 # TS header + pointer table + BASEPAT[patidx + 8] = chr(prognum >> 8) + BASEPAT[patidx + 9] = chr(prognum & 0xff) BASEPAT[patidx + 10] = chr(0xe0 | ((pmt >> 8) & 0x1f)) BASEPAT[patidx + 11] = chr(pmt & 0xff) newcrc = mpegts.psip_calc_crc32(''.join(BASEPAT[patidx:patidx + 12])) @@ -25,6 +55,8 @@ def genpats(pmt): assert len(BASEPAT) == mpegts.TSPKTLEN ret = [] + + # Generate continuity_counter old = ord(BASEPAT[3]) & 0xf0 for i in range(16): # continuity BASEPAT[3] = chr(old | i) @@ -33,22 +65,28 @@ def genpats(pmt): return ret def producets(inp, pmtpid, *pids): - print `inp`, `pmtpid`, `pids` - pats = itertools.cycle(genpats(pmtpid)) + #print `inp`, `pmtpid`, `pids` # XXX - check if all pids are ints? in range? pids = sets.Set(pids) stream = mpegts.TSPStream(inp) + didpmt = False for i in stream: frst = ord(i[1]) # Get first and error bits for testing. pid = (frst & 0x1f) << 8 | ord(i[2]) - if pid == pmtpid and (frst & 0xc0) == 0x40: + if pid == 0 and didpmt: yield pats.next() + elif pid == pmtpid: + if not didpmt: + assert i[4] == '\x00' and i[5] == '\x02' + pats = itertools.cycle(genpats(pmtpid, struct.unpack('>H', i[8:10])[0])) + yield pats.next() + didpmt = True # XXX - we probably want to rewrite the PMT to only # include the pids we are sending. yield i - elif pid in pids: + elif pid in pids and didpmt: yield i def main(): From 75f5d263fdb537696063ee7afcdf3f24d7ec8113 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 1 Nov 2007 20:35:24 -0800 Subject: [PATCH 135/179] add code to handle resending the notifys out every seven minutes.. This should prevent the DSM-520 from saying we've disappeared... 7 minutes means 4 sends before the 30 minutes max-age hits and is a pretty good compromise, though we do send out five notifies each time... [git-p4: depot-paths = "//depot/": change = 1087] --- SSDP.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/SSDP.py b/SSDP.py index 728fb87..bcff7ee 100644 --- a/SSDP.py +++ b/SSDP.py @@ -15,7 +15,7 @@ import string from twisted.python import log from twisted.internet.protocol import DatagramProtocol -from twisted.internet import reactor +from twisted.internet import reactor, task # TODO: Is there a better way of hooking the SSDPServer into a reactor # without having to know the default SSDP port and multicast address? @@ -37,12 +37,22 @@ class SSDPServer(DatagramProtocol): stdheaders = [ ('Server', 'Twisted, UPnP/1.0, python-upnp'), ] elements = {} known = {} + tasks = [] def doStop(self): '''Make sure we send out the byebye notifications.''' - for st in self.known: + while True: + try: + t = self.tasks.pop() + t.stop() + except IndexError: + break + + for st in self.known.keys(): self.doByebye(st) + del self.known[st] + DatagramProtocol.doStop(self) def datagramReceived(self, data, (host, port)): @@ -113,6 +123,10 @@ class SSDPServer(DatagramProtocol): self.known[st]['CACHE-CONTROL'] = 'max-age=1800' self.doNotify(st) + t = task.LoopingCall(lambda: self.doNotify(st)) + t.start(7 * 60) + self.tasks.append(t) + def doByebye(self, st): """Do byebye""" From 40fec323ea50dfffb2bda2f52fb2c8ad9e265368 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 2 Nov 2007 23:04:19 -0800 Subject: [PATCH 136/179] improve SSDP a bit... send out multiple notifies... first is sometime between .5 and 1 seconds, and the second is between 1 and 5 seconds later... Also, schedule a resend of the notify for sometime between a third and a half of the max-age of it all... send out two byebye notifications just incase... Yes, this increases traffic, but it's required per the spec.. and w/ 100Mbit it's not too big of a deal.. [git-p4: depot-paths = "//depot/": change = 1088] --- SSDP.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/SSDP.py b/SSDP.py index bcff7ee..70fd5c2 100644 --- a/SSDP.py +++ b/SSDP.py @@ -37,18 +37,11 @@ class SSDPServer(DatagramProtocol): stdheaders = [ ('Server', 'Twisted, UPnP/1.0, python-upnp'), ] elements = {} known = {} - tasks = [] + maxage = 7 * 24 * 60 * 60 def doStop(self): '''Make sure we send out the byebye notifications.''' - while True: - try: - t = self.tasks.pop() - t.stop() - except IndexError: - break - for st in self.known.keys(): self.doByebye(st) del self.known[st] @@ -120,12 +113,16 @@ class SSDPServer(DatagramProtocol): self.known[st]['ST'] = st self.known[st]['EXT'] = '' self.known[st]['SERVER'] = 'Twisted, UPnP/1.0, python-upnp' - self.known[st]['CACHE-CONTROL'] = 'max-age=1800' - self.doNotify(st) + self.known[st]['CACHE-CONTROL'] = 'max-age=%d' % self.maxage + self.doNotifySchedule(st) - t = task.LoopingCall(lambda: self.doNotify(st)) - t.start(7 * 60) - self.tasks.append(t) + reactor.callLater(random.uniform(.5, 1), lambda: self.doNotify(st)) + reactor.callLater(random.uniform(1, 5), lambda: self.doNotify(st)) + + def doNotifySchedule(self, st): + self.doNotify(st) + reactor.callLater(random.uniform(self.maxage / 3, + self.maxage / 2), lambda: self.doNotifySchedule(st)) def doByebye(self, st): """Do byebye""" @@ -141,7 +138,9 @@ class SSDPServer(DatagramProtocol): del stcpy['ST'] resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) resp.extend(('', '')) - self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) + resp = '\r\n'.join(resp) + self.transport.write(resp, (SSDP_ADDR, SSDP_PORT)) + self.transport.write(resp, (SSDP_ADDR, SSDP_PORT)) def doNotify(self, st): """Do notification""" From 718e881275321ff4d7709bf34c44c01db5b20662 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 4 Nov 2007 09:56:39 -0800 Subject: [PATCH 137/179] update to what is in FreeBSD's repo... atschuff.py#1 mpegts.py#42 tssel.py#8 [git-p4: depot-paths = "//depot/": change = 1089] --- mpegts/atschuff.py | 69 ++++++ mpegts/mpegts.py | 568 ++++++++++++++++++++++++++++++++++++--------- mpegts/tssel.py | 18 +- 3 files changed, 545 insertions(+), 110 deletions(-) create mode 100644 mpegts/atschuff.py diff --git a/mpegts/atschuff.py b/mpegts/atschuff.py new file mode 100644 index 0000000..0083f98 --- /dev/null +++ b/mpegts/atschuff.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# +# Copyright 2006 John-Mark Gurney. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +__all__ = [ 'decode_title', 'decode_description' ] + +try: + from ctypes import * + import ctypes.util + import os.path + + path = os.path.dirname(__file__) + if not path: + path = '.' + hd = ctypes.cdll.LoadLibrary(os.path.join(path, 'libhuffdecode.so.1')) + hd.decodetitle.restype = c_int + hd.decodetitle.argtypes = [ c_char_p, c_char_p, c_int ] + hd.decodedescription.restype = c_int + hd.decodedescription.argtypes = [ c_char_p, c_char_p, c_int ] + + def docall(fun, s): + buflen = 256 + while True: + buf = ctypes.create_string_buffer(buflen) + cnt = fun(s, buf, buflen) + if cnt < buflen: + break + + buflen *= 2 + + return buf.value.decode('iso8859-1') + + decode_title = lambda x: docall(hd.decodetitle, x) + decode_description = lambda x: docall(hd.decodedescription, x) + +except ImportError: + def foo(*args): + raise NotImplementedError, 'Failed to import ctypes' + decode_title = decode_description = foo + +except OSError: + def foo(*args): + raise NotImplementedError, 'Failed to find library huffdecode' + decode_title = decode_description = foo diff --git a/mpegts/mpegts.py b/mpegts/mpegts.py index 5d47e7c..94ec6c2 100755 --- a/mpegts/mpegts.py +++ b/mpegts/mpegts.py @@ -27,10 +27,12 @@ # $Id$ # +import atschuff import itertools import os import sets import struct +import time import traceback TSSYNC = '\x47' @@ -38,7 +40,8 @@ TSPKTLEN = 188 READBLK = 1024 def attribreprlist(obj, attrs): - return map(lambda x, y = obj: '%s: %s' % (x, repr(getattr(y, x))), itertools.ifilter(lambda x, y = obj: hasattr(y, x), attrs)) + return map(lambda x, y = obj: '%s: %s' % (x, repr(getattr(y, x))), + itertools.ifilter(lambda x, y = obj: hasattr(y, x), attrs)) class UnReadSTR: def __init__(self, s): @@ -277,7 +280,8 @@ class PES: self.DTS = read_timestamp(buf[i:i + 5]) i += 5 elif ptsdts_flag == 0x1: - raise ValueError, "ptsdts flag forbidden: %d" % ptsdts_flag + raise ValueError, \ + "ptsdts flag forbidden: %d" % ptsdts_flag if escr_flag: self.ESCR = read_escr(buf[i:i + 6]) i += 6 @@ -297,12 +301,15 @@ class PES: self.additional_copy_info = ord(buf[i]) & 0x7f i += 1 if crc_flag: - self.prev_crc = (ord(buf[i]) << 8) | ord(buf[i + 1]) + self.prev_crc = (ord(buf[i]) << 8) | \ + ord(buf[i + 1]) i += 2 if extension_flag: private_data_flag = bool(ord(buf[i]) & 0x80) - pack_header_field_flag = bool(ord(buf[i]) & 0x40) - program_packet_sequence_counter_flag = bool(ord(buf[i]) & 0x20) + pack_header_field_flag = bool(ord(buf[i]) & \ + 0x40) + program_packet_sequence_counter_flag = \ + bool(ord(buf[i]) & 0x20) pstd_buffer_flag = bool(ord(buf[i]) & 0x10) pes_extension_flag_2 = bool(ord(buf[i]) & 0x01) i += 1 @@ -311,25 +318,34 @@ class PES: i += 16 if pack_header_field_flag: pack_field_length = ord(buf[i]) - self.pack_header = buf[i + 1:i + 1 + pack_field_length] + self.pack_header = buf[i + 1:i + 1 + + pack_field_length] i += 1 + pack_field_length if program_packet_sequence_counter_flag: assert (ord(buf[i]) & 0x80) == 0x80 - self.sequence_counter = ord(buf[i]) & 0x7f + self.sequence_counter = \ + ord(buf[i]) & 0x7f i += 1 assert (ord(buf[i]) & 0x80) == 0x80 - self.mpeg1_mpeg2_ident = bool(ord(buf[i]) & 0x4) - self.original_stuff_len = ord(buf[i]) & 0x3f + self.mpeg1_mpeg2_ident = \ + bool(ord(buf[i]) & 0x4) + self.original_stuff_len = \ + ord(buf[i]) & 0x3f i += 1 if pstd_buffer_flag: assert (ord(buf[i]) & 0xc0) == 0x40 - self.pstd_buffer_scale = bool(ord(buf[i]) & 0x20) - self.pstd_buffer_size = ((ord(buf[i]) & 0x1f) << 8) | ord(buf[i + 1]) + self.pstd_buffer_scale = \ + bool(ord(buf[i]) & 0x20) + self.pstd_buffer_size = \ + ((ord(buf[i]) & 0x1f) << 8) | \ + ord(buf[i + 1]) i += 2 if pes_extension_flag_2: assert (ord(buf[i]) & 0x80) == 0x80 - extension_field_length = ord(buf[i]) & 0x7f - self.extension_field = buf[i + 1: i + 1 + extension_field_length] + extension_field_length = \ + ord(buf[i]) & 0x7f + self.extension_field = buf[i + 1:i + \ + 1 + extension_field_length] i += 1 + extension_field_length assert i <= header_end @@ -337,15 +353,16 @@ class PES: def __repr__(self): # XXX - data length - v = [ 'length', 'scrambling_control', + v = ( 'length', 'scrambling_control', 'priority', 'data_alignment', 'copyright', 'originalcopy', 'PTS', 'DTS', 'ESCR', 'ES_rate', 'trick_mode_control', 'trick_mode_bits', 'additional_copy_info', 'pack_header', 'sequence_counter', 'mpeg1_mpeg2_ident', 'original_stuff_len', 'pstd_buffer_scale', - 'pstd_buffer_size', 'extension_field', ] - return '' % (self.stream_id, ', '.join(attribreprlist(self, v)), ) + 'pstd_buffer_size', 'extension_field', ) + return '' % (self.stream_id, + ', '.join(attribreprlist(self, v)), ) class Pack(list): def __init__(self, f = None, **keyw): @@ -368,8 +385,10 @@ class Pack(list): hlen = (ord(d[4]) << 8) | ord(d[5]) header = f.read(hlen) oh = map(ord, header) - assert (oh[0] & 0x80) == 0x80 and (oh[2] & 0x1) == 0x1 - self.rate_bound = ((oh[0] & 0x7f) << 15) | (oh[1] << 7) | (oh[2] >> 1) + assert (oh[0] & 0x80) == 0x80 and \ + (oh[2] & 0x1) == 0x1 + self.rate_bound = ((oh[0] & 0x7f) << 15) | \ + (oh[1] << 7) | (oh[2] >> 1) self.audio_bound = oh[3] >> 2 self.fixed = bool(oh[3] & 0x2) self.CSPS = bool(oh[3] & 0x1) @@ -377,14 +396,16 @@ class Pack(list): self.system_video_lock = bool(oh[4] & 0x40) assert (oh[4] & 0x20) == 0x20 self.video_bound = oh[4] & 0x1f - self.packet_rate_restriction = bool(oh[5] & 0x80) + self.packet_rate_restriction = \ + bool(oh[5] & 0x80) d = f.peek(1) self.streams = {} while ord(d) & 0x80: d = map(ord, f.read(3)) assert (d[1] & 0xc0) == 0xc0 scaleflag = bool(d[1] & 0x20) - self.streams[d[0]] = (((d[1] & 0x1f) << 8) | d[2]) * (128, 1024)[scaleflag] + self.streams[d[0]] = (((d[1] & 0x1f) << + 8) | d[2]) * (128, 1024)[scaleflag] d = f.peek(1) # PES packets d = f.peek(3) @@ -410,12 +431,16 @@ class Pack(list): 'video_bound', 'packet_rate_restriction', 'streams', ] - return '' % (', '.join(attribreprlist(self, v)), list.__repr__(self)) + return '' % (', '.join(attribreprlist(self, v)), + list.__repr__(self)) def __str__(self): buf = [] buf.append('\x00\x00\x01\xba') - clock = (1l << 46) | (((self.SCR[0] >> 30) & 0x7) << 43) | (1l << 42) | (((self.SCR[0] >> 15) & 0x7ffff) << 27) | (1 << 26) | ((self.SCR[0] & 0x7fff) << 11) | (1 << 10) | ((self.SCR[1] << 1) & 0x3fe) | 0x1 + clock = (1l << 46) | (((self.SCR[0] >> 30) & 0x7) << 43) | \ + (1l << 42) | (((self.SCR[0] >> 15) & 0x7ffff) << 27) | \ + (1 << 26) | ((self.SCR[0] & 0x7fff) << 11) | (1 << 10) | \ + ((self.SCR[1] << 1) & 0x3fe) | 0x1 for i in range(6): buf.append(chr(clock >> ((5 - i) * 8) & 0xff)) muxr = self.muxr / 50 / 8 @@ -451,7 +476,8 @@ class BitRate(int): def max_bitrate_descriptor(b): assert len(b) == 3 - return BitRate((((ord(b[0]) & 0x3f) << 16) | ((ord(b[1]) & 0xff) << 8) | (ord(b[0]) & 0xff)) * 50 * 8) + return BitRate((((ord(b[0]) & 0x3f) << 16) | + ((ord(b[1]) & 0xff) << 8) | (ord(b[0]) & 0xff)) * 50 * 8) class ISO639LangDescriptor(list): atypedict = { @@ -471,11 +497,20 @@ class ISO639LangDescriptor(list): class VStreamDescriptor: def __init__(self, b): + if not b: + self.mpeg2 = None + self.multiple_frame_rate = None + self.frame_rate_code = None + self.constrained_parameter = None + self.still_picture = None + return + fb = ord(b[0]) # XXX - libdvbpsi says no not for mpeg2 flag, but my data # seems to say otherwise. self.mpeg2 = not bool(fb & 0x04) - assert (not self.mpeg2 and len(b) == 1) or (self.mpeg2 and len(b) == 3) + assert (not self.mpeg2 and len(b) == 1) or (self.mpeg2 and + len(b) == 3) self.multiple_frame_rate = bool(fb & 0x80) self.frame_rate_code = frame_rate_code[(fb & 0x78) >> 3] self.constrained_parameter = bool(fb & 0x02) @@ -553,6 +588,10 @@ class AC3Descriptor: else: self.asvcflags = ord(data[i]) i += 1 + if i >= len(data): + self.text = '' + return + textlangcode = ord(data[i]) textlen = textlangcode >> 1 i += 1 @@ -560,7 +599,8 @@ class AC3Descriptor: if textlangcode & 1: self.text = txt.decode('latin-1') else: - assert NotImplementedError, 'the following code is untested' + assert NotImplementedError, \ + 'the following code is untested' self.text = ''.join(map(lambda x: unichr(ord(x[0]) * 256 + ord(x[1])), [txt[i:i+2] for i in range(0, len(txt), 2)])) @@ -573,6 +613,26 @@ class AC3Descriptor: return '' % (', '.join(attribreprlist(self, v)), ) +class ContentAdvisory(list): + def __init__(self, data): + list.__init__(self) + + cnt = ord(data[0]) & 0x3f + i = 1 + for j in xrange(cnt): + region, dim = struct.unpack('>BB', data[i: i + 2]) + i += 2 + d = {} + for j in xrange(dim): + d[ord(data[i])] = ord(data[i + 1]) & 0xf + i += 2 + desclen = ord(data[i]) + desc = MultiStringStruct(data[i + 1: i + 1 + desclen]) + self.append((region, d, desc)) + + def __repr__(self): + return '' % list.__repr__(self) + class ServiceLocationDescriptor(list): tag = 0xa1 sldel = '>BH3c' @@ -599,13 +659,31 @@ class ServiceLocationDescriptor(list): (self.pcr_pid, list.__repr__(self)) class MultiStringStruct(dict): + '''Conforms to Section 6.10 of A/65b.''' + def decode(self, comp, mode, data): - assert (mode == 0 and comp in (1, 2)) or comp == 0 + assert (mode == 0 and comp in (1, 2)) or comp == 0, \ + 'mode: %#x, comp: %#x' % (mode, comp) if comp == 0: + if mode == 0x3f: + return data.decode('UTF-16-BE') + elif mode == 0x3e: + # http://www.unicode.org/reports/tr6/ + raise NotImplementedError, 'Unicode Technical Report #6, A Standard Compression Scheme for Unicode' + + # There are additional limitations + assert mode < 0x34, 'Invalid mode: %#x' % mode + return ''.join(map(lambda x, y = mode * 256: unichr(ord(x) + y), data)) - raise NotImplementedError, 'no code for comp type %d' % comp + assert (comp == 1 or comp == 2) and mode == 0xff, \ + 'Invalid comp: %#x, mode: %#x' % (comp, mode) + + if comp == 1: + return atschuff.decode_title(data) + else: + return atschuff.decode_description(data) def __init__(self, data): cnt = ord(data[0]) @@ -628,13 +706,23 @@ class ComponentNameDescriptor(MultiStringStruct): return '' % \ MultiStringStruct.__repr__(self) +def FindMe(data): + raise RuntimeError, 'found me' + Descriptors = { - 2: VStreamDescriptor, - 10: ISO639LangDescriptor, - 14: max_bitrate_descriptor, - 0x81: AC3Descriptor, - 0xa1: ServiceLocationDescriptor, - 0xa3: ComponentNameDescriptor, + # 0-63 Are listed in ISO 13818-1 Table 2-40 + 2: VStreamDescriptor, # ISO 13818-1 Section 2.6.2 + # 3: Audio, # ISO 13818-1 Section 2.6.3 + 10: ISO639LangDescriptor, # ISO 13818-1 Section 2.6.18 + 14: max_bitrate_descriptor, # ISO 13818-1 Section 2.6.26 + 0x81: AC3Descriptor, # A/53d Section 5.7.3.1 + 0x87: ContentAdvisory, # A/65b Section 6.9.4 + # 0xa0: ExtendedChannelName, # A/65b Section 6.9.5 + 0xa1: ServiceLocationDescriptor, # A/65b Section 6.9.6 + # 0xa2: TimeShiftedService, # A/65b Section 6.9.7 + 0xa3: ComponentNameDescriptor, # A/65b Section 6.9.8 + # 0xad: undefined, # A/53d Section 5.7.3.4 + 0xb6: FindMe, # A/57a Section 7 (ContentId) } PIDs = { @@ -720,10 +808,12 @@ def psip_calc_crc32(data, verbose = False, table = ( if verbose: i_crc = 0xffffffffl for i in data: - i_crc = ((i_crc << 8) & 0xffffffffl) ^ table[(i_crc >> 24) ^ ord(i)] + i_crc = ((i_crc << 8) & 0xffffffffl) ^ table[(i_crc >> + 24) ^ ord(i)] print hex(i_crc) - - i_crc = reduce(lambda x, y: ((x << 8) & 0xffffffffl) ^ table[(x >> 24) ^ ord(y)], data, 0xffffffffl) + else: + i_crc = reduce(lambda x, y: ((x << 8) & 0xffffffffl) ^ + table[(x >> 24) ^ ord(y)], data, 0xffffffffl) return i_crc def psip_crc32(data): @@ -790,7 +880,8 @@ and the key is the table number.''' self._table_id = ord(payload[i]) self.syntax = bool(ord(payload[i + 1]) & 0x80) self.private = bool(ord(payload[i + 1]) & 0x40) - self.sect_len = (((ord(payload[i + 1]) & 0xf) << 8) | ord(payload[i + 2])) + 3 + self.sect_len = (((ord(payload[i + 1]) & 0xf) << 8) | \ + ord(payload[i + 2])) + 3 self.stored_sects = [ payload[i:] ] #print 'bar', i, repr(payload) self.stored_len = len(self.stored_sects[0]) @@ -807,7 +898,8 @@ and the key is the table number.''' i = ord(payload[0]) + 1 self.decode_section_header(payload, i) else: - if self.discontinuity or self.next_continuity(p.continuity): + if self.discontinuity or \ + self.next_continuity(p.continuity): self.discontinuity = True return self.stored_sects.append(p.payload) @@ -823,11 +915,14 @@ and the key is the table number.''' assert len(payload) == self.stored_len if self.syntax: - # XXX I may need to include the skipped part above in - # the crc calculations. + # XXX I may need to include the skipped part + # above in the crc calculations. if not psip_crc32(payload[:self.sect_len]): - raise ValueError, 'CRC check failed: %s' % `payload[:self.sect_len]` - self.extension = (ord(payload[3]) << 8) | ord(payload[4]) + raise ValueError, \ + 'CRC check failed: %s' % \ + `payload[:self.sect_len]` + self.extension = (ord(payload[3]) << 8) | \ + ord(payload[4]) self.version = (ord(payload[5]) & 0x3e) >> 1 self.current_next = bool(ord(payload[5]) & 1) self.section_number = ord(payload[6]) @@ -852,28 +947,59 @@ and the key is the table number.''' pass # No handler, ignore or raise exception? # hmm. I had a packet with some low bits clear - # the spec seems to imply that there can be multiple sections, - # but every case I've seen in the world there isn't. + # the spec seems to imply that there can be multiple + # sections, but every case I've seen in the world + # there isn't. if ord(payload[self.sect_len]) != 0xff: #print 'prev:', self.last_section_number # I should make sure there is enough data - self.decode_section_header(payload, self.sect_len) + self.decode_section_header(payload, + self.sect_len) #print 'starting next section:', repr(self), repr(payload) continue else: break - def __repr__(self): - v = ('table_id', 'syntax', 'private', 'table', + def __repr__(self, v=('table_id', 'syntax', 'private', 'table', 'extension', 'version', 'current_next', 'section_number', - 'last_section_number', 'protocol_version', ) - return '' % (', '.join(attribreprlist(self, v)), super(TSPSIPHandler, self).__repr__()) + 'last_section_number', 'protocol_version', )): + return '' % \ + (', '.join(attribreprlist(self, v)), super(TSPSIPHandler, + self).__repr__()) + +class PSIPObject(object): + def parse_table(self, tbl): + raise NotImplementedError + + def repr_part(self): + return [] + + def __call__(self, psip): + if psip.syntax: + self.version = psip.version + self.current_next = psip.current_next + self.section_number = psip.section_number + self.last_section_number = psip.last_section_number + else: + self.version = None + self.current_next = None + self.section_number = None + self.last_section_number = None + + self.parse_table(psip) -class PAT(dict): + def __repr__(self, v=('version', 'current_next', 'section_number', + 'last_section_number', )): + return '<%s: %s>' % (self.__class__.__name__, + ', '.join(attribreprlist(self, v) + self.repr_part())) + +class PAT(PSIPObject, dict): def __init__(self): '''In order to prevent confusion, you can't init w/ a packet.''' - super(PAT, self).__init__() + PSIPObject.__init__(self) + dict.__init__(self) + self.pid_dict = {} def clean_up(self): @@ -886,17 +1012,18 @@ class PAT(dict): def get_prog(self, pid): return self.pid_dict[pid] - def __call__(self, psip, s = '>HH', sl = struct.calcsize('>HH')): + def parse_table(self, psip, s = '>HH', sl = struct.calcsize('>HH')): assert psip.table_id == 0x00 for i in range(len(psip.table) / sl): - prog, pid = struct.unpack(s, psip.table[i * sl:(i + 1) * sl]) + prog, pid = struct.unpack(s, psip.table[i * sl:(i + + 1) * sl]) pid &= 0x1fff self.pid_dict[pid] = prog self[prog] = pid - def __repr__(self): - return '' % dict.__repr__(self) + def repr_part(self): + return [ dict.__repr__(self) ] def getaudiovideopids(pmt, lang = None): anapid = None @@ -907,8 +1034,10 @@ def getaudiovideopids(pmt, lang = None): j = i[2] if i[0] == 2: vpids.append(cpid) - elif j.has_key(5): - assert 'AC-3' in map(lambda x: x[:4], j[5]) + elif i[0] == 129: + apids.append(cpid) + elif j.has_key(5) and i[0] != 5: + assert 'AC-3' in map(lambda x: x[:4], j[5]), (i, j) if lang is None or lang == j[10][0][0]: apids.append(cpid) else: @@ -926,9 +1055,11 @@ def iteravpids(stream, avpids): if SimpleTSPacket(i).pid in avpids: yield i -class PMT(dict): +class PMT(PSIPObject, dict): def __init__(self): - super(PMT, self).__init__() + PSIPObject.__init__(self) + dict.__init__(self) + self.pcrpid = None self.es = [] @@ -939,7 +1070,7 @@ class PMT(dict): def __nonzero__(self): return len(self) or bool(self.es) - def __call__(self, psip): + def parse_table(self, psip): assert psip.table_id == 0x02 tb = psip.table @@ -959,8 +1090,9 @@ class PMT(dict): i += l es.append((t, p, d)) - def __repr__(self): - return '' % (dict.__repr__(self), repr(self.es)) + def repr_part(self): + return [ 'PCRpid: %d' % self.pcrpid, dict.__repr__(self), + 'ES: %s' % `self.es` ] def channelmajorminorsort(x, y): if x['major'] != y['major']: @@ -968,16 +1100,147 @@ def channelmajorminorsort(x, y): return cmp(x['minor'], y['minor']) -class TVCT(dict): +def gpstoutc(gps, utcoff): + gpstrue = gps - utcoff + return gpstrue + 315990000 + +class STT(PSIPObject): def __init__(self): '''In order to prevent confusion, you can't init w/ a packet.''' - super(TVCT, self).__init__() + PSIPObject.__init__(self) def clean_up(self): - self.clear() + self.utc = None + self.ds_status = None + self.ds_day_of_month = None + self.ds_hour = None + + def parse_table(self, psip): + assert psip.table_id == 0xcd and psip.table[0] == '\x00' + + system_time, gps_utc_offset, daylight_savings = \ + struct.unpack('>IBH', psip.table[1:8]) + ds_status = daylight_savings >> 15 + ds_day_of_month = (daylight_savings >> 8) & 0x1f + ds_hour = daylight_savings & 0xff + utc = gpstoutc(system_time, gps_utc_offset) + self.utc = utc + self.ds_status = ds_status + self.ds_day_of_month = ds_day_of_month + self.ds_hour = ds_hour + + def repr_part(self, v=('ds_status', 'ds_day_of_month', 'ds_hour', )): + return [ `time.ctime(self.utc)`, ] + attribreprlist(self, v) + +class MGT(list): + def __init__(self, pidtable): + '''In order to prevent confusion, you can't init w/ a packet.''' + + super(MGT, self).__init__() + self.pidtable = pidtable + self.watch = {} + + def clean_up(self): + del self[:] def __call__(self, psip): + assert psip.table_id == 0xc7 and psip.table[0] == '\x00' + + ntables = struct.unpack('>H', psip.table[1:3])[0] + i = 3 + for foo in xrange(ntables): + type, pid, version, nbytes, desclen = \ + struct.unpack('>HHBIH', psip.table[i:i + 11]) + i += 11 + pid &= 0x1fff + version &= 0x1f + desclen &= 0xfff + desc = getdescriptors(psip.table[i:i + desclen]) + self.append((type, pid, version, nbytes, desc)) + i += desclen + + # start watch + if type >= 0x100 and type <= 0x17f: + if self.pidtable.has_key(pid): + # XXX - check that it's in watch + pass + else: + self.watch[type] = { 'pid': pid, + 'version': version, } + self.pidtable[pid] = TSPSIPHandler({ + 0xcb: EIT() }) + elif type >= 0x200 and type <= 0x27f: + if self.pidtable.has_key(pid): + # XXX - check that it's in watch + pass + else: + #print 'adding ett', pid + self.watch[type] = { 'pid': pid, + 'version': version, } + self.pidtable[pid] = TSPSIPHandler({ + 0xcc: ETT() }) + + + desclen = struct.unpack('>H', psip.table[i:i + 2])[0] + desclen &= 0xfff + desc = getdescriptors(psip.table[i:i + desclen]) + self.desc = desc + #print `self` + + def __repr__(self): + return '' % (`self.desc`, + list.__repr__(self)) + +class EIT(list): + def __init__(self): + '''In order to prevent confusion, you can't init w/ a packet.''' + + super(EIT, self).__init__() + + def clean_up(self): + del self[:] + + def __call__(self, psip): + assert psip.table_id == 0xcb and psip.table[0] == '\x00' + + ntables = ord(psip.table[1]) + i = 2 + for foo in xrange(ntables): + event_id, start_time, lochilen, lolength, titlelen = \ + struct.unpack('>HIBHB', psip.table[i:i + 10]) + i += 10 + event_id &= 0x3fff + etm_location = (lochilen >> 4) & 0x3 + length = ((lochilen & 0xf) << 16) | lolength + title = MultiStringStruct(psip.table[i:i + titlelen]) + i += titlelen + desclen = struct.unpack('>H', psip.table[i:i + 2])[0] + i += 2 + desclen &= 0xfff + desc = getdescriptors(psip.table[i:i + desclen]) + i += desclen + + # XXX - UTC offset should be what? + self.append((event_id, etm_location, + gpstoutc(start_time, 0), length, title, desc)) + + #print `self` + + def __repr__(self): + return '' % list.__repr__(self) + +class TVCT(PSIPObject, dict): + def __init__(self): + '''In order to prevent confusion, you can't init w/ a packet.''' + + PSIPObject.__init__(self) + dict.__init__(self) + + def clean_up(self): + self.clear() + + def parse_table(self, psip): assert psip.table_id == 0xc8 self['channels'] = [] @@ -986,13 +1249,17 @@ class TVCT(dict): chancnt = ord(tb[i]) i += 1 for foo in range(chancnt): - shrtnm = ''.join(map(lambda x: unichr((ord(x[0]) << 8) | ord(x[1])), [tb[i + x * 2:i + (x + 1) * 2] for x in range(7)])).rstrip(unichr(0)) + shrtnm = ''.join(map(lambda x: unichr((ord(x[0]) << + 8) | ord(x[1])), [tb[i + x * 2:i + (x + 1) * 2] for + x in range(7)])).rstrip(unichr(0)) i += 7 * 2 - major = (((ord(tb[i]) << 8) | ord(tb[i + 1])) >> 2) & 0x3ff + major = (((ord(tb[i]) << 8) | ord(tb[i + 1])) >> 2) & \ + 0x3ff minor = ((ord(tb[i + 1]) & 0x3) << 8) | ord(tb[i + 2]) mode = ord(tb[i + 3]) i += 4 - carrier, tsid, prog_num, flagsa, source, desc_len = struct.unpack('>IHHHHH', tb[i:i + 14]) + carrier, tsid, prog_num, flagsa, source, desc_len = \ + struct.unpack('>IHHHHH', tb[i:i + 14]) i += 14 etm_loc = (flagsa & 0xc000) >> 14 access_control = bool(flagsa & 0x2000) @@ -1014,8 +1281,30 @@ class TVCT(dict): i += 2 self['descriptors'] = getdescriptors(tb[i:i + desc_len]) + def repr_part(self): + return [ dict.__repr__(self), ] + +class ETT(dict): + def __init__(self): + '''In order to prevent confusion, you can't init w/ a packet.''' + + super(ETT, self).__init__() + + def clean_up(self): + pass + + def __call__(self, psip): + assert psip.table_id == 0xcc and psip.table[0] == '\x00' + + id, event = struct.unpack('>HH', psip.table[1:5]) + event >>= 2 + desc = MultiStringStruct(psip.table[5:]) + self[(id, event)] = desc + + #print `self` + def __repr__(self): - return '' % (dict.__repr__(self), ) + return '' % dict.__repr__(self) class TSPESHandler: def __init__(self, cb): @@ -1065,7 +1354,8 @@ class TSPESHandler: self.stored_len = len(self.stored_sects[0]) self.discontinuity = False else: - if self.discontinuity or not self.next_continuity(p.continuity): + if self.discontinuity or \ + not self.next_continuity(p.continuity): self.discontinuity = True return self.stored_sects.append(p.payload) @@ -1076,7 +1366,8 @@ class TSPESHandler: return ps = ''.join(self.stored_sects) - assert self.stored_len == self.pes_len and self.pes_len == len(ps) + assert self.stored_len == self.pes_len and \ + self.pes_len == len(ps) self.cb(ps) def read_clock(buf): @@ -1135,12 +1426,14 @@ class TSPacket: i = 4 adapt_len = ord(p[4]) # XXX - this is a large adapt, is it real? - if adapt >= 2 and adapt_len >= 188: + if (adapt >= 2 and adapt_len >= 188) or self.scramble: return if adapt >= 2: if adapt == 3: - assert adapt_len >= 0 and adapt_len <= 182 + pass + # see below + #assert adapt_len >= 0 and adapt_len <= 182 else: pass # my reading of the spec says this, but in @@ -1148,7 +1441,7 @@ class TSPacket: #assert adapt == 2 and adapt_len == 183 buf = p[i + 1:i + 1 + adapt_len] #print self.error, self.start, self.priority, self.pid, self.scramble, adapt, self.continuity, adapt_len, i - assert len(buf) == adapt_len, 'lengths: %d, %d' % (len(buf), adapt_len) + #assert len(buf) == adapt_len, 'adapt: %d, lengths: %d, %d, buf[0]: %02x' % (adapt, len(buf), adapt_len, ord(buf[0])) try: self.decode_adaptation(buf) except: @@ -1192,8 +1485,8 @@ class TSPacket: i += 2 if ltw_flag: self.ltw_valid = bool(ord(adp[i]) & 0x80) - self.ltw_offset = ((ord(adp[i]) & 0x7f) << 8) |\ - ord(adp[i + 1]) + self.ltw_offset = ((ord(adp[i]) & 0x7f) << + 8) | ord(adp[i + 1]) i += 2 if piecewise_rate_flag: self.piecewise_rate = ((ord(adp[i]) & 0x3f) << @@ -1233,7 +1526,8 @@ data gets modified.''' alenstr = chr(len(self.adaptation)) if self.payload: fb |= 1 << 4 - ret = '%c%c%c%c%s%s%s' % (TSSYNC, sb, tb, fb, alenstr, self.adaptation, self.payload) + ret = '%c%c%c%c%s%s%s' % (TSSYNC, sb, tb, fb, alenstr, + self.adaptation, self.payload) if len(ret) != TSPKTLEN: pass #print >>sys.stderr, repr(self) @@ -1251,8 +1545,10 @@ class TSPStream: def __iter__(self): foundsync = False buf = self.f.read(READBLK) + fppos = self.f.tell() while buf: - if self.endpos is not None and self.f.tell() > self.endpos: + if self.endpos is not None and \ + fppos > self.endpos: break if not foundsync: @@ -1260,6 +1556,7 @@ class TSPStream: start = buf.index(TSSYNC) except ValueError: buf = self.f.read(READBLK) + fppos = self.f.tell() continue try: @@ -1273,6 +1570,7 @@ class TSPStream: continue except IndexError: nbuf = self.f.read(READBLK) + fppos = self.f.tell() if not nbuf: return buf += nbuf @@ -1287,6 +1585,7 @@ class TSPStream: t = buf[start:start + TSPKTLEN] if len(t) != TSPKTLEN: r = self.f.read(READBLK) + fppos = self.f.tell() if not r: #No more data break @@ -1294,13 +1593,16 @@ class TSPStream: start = 0 if not buf: buf = self.f.read(READBLK) + fppos = self.f.tell() continue + self.itempos = fppos - len(buf) yield t buf = buf[start + TSPKTLEN:] start = 0 if not buf: buf = self.f.read(READBLK) + fppos = self.f.tell() import getopt import re @@ -1308,12 +1610,23 @@ import sys def usage(): print 'Usage: %s -lmty ' % sys.argv[0] + print ' %s -k ' % sys.argv[0] print ' %s -b [ -p ] ' % sys.argv[0] print ' %s -c -o ' % sys.argv[0] print '' print ' -l list channels' print ' -m print PAT and PMT' print ' -t print TVCT' + print '' + print ' -b bandwidth' + print ' -p sort by percentage' + print '' + print ' -c channel to capture' + print ' -o file to output channel' + print '' + print ' -k print PCR of pid stream' + print '' + print 'Options for all:' print ' -y file offset when done' print ' -s Starting pos' print ' -e Ending pos' @@ -1338,7 +1651,6 @@ def GetTVCT(tsstream): needtvct = True needpat = False - needpmts = {} pat = PAT() pmts = {} @@ -1390,7 +1702,9 @@ def GetTVCT(tsstream): # unable to find TVCT lst = pat.items() lst.sort() - lst = map(lambda x, y: { 'name': 'PAT%d' % x[1], 'prog_num': x[1], 'major': '?', 'minor': y}, lst, range(1, len(pat) + 1)) + lst = map(lambda x, y: { 'name': 'PAT%d' % x[1], + 'prog_num': x[1], 'major': '?', 'minor': y}, lst, + range(1, len(pat) + 1)) tvct = { 'channels': lst } for i in lst: @@ -1402,7 +1716,7 @@ def GetTVCT(tsstream): def main(): try: - opts, args = getopt.getopt(sys.argv[1:], "bc:e:hlmo:ps:ty") + opts, args = getopt.getopt(sys.argv[1:], "bc:e:hk:lmo:pr:s:ty") except getopt.GetoptError: # print help information and exit: usage() @@ -1413,17 +1727,20 @@ def main(): printbandwidthpercent = False listchan = False channelsel = None + programsel = None output = None allmaps = False printtvct = False startpos = None endpos = None + pcrpid = None + needtvct = False needpat = False - needpmts = {} channelfnd = False needallmaps = False + cuts = False for o, a in opts: if o == '-b': @@ -1433,7 +1750,8 @@ def main(): channelsel = int(a) except ValueError: try: - channelsel = tuple(map(int, re.split('[-.]', a, 1))) + channelsel = tuple(map(int, + re.split('[-.]', a, 1))) except ValueError: channelsel = a if channelsel is not None: @@ -1441,6 +1759,8 @@ def main(): needtvct = True elif o == '-e': endpos = int(a) + elif o == '-k': + pcrpid = int(a) elif o == "-m": allmaps = True needallmaps = True @@ -1461,6 +1781,9 @@ def main(): output = a elif o == '-p': printbandwidthpercent = True + elif o == '-r': + programsel = int(a) + needpat = True elif o == '-y': printbyteoffset = True @@ -1475,6 +1798,7 @@ def main(): pat = PAT() pmts = {} tvct = TVCT() + stt = STT() def null(p): #print 'null', repr(p) @@ -1482,13 +1806,16 @@ def main(): null.clean_up = lambda: None psippids = { 0x00: TSPSIPHandler({ 0x00: pat }), - 0x1ffb: TSPSIPHandler({ - #0xc7: null, - 0xc8: tvct, - }), } pidcnt = {} + mgt = MGT(psippids) + psippids[0x1ffb] = TSPSIPHandler({ + #0xc7: mgt, + 0xc8: tvct, + 0xcd: stt, + }) + def getpmt(pid, pm = pmts, psp = psippids): if not pm.has_key(pid): pm[pid] = PMT() @@ -1501,6 +1828,9 @@ def main(): return False + lastpcr = None + lastpatpos = None + for i in itertools.imap(TSPacket, s): #if hasattr(i, 'splice_countdown') or hasattr(i, 'DTS_next_AU'): # print 'splice_countdown:', repr(i) @@ -1508,6 +1838,17 @@ def main(): # print 'PCR:', repr(i) #if i.pid in (48, 64, 80, 112): # print `i` + # print s.itempos, `i` + + if i.pid == 0 or lastpatpos is None: + lastpatpos = s.itempos + + if pcrpid is not None and i.pid == pcrpid: + if lastpcr is not None: + # I've only seen 2703 as the largest + if i.PCR[0] - lastpcr[0] > 3000: + print lastpatpos + lastpcr = i.PCR try: psippids[i.pid](i) @@ -1530,18 +1871,27 @@ def main(): if needtvct and tvct: # Handle TVCT needtvct = False - if channelsel is not None: - channelfnd = findchannel(tvct, channelsel) - if channelfnd is None: - sys.stderr.write("Unable to find channel: %s\n" % channelsel) - channelsel = None - else: - channelfnd = pat[channelfnd['prog_num']] - getpmt(channelfnd) + + if programsel is not None and pat: + channelfnd = pat[programsel] + getpmt(channelfnd) + + if channelsel is not None and pat and tvct: + channelfnd = findchannel(tvct, channelsel) + if channelfnd is None: + sys.stderr.write("Unable to find channel: %s\n" + % channelsel) + channelsel = None + else: + channelfnd = pat[channelfnd['prog_num']] + getpmt(channelfnd) if needpat and pat: needpat = False - for j in pat.itervalues(): + for pn, j in pat.iteritems(): + if pn == 0: + # XXX - NIT + continue if listchan or allmaps: getpmt(j) @@ -1551,14 +1901,17 @@ def main(): break needallmaps = False - #print repr(tvct), repr(pat), repr(pmts) + #print `tvct`, `pat`, `pmts` #print needtvct, needpat, needpmts(), printbandwidth, needallmaps - if not (needtvct or needpat or needpmts() or printbandwidth or needallmaps): + if not (needtvct or needpat or needpmts() or printbandwidth or + needallmaps or pcrpid): break if channelfnd and pmts[channelfnd]: av = getaudiovideopids(pmts[channelfnd]) - os.system("python tssel.py %s %s %s > '%s'" % (args[0], channelfnd, ' '.join(map(str, itertools.chain(*av))), output)) + os.system("python tssel.py '%s' %s %s > '%s'" % (args[0], + channelfnd, ' '.join(map(str, itertools.chain(*av))), + output)) if allmaps: print repr(pat) @@ -1579,13 +1932,15 @@ def main(): # lst.sort() # lst = map(lambda x, y: { 'prog_num': x[1], 'major': '?', 'minor': y}, lst, range(1, len(pat) + 1)) for i in lst: - if i['prog_num'] != 0: + if i['prog_num'] != 0 and i['prog_num'] != 0xffff: #print repr(pmts[pat[i['prog_num']]]) av = getaudiovideopids(pmts[pat[i['prog_num']]]) - prog_info = '\t'.join(map(lambda x: ','.join(map(str, x)), av)) + prog_info = '\t'.join(map(lambda x: + ','.join(map(str, x)), av)) else: prog_info = '' - print ('%(major)d.%(minor)d\t%(name)s\t' % i) + prog_info + print ('%(major)d.%(minor)d\t%(name)s\t' % i) + \ + prog_info if printbandwidth: totpkts = sum(pidcnt.itervalues()) @@ -1599,7 +1954,8 @@ def main(): else: i.sort() for pid, cnt in i: - print '%4d\t%d\t%5.2f' % (pid, cnt, float(cnt) * 100 / totpkts) + print '%4d\t%d\t%5.2f' % (pid, cnt, + float(cnt) * 100 / totpkts) if printbyteoffset: print inp.tell() @@ -1617,7 +1973,8 @@ def justprint(v, p): for i in filter(lambda x: x[1] == '\x00', fc): print `pes.data[i[0] + 3: i[0] + 7]` if ((ord(pes.data[i[0] + 5]) & 0x38) >> 3) in (2, 3): - print 'non I frame found: %d' % ((ord(pes.data[i[0] + 5]) & 0x38) >> 3) + print 'non I frame found: %d' % \ + ((ord(pes.data[i[0] + 5]) & 0x38) >> 3) if __name__ == '__main__': if True: @@ -1680,7 +2037,8 @@ if __name__ == '__main__': if pesstreams.has_key(l[1]): continue print repr(l) - pesstreams[l[1]] = TSPESHandler(lambda x, y = l[1]: justprint(y, x)) + pesstreams[l[1]] = TSPESHandler(lambda x, y = + l[1]: justprint(y, x)) pidhandlers[l[1]] = pesstreams[l[1]] try: diff --git a/mpegts/tssel.py b/mpegts/tssel.py index 6f8e306..ab3ffff 100755 --- a/mpegts/tssel.py +++ b/mpegts/tssel.py @@ -32,9 +32,9 @@ sys.path.append('/Users/jgurney/p4/bktrau/info') import itertools import mpegts -import sys import sets import struct +import sys def usage(): print >>sys.stderr, 'Usage: %s ...' % sys.argv[0] @@ -75,12 +75,20 @@ def producets(inp, pmtpid, *pids): frst = ord(i[1]) # Get first and error bits for testing. pid = (frst & 0x1f) << 8 | ord(i[2]) - if pid == 0 and didpmt: + if frst & 0x80: + continue + elif pid == 0 and didpmt: yield pats.next() - elif pid == pmtpid: + elif pid == pmtpid and frst & 0x40: if not didpmt: - assert i[4] == '\x00' and i[5] == '\x02' - pats = itertools.cycle(genpats(pmtpid, struct.unpack('>H', i[8:10])[0])) + startpmt = 4 + if ((ord(i[3]) >> 4) & 0x3) == 0x3: + # Has adaptation field + startpmt += ord(i[startpmt]) + 1 + + startpmt += ord(i[startpmt]) + 1 + assert i[startpmt] == '\x02', (startpmt, i[0:10]) + pats = itertools.cycle(genpats(pmtpid, struct.unpack('>H', i[startpmt + 3:startpmt + 5])[0])) yield pats.next() didpmt = True # XXX - we probably want to rewrite the PMT to only From 5cf223798a769ae135e424cfa81bb7128c9ca86f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 12 Nov 2007 01:28:18 -0800 Subject: [PATCH 138/179] update location of mpegts.. [git-p4: depot-paths = "//depot/": change = 1095] --- dvd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvd.py b/dvd.py index 3855252..677421b 100644 --- a/dvd.py +++ b/dvd.py @@ -12,7 +12,7 @@ import os import sets import sys -sys.path.append('/Users/jgurney/p4/bktrau/info') +sys.path.append('mpegts') try: import mpegts audiofilter = lambda x, y: mpegts.DVDAudioFilter(x, y) From aa594de14a2f34309b38aae03ea25e80d172d89c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 12 Nov 2007 08:51:18 -0800 Subject: [PATCH 139/179] make seeking possible on mpegts files... This does some magic to simply replace the pat w/ only the program we want, but keeps all the data there... it wastes a bit of bandwidth, but makes the file seekable, which is good for the media player.. We need to extend this so that we generate the PAT's first, and then start reading/writing the file so we don't pass a PAT unchanged.. [git-p4: depot-paths = "//depot/": change = 1096] --- mpegtsmod.py | 155 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 125 insertions(+), 30 deletions(-) diff --git a/mpegtsmod.py b/mpegtsmod.py index 0863051..b3fffb7 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -8,8 +8,11 @@ __version__ = '$Change$' tsselpypath = 'mpegts/tssel.py' default_audio_lang = 'eng' +import array +import itertools import os import sets +import struct import sys mpegtspath = 'mpegts' @@ -23,8 +26,8 @@ from FSStorage import FSObject, registerklassfun from twisted.python import log, threadable from twisted.spread import pb -from twisted.internet import process, protocol, reactor -from twisted.web import resource, server +from twisted.internet import abstract, process, protocol, reactor +from twisted.web import error, http, resource, server class _LimitedFile(file): def __init__(self, *args, **kwargs): @@ -100,39 +103,68 @@ class MPEGTSTransfer(pb.Viewable): threadable.synchronize(MPEGTSTransfer) -class DynamTSTransfer(protocol.ProcessProtocol): +class DynamTSTransfer(pb.Viewable): def __init__(self, path, pmt, *pids): self.path = path + #log.msg("DynamTSTransfer: pmt: %s, pids: %s" % (pmt, pids)) self.pmt = pmt self.pids = pids + self.didpmt = False - def outReceived(self, data): - self.request.write(data) + def resumeProducing(self): + if not self.request: + return - def outConnectionLost(self): - if self.request: + repcnt = 0 + data = self.fp.read(min(abstract.FileDescriptor.bufferSize, + self.size - self.written) // 188 * 188) + dataarray = array.array('B', data) + for i in xrange(0, len(data), 188): + if data[i] != 'G': + print 'bad sync' + continue + frst = dataarray[i + 1] + pid = (frst & 0x1f) << 8 | dataarray[i + 2] + if not frst & 0x40: + continue + elif not self.didpmt and pid == self.pmt: + startpmt = 4 + if ((dataarray[i + 3] >> 4) & 0x3) == 0x3: + # Adaptation + startpmt += dataarray[i + startpmt] + 1 + startpmt += dataarray[i + startpmt] + 1 + assert data[i + startpmt] =='\x02', (startpmt, + data[i:i + 20]) + self.pats = itertools.cycle(tssel.genpats( + self.pmt, struct.unpack('>H', data[i + + startpmt + 3:i + startpmt + 5])[0])) + self.didpmt = True + + if pid == 0 and self.didpmt: + assert data[i + 4] =='\x00' and \ + data[i + 5] == '\x00', 'error: %s' % `data[i:i + 10]` + repcnt += 1 + pn = self.pats.next() + data = data[:i] + pn + data[i + + 188:] + + if repcnt > 1: + print 'repcnt:', repcnt, 'len(data):', len(data) + + if data: + self.written += len(data) + self.request.write(data) + if self.request and self.fp.tell() == self.size: self.request.unregisterProducer() self.request.finish() self.request = None - def errReceived(self, data): + def pauseProducing(self): pass - #log.msg(data) def stopProducing(self): - if self.request: - self.request.unregisterProducer() - self.request.finish() - - if self.proc: - self.proc.loseConnection() - self.proc.signalProcess('INT') - + self.fp.close() self.request = None - self.proc = None - - pauseProducing = lambda x: x.proc.pauseProducing() - resumeProducing = lambda x: x.proc.resumeProducing() def render(self, request): path = self.path @@ -140,15 +172,79 @@ class DynamTSTransfer(protocol.ProcessProtocol): pids = self.pids self.request = request + fsize = size = os.path.getsize(path) + + request.setHeader('accept-ranges','bytes') + request.setHeader('content-type', 'video/mpeg') - if request.method == 'HEAD': + + try: + self.fp = open(path) + except IOError, e: + import errno + if e[0] == errno.EACCESS: + return error.ForbiddenResource().render(request) + else: + raise + + if request.setLastModified(os.path.getmtime(path)) is http.CACHED: return '' - args = [ 'tssel.py', path, str(pmt), ] + map(str, pids) - self.proc = process.Process(reactor, tsselpypath, args, - None, None, self) - self.proc.closeStdin() - request.registerProducer(self, 1) + trans = True + # Commented out because it's totally broken. --jknight 11/29/04 + # XXX - fixed? jmg 2/17/06 + range = request.getHeader('range') + + tsize = size + if range is not None: + # This is a request for partial data... + bytesrange = range.split('=') + assert bytesrange[0] == 'bytes', \ + "Syntactically invalid http range header!" + start, end = bytesrange[1].split('-', 1) + if start: + start = int(start) + self.fp.seek(start) + if end and int(end) < size: + end = int(end) + else: + end = size - 1 + else: + lastbytes = int(end) + if size < lastbytes: + lastbytes = size + start = size - lastbytes + self.fp.seek(start) + fsize = lastbytes + end = size - 1 + start = start // 188 * 188 + self.fp.seek(start) + size = (end + 1) // 188 * 188 + fsize = end - int(start) + 1 + # start is the byte offset to begin, and end is the + # byte offset to end.. fsize is size to send, tsize + # is the real size of the file, and size is the byte + # position to stop sending. + + if fsize <= 0: + request.setResponseCode(http.REQUESTED_RANGE_NOT_SATISFIABLE + ) + fsize = tsize + trans = False + else: + request.setResponseCode(http.PARTIAL_CONTENT) + request.setHeader('content-range',"bytes %s-%s/%s " % ( + str(start), str(end), str(tsize))) + + request.setHeader('content-length', str(fsize)) + + if request.method == 'HEAD' or trans is False: + request.method = 'HEAD' + return '' + + self.size = tsize + self.written = 0 + request.registerProducer(self, 0) return server.NOT_DONE_YET @@ -163,9 +259,6 @@ class MPEGTSResource(resource.Resource): def render(self, request): request.setHeader('content-type', 'video/mpeg') - if request.method == 'HEAD': - return '' - # return data return DynamTSTransfer(*self.args).render(request) @@ -207,6 +300,7 @@ class MultiMPEGTS(FSObject, StorageFolder): doupdate = False origchildren, toindex = _gennameindexes(self.tvct['channels']) + #log.msg('MultiMPEGTS doUpdate: tvct: %s' % self.tvct) children = sets.Set(origchildren) for i in self.pathObjmap.keys(): if i not in children: @@ -243,6 +337,7 @@ def detectmpegts(path, fobj): # fast enough. return MPEGTS, { 'path': path, 'tvct': tvct['channels'][0] } elif len(tvct['channels']) > 1: + #log.msg('MultiMPEGTS: path: %s' % path) return MultiMPEGTS, { 'path': path } return None, None From 62dd6c479eb862b52dce2cd29c4bda09c827f051 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 12 Nov 2007 22:59:48 -0800 Subject: [PATCH 140/179] switch to using the PAT... since we know the PMT we want, search through the programs till we find the one w/ the PMT we want.. This means an incorrect PAT doesn't slip through.. This now works since we don't overload pid and attempt to use it's original value later... [git-p4: depot-paths = "//depot/": change = 1097] --- mpegtsmod.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/mpegtsmod.py b/mpegtsmod.py index b3fffb7..72fa8db 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -109,7 +109,7 @@ class DynamTSTransfer(pb.Viewable): #log.msg("DynamTSTransfer: pmt: %s, pids: %s" % (pmt, pids)) self.pmt = pmt self.pids = pids - self.didpmt = False + self.didpat = False def resumeProducing(self): if not self.request: @@ -125,22 +125,39 @@ class DynamTSTransfer(pb.Viewable): continue frst = dataarray[i + 1] pid = (frst & 0x1f) << 8 | dataarray[i + 2] + if not frst & 0x40: continue - elif not self.didpmt and pid == self.pmt: - startpmt = 4 + elif not self.didpat and pid == 0: + startpmt = i + 4 if ((dataarray[i + 3] >> 4) & 0x3) == 0x3: # Adaptation - startpmt += dataarray[i + startpmt] + 1 - startpmt += dataarray[i + startpmt] + 1 - assert data[i + startpmt] =='\x02', (startpmt, - data[i:i + 20]) + startpmt += dataarray[startpmt] + 1 + startpmt += dataarray[startpmt] + 1 + assert data[startpmt] =='\x00', (startpmt, + data[i:startpmt + 4]) + arraysize = ((dataarray[startpmt + 1] & + 0xf) << 8) | dataarray[startpmt + 2] + startpmt += 3 + arraysize -= 4 # CRC + # Remaining fields before array + startpmt += 5 + arraysize -= 5 + for startpmt in xrange(startpmt, + min(i + 188 - 3, startpmt + arraysize), 4): + prognum, ppid = struct.unpack('>2H', + data[startpmt:startpmt + 4]) + ppid = ppid & 0x1fff + if ppid == self.pmt: + break + else: + raise KeyError, 'unable to find pmt(%d) in pkt: %s' % (pmt, `data[i:i + 188]`) + self.pats = itertools.cycle(tssel.genpats( - self.pmt, struct.unpack('>H', data[i + - startpmt + 3:i + startpmt + 5])[0])) - self.didpmt = True + self.pmt, prognum)) + self.didpat = True - if pid == 0 and self.didpmt: + if pid == 0 and self.didpat: assert data[i + 4] =='\x00' and \ data[i + 5] == '\x00', 'error: %s' % `data[i:i + 10]` repcnt += 1 From 7a22dee7268b9a95b8556c66bae1875688b8a073 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 12 Nov 2007 23:52:13 -0800 Subject: [PATCH 141/179] update copyright dates to include 2007... [git-p4: depot-paths = "//depot/": change = 1098] --- SSDP.py | 2 +- mpegtsmod.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SSDP.py b/SSDP.py index 70fd5c2..cb532b4 100644 --- a/SSDP.py +++ b/SSDP.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/mpegtsmod.py b/mpegtsmod.py index 72fa8db..3ef734b 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney '''MPEG-TS Handling''' __version__ = '$Change$' From 353f65dc686061a288671131d3395a43b228836b Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 14:42:22 -0800 Subject: [PATCH 142/179] import part of SOAPpy so I can make some modifications to it... [git-p4: depot-paths = "//depot/": change = 1101] --- SOAPpy/Config.py | 202 ++ SOAPpy/Errors.py | 79 + SOAPpy/NS.py | 104 + SOAPpy/Parser.py | 1024 ++++++++ SOAPpy/SOAPBuilder.py | 620 +++++ SOAPpy/Types.py | 1734 +++++++++++++ SOAPpy/Utilities.py | 178 ++ SOAPpy/__init__.py | 15 + SOAPpy/version.py | 2 + SOAPpy/wstools/Namespaces.py | 92 + SOAPpy/wstools/TimeoutSocket.py | 179 ++ SOAPpy/wstools/UserTuple.py | 99 + SOAPpy/wstools/Utility.py | 839 +++++++ SOAPpy/wstools/WSDLTools.py | 1336 ++++++++++ SOAPpy/wstools/XMLSchema.py | 2976 +++++++++++++++++++++++ SOAPpy/wstools/XMLname.py | 88 + SOAPpy/wstools/__init__.py | 36 + SOAPpy/wstools/test/__init__.py | 5 + SOAPpy/wstools/test/test_t1.py | 20 + SOAPpy/wstools/test/test_wsdl.py | 160 ++ SOAPpy/wstools/test/test_wstools.py | 37 + SOAPpy/wstools/test/test_wstools_net.py | 20 + 22 files changed, 9845 insertions(+) create mode 100644 SOAPpy/Config.py create mode 100644 SOAPpy/Errors.py create mode 100644 SOAPpy/NS.py create mode 100644 SOAPpy/Parser.py create mode 100644 SOAPpy/SOAPBuilder.py create mode 100644 SOAPpy/Types.py create mode 100644 SOAPpy/Utilities.py create mode 100644 SOAPpy/__init__.py create mode 100644 SOAPpy/version.py create mode 100755 SOAPpy/wstools/Namespaces.py create mode 100755 SOAPpy/wstools/TimeoutSocket.py create mode 100755 SOAPpy/wstools/UserTuple.py create mode 100755 SOAPpy/wstools/Utility.py create mode 100755 SOAPpy/wstools/WSDLTools.py create mode 100755 SOAPpy/wstools/XMLSchema.py create mode 100755 SOAPpy/wstools/XMLname.py create mode 100644 SOAPpy/wstools/__init__.py create mode 100644 SOAPpy/wstools/test/__init__.py create mode 100644 SOAPpy/wstools/test/test_t1.py create mode 100644 SOAPpy/wstools/test/test_wsdl.py create mode 100644 SOAPpy/wstools/test/test_wstools.py create mode 100644 SOAPpy/wstools/test/test_wstools_net.py diff --git a/SOAPpy/Config.py b/SOAPpy/Config.py new file mode 100644 index 0000000..3ec4dfe --- /dev/null +++ b/SOAPpy/Config.py @@ -0,0 +1,202 @@ +""" +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +ident = '$Id: Config.py,v 1.9 2004/01/31 04:20:05 warnes Exp $' +from version import __version__ + +import copy, socket +from types import * + +from NS import NS + +################################################################################ +# Configuration class +################################################################################ + +class SOAPConfig: + __readonly = ('SSLserver', 'SSLclient', 'GSIserver', 'GSIclient') + + def __init__(self, config = None, **kw): + d = self.__dict__ + + if config: + if not isinstance(config, SOAPConfig): + raise AttributeError, \ + "initializer must be SOAPConfig instance" + + s = config.__dict__ + + for k, v in s.items(): + if k[0] != '_': + d[k] = v + else: + # Setting debug also sets returnFaultInfo, + # dumpHeadersIn, dumpHeadersOut, dumpSOAPIn, and dumpSOAPOut + self.debug = 0 + self.dumpFaultInfo = 1 + # Setting namespaceStyle sets typesNamespace, typesNamespaceURI, + # schemaNamespace, and schemaNamespaceURI + self.namespaceStyle = '1999' + self.strictNamespaces = 0 + self.typed = 1 + self.buildWithNamespacePrefix = 1 + self.returnAllAttrs = 0 + + # Strict checking of range for floats and doubles + self.strict_range = 0 + + # Default encoding for dictionary keys + self.dict_encoding = 'ascii' + + # New argument name handling mechanism. See + # README.MethodParameterNaming for details + self.specialArgs = 1 + + # If unwrap_results=1 and there is only element in the struct, + # SOAPProxy will assume that this element is the result + # and return it rather than the struct containing it. + # Otherwise SOAPproxy will return the struct with all the + # elements as attributes. + self.unwrap_results = 1 + + # Automatically convert SOAP complex types, and + # (recursively) public contents into the corresponding + # python types. (Private subobjects have names that start + # with '_'.) + # + # Conversions: + # - faultType --> raise python exception + # - arrayType --> array + # - compoundType --> dictionary + # + self.simplify_objects = 0 + + # Per-class authorization method. If this is set, before + # calling a any class method, the specified authorization + # method will be called. If it returns 1, the method call + # will proceed, otherwise the call will throw with an + # authorization error. + self.authMethod = None + + # Globus Support if pyGlobus.io available + try: + from pyGlobus import io; + d['GSIserver'] = 1 + d['GSIclient'] = 1 + except: + d['GSIserver'] = 0 + d['GSIclient'] = 0 + + + # Server SSL support if M2Crypto.SSL available + try: + from M2Crypto import SSL + d['SSLserver'] = 1 + except: + d['SSLserver'] = 0 + + # Client SSL support if socket.ssl available + try: + from socket import ssl + d['SSLclient'] = 1 + except: + d['SSLclient'] = 0 + + for k, v in kw.items(): + if k[0] != '_': + setattr(self, k, v) + + def __setattr__(self, name, value): + if name in self.__readonly: + raise AttributeError, "readonly configuration setting" + + d = self.__dict__ + + if name in ('typesNamespace', 'typesNamespaceURI', + 'schemaNamespace', 'schemaNamespaceURI'): + + if name[-3:] == 'URI': + base, uri = name[:-3], 1 + else: + base, uri = name, 0 + + if type(value) == StringType: + if NS.NSMAP.has_key(value): + n = (value, NS.NSMAP[value]) + elif NS.NSMAP_R.has_key(value): + n = (NS.NSMAP_R[value], value) + else: + raise AttributeError, "unknown namespace" + elif type(value) in (ListType, TupleType): + if uri: + n = (value[1], value[0]) + else: + n = (value[0], value[1]) + else: + raise AttributeError, "unknown namespace type" + + d[base], d[base + 'URI'] = n + + try: + d['namespaceStyle'] = \ + NS.STMAP_R[(d['typesNamespace'], d['schemaNamespace'])] + except: + d['namespaceStyle'] = '' + + elif name == 'namespaceStyle': + value = str(value) + + if not NS.STMAP.has_key(value): + raise AttributeError, "unknown namespace style" + + d[name] = value + n = d['typesNamespace'] = NS.STMAP[value][0] + d['typesNamespaceURI'] = NS.NSMAP[n] + n = d['schemaNamespace'] = NS.STMAP[value][1] + d['schemaNamespaceURI'] = NS.NSMAP[n] + + elif name == 'debug': + d[name] = \ + d['returnFaultInfo'] = \ + d['dumpHeadersIn'] = \ + d['dumpHeadersOut'] = \ + d['dumpSOAPIn'] = \ + d['dumpSOAPOut'] = value + + else: + d[name] = value + + +Config = SOAPConfig() diff --git a/SOAPpy/Errors.py b/SOAPpy/Errors.py new file mode 100644 index 0000000..88e2984 --- /dev/null +++ b/SOAPpy/Errors.py @@ -0,0 +1,79 @@ +""" +################################################################################ +# +# SOAPpy - Cayce Ullman (cayce@actzero.com) +# Brian Matthews (blm@actzero.com) +# Gregory Warnes (gregory_r_warnes@groton.pfizer.com) +# Christopher Blunck (blunck@gst.com) +# +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +ident = '$Id: Errors.py,v 1.4 2004/01/31 04:20:05 warnes Exp $' +from version import __version__ + +import exceptions + +################################################################################ +# Exceptions +################################################################################ +class Error(exceptions.Exception): + def __init__(self, msg): + self.msg = msg + def __str__(self): + return "" % self.msg + __repr__ = __str__ + def __call__(self): + return (msg,) + +class RecursionError(Error): + pass + +class UnknownTypeError(Error): + pass + +class HTTPError(Error): + # indicates an HTTP protocol error + def __init__(self, code, msg): + self.code = code + self.msg = msg + def __str__(self): + return "" % (self.code, self.msg) + __repr__ = __str__ + def __call___(self): + return (self.code, self.msg, ) + +class UnderflowError(exceptions.ArithmeticError): + pass + diff --git a/SOAPpy/NS.py b/SOAPpy/NS.py new file mode 100644 index 0000000..658a20e --- /dev/null +++ b/SOAPpy/NS.py @@ -0,0 +1,104 @@ +""" +################################################################################ +# +# SOAPpy - Cayce Ullman (cayce@actzero.com) +# Brian Matthews (blm@actzero.com) +# Gregory Warnes (gregory_r_warnes@groton.pfizer.com) +# Christopher Blunck (blunck@gst.com) +# +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +from __future__ import nested_scopes + +ident = '$Id: NS.py,v 1.3 2004/01/31 04:20:05 warnes Exp $' +from version import __version__ + +############################################################################## +# Namespace Class +################################################################################ +def invertDict(dict): + d = {} + + for k, v in dict.items(): + d[v] = k + + return d + +class NS: + XML = "http://www.w3.org/XML/1998/namespace" + + ENV = "http://schemas.xmlsoap.org/soap/envelope/" + ENC = "http://schemas.xmlsoap.org/soap/encoding/" + + XSD = "http://www.w3.org/1999/XMLSchema" + XSD2 = "http://www.w3.org/2000/10/XMLSchema" + XSD3 = "http://www.w3.org/2001/XMLSchema" + + XSD_L = [XSD, XSD2, XSD3] + EXSD_L= [ENC, XSD, XSD2, XSD3] + + XSI = "http://www.w3.org/1999/XMLSchema-instance" + XSI2 = "http://www.w3.org/2000/10/XMLSchema-instance" + XSI3 = "http://www.w3.org/2001/XMLSchema-instance" + XSI_L = [XSI, XSI2, XSI3] + + URN = "http://soapinterop.org/xsd" + + # For generated messages + XML_T = "xml" + ENV_T = "SOAP-ENV" + ENC_T = "SOAP-ENC" + XSD_T = "xsd" + XSD2_T= "xsd2" + XSD3_T= "xsd3" + XSI_T = "xsi" + XSI2_T= "xsi2" + XSI3_T= "xsi3" + URN_T = "urn" + + NSMAP = {ENV_T: ENV, ENC_T: ENC, XSD_T: XSD, XSD2_T: XSD2, + XSD3_T: XSD3, XSI_T: XSI, XSI2_T: XSI2, XSI3_T: XSI3, + URN_T: URN} + NSMAP_R = invertDict(NSMAP) + + STMAP = {'1999': (XSD_T, XSI_T), '2000': (XSD2_T, XSI2_T), + '2001': (XSD3_T, XSI3_T)} + STMAP_R = invertDict(STMAP) + + def __init__(self): + raise Error, "Don't instantiate this" + + + diff --git a/SOAPpy/Parser.py b/SOAPpy/Parser.py new file mode 100644 index 0000000..aee364d --- /dev/null +++ b/SOAPpy/Parser.py @@ -0,0 +1,1024 @@ +# SOAPpy modules +from Config import Config +from Types import * +from NS import NS +from Utilities import * + +import string +import fpconst +import xml.sax +from wstools.XMLname import fromXMLname + +try: from M2Crypto import SSL +except: pass + +ident = '$Id: Parser.py,v 1.14 2004/01/31 04:20:05 warnes Exp $' +from version import __version__ + + +################################################################################ +# SOAP Parser +################################################################################ +class RefHolder: + def __init__(self, name, frame): + self.name = name + self.parent = frame + self.pos = len(frame) + self.subpos = frame.namecounts.get(name, 0) + + def __repr__(self): + return "<%s %s at %d>" % (self.__class__, self.name, id(self)) + + def __str__(self): + return "<%s %s at %d>" % (self.__class__, self.name, id(self)) + +class SOAPParser(xml.sax.handler.ContentHandler): + class Frame: + def __init__(self, name, kind = None, attrs = {}, rules = {}): + self.name = name + self.kind = kind + self.attrs = attrs + self.rules = rules + + self.contents = [] + self.names = [] + self.namecounts = {} + self.subattrs = [] + + def append(self, name, data, attrs): + self.names.append(name) + self.contents.append(data) + self.subattrs.append(attrs) + + if self.namecounts.has_key(name): + self.namecounts[name] += 1 + else: + self.namecounts[name] = 1 + + def _placeItem(self, name, value, pos, subpos = 0, attrs = None): + self.contents[pos] = value + + if attrs: + self.attrs.update(attrs) + + def __len__(self): + return len(self.contents) + + def __repr__(self): + return "<%s %s at %d>" % (self.__class__, self.name, id(self)) + + def __init__(self, rules = None): + xml.sax.handler.ContentHandler.__init__(self) + self.body = None + self.header = None + self.attrs = {} + self._data = None + self._next = "E" # Keeping state for message validity + self._stack = [self.Frame('SOAP')] + + # Make two dictionaries to store the prefix <-> URI mappings, and + # initialize them with the default + self._prem = {NS.XML_T: NS.XML} + self._prem_r = {NS.XML: NS.XML_T} + self._ids = {} + self._refs = {} + self._rules = rules + + def startElementNS(self, name, qname, attrs): + # Workaround two sax bugs + if name[0] == None and name[1][0] == ' ': + name = (None, name[1][1:]) + else: + name = tuple(name) + + # First some checking of the layout of the message + + if self._next == "E": + if name[1] != 'Envelope': + raise Error, "expected `SOAP-ENV:Envelope', gto `%s:%s'" % \ + (self._prem_r[name[0]], name[1]) + if name[0] != NS.ENV: + raise faultType, ("%s:VersionMismatch" % NS.ENV_T, + "Don't understand version `%s' Envelope" % name[0]) + else: + self._next = "HorB" + elif self._next == "HorB": + if name[0] == NS.ENV and name[1] in ("Header", "Body"): + self._next = None + else: + raise Error, \ + "expected `SOAP-ENV:Header' or `SOAP-ENV:Body', " \ + "got `%s'" % self._prem_r[name[0]] + ':' + name[1] + elif self._next == "B": + if name == (NS.ENV, "Body"): + self._next = None + else: + raise Error, "expected `SOAP-ENV:Body', got `%s'" % \ + self._prem_r[name[0]] + ':' + name[1] + elif self._next == "": + raise Error, "expected nothing, got `%s'" % \ + self._prem_r[name[0]] + ':' + name[1] + + if len(self._stack) == 2: + rules = self._rules + else: + try: + rules = self._stack[-1].rules[name[1]] + except: + rules = None + + if type(rules) not in (NoneType, DictType): + kind = rules + else: + kind = attrs.get((NS.ENC, 'arrayType')) + + if kind != None: + del attrs._attrs[(NS.ENC, 'arrayType')] + + i = kind.find(':') + if i >= 0: + kind = (self._prem[kind[:i]], kind[i + 1:]) + else: + kind = None + + self.pushFrame(self.Frame(name[1], kind, attrs._attrs, rules)) + + self._data = [] # Start accumulating + + def pushFrame(self, frame): + self._stack.append(frame) + + def popFrame(self): + return self._stack.pop() + + def endElementNS(self, name, qname): + # Workaround two sax bugs + if name[0] == None and name[1][0] == ' ': + ns, name = None, name[1][1:] + else: + ns, name = tuple(name) + + name = fromXMLname(name) # convert to SOAP 1.2 XML name encoding + + if self._next == "E": + raise Error, "didn't get SOAP-ENV:Envelope" + if self._next in ("HorB", "B"): + raise Error, "didn't get SOAP-ENV:Body" + + cur = self.popFrame() + attrs = cur.attrs + + idval = None + + if attrs.has_key((None, 'id')): + idval = attrs[(None, 'id')] + + if self._ids.has_key(idval): + raise Error, "duplicate id `%s'" % idval + + del attrs[(None, 'id')] + + root = 1 + + if len(self._stack) == 3: + if attrs.has_key((NS.ENC, 'root')): + root = int(attrs[(NS.ENC, 'root')]) + + # Do some preliminary checks. First, if root="0" is present, + # the element must have an id. Next, if root="n" is present, + # n something other than 0 or 1, raise an exception. + + if root == 0: + if idval == None: + raise Error, "non-root element must have an id" + elif root != 1: + raise Error, "SOAP-ENC:root must be `0' or `1'" + + del attrs[(NS.ENC, 'root')] + + while 1: + href = attrs.get((None, 'href')) + if href: + if href[0] != '#': + raise Error, "Non-local hrefs are not yet suppported." + if self._data != None and string.join(self._data, "").strip() != '': + raise Error, "hrefs can't have data" + + href = href[1:] + + if self._ids.has_key(href): + data = self._ids[href] + else: + data = RefHolder(name, self._stack[-1]) + + if self._refs.has_key(href): + self._refs[href].append(data) + else: + self._refs[href] = [data] + + del attrs[(None, 'href')] + + break + + kind = None + + if attrs: + for i in NS.XSI_L: + if attrs.has_key((i, 'type')): + kind = attrs[(i, 'type')] + del attrs[(i, 'type')] + + if kind != None: + i = kind.find(':') + if i >= 0: + kind = (self._prem[kind[:i]], kind[i + 1:]) + else: +# XXX What to do here? (None, kind) is just going to fail in convertType + kind = (None, kind) + + null = 0 + + if attrs: + for i in (NS.XSI, NS.XSI2): + if attrs.has_key((i, 'null')): + null = attrs[(i, 'null')] + del attrs[(i, 'null')] + + if attrs.has_key((NS.XSI3, 'nil')): + null = attrs[(NS.XSI3, 'nil')] + del attrs[(NS.XSI3, 'nil')] + + + ## Check for nil + + # check for nil='true' + if type(null) in (StringType, UnicodeType): + if null.lower() == 'true': + null = 1 + + # check for nil=1, but watch out for string values + try: + null = int(null) + except ValueError, e: + if not e[0].startswith("invalid literal for int()"): + raise e + null = 0 + + if null: + if len(cur) or \ + (self._data != None and string.join(self._data, "").strip() != ''): + raise Error, "nils can't have data" + + data = None + + break + + if len(self._stack) == 2: + if (ns, name) == (NS.ENV, "Header"): + self.header = data = headerType(attrs = attrs) + self._next = "B" + break + elif (ns, name) == (NS.ENV, "Body"): + self.body = data = bodyType(attrs = attrs) + self._next = "" + break + elif len(self._stack) == 3 and self._next == None: + if (ns, name) == (NS.ENV, "Fault"): + data = faultType() + self._next = "" + break + + if cur.rules != None: + rule = cur.rules + + if type(rule) in (StringType, UnicodeType): +# XXX Need a namespace here + rule = (None, rule) + elif type(rule) == ListType: + rule = tuple(rule) + +# XXX What if rule != kind? + if callable(rule): + data = rule(string.join(self._data, "")) + elif type(rule) == DictType: + data = structType(name = (ns, name), attrs = attrs) + else: + data = self.convertType(string.join(self._data, ""), + rule, attrs) + + break + + if (kind == None and cur.kind != None) or \ + (kind == (NS.ENC, 'Array')): + kind = cur.kind + + if kind == None: + kind = 'ur-type[%d]' % len(cur) + else: + kind = kind[1] + + if len(cur.namecounts) == 1: + elemsname = cur.names[0] + else: + elemsname = None + + data = self.startArray((ns, name), kind, attrs, elemsname) + + break + + if len(self._stack) == 3 and kind == None and \ + len(cur) == 0 and \ + (self._data == None or string.join(self._data, "").strip() == ''): + data = structType(name = (ns, name), attrs = attrs) + break + + if len(cur) == 0 and ns != NS.URN: + # Nothing's been added to the current frame so it must be a + # simple type. + + if kind == None: + # If the current item's container is an array, it will + # have a kind. If so, get the bit before the first [, + # which is the type of the array, therefore the type of + # the current item. + + kind = self._stack[-1].kind + + if kind != None: + i = kind[1].find('[') + if i >= 0: + kind = (kind[0], kind[1][:i]) + elif ns != None: + kind = (ns, name) + + if kind != None: + try: + data = self.convertType(string.join(self._data, ""), + kind, attrs) + except UnknownTypeError: + data = None + else: + data = None + + if data == None: + if self._data == None: + data = '' + else: + data = string.join(self._data, "") + + if len(attrs) == 0: + try: data = str(data) + except: pass + + break + + data = structType(name = (ns, name), attrs = attrs) + + break + + if isinstance(data, compoundType): + for i in range(len(cur)): + v = cur.contents[i] + data._addItem(cur.names[i], v, cur.subattrs[i]) + + if isinstance(v, RefHolder): + v.parent = data + + if root: + self._stack[-1].append(name, data, attrs) + + if idval != None: + self._ids[idval] = data + + if self._refs.has_key(idval): + for i in self._refs[idval]: + i.parent._placeItem(i.name, data, i.pos, i.subpos, attrs) + + del self._refs[idval] + + self.attrs[id(data)] = attrs + + if isinstance(data, anyType): + data._setAttrs(attrs) + + self._data = None # Stop accumulating + + def endDocument(self): + if len(self._refs) == 1: + raise Error, \ + "unresolved reference " + self._refs.keys()[0] + elif len(self._refs) > 1: + raise Error, \ + "unresolved references " + ', '.join(self._refs.keys()) + + def startPrefixMapping(self, prefix, uri): + self._prem[prefix] = uri + self._prem_r[uri] = prefix + + def endPrefixMapping(self, prefix): + try: + del self._prem_r[self._prem[prefix]] + del self._prem[prefix] + except: + pass + + def characters(self, c): + if self._data != None: + self._data.append(c) + + arrayre = '^(?:(?P[^:]*):)?' \ + '(?P[^[]+)' \ + '(?:\[(?P,*)\])?' \ + '(?:\[(?P\d+(?:,\d+)*)?\])$' + + def startArray(self, name, kind, attrs, elemsname): + if type(self.arrayre) == StringType: + self.arrayre = re.compile (self.arrayre) + + offset = attrs.get((NS.ENC, "offset")) + + if offset != None: + del attrs[(NS.ENC, "offset")] + + try: + if offset[0] == '[' and offset[-1] == ']': + offset = int(offset[1:-1]) + if offset < 0: + raise Exception + else: + raise Exception + except: + raise AttributeError, "invalid Array offset" + else: + offset = 0 + + try: + m = self.arrayre.search(kind) + + if m == None: + raise Exception + + t = m.group('type') + + if t == 'ur-type': + return arrayType(None, name, attrs, offset, m.group('rank'), + m.group('asize'), elemsname) + elif m.group('ns') != None: + return typedArrayType(None, name, + (self._prem[m.group('ns')], t), attrs, offset, + m.group('rank'), m.group('asize'), elemsname) + else: + return typedArrayType(None, name, (None, t), attrs, offset, + m.group('rank'), m.group('asize'), elemsname) + except: + raise AttributeError, "invalid Array type `%s'" % kind + + # Conversion + + class DATETIMECONSTS: + SIGNre = '(?P-?)' + CENTURYre = '(?P\d{2,})' + YEARre = '(?P\d{2})' + MONTHre = '(?P\d{2})' + DAYre = '(?P\d{2})' + HOURre = '(?P\d{2})' + MINUTEre = '(?P\d{2})' + SECONDre = '(?P\d{2}(?:\.\d*)?)' + TIMEZONEre = '(?PZ)|(?P[-+])(?P\d{2}):' \ + '(?P\d{2})' + BOSre = '^\s*' + EOSre = '\s*$' + + __allres = {'sign': SIGNre, 'century': CENTURYre, 'year': YEARre, + 'month': MONTHre, 'day': DAYre, 'hour': HOURre, + 'minute': MINUTEre, 'second': SECONDre, 'timezone': TIMEZONEre, + 'b': BOSre, 'e': EOSre} + + dateTime = '%(b)s%(sign)s%(century)s%(year)s-%(month)s-%(day)sT' \ + '%(hour)s:%(minute)s:%(second)s(%(timezone)s)?%(e)s' % __allres + timeInstant = dateTime + timePeriod = dateTime + time = '%(b)s%(hour)s:%(minute)s:%(second)s(%(timezone)s)?%(e)s' % \ + __allres + date = '%(b)s%(sign)s%(century)s%(year)s-%(month)s-%(day)s' \ + '(%(timezone)s)?%(e)s' % __allres + century = '%(b)s%(sign)s%(century)s(%(timezone)s)?%(e)s' % __allres + gYearMonth = '%(b)s%(sign)s%(century)s%(year)s-%(month)s' \ + '(%(timezone)s)?%(e)s' % __allres + gYear = '%(b)s%(sign)s%(century)s%(year)s(%(timezone)s)?%(e)s' % \ + __allres + year = gYear + gMonthDay = '%(b)s--%(month)s-%(day)s(%(timezone)s)?%(e)s' % __allres + recurringDate = gMonthDay + gDay = '%(b)s---%(day)s(%(timezone)s)?%(e)s' % __allres + recurringDay = gDay + gMonth = '%(b)s--%(month)s--(%(timezone)s)?%(e)s' % __allres + month = gMonth + + recurringInstant = '%(b)s%(sign)s(%(century)s|-)(%(year)s|-)-' \ + '(%(month)s|-)-(%(day)s|-)T' \ + '(%(hour)s|-):(%(minute)s|-):(%(second)s|-)' \ + '(%(timezone)s)?%(e)s' % __allres + + duration = '%(b)s%(sign)sP' \ + '((?P\d+)Y)?' \ + '((?P\d+)M)?' \ + '((?P\d+)D)?' \ + '((?PT)' \ + '((?P\d+)H)?' \ + '((?P\d+)M)?' \ + '((?P\d*(?:\.\d*)?)S)?)?%(e)s' % \ + __allres + + timeDuration = duration + + # The extra 31 on the front is: + # - so the tuple is 1-based + # - so months[month-1] is December's days if month is 1 + + months = (31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) + + def convertDateTime(self, value, kind): + def getZoneOffset(d): + zoffs = 0 + + try: + if d['zulu'] == None: + zoffs = 60 * int(d['tzhour']) + int(d['tzminute']) + if d['tzsign'] != '-': + zoffs = -zoffs + except TypeError: + pass + + return zoffs + + def applyZoneOffset(months, zoffs, date, minfield, posday = 1): + if zoffs == 0 and (minfield > 4 or 0 <= date[5] < 60): + return date + + if minfield > 5: date[5] = 0 + if minfield > 4: date[4] = 0 + + if date[5] < 0: + date[4] += int(date[5]) / 60 + date[5] %= 60 + + date[4] += zoffs + + if minfield > 3 or 0 <= date[4] < 60: return date + + date[3] += date[4] / 60 + date[4] %= 60 + + if minfield > 2 or 0 <= date[3] < 24: return date + + date[2] += date[3] / 24 + date[3] %= 24 + + if minfield > 1: + if posday and date[2] <= 0: + date[2] += 31 # zoffs is at most 99:59, so the + # day will never be less than -3 + return date + + while 1: + # The date[1] == 3 (instead of == 2) is because we're + # going back a month, so we need to know if the previous + # month is February, so we test if this month is March. + + leap = minfield == 0 and date[1] == 3 and \ + date[0] % 4 == 0 and \ + (date[0] % 100 != 0 or date[0] % 400 == 0) + + if 0 < date[2] <= months[date[1]] + leap: break + + date[2] += months[date[1] - 1] + leap + + date[1] -= 1 + + if date[1] > 0: break + + date[1] = 12 + + if minfield > 0: break + + date[0] -= 1 + + return date + + try: + exp = getattr(self.DATETIMECONSTS, kind) + except AttributeError: + return None + + if type(exp) == StringType: + exp = re.compile(exp) + setattr (self.DATETIMECONSTS, kind, exp) + + m = exp.search(value) + + try: + if m == None: + raise Exception + + d = m.groupdict() + f = ('century', 'year', 'month', 'day', + 'hour', 'minute', 'second') + fn = len(f) # Index of first non-None value + r = [] + + if kind in ('duration', 'timeDuration'): + if d['sep'] != None and d['hour'] == None and \ + d['minute'] == None and d['second'] == None: + raise Exception + + f = f[1:] + + for i in range(len(f)): + s = d[f[i]] + + if s != None: + if f[i] == 'second': + s = float(s) + else: + try: s = int(s) + except ValueError: s = long(s) + + if i < fn: fn = i + + r.append(s) + + if fn > len(r): # Any non-Nones? + raise Exception + + if d['sign'] == '-': + r[fn] = -r[fn] + + return tuple(r) + + if kind == 'recurringInstant': + for i in range(len(f)): + s = d[f[i]] + + if s == None or s == '-': + if i > fn: + raise Exception + s = None + else: + if i < fn: + fn = i + + if f[i] == 'second': + s = float(s) + else: + try: + s = int(s) + except ValueError: + s = long(s) + + r.append(s) + + s = r.pop(0) + + if fn == 0: + r[0] += s * 100 + else: + fn -= 1 + + if fn < len(r) and d['sign'] == '-': + r[fn] = -r[fn] + + cleanDate(r, fn) + + return tuple(applyZoneOffset(self.DATETIMECONSTS.months, + getZoneOffset(d), r, fn, 0)) + + r = [0, 0, 1, 1, 0, 0, 0] + + for i in range(len(f)): + field = f[i] + + s = d.get(field) + + if s != None: + if field == 'second': + s = float(s) + else: + try: + s = int(s) + except ValueError: + s = long(s) + + if i < fn: + fn = i + + r[i] = s + + if fn > len(r): # Any non-Nones? + raise Exception + + s = r.pop(0) + + if fn == 0: + r[0] += s * 100 + else: + fn -= 1 + + if d.get('sign') == '-': + r[fn] = -r[fn] + + cleanDate(r, fn) + + zoffs = getZoneOffset(d) + + if zoffs: + r = applyZoneOffset(self.DATETIMECONSTS.months, zoffs, r, fn) + + if kind == 'century': + return r[0] / 100 + + s = [] + + for i in range(1, len(f)): + if d.has_key(f[i]): + s.append(r[i - 1]) + + if len(s) == 1: + return s[0] + return tuple(s) + except Exception, e: + raise Error, "invalid %s value `%s' - %s" % (kind, value, e) + + intlimits = \ + { + 'nonPositiveInteger': (0, None, 0), + 'non-positive-integer': (0, None, 0), + 'negativeInteger': (0, None, -1), + 'negative-integer': (0, None, -1), + 'long': (1, -9223372036854775808L, + 9223372036854775807L), + 'int': (0, -2147483648L, 2147483647), + 'short': (0, -32768, 32767), + 'byte': (0, -128, 127), + 'nonNegativeInteger': (0, 0, None), + 'non-negative-integer': (0, 0, None), + 'positiveInteger': (0, 1, None), + 'positive-integer': (0, 1, None), + 'unsignedLong': (1, 0, 18446744073709551615L), + 'unsignedInt': (0, 0, 4294967295L), + 'unsignedShort': (0, 0, 65535), + 'unsignedByte': (0, 0, 255), + } + floatlimits = \ + { + 'float': (7.0064923216240861E-46, -3.4028234663852886E+38, + 3.4028234663852886E+38), + 'double': (2.4703282292062327E-324, -1.7976931348623158E+308, + 1.7976931348623157E+308), + } + zerofloatre = '[1-9]' + + + + + + def convertType(self, d, t, attrs, config=Config): + return self.convertToBasicTypes(d, t, attrs, config) + + + def convertToSOAPpyTypes(self, d, t, attrs, config=Config): + pass + + + def convertToBasicTypes(self, d, t, attrs, config=Config): + dnn = d or '' + + if t[0] in NS.EXSD_L: + if t[1] == "integer": + try: + d = int(d) + if len(attrs): + d = long(d) + except: + d = long(d) + return d + if self.intlimits.has_key (t[1]): # integer types + l = self.intlimits[t[1]] + try: d = int(d) + except: d = long(d) + + if l[1] != None and d < l[1]: + raise UnderflowError, "%s too small" % d + if l[2] != None and d > l[2]: + raise OverflowError, "%s too large" % d + + if l[0] or len(attrs): + return long(d) + return d + if t[1] == "string": + if len(attrs): + return unicode(dnn) + try: + return str(dnn) + except: + return dnn + if t[1] == "boolean": + d = d.strip().lower() + if d in ('0', 'false'): + return 0 + if d in ('1', 'true'): + return 1 + raise AttributeError, "invalid boolean value" + if t[1] in ('double','float'): + l = self.floatlimits[t[1]] + s = d.strip().lower() + + d = float(s) + + if config.strict_range: + if d < l[1]: raise UnderflowError + if d > l[2]: raise OverflowError + else: + # some older SOAP impementations (notably SOAP4J, + # Apache SOAP) return "infinity" instead of "INF" + # so check the first 3 characters for a match. + if s == "nan": + return fpconst.NaN + elif s[0:3] in ("inf", "+inf"): + return fpconst.PosInf + elif s[0:3] == "-inf": + return fpconst.NegInf + + if fpconst.isNaN(d): + if s != 'nan': + raise ValueError, "invalid %s: %s" % (t[1], s) + elif fpconst.isNegInf(d): + if s != '-inf': + raise UnderflowError, "%s too small: %s" % (t[1], s) + elif fpconst.isPosInf(d): + if s != 'inf': + raise OverflowError, "%s too large: %s" % (t[1], s) + elif d < 0 and d < l[1]: + raise UnderflowError, "%s too small: %s" % (t[1], s) + elif d > 0 and ( d < l[0] or d > l[2] ): + raise OverflowError, "%s too large: %s" % (t[1], s) + elif d == 0: + if type(self.zerofloatre) == StringType: + self.zerofloatre = re.compile(self.zerofloatre) + + if self.zerofloatre.search(s): + raise UnderflowError, "invalid %s: %s" % (t[1], s) + + return d + if t[1] in ("dateTime", "date", "timeInstant", "time"): + return self.convertDateTime(d, t[1]) + if t[1] == "decimal": + return float(d) + if t[1] in ("language", "QName", "NOTATION", "NMTOKEN", "Name", + "NCName", "ID", "IDREF", "ENTITY"): + return collapseWhiteSpace(d) + if t[1] in ("IDREFS", "ENTITIES", "NMTOKENS"): + d = collapseWhiteSpace(d) + return d.split() + if t[0] in NS.XSD_L: + if t[1] in ("base64", "base64Binary"): + if d: + return base64.decodestring(d) + else: + return '' + if t[1] == "hexBinary": + if d: + return decodeHexString(d) + else: + return + if t[1] == "anyURI": + return urllib.unquote(collapseWhiteSpace(d)) + if t[1] in ("normalizedString", "token"): + return collapseWhiteSpace(d) + if t[0] == NS.ENC: + if t[1] == "base64": + if d: + return base64.decodestring(d) + else: + return '' + if t[0] == NS.XSD: + if t[1] == "binary": + try: + e = attrs[(None, 'encoding')] + + if d: + if e == 'hex': + return decodeHexString(d) + elif e == 'base64': + return base64.decodestring(d) + else: + return '' + except: + pass + + raise Error, "unknown or missing binary encoding" + if t[1] == "uri": + return urllib.unquote(collapseWhiteSpace(d)) + if t[1] == "recurringInstant": + return self.convertDateTime(d, t[1]) + if t[0] in (NS.XSD2, NS.ENC): + if t[1] == "uriReference": + return urllib.unquote(collapseWhiteSpace(d)) + if t[1] == "timePeriod": + return self.convertDateTime(d, t[1]) + if t[1] in ("century", "year"): + return self.convertDateTime(d, t[1]) + if t[0] in (NS.XSD, NS.XSD2, NS.ENC): + if t[1] == "timeDuration": + return self.convertDateTime(d, t[1]) + if t[0] == NS.XSD3: + if t[1] == "anyURI": + return urllib.unquote(collapseWhiteSpace(d)) + if t[1] in ("gYearMonth", "gMonthDay"): + return self.convertDateTime(d, t[1]) + if t[1] == "gYear": + return self.convertDateTime(d, t[1]) + if t[1] == "gMonth": + return self.convertDateTime(d, t[1]) + if t[1] == "gDay": + return self.convertDateTime(d, t[1]) + if t[1] == "duration": + return self.convertDateTime(d, t[1]) + if t[0] in (NS.XSD2, NS.XSD3): + if t[1] == "token": + return collapseWhiteSpace(d) + if t[1] == "recurringDate": + return self.convertDateTime(d, t[1]) + if t[1] == "month": + return self.convertDateTime(d, t[1]) + if t[1] == "recurringDay": + return self.convertDateTime(d, t[1]) + if t[0] == NS.XSD2: + if t[1] == "CDATA": + return collapseWhiteSpace(d) + + raise UnknownTypeError, "unknown type `%s'" % (t[0] + ':' + t[1]) + + +################################################################################ +# call to SOAPParser that keeps all of the info +################################################################################ +def _parseSOAP(xml_str, rules = None): + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + parser = xml.sax.make_parser() + t = SOAPParser(rules = rules) + parser.setContentHandler(t) + e = xml.sax.handler.ErrorHandler() + parser.setErrorHandler(e) + + inpsrc = xml.sax.xmlreader.InputSource() + inpsrc.setByteStream(StringIO(xml_str)) + + # turn on namespace mangeling + parser.setFeature(xml.sax.handler.feature_namespaces,1) + + try: + parser.parse(inpsrc) + except xml.sax.SAXParseException, e: + parser._parser = None + raise e + + return t + +################################################################################ +# SOAPParser's more public interface +################################################################################ +def parseSOAP(xml_str, attrs = 0): + t = _parseSOAP(xml_str) + + if attrs: + return t.body, t.attrs + return t.body + + +def parseSOAPRPC(xml_str, header = 0, body = 0, attrs = 0, rules = None): + #config=Config, unwrap_outer=1): + + t = _parseSOAP(xml_str, rules = rules) + p = t.body[0] + + # Empty string, for RPC this translates into a void + if type(p) in (type(''), type(u'')) and p in ('', u''): + name = "Response" + for k in t.body.__dict__.keys(): + if k[0] != "_": + name = k + p = structType(name) + + if header or body or attrs: + ret = (p,) + if header : ret += (t.header,) + if body: ret += (t.body,) + if attrs: ret += (t.attrs,) + return ret + else: + return p diff --git a/SOAPpy/SOAPBuilder.py b/SOAPpy/SOAPBuilder.py new file mode 100644 index 0000000..e375a41 --- /dev/null +++ b/SOAPpy/SOAPBuilder.py @@ -0,0 +1,620 @@ +""" +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +ident = '$Id: SOAPBuilder.py,v 1.19 2004/04/10 04:28:46 irjudson Exp $' +from version import __version__ + +import cgi +import copy +from wstools.XMLname import toXMLname, fromXMLname +import fpconst + +# SOAPpy modules +from Config import Config +from NS import NS +from Types import * + +# Test whether this Python version has Types.BooleanType +# If it doesn't have it, then False and True are serialized as integers +try: + BooleanType + pythonHasBooleanType = 1 +except NameError: + pythonHasBooleanType = 0 + +################################################################################ +# SOAP Builder +################################################################################ +class SOAPBuilder: + _xml_top = '\n' + _xml_enc_top = '\n' + _env_top = '%(ENV_T)s:Envelope %(ENV_T)s:encodingStyle="%(ENC)s"' % \ + NS.__dict__ + _env_bot = '\n' % NS.__dict__ + + # Namespaces potentially defined in the Envelope tag. + + _env_ns = {NS.ENC: NS.ENC_T, NS.ENV: NS.ENV_T, + NS.XSD: NS.XSD_T, NS.XSD2: NS.XSD2_T, NS.XSD3: NS.XSD3_T, + NS.XSI: NS.XSI_T, NS.XSI2: NS.XSI2_T, NS.XSI3: NS.XSI3_T} + + def __init__(self, args = (), kw = {}, method = None, namespace = None, + header = None, methodattrs = None, envelope = 1, encoding = 'UTF-8', + use_refs = 0, config = Config, noroot = 0): + + # Test the encoding, raising an exception if it's not known + if encoding != None: + ''.encode(encoding) + + self.args = args + self.kw = kw + self.envelope = envelope + self.encoding = encoding + self.method = method + self.namespace = namespace + self.header = header + self.methodattrs= methodattrs + self.use_refs = use_refs + self.config = config + self.out = [] + self.tcounter = 0 + self.ncounter = 1 + self.icounter = 1 + self.envns = {} + self.ids = {} + self.depth = 0 + self.multirefs = [] + self.multis = 0 + self.body = not isinstance(args, bodyType) + self.noroot = noroot + + def build(self): + if Config.debug: print "In build." + ns_map = {} + + # Cache whether typing is on or not + typed = self.config.typed + + if self.header: + # Create a header. + self.dump(self.header, "Header", typed = typed) + self.header = None # Wipe it out so no one is using it. + + if self.body: + # Call genns to record that we've used SOAP-ENV. + self.depth += 1 + body_ns = self.genns(ns_map, NS.ENV)[0] + self.out.append("<%sBody>\n" % body_ns) + + if self.method: + self.depth += 1 + a = '' + if self.methodattrs: + for (k, v) in self.methodattrs.items(): + a += ' %s="%s"' % (k, v) + + if self.namespace: # Use the namespace info handed to us + methodns, n = self.genns(ns_map, self.namespace) + else: + methodns, n = '', '' + + self.out.append('<%s%s%s%s%s>\n' % ( + methodns, self.method, n, a, self.genroot(ns_map))) + + try: + if type(self.args) != TupleType: + args = (self.args,) + else: + args = self.args + + for i in args: + self.dump(i, typed = typed, ns_map = ns_map) + + if hasattr(self.config, "argsOrdering") and self.config.argsOrdering.has_key(self.method): + for k in self.config.argsOrdering.get(self.method): + self.dump(self.kw.get(k), k, typed = typed, ns_map = ns_map) + else: + for (k, v) in self.kw.items(): + self.dump(v, k, typed = typed, ns_map = ns_map) + + except RecursionError: + if self.use_refs == 0: + # restart + b = SOAPBuilder(args = self.args, kw = self.kw, + method = self.method, namespace = self.namespace, + header = self.header, methodattrs = self.methodattrs, + envelope = self.envelope, encoding = self.encoding, + use_refs = 1, config = self.config) + return b.build() + raise + + if self.method: + self.out.append("\n" % (methodns, self.method)) + self.depth -= 1 + + if self.body: + # dump may add to self.multirefs, but the for loop will keep + # going until it has used all of self.multirefs, even those + # entries added while in the loop. + + self.multis = 1 + + for obj, tag in self.multirefs: + self.dump(obj, tag, typed = typed, ns_map = ns_map) + + self.out.append("\n" % body_ns) + self.depth -= 1 + + if self.envelope: + e = map (lambda ns: ' xmlns:%s="%s"' % (ns[1], ns[0]), + self.envns.items()) + + self.out = ['<', self._env_top] + e + ['>\n'] + \ + self.out + \ + [self._env_bot] + + if self.encoding != None: + self.out.insert(0, self._xml_enc_top % self.encoding) + return ''.join(self.out).encode(self.encoding) + + self.out.insert(0, self._xml_top) + return ''.join(self.out) + + def gentag(self): + if Config.debug: print "In gentag." + self.tcounter += 1 + return "v%d" % self.tcounter + + def genns(self, ns_map, nsURI): + if nsURI == None: + return ('', '') + + if type(nsURI) == TupleType: # already a tuple + if len(nsURI) == 2: + ns, nsURI = nsURI + else: + ns, nsURI = None, nsURI[0] + else: + ns = None + + if ns_map.has_key(nsURI): + return (ns_map[nsURI] + ':', '') + + if self._env_ns.has_key(nsURI): + ns = self.envns[nsURI] = ns_map[nsURI] = self._env_ns[nsURI] + return (ns + ':', '') + + if not ns: + ns = "ns%d" % self.ncounter + self.ncounter += 1 + ns_map[nsURI] = ns + if self.config.buildWithNamespacePrefix: + return (ns + ':', ' xmlns:%s="%s"' % (ns, nsURI)) + else: + return ('', ' xmlns="%s"' % (nsURI)) + + def genroot(self, ns_map): + if self.noroot: + return '' + + if self.depth != 2: + return '' + + ns, n = self.genns(ns_map, NS.ENC) + return ' %sroot="%d"%s' % (ns, not self.multis, n) + + # checkref checks an element to see if it needs to be encoded as a + # multi-reference element or not. If it returns None, the element has + # been handled and the caller can continue with subsequent elements. + # If it returns a string, the string should be included in the opening + # tag of the marshaled element. + + def checkref(self, obj, tag, ns_map): + if self.depth < 2: + return '' + + if not self.ids.has_key(id(obj)): + n = self.ids[id(obj)] = self.icounter + self.icounter = n + 1 + + if self.use_refs == 0: + return '' + + if self.depth == 2: + return ' id="i%d"' % n + + self.multirefs.append((obj, tag)) + else: + if self.use_refs == 0: + raise RecursionError, "Cannot serialize recursive object" + + n = self.ids[id(obj)] + + if self.multis and self.depth == 2: + return ' id="i%d"' % n + + self.out.append('<%s href="#i%d"%s/>\n' % + (tag, n, self.genroot(ns_map))) + return None + + # dumpers + + def dump(self, obj, tag = None, typed = 1, ns_map = {}): + if Config.debug: print "In dump.", "obj=", obj + ns_map = ns_map.copy() + self.depth += 1 + + if type(tag) not in (NoneType, StringType, UnicodeType): + raise KeyError, "tag must be a string or None" + + try: + meth = getattr(self, "dump_" + type(obj).__name__) + except AttributeError: + if type(obj) == LongType: + obj_type = "integer" + elif pythonHasBooleanType and type(obj) == BooleanType: + obj_type = "boolean" + else: + obj_type = type(obj).__name__ + + self.out.append(self.dumper(None, obj_type, obj, tag, typed, + ns_map, self.genroot(ns_map))) + else: + meth(obj, tag, typed, ns_map) + + + self.depth -= 1 + + # generic dumper + def dumper(self, nsURI, obj_type, obj, tag, typed = 1, ns_map = {}, + rootattr = '', id = '', + xml = '<%(tag)s%(type)s%(id)s%(attrs)s%(root)s>%(data)s\n'): + if Config.debug: print "In dumper." + + if nsURI == None: + nsURI = self.config.typesNamespaceURI + + tag = tag or self.gentag() + + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + a = n = t = '' + if typed and obj_type: + ns, n = self.genns(ns_map, nsURI) + ins = self.genns(ns_map, self.config.schemaNamespaceURI)[0] + t = ' %stype="%s%s"%s' % (ins, ns, obj_type, n) + + try: a = obj._marshalAttrs(ns_map, self) + except: pass + + try: data = obj._marshalData() + except: + if (obj_type != "string"): # strings are already encoded + data = cgi.escape(str(obj)) + else: + data = obj + + + return xml % {"tag": tag, "type": t, "data": data, "root": rootattr, + "id": id, "attrs": a} + + def dump_float(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_float." + tag = tag or self.gentag() + + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + if Config.strict_range: + doubleType(obj) + + if fpconst.isPosInf(obj): + obj = "INF" + elif fpconst.isNegInf(obj): + obj = "-INF" + elif fpconst.isNaN(obj): + obj = "NaN" + else: + obj = str(obj) + + # Note: python 'float' is actually a SOAP 'double'. + self.out.append(self.dumper(None, "double", obj, tag, typed, ns_map, + self.genroot(ns_map))) + + def dump_string(self, obj, tag, typed = 0, ns_map = {}): + if Config.debug: print "In dump_string." + tag = tag or self.gentag() + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + id = self.checkref(obj, tag, ns_map) + if id == None: + return + + try: data = obj._marshalData() + except: data = obj + + self.out.append(self.dumper(None, "string", cgi.escape(data), tag, + typed, ns_map, self.genroot(ns_map), id)) + + dump_str = dump_string # For Python 2.2+ + dump_unicode = dump_string + + def dump_None(self, obj, tag, typed = 0, ns_map = {}): + if Config.debug: print "In dump_None." + tag = tag or self.gentag() + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + ns = self.genns(ns_map, self.config.schemaNamespaceURI)[0] + + self.out.append('<%s %snull="1"%s/>\n' % + (tag, ns, self.genroot(ns_map))) + + dump_NoneType = dump_None # For Python 2.2+ + + def dump_list(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_list.", "obj=", obj + tag = tag or self.gentag() + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + if type(obj) == InstanceType: + data = obj.data + else: + data = obj + + id = self.checkref(obj, tag, ns_map) + if id == None: + return + + try: + sample = data[0] + empty = 0 + except: + # preserve type if present + if getattr(obj,"_typed",None) and getattr(obj,"_type",None): + if getattr(obj, "_complexType", None): + sample = typedArrayType(typed=obj._type, + complexType = obj._complexType) + sample._typename = obj._type + obj._ns = NS.URN + else: + sample = typedArrayType(typed=obj._type) + else: + sample = structType() + empty = 1 + + # First scan list to see if all are the same type + same_type = 1 + + if not empty: + for i in data[1:]: + if type(sample) != type(i) or \ + (type(sample) == InstanceType and \ + sample.__class__ != i.__class__): + same_type = 0 + break + + ndecl = '' + if same_type: + if (isinstance(sample, structType)) or \ + type(sample) == DictType or \ + (isinstance(sample, anyType) and \ + (getattr(sample, "_complexType", None) and \ + sample._complexType)): # force to urn struct + try: + tns = obj._ns or NS.URN + except: + tns = NS.URN + + ns, ndecl = self.genns(ns_map, tns) + + try: + typename = sample._typename + except: + typename = "SOAPStruct" + + t = ns + typename + + elif isinstance(sample, anyType): + ns = sample._validNamespaceURI(self.config.typesNamespaceURI, + self.config.strictNamespaces) + if ns: + ns, ndecl = self.genns(ns_map, ns) + t = ns + sample._type + else: + t = 'ur-type' + else: + typename = type(sample).__name__ + + # For Python 2.2+ + if type(sample) == StringType: typename = 'string' + + # HACK: python 'float' is actually a SOAP 'double'. + if typename=="float": typename="double" + t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ + typename + + else: + t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ + "ur-type" + + try: a = obj._marshalAttrs(ns_map, self) + except: a = '' + + ens, edecl = self.genns(ns_map, NS.ENC) + ins, idecl = self.genns(ns_map, self.config.schemaNamespaceURI) + + self.out.append( + '<%s %sarrayType="%s[%d]" %stype="%sArray"%s%s%s%s%s%s>\n' % + (tag, ens, t, len(data), ins, ens, ndecl, edecl, idecl, + self.genroot(ns_map), id, a)) + + typed = not same_type + + try: elemsname = obj._elemsname + except: elemsname = "item" + + for i in data: + self.dump(i, elemsname, typed, ns_map) + + self.out.append('\n' % tag) + + dump_tuple = dump_list + + def dump_dictionary(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_dictionary." + tag = tag or self.gentag() + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + id = self.checkref(obj, tag, ns_map) + if id == None: + return + + try: a = obj._marshalAttrs(ns_map, self) + except: a = '' + + self.out.append('<%s%s%s%s>\n' % + (tag, id, a, self.genroot(ns_map))) + + for (k, v) in obj.items(): + if k[0] != "_": + self.dump(v, k, 1, ns_map) + + self.out.append('\n' % tag) + + dump_dict = dump_dictionary # For Python 2.2+ + + def dump_instance(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_instance.", "obj=", obj, "tag=", tag + if not tag: + # If it has a name use it. + if isinstance(obj, anyType) and obj._name: + tag = obj._name + else: + tag = self.gentag() + tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding + + if isinstance(obj, arrayType): # Array + self.dump_list(obj, tag, typed, ns_map) + return + + if isinstance(obj, faultType): # Fault + cns, cdecl = self.genns(ns_map, NS.ENC) + vns, vdecl = self.genns(ns_map, NS.ENV) + self.out.append('''<%sFault %sroot="1"%s%s> +%s +%s +''' % (vns, cns, vdecl, cdecl, obj.faultcode, obj.faultstring)) + if hasattr(obj, "detail"): + self.dump(obj.detail, "detail", typed, ns_map) + self.out.append("\n" % vns) + return + + r = self.genroot(ns_map) + + try: a = obj._marshalAttrs(ns_map, self) + except: a = '' + + if isinstance(obj, voidType): # void + self.out.append("<%s%s%s>\n" % (tag, a, r, tag)) + return + + id = self.checkref(obj, tag, ns_map) + if id == None: + return + + if isinstance(obj, structType): + # Check for namespace + ndecl = '' + ns = obj._validNamespaceURI(self.config.typesNamespaceURI, + self.config.strictNamespaces) + if ns: + ns, ndecl = self.genns(ns_map, ns) + tag = ns + tag + self.out.append("<%s%s%s%s%s>\n" % (tag, ndecl, id, a, r)) + + keylist = obj.__dict__.keys() + + # first write out items with order information + if hasattr(obj, '_keyord'): + for i in range(len(obj._keyord)): + self.dump(obj._aslist(i), obj._keyord[i], 1, ns_map) + keylist.remove(obj._keyord[i]) + + # now write out the rest + for k in keylist: + if (k[0] != "_"): + self.dump(getattr(obj,k), k, 1, ns_map) + + if isinstance(obj, bodyType): + self.multis = 1 + + for v, k in self.multirefs: + self.dump(v, k, typed = typed, ns_map = ns_map) + + self.out.append('\n' % tag) + + elif isinstance(obj, anyType): + t = '' + + if typed: + ns = obj._validNamespaceURI(self.config.typesNamespaceURI, + self.config.strictNamespaces) + if ns: + ons, ondecl = self.genns(ns_map, ns) + ins, indecl = self.genns(ns_map, + self.config.schemaNamespaceURI) + t = ' %stype="%s%s"%s%s' % \ + (ins, ons, obj._type, ondecl, indecl) + + self.out.append('<%s%s%s%s%s>%s\n' % + (tag, t, id, a, r, obj._marshalData(), tag)) + + else: # Some Class + self.out.append('<%s%s%s>\n' % (tag, id, r)) + + for (k, v) in obj.__dict__.items(): + if k[0] != "_": + self.dump(v, k, 1, ns_map) + + self.out.append('\n' % tag) + + +################################################################################ +# SOAPBuilder's more public interface +################################################################################ +def buildSOAP(args=(), kw={}, method=None, namespace=None, header=None, + methodattrs=None,envelope=1,encoding='UTF-8',config=Config,noroot = 0): + t = SOAPBuilder(args=args,kw=kw, method=method, namespace=namespace, + header=header, methodattrs=methodattrs,envelope=envelope, + encoding=encoding, config=config,noroot=noroot) + return t.build() diff --git a/SOAPpy/Types.py b/SOAPpy/Types.py new file mode 100644 index 0000000..b4d9a57 --- /dev/null +++ b/SOAPpy/Types.py @@ -0,0 +1,1734 @@ +""" +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +ident = '$Id: Types.py,v 1.17 2004/09/11 03:03:33 warnes Exp $' +from version import __version__ + +from __future__ import nested_scopes + +import UserList +import base64 +import cgi +import urllib +import copy +import re +import time +from types import * + +# SOAPpy modules +from Errors import * +from NS import NS +from Utilities import encodeHexString, cleanDate +from Config import Config + +############################################################################### +# Utility functions +############################################################################### + +def isPrivate(name): return name[0]=='_' +def isPublic(name): return name[0]!='_' + +############################################################################### +# Types and Wrappers +############################################################################### + +class anyType: + _validURIs = (NS.XSD, NS.XSD2, NS.XSD3, NS.ENC) + + def __init__(self, data = None, name = None, typed = 1, attrs = None): + if self.__class__ == anyType: + raise Error, "anyType can't be instantiated directly" + + if type(name) in (ListType, TupleType): + self._ns, self._name = name + else: + self._ns = self._validURIs[0] + self._name = name + + self._typed = typed + self._attrs = {} + + self._cache = None + self._type = self._typeName() + + self._data = self._checkValueSpace(data) + + if attrs != None: + self._setAttrs(attrs) + + def __str__(self): + if hasattr(self,'_name') and self._name: + return "<%s %s at %d>" % (self.__class__, self._name, id(self)) + return "<%s at %d>" % (self.__class__, id(self)) + + __repr__ = __str__ + + def _checkValueSpace(self, data): + return data + + def _marshalData(self): + return str(self._data) + + def _marshalAttrs(self, ns_map, builder): + a = '' + + for attr, value in self._attrs.items(): + ns, n = builder.genns(ns_map, attr[0]) + a += n + ' %s%s="%s"' % \ + (ns, attr[1], cgi.escape(str(value), 1)) + + return a + + def _fixAttr(self, attr): + if type(attr) in (StringType, UnicodeType): + attr = (None, attr) + elif type(attr) == ListType: + attr = tuple(attr) + elif type(attr) != TupleType: + raise AttributeError, "invalid attribute type" + + if len(attr) != 2: + raise AttributeError, "invalid attribute length" + + if type(attr[0]) not in (NoneType, StringType, UnicodeType): + raise AttributeError, "invalid attribute namespace URI type" + + return attr + + def _getAttr(self, attr): + attr = self._fixAttr(attr) + + try: + return self._attrs[attr] + except: + return None + + def _setAttr(self, attr, value): + attr = self._fixAttr(attr) + + if type(value) is StringType: + value = unicode(value) + + self._attrs[attr] = value + + + def _setAttrs(self, attrs): + if type(attrs) in (ListType, TupleType): + for i in range(0, len(attrs), 2): + self._setAttr(attrs[i], attrs[i + 1]) + + return + + if type(attrs) == DictType: + d = attrs + elif isinstance(attrs, anyType): + d = attrs._attrs + else: + raise AttributeError, "invalid attribute type" + + for attr, value in d.items(): + self._setAttr(attr, value) + + def _setMustUnderstand(self, val): + self._setAttr((NS.ENV, "mustUnderstand"), val) + + def _getMustUnderstand(self): + return self._getAttr((NS.ENV, "mustUnderstand")) + + def _setActor(self, val): + self._setAttr((NS.ENV, "actor"), val) + + def _getActor(self): + return self._getAttr((NS.ENV, "actor")) + + def _typeName(self): + return self.__class__.__name__[:-4] + + def _validNamespaceURI(self, URI, strict): + if not hasattr(self, '_typed') or not self._typed: + return None + if URI in self._validURIs: + return URI + if not strict: + return self._ns + raise AttributeError, \ + "not a valid namespace for type %s" % self._type + +class voidType(anyType): + pass + +class stringType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type:" % self._type + + return data + +class untypedType(stringType): + def __init__(self, data = None, name = None, attrs = None): + stringType.__init__(self, data, name, 0, attrs) + +class IDType(stringType): pass +class NCNameType(stringType): pass +class NameType(stringType): pass +class ENTITYType(stringType): pass +class IDREFType(stringType): pass +class languageType(stringType): pass +class NMTOKENType(stringType): pass +class QNameType(stringType): pass + +class tokenType(anyType): + _validURIs = (NS.XSD2, NS.XSD3) + __invalidre = '[\n\t]|^ | $| ' + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + if type(self.__invalidre) == StringType: + self.__invalidre = re.compile(self.__invalidre) + + if self.__invalidre.search(data): + raise ValueError, "invalid %s value" % self._type + + return data + +class normalizedStringType(anyType): + _validURIs = (NS.XSD3,) + __invalidre = '[\n\r\t]' + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + if type(self.__invalidre) == StringType: + self.__invalidre = re.compile(self.__invalidre) + + if self.__invalidre.search(data): + raise ValueError, "invalid %s value" % self._type + + return data + +class CDATAType(normalizedStringType): + _validURIs = (NS.XSD2,) + +class booleanType(anyType): + def __int__(self): + return self._data + + __nonzero__ = __int__ + + def _marshalData(self): + return ['false', 'true'][self._data] + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if data in (0, '0', 'false', ''): + return 0 + if data in (1, '1', 'true'): + return 1 + raise ValueError, "invalid %s value" % self._type + +class decimalType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType, FloatType): + raise Error, "invalid %s value" % self._type + + return data + +class floatType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType, FloatType) or \ + data < -3.4028234663852886E+38 or \ + data > 3.4028234663852886E+38: + raise ValueError, "invalid %s value: %s" % (self._type, repr(data)) + + return data + + def _marshalData(self): + return "%.18g" % self._data # More precision + +class doubleType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType, FloatType) or \ + data < -1.7976931348623158E+308 or \ + data > 1.7976931348623157E+308: + raise ValueError, "invalid %s value: %s" % (self._type, repr(data)) + + return data + + def _marshalData(self): + return "%.18g" % self._data # More precision + +class durationType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + try: + # A tuple or a scalar is OK, but make them into a list + + if type(data) == TupleType: + data = list(data) + elif type(data) != ListType: + data = [data] + + if len(data) > 6: + raise Exception, "too many values" + + # Now check the types of all the components, and find + # the first nonzero element along the way. + + f = -1 + + for i in range(len(data)): + if data[i] == None: + data[i] = 0 + continue + + if type(data[i]) not in \ + (IntType, LongType, FloatType): + raise Exception, "element %d a bad type" % i + + if data[i] and f == -1: + f = i + + # If they're all 0, just use zero seconds. + + if f == -1: + self._cache = 'PT0S' + + return (0,) * 6 + + # Make sure only the last nonzero element has a decimal fraction + # and only the first element is negative. + + d = -1 + + for i in range(f, len(data)): + if data[i]: + if d != -1: + raise Exception, \ + "all except the last nonzero element must be " \ + "integers" + if data[i] < 0 and i > f: + raise Exception, \ + "only the first nonzero element can be negative" + elif data[i] != long(data[i]): + d = i + + # Pad the list on the left if necessary. + + if len(data) < 6: + n = 6 - len(data) + f += n + d += n + data = [0] * n + data + + # Save index of the first nonzero element and the decimal + # element for _marshalData. + + self.__firstnonzero = f + self.__decimal = d + + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + t = 0 + + if d[self.__firstnonzero] < 0: + s = '-P' + else: + s = 'P' + + t = 0 + + for i in range(self.__firstnonzero, len(d)): + if d[i]: + if i > 2 and not t: + s += 'T' + t = 1 + if self.__decimal == i: + s += "%g" % abs(d[i]) + else: + s += "%d" % long(abs(d[i])) + s += ['Y', 'M', 'D', 'H', 'M', 'S'][i] + + self._cache = s + + return self._cache + +class timeDurationType(durationType): + _validURIs = (NS.XSD, NS.XSD2, NS.ENC) + +class dateTimeType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.time() + + if (type(data) in (IntType, LongType)): + data = list(time.gmtime(data)[:6]) + elif (type(data) == FloatType): + f = data - int(data) + data = list(time.gmtime(int(data))[:6]) + data[5] += f + elif type(data) in (ListType, TupleType): + if len(data) < 6: + raise Exception, "not enough values" + if len(data) > 9: + raise Exception, "too many values" + + data = list(data[:6]) + + cleanDate(data) + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + s = "%04d-%02d-%02dT%02d:%02d:%02d" % ((abs(d[0]),) + d[1:]) + if d[0] < 0: + s = '-' + s + f = d[5] - int(d[5]) + if f != 0: + s += ("%g" % f)[1:] + s += 'Z' + + self._cache = s + + return self._cache + +class recurringInstantType(anyType): + _validURIs = (NS.XSD,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = list(time.gmtime(time.time())[:6]) + if (type(data) in (IntType, LongType)): + data = list(time.gmtime(data)[:6]) + elif (type(data) == FloatType): + f = data - int(data) + data = list(time.gmtime(int(data))[:6]) + data[5] += f + elif type(data) in (ListType, TupleType): + if len(data) < 1: + raise Exception, "not enough values" + if len(data) > 9: + raise Exception, "too many values" + + data = list(data[:6]) + + if len(data) < 6: + data += [0] * (6 - len(data)) + + f = len(data) + + for i in range(f): + if data[i] == None: + if f < i: + raise Exception, \ + "only leftmost elements can be none" + else: + f = i + break + + cleanDate(data, f) + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + e = list(d) + neg = '' + + if not e[0]: + e[0] = '--' + else: + if e[0] < 0: + neg = '-' + e[0] = abs(e[0]) + if e[0] < 100: + e[0] = '-' + "%02d" % e[0] + else: + e[0] = "%04d" % e[0] + + for i in range(1, len(e)): + if e[i] == None or (i < 3 and e[i] == 0): + e[i] = '-' + else: + if e[i] < 0: + neg = '-' + e[i] = abs(e[i]) + + e[i] = "%02d" % e[i] + + if d[5]: + f = abs(d[5] - int(d[5])) + + if f: + e[5] += ("%g" % f)[1:] + + s = "%s%s-%s-%sT%s:%s:%sZ" % ((neg,) + tuple(e)) + + self._cache = s + + return self._cache + +class timeInstantType(dateTimeType): + _validURIs = (NS.XSD, NS.XSD2, NS.ENC) + +class timePeriodType(dateTimeType): + _validURIs = (NS.XSD2, NS.ENC) + +class timeType(anyType): + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[3:6] + elif (type(data) == FloatType): + f = data - int(data) + data = list(time.gmtime(int(data))[3:6]) + data[2] += f + elif type(data) in (IntType, LongType): + data = time.gmtime(data)[3:6] + elif type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[3:6] + elif len(data) > 3: + raise Exception, "too many values" + + data = [None, None, None] + list(data) + + if len(data) < 6: + data += [0] * (6 - len(data)) + + cleanDate(data, 3) + + data = data[3:] + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + s = '' + + s = time.strftime("%H:%M:%S", (0, 0, 0) + d + (0, 0, -1)) + f = d[2] - int(d[2]) + if f != 0: + s += ("%g" % f)[1:] + s += 'Z' + + self._cache = s + + return self._cache + +class dateType(anyType): + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[0:3] + elif type(data) in (IntType, LongType, FloatType): + data = time.gmtime(data)[0:3] + elif type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[0:3] + elif len(data) > 3: + raise Exception, "too many values" + + data = list(data) + + if len(data) < 3: + data += [1, 1, 1][len(data):] + + data += [0, 0, 0] + + cleanDate(data) + + data = data[:3] + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + s = "%04d-%02d-%02dZ" % ((abs(d[0]),) + d[1:]) + if d[0] < 0: + s = '-' + s + + self._cache = s + + return self._cache + +class gYearMonthType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[0:2] + elif type(data) in (IntType, LongType, FloatType): + data = time.gmtime(data)[0:2] + elif type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[0:2] + elif len(data) > 2: + raise Exception, "too many values" + + data = list(data) + + if len(data) < 2: + data += [1, 1][len(data):] + + data += [1, 0, 0, 0] + + cleanDate(data) + + data = data[:2] + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + d = self._data + s = "%04d-%02dZ" % ((abs(d[0]),) + d[1:]) + if d[0] < 0: + s = '-' + s + + self._cache = s + + return self._cache + +class gYearType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[0:1] + elif type(data) in (IntType, LongType, FloatType): + data = [data] + + if type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[0:1] + elif len(data) < 1: + raise Exception, "too few values" + elif len(data) > 1: + raise Exception, "too many values" + + if type(data[0]) == FloatType: + try: s = int(data[0]) + except: s = long(data[0]) + + if s != data[0]: + raise Exception, "not integral" + + data = [s] + elif type(data[0]) not in (IntType, LongType): + raise Exception, "bad type" + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return data[0] + + def _marshalData(self): + if self._cache == None: + d = self._data + s = "%04dZ" % abs(d) + if d < 0: + s = '-' + s + + self._cache = s + + return self._cache + +class centuryType(anyType): + _validURIs = (NS.XSD2, NS.ENC) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[0:1] / 100 + elif type(data) in (IntType, LongType, FloatType): + data = [data] + + if type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[0:1] / 100 + elif len(data) < 1: + raise Exception, "too few values" + elif len(data) > 1: + raise Exception, "too many values" + + if type(data[0]) == FloatType: + try: s = int(data[0]) + except: s = long(data[0]) + + if s != data[0]: + raise Exception, "not integral" + + data = [s] + elif type(data[0]) not in (IntType, LongType): + raise Exception, "bad type" + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return data[0] + + def _marshalData(self): + if self._cache == None: + d = self._data + s = "%02dZ" % abs(d) + if d < 0: + s = '-' + s + + self._cache = s + + return self._cache + +class yearType(gYearType): + _validURIs = (NS.XSD2, NS.ENC) + +class gMonthDayType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[1:3] + elif type(data) in (IntType, LongType, FloatType): + data = time.gmtime(data)[1:3] + elif type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[0:2] + elif len(data) > 2: + raise Exception, "too many values" + + data = list(data) + + if len(data) < 2: + data += [1, 1][len(data):] + + data = [0] + data + [0, 0, 0] + + cleanDate(data, 1) + + data = data[1:3] + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return tuple(data) + + def _marshalData(self): + if self._cache == None: + self._cache = "--%02d-%02dZ" % self._data + + return self._cache + +class recurringDateType(gMonthDayType): + _validURIs = (NS.XSD2, NS.ENC) + +class gMonthType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[1:2] + elif type(data) in (IntType, LongType, FloatType): + data = [data] + + if type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[1:2] + elif len(data) < 1: + raise Exception, "too few values" + elif len(data) > 1: + raise Exception, "too many values" + + if type(data[0]) == FloatType: + try: s = int(data[0]) + except: s = long(data[0]) + + if s != data[0]: + raise Exception, "not integral" + + data = [s] + elif type(data[0]) not in (IntType, LongType): + raise Exception, "bad type" + + if data[0] < 1 or data[0] > 12: + raise Exception, "bad value" + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return data[0] + + def _marshalData(self): + if self._cache == None: + self._cache = "--%02d--Z" % self._data + + return self._cache + +class monthType(gMonthType): + _validURIs = (NS.XSD2, NS.ENC) + +class gDayType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + try: + if data == None: + data = time.gmtime(time.time())[2:3] + elif type(data) in (IntType, LongType, FloatType): + data = [data] + + if type(data) in (ListType, TupleType): + if len(data) == 9: + data = data[2:3] + elif len(data) < 1: + raise Exception, "too few values" + elif len(data) > 1: + raise Exception, "too many values" + + if type(data[0]) == FloatType: + try: s = int(data[0]) + except: s = long(data[0]) + + if s != data[0]: + raise Exception, "not integral" + + data = [s] + elif type(data[0]) not in (IntType, LongType): + raise Exception, "bad type" + + if data[0] < 1 or data[0] > 31: + raise Exception, "bad value" + else: + raise Exception, "invalid type" + except Exception, e: + raise ValueError, "invalid %s value - %s" % (self._type, e) + + return data[0] + + def _marshalData(self): + if self._cache == None: + self._cache = "---%02dZ" % self._data + + return self._cache + +class recurringDayType(gDayType): + _validURIs = (NS.XSD2, NS.ENC) + +class hexBinaryType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + return data + + def _marshalData(self): + if self._cache == None: + self._cache = encodeHexString(self._data) + + return self._cache + +class base64BinaryType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + return data + + def _marshalData(self): + if self._cache == None: + self._cache = base64.encodestring(self._data) + + return self._cache + +class base64Type(base64BinaryType): + _validURIs = (NS.ENC,) + +class binaryType(anyType): + _validURIs = (NS.XSD, NS.ENC) + + def __init__(self, data, name = None, typed = 1, encoding = 'base64', + attrs = None): + + anyType.__init__(self, data, name, typed, attrs) + + self._setAttr('encoding', encoding) + + def _marshalData(self): + if self._cache == None: + if self._getAttr((None, 'encoding')) == 'base64': + self._cache = base64.encodestring(self._data) + else: + self._cache = encodeHexString(self._data) + + return self._cache + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + return data + + def _setAttr(self, attr, value): + attr = self._fixAttr(attr) + + if attr[1] == 'encoding': + if attr[0] != None or value not in ('base64', 'hex'): + raise AttributeError, "invalid encoding" + + self._cache = None + + anyType._setAttr(self, attr, value) + + +class anyURIType(anyType): + _validURIs = (NS.XSD3,) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (StringType, UnicodeType): + raise AttributeError, "invalid %s type" % self._type + + return data + + def _marshalData(self): + if self._cache == None: + self._cache = urllib.quote(self._data) + + return self._cache + +class uriType(anyURIType): + _validURIs = (NS.XSD,) + +class uriReferenceType(anyURIType): + _validURIs = (NS.XSD2,) + +class NOTATIONType(anyType): + def __init__(self, data, name = None, typed = 1, attrs = None): + + if self.__class__ == NOTATIONType: + raise Error, "a NOTATION can't be instantiated directly" + + anyType.__init__(self, data, name, typed, attrs) + +class ENTITIESType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) in (StringType, UnicodeType): + return (data,) + + if type(data) not in (ListType, TupleType) or \ + filter (lambda x: type(x) not in (StringType, UnicodeType), data): + raise AttributeError, "invalid %s type" % self._type + + return data + + def _marshalData(self): + return ' '.join(self._data) + +class IDREFSType(ENTITIESType): pass +class NMTOKENSType(ENTITIESType): pass + +class integerType(anyType): + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType): + raise ValueError, "invalid %s value" % self._type + + return data + +class nonPositiveIntegerType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or data > 0: + raise ValueError, "invalid %s value" % self._type + + return data + +class non_Positive_IntegerType(nonPositiveIntegerType): + _validURIs = (NS.XSD,) + + def _typeName(self): + return 'non-positive-integer' + +class negativeIntegerType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or data >= 0: + raise ValueError, "invalid %s value" % self._type + + return data + +class negative_IntegerType(negativeIntegerType): + _validURIs = (NS.XSD,) + + def _typeName(self): + return 'negative-integer' + +class longType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < -9223372036854775808L or \ + data > 9223372036854775807L: + raise ValueError, "invalid %s value" % self._type + + return data + +class intType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < -2147483648L or \ + data > 2147483647: + raise ValueError, "invalid %s value" % self._type + + return data + +class shortType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < -32768 or \ + data > 32767: + raise ValueError, "invalid %s value" % self._type + + return data + +class byteType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < -128 or \ + data > 127: + raise ValueError, "invalid %s value" % self._type + + return data + +class nonNegativeIntegerType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or data < 0: + raise ValueError, "invalid %s value" % self._type + + return data + +class non_Negative_IntegerType(nonNegativeIntegerType): + _validURIs = (NS.XSD,) + + def _typeName(self): + return 'non-negative-integer' + +class unsignedLongType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < 0 or \ + data > 18446744073709551615L: + raise ValueError, "invalid %s value" % self._type + + return data + +class unsignedIntType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < 0 or \ + data > 4294967295L: + raise ValueError, "invalid %s value" % self._type + + return data + +class unsignedShortType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < 0 or \ + data > 65535: + raise ValueError, "invalid %s value" % self._type + + return data + +class unsignedByteType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or \ + data < 0 or \ + data > 255: + raise ValueError, "invalid %s value" % self._type + + return data + +class positiveIntegerType(anyType): + _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) + + def _checkValueSpace(self, data): + if data == None: + raise ValueError, "must supply initial %s value" % self._type + + if type(data) not in (IntType, LongType) or data <= 0: + raise ValueError, "invalid %s value" % self._type + + return data + +class positive_IntegerType(positiveIntegerType): + _validURIs = (NS.XSD,) + + def _typeName(self): + return 'positive-integer' + +# Now compound types + +class compoundType(anyType): + def __init__(self, data = None, name = None, typed = 1, attrs = None): + if self.__class__ == compoundType: + raise Error, "a compound can't be instantiated directly" + + anyType.__init__(self, data, name, typed, attrs) + self._keyord = [] + + if type(data) == DictType: + self.__dict__.update(data) + + def _aslist(self, item=None): + if item: + return self.__dict__[self._keyord[item]] + else: + return map( lambda x: self.__dict__[x], self._keyord) + + def _asdict(self, item=None, encoding=Config.dict_encoding): + if item: + if type(item) in (UnicodeType,StringType): + item = item.encode(encoding) + return self.__dict__[item] + else: + retval = {} + def fun(x): retval[x.encode(encoding)] = self.__dict__[x] + + if hasattr(self, '_keyord'): + map( fun, self._keyord) + else: + for name in dir(self): + if isPublic(name): + retval[name] = getattr(self,name) + return retval + + + def __getitem__(self, item): + if type(item) == IntType: + return self.__dict__[self._keyord[item]] + else: + return getattr(self, item) + + def __len__(self): + return len(self._keyord) + + def __nonzero__(self): + return 1 + + def _keys(self): + return filter(lambda x: x[0] != '_', self.__dict__.keys()) + + def _addItem(self, name, value, attrs = None): + + if name in self._keyord: + if type(self.__dict__[name]) != ListType: + self.__dict__[name] = [self.__dict__[name]] + self.__dict__[name].append(value) + else: + self.__dict__[name] = value + self._keyord.append(name) + + def _placeItem(self, name, value, pos, subpos = 0, attrs = None): + + if subpos == 0 and type(self.__dict__[name]) != ListType: + self.__dict__[name] = value + else: + self.__dict__[name][subpos] = value + + self._keyord[pos] = name + + + def _getItemAsList(self, name, default = []): + try: + d = self.__dict__[name] + except: + return default + + if type(d) == ListType: + return d + return [d] + + def __str__(self): + return anyType.__str__(self) + ": " + str(self._asdict()) + + def __repr__(self): + return self.__str__() + +class structType(compoundType): + pass + +class headerType(structType): + _validURIs = (NS.ENV,) + + def __init__(self, data = None, typed = 1, attrs = None): + structType.__init__(self, data, "Header", typed, attrs) + +class bodyType(structType): + _validURIs = (NS.ENV,) + + def __init__(self, data = None, typed = 1, attrs = None): + structType.__init__(self, data, "Body", typed, attrs) + +class arrayType(UserList.UserList, compoundType): + def __init__(self, data = None, name = None, attrs = None, + offset = 0, rank = None, asize = 0, elemsname = None): + + if data: + if type(data) not in (ListType, TupleType): + raise Error, "Data must be a sequence" + + UserList.UserList.__init__(self, data) + compoundType.__init__(self, data, name, 0, attrs) + + self._elemsname = elemsname or "item" + + if data == None: + self._rank = rank + + # According to 5.4.2.2 in the SOAP spec, each element in a + # sparse array must have a position. _posstate keeps track of + # whether we've seen a position or not. It's possible values + # are: + # -1 No elements have been added, so the state is indeterminate + # 0 An element without a position has been added, so no + # elements can have positions + # 1 An element with a position has been added, so all elements + # must have positions + + self._posstate = -1 + + self._full = 0 + + if asize in ('', None): + asize = '0' + + self._dims = map (lambda x: int(x), str(asize).split(',')) + self._dims.reverse() # It's easier to work with this way + self._poss = [0] * len(self._dims) # This will end up + # reversed too + + for i in range(len(self._dims)): + if self._dims[i] < 0 or \ + self._dims[i] == 0 and len(self._dims) > 1: + raise TypeError, "invalid Array dimensions" + + if offset > 0: + self._poss[i] = offset % self._dims[i] + offset = int(offset / self._dims[i]) + + # Don't break out of the loop if offset is 0 so we test all the + # dimensions for > 0. + if offset: + raise AttributeError, "invalid Array offset" + + a = [None] * self._dims[0] + + for i in range(1, len(self._dims)): + b = [] + + for j in range(self._dims[i]): + b.append(copy.deepcopy(a)) + + a = b + + self.data = a + + + def _aslist(self, item=None): + if item: + return self.data[int(item)] + else: + return self.data + + def _asdict(self, item=None, encoding=Config.dict_encoding): + if item: + if type(item) in (UnicodeType,StringType): + item = item.encode(encoding) + return self.data[int(item)] + else: + retval = {} + def fun(x): retval[str(x).encode(encoding)] = self.data[x] + + map( fun, range(len(self.data)) ) + return retval + + def __getitem__(self, item): + try: + return self.data[int(item)] + except ValueError: + return getattr(self, item) + + def __len__(self): + return len(self.data) + + def __nonzero__(self): + return 1 + + def __str__(self): + return anyType.__str__(self) + ": " + str(self._aslist()) + + def _keys(self): + return filter(lambda x: x[0] != '_', self.__dict__.keys()) + + def _addItem(self, name, value, attrs): + if self._full: + raise ValueError, "Array is full" + + pos = attrs.get((NS.ENC, 'position')) + + if pos != None: + if self._posstate == 0: + raise AttributeError, \ + "all elements in a sparse Array must have a " \ + "position attribute" + + self._posstate = 1 + + try: + if pos[0] == '[' and pos[-1] == ']': + pos = map (lambda x: int(x), pos[1:-1].split(',')) + pos.reverse() + + if len(pos) == 1: + pos = pos[0] + + curpos = [0] * len(self._dims) + + for i in range(len(self._dims)): + curpos[i] = pos % self._dims[i] + pos = int(pos / self._dims[i]) + + if pos == 0: + break + + if pos: + raise Exception + elif len(pos) != len(self._dims): + raise Exception + else: + for i in range(len(self._dims)): + if pos[i] >= self._dims[i]: + raise Exception + + curpos = pos + else: + raise Exception + except: + raise AttributeError, \ + "invalid Array element position %s" % str(pos) + else: + if self._posstate == 1: + raise AttributeError, \ + "only elements in a sparse Array may have a " \ + "position attribute" + + self._posstate = 0 + + curpos = self._poss + + a = self.data + + for i in range(len(self._dims) - 1, 0, -1): + a = a[curpos[i]] + + if curpos[0] >= len(a): + a += [None] * (len(a) - curpos[0] + 1) + + a[curpos[0]] = value + + if pos == None: + self._poss[0] += 1 + + for i in range(len(self._dims) - 1): + if self._poss[i] < self._dims[i]: + break + + self._poss[i] = 0 + self._poss[i + 1] += 1 + + if self._dims[-1] and self._poss[-1] >= self._dims[-1]: + self._full = 1 + + def _placeItem(self, name, value, pos, subpos, attrs = None): + curpos = [0] * len(self._dims) + + for i in range(len(self._dims)): + if self._dims[i] == 0: + curpos[0] = pos + break + + curpos[i] = pos % self._dims[i] + pos = int(pos / self._dims[i]) + + if pos == 0: + break + + if self._dims[i] != 0 and pos: + raise Error, "array index out of range" + + a = self.data + + for i in range(len(self._dims) - 1, 0, -1): + a = a[curpos[i]] + + if curpos[0] >= len(a): + a += [None] * (len(a) - curpos[0] + 1) + + a[curpos[0]] = value + +class typedArrayType(arrayType): + def __init__(self, data = None, name = None, typed = None, attrs = None, + offset = 0, rank = None, asize = 0, elemsname = None, complexType = 0): + + arrayType.__init__(self, data, name, attrs, offset, rank, asize, + elemsname) + + self._typed = 1 + self._type = typed + self._complexType = complexType + +class faultType(structType, Error): + def __init__(self, faultcode = "", faultstring = "", detail = None): + self.faultcode = faultcode + self.faultstring = faultstring + if detail != None: + self.detail = detail + + structType.__init__(self, None, 0) + + def _setDetail(self, detail = None): + if detail != None: + self.detail = detail + else: + try: del self.detail + except AttributeError: pass + + def __repr__(self): + if getattr(self, 'detail', None) != None: + return "" % (self.faultcode, + self.faultstring, + self.detail) + else: + return "" % (self.faultcode, self.faultstring) + + __str__ = __repr__ + + def __call__(self): + return (self.faultcode, self.faultstring, self.detail) + +class SOAPException(Exception): + def __init__(self, code="", string="", detail=None): + self.value = ("SOAPpy SOAP Exception", code, string, detail) + self.code = code + self.string = string + self.detail = detail + + def __str__(self): + return repr(self.value) + +class RequiredHeaderMismatch(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + +class MethodNotFound(Exception): + def __init__(self, value): + (val, detail) = value.split(":") + self.value = val + self.detail = detail + + def __str__(self): + return repr(self.value, self.detail) + +class AuthorizationFailed(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + +class MethodFailed(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + +####### +# Convert complex SOAPpy objects to native python equivalents +####### + +def simplify(object, level=0): + """ + Convert the SOAPpy objects and thier contents to simple python types. + + This function recursively converts the passed 'container' object, + and all public subobjects. (Private subobjects have names that + start with '_'.) + + Conversions: + - faultType --> raise python exception + - arrayType --> array + - compoundType --> dictionary + """ + + if level > 10: + return object + + if isinstance( object, faultType ): + if object.faultstring == "Required Header Misunderstood": + raise RequiredHeaderMismatch(object.detail) + elif object.faultstring == "Method Not Found": + raise MethodNotFound(object.detail) + elif object.faultstring == "Authorization Failed": + raise AuthorizationFailed(object.detail) + elif object.faultstring == "Method Failed": + raise MethodFailed(object.detail) + else: + se = SOAPException(object.faultcode, object.faultstring, + object.detail) + raise se + elif isinstance( object, arrayType ): + data = object._aslist() + for k in range(len(data)): + data[k] = simplify(data[k], level=level+1) + return data + elif isinstance( object, compoundType ) or isinstance(object, structType): + data = object._asdict() + for k in data.keys(): + if isPublic(k): + data[k] = simplify(data[k], level=level+1) + return data + elif type(object)==DictType: + for k in object.keys(): + if isPublic(k): + object[k] = simplify(object[k]) + return object + elif type(object)==list: + for k in range(len(object)): + object[k] = simplify(object[k]) + return object + else: + return object + + +def simplify_contents(object, level=0): + """ + Convert the contents of SOAPpy objects to simple python types. + + This function recursively converts the sub-objects contained in a + 'container' object to simple python types. + + Conversions: + - faultType --> raise python exception + - arrayType --> array + - compoundType --> dictionary + """ + + if level>10: return object + + if isinstance( object, faultType ): + for k in object._keys(): + if isPublic(k): + setattr(object, k, simplify(object[k], level=level+1)) + raise object + elif isinstance( object, arrayType ): + data = object._aslist() + for k in range(len(data)): + object[k] = simplify(data[k], level=level+1) + elif isinstance(object, structType): + data = object._asdict() + for k in data.keys(): + if isPublic(k): + setattr(object, k, simplify(data[k], level=level+1)) + elif isinstance( object, compoundType ) : + data = object._asdict() + for k in data.keys(): + if isPublic(k): + object[k] = simplify(data[k], level=level+1) + elif type(object)==DictType: + for k in object.keys(): + if isPublic(k): + object[k] = simplify(object[k]) + elif type(object)==list: + for k in range(len(object)): + object[k] = simplify(object[k]) + + return object + + diff --git a/SOAPpy/Utilities.py b/SOAPpy/Utilities.py new file mode 100644 index 0000000..03d3433 --- /dev/null +++ b/SOAPpy/Utilities.py @@ -0,0 +1,178 @@ +""" +################################################################################ +# Copyright (c) 2003, Pfizer +# Copyright (c) 2001, Cayce Ullman. +# Copyright (c) 2001, Brian Matthews. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of actzero, inc. nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +################################################################################ +""" + +ident = '$Id: Utilities.py,v 1.4 2004/01/31 04:20:06 warnes Exp $' +from version import __version__ + +import exceptions +import copy +import re +import string +import sys +from types import * + +# SOAPpy modules +from Errors import * + +################################################################################ +# Utility infielders +################################################################################ +def collapseWhiteSpace(s): + return re.sub('\s+', ' ', s).strip() + +def decodeHexString(data): + conv = { + '0': 0x0, '1': 0x1, '2': 0x2, '3': 0x3, '4': 0x4, + '5': 0x5, '6': 0x6, '7': 0x7, '8': 0x8, '9': 0x9, + + 'a': 0xa, 'b': 0xb, 'c': 0xc, 'd': 0xd, 'e': 0xe, + 'f': 0xf, + + 'A': 0xa, 'B': 0xb, 'C': 0xc, 'D': 0xd, 'E': 0xe, + 'F': 0xf, + } + + ws = string.whitespace + + bin = '' + + i = 0 + + while i < len(data): + if data[i] not in ws: + break + i += 1 + + low = 0 + + while i < len(data): + c = data[i] + + if c in string.whitespace: + break + + try: + c = conv[c] + except KeyError: + raise ValueError, \ + "invalid hex string character `%s'" % c + + if low: + bin += chr(high * 16 + c) + low = 0 + else: + high = c + low = 1 + + i += 1 + + if low: + raise ValueError, "invalid hex string length" + + while i < len(data): + if data[i] not in string.whitespace: + raise ValueError, \ + "invalid hex string character `%s'" % c + + i += 1 + + return bin + +def encodeHexString(data): + h = '' + + for i in data: + h += "%02X" % ord(i) + + return h + +def leapMonth(year, month): + return month == 2 and \ + year % 4 == 0 and \ + (year % 100 != 0 or year % 400 == 0) + +def cleanDate(d, first = 0): + ranges = (None, (1, 12), (1, 31), (0, 23), (0, 59), (0, 61)) + months = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) + names = ('year', 'month', 'day', 'hours', 'minutes', 'seconds') + + if len(d) != 6: + raise ValueError, "date must have 6 elements" + + for i in range(first, 6): + s = d[i] + + if type(s) == FloatType: + if i < 5: + try: + s = int(s) + except OverflowError: + if i > 0: + raise + s = long(s) + + if s != d[i]: + raise ValueError, "%s must be integral" % names[i] + + d[i] = s + elif type(s) == LongType: + try: s = int(s) + except: pass + elif type(s) != IntType: + raise TypeError, "%s isn't a valid type" % names[i] + + if i == first and s < 0: + continue + + if ranges[i] != None and \ + (s < ranges[i][0] or ranges[i][1] < s): + raise ValueError, "%s out of range" % names[i] + + if first < 6 and d[5] >= 61: + raise ValueError, "seconds out of range" + + if first < 2: + leap = first < 1 and leapMonth(d[0], d[1]) + + if d[2] > months[d[1]] + leap: + raise ValueError, "day out of range" + +def debugHeader(title): + s = '*** ' + title + ' ' + print s + ('*' * (72 - len(s))) + +def debugFooter(title): + print '*' * 72 + sys.stdout.flush() diff --git a/SOAPpy/__init__.py b/SOAPpy/__init__.py new file mode 100644 index 0000000..0e039f8 --- /dev/null +++ b/SOAPpy/__init__.py @@ -0,0 +1,15 @@ + +ident = '$Id: __init__.py,v 1.9 2004/01/31 04:20:06 warnes Exp $' +from version import __version__ + +from Client import * +from Config import * +from Errors import * +from NS import * +from Parser import * +from SOAPBuilder import * +from Server import * +from Types import * +from Utilities import * +import wstools +import WSDL diff --git a/SOAPpy/version.py b/SOAPpy/version.py new file mode 100644 index 0000000..eda6139 --- /dev/null +++ b/SOAPpy/version.py @@ -0,0 +1,2 @@ +__version__="0.11.6" + diff --git a/SOAPpy/wstools/Namespaces.py b/SOAPpy/wstools/Namespaces.py new file mode 100755 index 0000000..60eaa0f --- /dev/null +++ b/SOAPpy/wstools/Namespaces.py @@ -0,0 +1,92 @@ +#! /usr/bin/env python +"""Namespace module, so you don't need PyXML +""" + +try: + from xml.ns import SOAP, SCHEMA, WSDL, XMLNS, DSIG, ENCRYPTION +except: + class SOAP: + ENV = "http://schemas.xmlsoap.org/soap/envelope/" + ENC = "http://schemas.xmlsoap.org/soap/encoding/" + ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next" + + class SCHEMA: + XSD1 = "http://www.w3.org/1999/XMLSchema" + XSD2 = "http://www.w3.org/2000/10/XMLSchema" + XSD3 = "http://www.w3.org/2001/XMLSchema" + XSD_LIST = [ XSD1, XSD2, XSD3 ] + XSI1 = "http://www.w3.org/1999/XMLSchema-instance" + XSI2 = "http://www.w3.org/2000/10/XMLSchema-instance" + XSI3 = "http://www.w3.org/2001/XMLSchema-instance" + XSI_LIST = [ XSI1, XSI2, XSI3 ] + BASE = XSD3 + + class WSDL: + BASE = "http://schemas.xmlsoap.org/wsdl/" + BIND_HTTP = "http://schemas.xmlsoap.org/wsdl/http/" + BIND_MIME = "http://schemas.xmlsoap.org/wsdl/mime/" + BIND_SOAP = "http://schemas.xmlsoap.org/wsdl/soap/" + + class XMLNS: + BASE = "http://www.w3.org/2000/xmlns/" + XML = "http://www.w3.org/XML/1998/namespace" + HTML = "http://www.w3.org/TR/REC-html40" + + class DSIG: + BASE = "http://www.w3.org/2000/09/xmldsig#" + C14N = "http://www.w3.org/TR/2000/CR-xml-c14n-20010315" + C14N_COMM = "http://www.w3.org/TR/2000/CR-xml-c14n-20010315#WithComments" + C14N_EXCL = "http://www.w3.org/2001/10/xml-exc-c14n#" + DIGEST_MD2 = "http://www.w3.org/2000/09/xmldsig#md2" + DIGEST_MD5 = "http://www.w3.org/2000/09/xmldsig#md5" + DIGEST_SHA1 = "http://www.w3.org/2000/09/xmldsig#sha1" + ENC_BASE64 = "http://www.w3.org/2000/09/xmldsig#base64" + ENVELOPED = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" + HMAC_SHA1 = "http://www.w3.org/2000/09/xmldsig#hmac-sha1" + SIG_DSA_SHA1 = "http://www.w3.org/2000/09/xmldsig#dsa-sha1" + SIG_RSA_SHA1 = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" + XPATH = "http://www.w3.org/TR/1999/REC-xpath-19991116" + XSLT = "http://www.w3.org/TR/1999/REC-xslt-19991116" + + class ENCRYPTION: + BASE = "http://www.w3.org/2001/04/xmlenc#" + BLOCK_3DES = "http://www.w3.org/2001/04/xmlenc#des-cbc" + BLOCK_AES128 = "http://www.w3.org/2001/04/xmlenc#aes128-cbc" + BLOCK_AES192 = "http://www.w3.org/2001/04/xmlenc#aes192-cbc" + BLOCK_AES256 = "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + DIGEST_RIPEMD160 = "http://www.w3.org/2001/04/xmlenc#ripemd160" + DIGEST_SHA256 = "http://www.w3.org/2001/04/xmlenc#sha256" + DIGEST_SHA512 = "http://www.w3.org/2001/04/xmlenc#sha512" + KA_DH = "http://www.w3.org/2001/04/xmlenc#dh" + KT_RSA_1_5 = "http://www.w3.org/2001/04/xmlenc#rsa-1_5" + KT_RSA_OAEP = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" + STREAM_ARCFOUR = "http://www.w3.org/2001/04/xmlenc#arcfour" + WRAP_3DES = "http://www.w3.org/2001/04/xmlenc#kw-3des" + WRAP_AES128 = "http://www.w3.org/2001/04/xmlenc#kw-aes128" + WRAP_AES192 = "http://www.w3.org/2001/04/xmlenc#kw-aes192" + WRAP_AES256 = "http://www.w3.org/2001/04/xmlenc#kw-aes256" + + +class WSSE: + BASE = "http://schemas.xmlsoap.org/ws/2002/04/secext" + +class WSU: + BASE = "http://schemas.xmlsoap.org/ws/2002/04/utility" + UTILITY = "http://schemas.xmlsoap.org/ws/2002/07/utility" + +class WSR: + PROPERTIES = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceProperties" + LIFETIME = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime" + +class WSA: + ADDRESS = "http://schemas.xmlsoap.org/ws/2003/03/addressing" + ADDRESS2004 = "http://schemas.xmlsoap.org/ws/2004/03/addressing" + ANONYMOUS = "%s/role/anonymous" %ADDRESS + ANONYMOUS2004 = "%s/role/anonymous" %ADDRESS2004 + FAULT = "http://schemas.xmlsoap.org/ws/2004/03/addressing/fault" + +class WSP: + POLICY = "http://schemas.xmlsoap.org/ws/2002/12/policy" + + + diff --git a/SOAPpy/wstools/TimeoutSocket.py b/SOAPpy/wstools/TimeoutSocket.py new file mode 100755 index 0000000..2d804dd --- /dev/null +++ b/SOAPpy/wstools/TimeoutSocket.py @@ -0,0 +1,179 @@ +"""Based on code from timeout_socket.py, with some tweaks for compatibility. + These tweaks should really be rolled back into timeout_socket, but it's + not totally clear who is maintaining it at this point. In the meantime, + we'll use a different module name for our tweaked version to avoid any + confusion. + + The original timeout_socket is by: + + Scott Cotton + Lloyd Zusman + Phil Mayes + Piers Lauder + Radovan Garabik +""" + +ident = "$Id: TimeoutSocket.py,v 1.2 2003/05/20 21:10:12 warnes Exp $" + +import string, socket, select, errno + +WSAEINVAL = getattr(errno, 'WSAEINVAL', 10022) + + +class TimeoutSocket: + """A socket imposter that supports timeout limits.""" + + def __init__(self, timeout=20, sock=None): + self.timeout = float(timeout) + self.inbuf = '' + if sock is None: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock = sock + self.sock.setblocking(0) + self._rbuf = '' + self._wbuf = '' + + def __getattr__(self, name): + # Delegate to real socket attributes. + return getattr(self.sock, name) + + def connect(self, *addr): + timeout = self.timeout + sock = self.sock + try: + # Non-blocking mode + sock.setblocking(0) + apply(sock.connect, addr) + sock.setblocking(timeout != 0) + return 1 + except socket.error,why: + if not timeout: + raise + sock.setblocking(1) + if len(why.args) == 1: + code = 0 + else: + code, why = why + if code not in ( + errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK + ): + raise + r,w,e = select.select([],[sock],[],timeout) + if w: + try: + apply(sock.connect, addr) + return 1 + except socket.error,why: + if len(why.args) == 1: + code = 0 + else: + code, why = why + if code in (errno.EISCONN, WSAEINVAL): + return 1 + raise + raise TimeoutError('socket connect() timeout.') + + def send(self, data, flags=0): + total = len(data) + next = 0 + while 1: + r, w, e = select.select([],[self.sock], [], self.timeout) + if w: + buff = data[next:next + 8192] + sent = self.sock.send(buff, flags) + next = next + sent + if next == total: + return total + continue + raise TimeoutError('socket send() timeout.') + + def recv(self, amt, flags=0): + if select.select([self.sock], [], [], self.timeout)[0]: + return self.sock.recv(amt, flags) + raise TimeoutError('socket recv() timeout.') + + buffsize = 4096 + handles = 1 + + def makefile(self, mode="r", buffsize=-1): + self.handles = self.handles + 1 + self.mode = mode + return self + + def close(self): + self.handles = self.handles - 1 + if self.handles == 0 and self.sock.fileno() >= 0: + self.sock.close() + + def read(self, n=-1): + if not isinstance(n, type(1)): + n = -1 + if n >= 0: + k = len(self._rbuf) + if n <= k: + data = self._rbuf[:n] + self._rbuf = self._rbuf[n:] + return data + n = n - k + L = [self._rbuf] + self._rbuf = "" + while n > 0: + new = self.recv(max(n, self.buffsize)) + if not new: break + k = len(new) + if k > n: + L.append(new[:n]) + self._rbuf = new[n:] + break + L.append(new) + n = n - k + return "".join(L) + k = max(4096, self.buffsize) + L = [self._rbuf] + self._rbuf = "" + while 1: + new = self.recv(k) + if not new: break + L.append(new) + k = min(k*2, 1024**2) + return "".join(L) + + def readline(self, limit=-1): + data = "" + i = self._rbuf.find('\n') + while i < 0 and not (0 < limit <= len(self._rbuf)): + new = self.recv(self.buffsize) + if not new: break + i = new.find('\n') + if i >= 0: i = i + len(self._rbuf) + self._rbuf = self._rbuf + new + if i < 0: i = len(self._rbuf) + else: i = i+1 + if 0 <= limit < len(self._rbuf): i = limit + data, self._rbuf = self._rbuf[:i], self._rbuf[i:] + return data + + def readlines(self, sizehint = 0): + total = 0 + list = [] + while 1: + line = self.readline() + if not line: break + list.append(line) + total += len(line) + if sizehint and total >= sizehint: + break + return list + + def writelines(self, list): + self.send(''.join(list)) + + def write(self, data): + self.send(data) + + def flush(self): + pass + + +class TimeoutError(Exception): + pass diff --git a/SOAPpy/wstools/UserTuple.py b/SOAPpy/wstools/UserTuple.py new file mode 100755 index 0000000..5b193e7 --- /dev/null +++ b/SOAPpy/wstools/UserTuple.py @@ -0,0 +1,99 @@ +""" +A more or less complete user-defined wrapper around tuple objects. +Adapted version of the standard library's UserList. + +Taken from Stefan Schwarzer's ftputil library, available at +, and used under this license: + + + + +Copyright (C) 1999, Stefan Schwarzer +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +- Neither the name of the above author nor the names of the + contributors to the software may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" + + + + +# $Id: UserTuple.py,v 1.1 2003/07/21 14:18:54 warnes Exp $ + +#XXX tuple instances (in Python 2.2) contain also: +# __class__, __delattr__, __getattribute__, __hash__, __new__, +# __reduce__, __setattr__, __str__ +# What about these? + +class UserTuple: + def __init__(self, inittuple=None): + self.data = () + if inittuple is not None: + # XXX should this accept an arbitrary sequence? + if type(inittuple) == type(self.data): + self.data = inittuple + elif isinstance(inittuple, UserTuple): + # this results in + # self.data is inittuple.data + # but that's ok for tuples because they are + # immutable. (Builtin tuples behave the same.) + self.data = inittuple.data[:] + else: + # the same applies here; (t is tuple(t)) == 1 + self.data = tuple(inittuple) + def __repr__(self): return repr(self.data) + def __lt__(self, other): return self.data < self.__cast(other) + def __le__(self, other): return self.data <= self.__cast(other) + def __eq__(self, other): return self.data == self.__cast(other) + def __ne__(self, other): return self.data != self.__cast(other) + def __gt__(self, other): return self.data > self.__cast(other) + def __ge__(self, other): return self.data >= self.__cast(other) + def __cast(self, other): + if isinstance(other, UserTuple): return other.data + else: return other + def __cmp__(self, other): + return cmp(self.data, self.__cast(other)) + def __contains__(self, item): return item in self.data + def __len__(self): return len(self.data) + def __getitem__(self, i): return self.data[i] + def __getslice__(self, i, j): + i = max(i, 0); j = max(j, 0) + return self.__class__(self.data[i:j]) + def __add__(self, other): + if isinstance(other, UserTuple): + return self.__class__(self.data + other.data) + elif isinstance(other, type(self.data)): + return self.__class__(self.data + other) + else: + return self.__class__(self.data + tuple(other)) + # dir( () ) contains no __radd__ (at least in Python 2.2) + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + diff --git a/SOAPpy/wstools/Utility.py b/SOAPpy/wstools/Utility.py new file mode 100755 index 0000000..b2bfb3c --- /dev/null +++ b/SOAPpy/wstools/Utility.py @@ -0,0 +1,839 @@ +# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. + +ident = "$Id: Utility.py,v 1.15 2004/04/29 01:40:49 boverhof Exp $" + +import types +import string, httplib, smtplib, urllib, socket, weakref +import xml.dom.minidom +from string import join, strip, split +from UserDict import UserDict +from StringIO import StringIO +from TimeoutSocket import TimeoutSocket, TimeoutError +from urlparse import urlparse +from httplib import HTTPConnection, HTTPSConnection +from exceptions import Exception + +try: + from xml.dom.ext import SplitQName +except: + def SplitQName(qname): + '''SplitQName(qname) -> (string, string) + + Split Qualified Name into a tuple of len 2, consisting + of the prefix and the local name. + + (prefix, localName) + + Special Cases: + xmlns -- (localName, 'xmlns') + None -- (None, localName) + ''' + + l = qname.split(':') + if len(l) == 1: + l.insert(0, None) + elif len(l) == 2: + if l[0] == 'xmlns': + l.reverse() + else: + return + return tuple(l) + +class RecursionError(Exception): + """Used to indicate a HTTP redirect recursion.""" + pass + +class HTTPResponse: + """Captures the information in an HTTP response message.""" + + def __init__(self, response): + self.status = response.status + self.reason = response.reason + self.headers = response.msg + self.body = response.read() or None + response.close() + +class TimeoutHTTP(HTTPConnection): + """A custom http connection object that supports socket timeout.""" + def __init__(self, host, port=None, timeout=20): + HTTPConnection.__init__(self, host, port) + self.timeout = timeout + + def connect(self): + self.sock = TimeoutSocket(self.timeout) + self.sock.connect((self.host, self.port)) + + +class TimeoutHTTPS(HTTPSConnection): + """A custom https object that supports socket timeout. Note that this + is not really complete. The builtin SSL support in the Python socket + module requires a real socket (type) to be passed in to be hooked to + SSL. That means our fake socket won't work and our timeout hacks are + bypassed for send and recv calls. Since our hack _is_ in place at + connect() time, it should at least provide some timeout protection.""" + def __init__(self, host, port=None, timeout=20, **kwargs): + HTTPSConnection.__init__(self, str(host), port, **kwargs) + self.timeout = timeout + + def connect(self): + sock = TimeoutSocket(self.timeout) + sock.connect((self.host, self.port)) + realsock = getattr(sock.sock, '_sock', sock.sock) + ssl = socket.ssl(realsock, self.key_file, self.cert_file) + self.sock = httplib.FakeSocket(sock, ssl) + +def urlopen(url, timeout=20, redirects=None): + """A minimal urlopen replacement hack that supports timeouts for http. + Note that this supports GET only.""" + scheme, host, path, params, query, frag = urlparse(url) + if not scheme in ('http', 'https'): + return urllib.urlopen(url) + if params: path = '%s;%s' % (path, params) + if query: path = '%s?%s' % (path, query) + if frag: path = '%s#%s' % (path, frag) + + if scheme == 'https': + # If ssl is not compiled into Python, you will not get an exception + # until a conn.endheaders() call. We need to know sooner, so use + # getattr. + if hasattr(socket, 'ssl'): + conn = TimeoutHTTPS(host, None, timeout) + else: + import M2Crypto + ctx = M2Crypto.SSL.Context() + ctx.set_session_timeout(timeout) + conn = M2Crypto.httpslib.HTTPSConnection(host, ssl_context=ctx) + #conn.set_debuglevel(1) + else: + conn = TimeoutHTTP(host, None, timeout) + + conn.putrequest('GET', path) + conn.putheader('Connection', 'close') + conn.endheaders() + response = None + while 1: + response = conn.getresponse() + if response.status != 100: + break + conn._HTTPConnection__state = httplib._CS_REQ_SENT + conn._HTTPConnection__response = None + + status = response.status + + # If we get an HTTP redirect, we will follow it automatically. + if status >= 300 and status < 400: + location = response.msg.getheader('location') + if location is not None: + response.close() + if redirects is not None and redirects.has_key(location): + raise RecursionError( + 'Circular HTTP redirection detected.' + ) + if redirects is None: + redirects = {} + redirects[location] = 1 + return urlopen(location, timeout, redirects) + raise HTTPResponse(response) + + if not (status >= 200 and status < 300): + raise HTTPResponse(response) + + body = StringIO(response.read()) + response.close() + return body + +class DOM: + """The DOM singleton defines a number of XML related constants and + provides a number of utility methods for DOM related tasks. It + also provides some basic abstractions so that the rest of the + package need not care about actual DOM implementation in use.""" + + # Namespace stuff related to the SOAP specification. + + NS_SOAP_ENV_1_1 = 'http://schemas.xmlsoap.org/soap/envelope/' + NS_SOAP_ENC_1_1 = 'http://schemas.xmlsoap.org/soap/encoding/' + + NS_SOAP_ENV_1_2 = 'http://www.w3.org/2001/06/soap-envelope' + NS_SOAP_ENC_1_2 = 'http://www.w3.org/2001/06/soap-encoding' + + NS_SOAP_ENV_ALL = (NS_SOAP_ENV_1_1, NS_SOAP_ENV_1_2) + NS_SOAP_ENC_ALL = (NS_SOAP_ENC_1_1, NS_SOAP_ENC_1_2) + + NS_SOAP_ENV = NS_SOAP_ENV_1_1 + NS_SOAP_ENC = NS_SOAP_ENC_1_1 + + _soap_uri_mapping = { + NS_SOAP_ENV_1_1 : '1.1', + NS_SOAP_ENV_1_2 : '1.2', + } + + SOAP_ACTOR_NEXT_1_1 = 'http://schemas.xmlsoap.org/soap/actor/next' + SOAP_ACTOR_NEXT_1_2 = 'http://www.w3.org/2001/06/soap-envelope/actor/next' + SOAP_ACTOR_NEXT_ALL = (SOAP_ACTOR_NEXT_1_1, SOAP_ACTOR_NEXT_1_2) + + def SOAPUriToVersion(self, uri): + """Return the SOAP version related to an envelope uri.""" + value = self._soap_uri_mapping.get(uri) + if value is not None: + return value + raise ValueError( + 'Unsupported SOAP envelope uri: %s' % uri + ) + + def GetSOAPEnvUri(self, version): + """Return the appropriate SOAP envelope uri for a given + human-friendly SOAP version string (e.g. '1.1').""" + attrname = 'NS_SOAP_ENV_%s' % join(split(version, '.'), '_') + value = getattr(self, attrname, None) + if value is not None: + return value + raise ValueError( + 'Unsupported SOAP version: %s' % version + ) + + def GetSOAPEncUri(self, version): + """Return the appropriate SOAP encoding uri for a given + human-friendly SOAP version string (e.g. '1.1').""" + attrname = 'NS_SOAP_ENC_%s' % join(split(version, '.'), '_') + value = getattr(self, attrname, None) + if value is not None: + return value + raise ValueError( + 'Unsupported SOAP version: %s' % version + ) + + def GetSOAPActorNextUri(self, version): + """Return the right special next-actor uri for a given + human-friendly SOAP version string (e.g. '1.1').""" + attrname = 'SOAP_ACTOR_NEXT_%s' % join(split(version, '.'), '_') + value = getattr(self, attrname, None) + if value is not None: + return value + raise ValueError( + 'Unsupported SOAP version: %s' % version + ) + + + # Namespace stuff related to XML Schema. + + NS_XSD_99 = 'http://www.w3.org/1999/XMLSchema' + NS_XSI_99 = 'http://www.w3.org/1999/XMLSchema-instance' + + NS_XSD_00 = 'http://www.w3.org/2000/10/XMLSchema' + NS_XSI_00 = 'http://www.w3.org/2000/10/XMLSchema-instance' + + NS_XSD_01 = 'http://www.w3.org/2001/XMLSchema' + NS_XSI_01 = 'http://www.w3.org/2001/XMLSchema-instance' + + NS_XSD_ALL = (NS_XSD_99, NS_XSD_00, NS_XSD_01) + NS_XSI_ALL = (NS_XSI_99, NS_XSI_00, NS_XSI_01) + + NS_XSD = NS_XSD_01 + NS_XSI = NS_XSI_01 + + _xsd_uri_mapping = { + NS_XSD_99 : NS_XSI_99, + NS_XSD_00 : NS_XSI_00, + NS_XSD_01 : NS_XSI_01, + } + + for key, value in _xsd_uri_mapping.items(): + _xsd_uri_mapping[value] = key + + + def InstanceUriForSchemaUri(self, uri): + """Return the appropriate matching XML Schema instance uri for + the given XML Schema namespace uri.""" + return self._xsd_uri_mapping.get(uri) + + def SchemaUriForInstanceUri(self, uri): + """Return the appropriate matching XML Schema namespace uri for + the given XML Schema instance namespace uri.""" + return self._xsd_uri_mapping.get(uri) + + + # Namespace stuff related to WSDL. + + NS_WSDL_1_1 = 'http://schemas.xmlsoap.org/wsdl/' + NS_WSDL_ALL = (NS_WSDL_1_1,) + NS_WSDL = NS_WSDL_1_1 + + NS_SOAP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/soap/' + NS_HTTP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/http/' + NS_MIME_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/mime/' + + NS_SOAP_BINDING_ALL = (NS_SOAP_BINDING_1_1,) + NS_HTTP_BINDING_ALL = (NS_HTTP_BINDING_1_1,) + NS_MIME_BINDING_ALL = (NS_MIME_BINDING_1_1,) + + NS_SOAP_BINDING = NS_SOAP_BINDING_1_1 + NS_HTTP_BINDING = NS_HTTP_BINDING_1_1 + NS_MIME_BINDING = NS_MIME_BINDING_1_1 + + NS_SOAP_HTTP_1_1 = 'http://schemas.xmlsoap.org/soap/http' + NS_SOAP_HTTP_ALL = (NS_SOAP_HTTP_1_1,) + NS_SOAP_HTTP = NS_SOAP_HTTP_1_1 + + + _wsdl_uri_mapping = { + NS_WSDL_1_1 : '1.1', + } + + def WSDLUriToVersion(self, uri): + """Return the WSDL version related to a WSDL namespace uri.""" + value = self._wsdl_uri_mapping.get(uri) + if value is not None: + return value + raise ValueError( + 'Unsupported SOAP envelope uri: %s' % uri + ) + + def GetWSDLUri(self, version): + attr = 'NS_WSDL_%s' % join(split(version, '.'), '_') + value = getattr(self, attr, None) + if value is not None: + return value + raise ValueError( + 'Unsupported WSDL version: %s' % version + ) + + def GetWSDLSoapBindingUri(self, version): + attr = 'NS_SOAP_BINDING_%s' % join(split(version, '.'), '_') + value = getattr(self, attr, None) + if value is not None: + return value + raise ValueError( + 'Unsupported WSDL version: %s' % version + ) + + def GetWSDLHttpBindingUri(self, version): + attr = 'NS_HTTP_BINDING_%s' % join(split(version, '.'), '_') + value = getattr(self, attr, None) + if value is not None: + return value + raise ValueError( + 'Unsupported WSDL version: %s' % version + ) + + def GetWSDLMimeBindingUri(self, version): + attr = 'NS_MIME_BINDING_%s' % join(split(version, '.'), '_') + value = getattr(self, attr, None) + if value is not None: + return value + raise ValueError( + 'Unsupported WSDL version: %s' % version + ) + + def GetWSDLHttpTransportUri(self, version): + attr = 'NS_SOAP_HTTP_%s' % join(split(version, '.'), '_') + value = getattr(self, attr, None) + if value is not None: + return value + raise ValueError( + 'Unsupported WSDL version: %s' % version + ) + + + # Other xml namespace constants. + NS_XMLNS = 'http://www.w3.org/2000/xmlns/' + + + + def isElement(self, node, name, nsuri=None): + """Return true if the given node is an element with the given + name and optional namespace uri.""" + if node.nodeType != node.ELEMENT_NODE: + return 0 + return node.localName == name and \ + (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) + + def getElement(self, node, name, nsuri=None, default=join): + """Return the first child of node with a matching name and + namespace uri, or the default if one is provided.""" + nsmatch = self.nsUriMatch + ELEMENT_NODE = node.ELEMENT_NODE + for child in node.childNodes: + if child.nodeType == ELEMENT_NODE: + if ((child.localName == name or name is None) and + (nsuri is None or nsmatch(child.namespaceURI, nsuri)) + ): + return child + if default is not join: + return default + raise KeyError, name + + def getElementById(self, node, id, default=join): + """Return the first child of node matching an id reference.""" + attrget = self.getAttr + ELEMENT_NODE = node.ELEMENT_NODE + for child in node.childNodes: + if child.nodeType == ELEMENT_NODE: + if attrget(child, 'id') == id: + return child + if default is not join: + return default + raise KeyError, name + + def getMappingById(self, document, depth=None, element=None, + mapping=None, level=1): + """Create an id -> element mapping of those elements within a + document that define an id attribute. The depth of the search + may be controlled by using the (1-based) depth argument.""" + if document is not None: + element = document.documentElement + mapping = {} + attr = element._attrs.get('id', None) + if attr is not None: + mapping[attr.value] = element + if depth is None or depth > level: + level = level + 1 + ELEMENT_NODE = element.ELEMENT_NODE + for child in element.childNodes: + if child.nodeType == ELEMENT_NODE: + self.getMappingById(None, depth, child, mapping, level) + return mapping + + def getElements(self, node, name, nsuri=None): + """Return a sequence of the child elements of the given node that + match the given name and optional namespace uri.""" + nsmatch = self.nsUriMatch + result = [] + ELEMENT_NODE = node.ELEMENT_NODE + for child in node.childNodes: + if child.nodeType == ELEMENT_NODE: + if ((child.localName == name or name is None) and ( + (nsuri is None) or nsmatch(child.namespaceURI, nsuri))): + result.append(child) + return result + + def hasAttr(self, node, name, nsuri=None): + """Return true if element has attribute with the given name and + optional nsuri. If nsuri is not specified, returns true if an + attribute exists with the given name with any namespace.""" + if nsuri is None: + if node.hasAttribute(name): + return True + return False + return node.hasAttributeNS(nsuri, name) + + def getAttr(self, node, name, nsuri=None, default=join): + """Return the value of the attribute named 'name' with the + optional nsuri, or the default if one is specified. If + nsuri is not specified, an attribute that matches the + given name will be returned regardless of namespace.""" + if nsuri is None: + result = node._attrs.get(name, None) + if result is None: + for item in node._attrsNS.keys(): + if item[1] == name: + result = node._attrsNS[item] + break + else: + result = node._attrsNS.get((nsuri, name), None) + if result is not None: + return result.value + if default is not join: + return default + return '' + + def getAttrs(self, node): + """Return a Collection of all attributes + """ + attrs = {} + for k,v in node._attrs.items(): + attrs[k] = v.value + return attrs + + def getElementText(self, node, preserve_ws=None): + """Return the text value of an xml element node. Leading and trailing + whitespace is stripped from the value unless the preserve_ws flag + is passed with a true value.""" + result = [] + for child in node.childNodes: + nodetype = child.nodeType + if nodetype == child.TEXT_NODE or \ + nodetype == child.CDATA_SECTION_NODE: + result.append(child.nodeValue) + value = join(result, '') + if preserve_ws is None: + value = strip(value) + return value + + def findNamespaceURI(self, prefix, node): + """Find a namespace uri given a prefix and a context node.""" + attrkey = (self.NS_XMLNS, prefix) + DOCUMENT_NODE = node.DOCUMENT_NODE + ELEMENT_NODE = node.ELEMENT_NODE + while 1: + if node.nodeType != ELEMENT_NODE: + node = node.parentNode + continue + result = node._attrsNS.get(attrkey, None) + if result is not None: + return result.value + if hasattr(node, '__imported__'): + raise DOMException('Value for prefix %s not found.' % prefix) + node = node.parentNode + if node.nodeType == DOCUMENT_NODE: + raise DOMException('Value for prefix %s not found.' % prefix) + + def findDefaultNS(self, node): + """Return the current default namespace uri for the given node.""" + attrkey = (self.NS_XMLNS, 'xmlns') + DOCUMENT_NODE = node.DOCUMENT_NODE + ELEMENT_NODE = node.ELEMENT_NODE + while 1: + if node.nodeType != ELEMENT_NODE: + node = node.parentNode + continue + result = node._attrsNS.get(attrkey, None) + if result is not None: + return result.value + if hasattr(node, '__imported__'): + raise DOMException('Cannot determine default namespace.') + node = node.parentNode + if node.nodeType == DOCUMENT_NODE: + raise DOMException('Cannot determine default namespace.') + + def findTargetNS(self, node): + """Return the defined target namespace uri for the given node.""" + attrget = self.getAttr + attrkey = (self.NS_XMLNS, 'xmlns') + DOCUMENT_NODE = node.DOCUMENT_NODE + ELEMENT_NODE = node.ELEMENT_NODE + while 1: + if node.nodeType != ELEMENT_NODE: + node = node.parentNode + continue + result = attrget(node, 'targetNamespace', default=None) + if result is not None: + return result + node = node.parentNode + if node.nodeType == DOCUMENT_NODE: + raise DOMException('Cannot determine target namespace.') + + def getTypeRef(self, element): + """Return (namespaceURI, name) for a type attribue of the given + element, or None if the element does not have a type attribute.""" + typeattr = self.getAttr(element, 'type', default=None) + if typeattr is None: + return None + parts = typeattr.split(':', 1) + if len(parts) == 2: + nsuri = self.findNamespaceURI(parts[0], element) + else: + nsuri = self.findDefaultNS(element) + return (nsuri, parts[1]) + + def importNode(self, document, node, deep=0): + """Implements (well enough for our purposes) DOM node import.""" + nodetype = node.nodeType + if nodetype in (node.DOCUMENT_NODE, node.DOCUMENT_TYPE_NODE): + raise DOMException('Illegal node type for importNode') + if nodetype == node.ENTITY_REFERENCE_NODE: + deep = 0 + clone = node.cloneNode(deep) + self._setOwnerDoc(document, clone) + clone.__imported__ = 1 + return clone + + def _setOwnerDoc(self, document, node): + node.ownerDocument = document + for child in node.childNodes: + self._setOwnerDoc(document, child) + + def nsUriMatch(self, value, wanted, strict=0, tt=type(())): + """Return a true value if two namespace uri values match.""" + if value == wanted or (type(wanted) is tt) and value in wanted: + return 1 + if not strict: + wanted = type(wanted) is tt and wanted or (wanted,) + value = value[-1:] != '/' and value or value[:-1] + for item in wanted: + if item == value or item[:-1] == value: + return 1 + return 0 + + def createDocument(self, nsuri, qname, doctype=None): + """Create a new writable DOM document object.""" + impl = xml.dom.minidom.getDOMImplementation() + return impl.createDocument(nsuri, qname, doctype) + + def loadDocument(self, data): + """Load an xml file from a file-like object and return a DOM + document instance.""" + return xml.dom.minidom.parse(data) + + def loadFromURL(self, url): + """Load an xml file from a URL and return a DOM document.""" + file = urlopen(url) + try: result = self.loadDocument(file) + finally: file.close() + return result + + +class DOMException(Exception): + pass + +DOM = DOM() + + +class Collection(UserDict): + """Helper class for maintaining ordered named collections.""" + default = lambda self,k: k.name + def __init__(self, parent, key=None): + UserDict.__init__(self) + self.parent = weakref.ref(parent) + self.list = [] + self._func = key or self.default + + def __getitem__(self, key): + if type(key) is type(1): + return self.list[key] + return self.data[key] + + def __setitem__(self, key, item): + item.parent = weakref.ref(self) + self.list.append(item) + self.data[key] = item + + def keys(self): + return map(lambda i: self._func(i), self.list) + + def items(self): + return map(lambda i: (self._func(i), i), self.list) + + def values(self): + return self.list + + +class CollectionNS(UserDict): + """Helper class for maintaining ordered named collections.""" + default = lambda self,k: k.name + def __init__(self, parent, key=None): + UserDict.__init__(self) + self.parent = weakref.ref(parent) + self.targetNamespace = None + self.list = [] + self._func = key or self.default + + def __getitem__(self, key): + self.targetNamespace = self.parent().targetNamespace + if type(key) is types.IntType: + return self.list[key] + elif self.__isSequence(key): + nsuri,name = key + return self.data[nsuri][name] + return self.data[self.parent().targetNamespace][key] + + def __setitem__(self, key, item): + item.parent = weakref.ref(self) + self.list.append(item) + targetNamespace = getattr(item, 'targetNamespace', self.parent().targetNamespace) + if not self.data.has_key(targetNamespace): + self.data[targetNamespace] = {} + self.data[targetNamespace][key] = item + + def __isSequence(self, key): + return (type(key) in (types.TupleType,types.ListType) and len(key) == 2) + + def keys(self): + keys = [] + for tns in self.data.keys(): + keys.append(map(lambda i: (tns,self._func(i)), self.data[tns].values())) + return keys + + def items(self): + return map(lambda i: (self._func(i), i), self.list) + + def values(self): + return self.list + + + +# This is a runtime guerilla patch for pulldom (used by minidom) so +# that xml namespace declaration attributes are not lost in parsing. +# We need them to do correct QName linking for XML Schema and WSDL. +# The patch has been submitted to SF for the next Python version. + +from xml.dom.pulldom import PullDOM, START_ELEMENT +if 1: + def startPrefixMapping(self, prefix, uri): + if not hasattr(self, '_xmlns_attrs'): + self._xmlns_attrs = [] + self._xmlns_attrs.append((prefix or 'xmlns', uri)) + self._ns_contexts.append(self._current_context.copy()) + self._current_context[uri] = prefix or '' + + PullDOM.startPrefixMapping = startPrefixMapping + + def startElementNS(self, name, tagName , attrs): + # Retrieve xml namespace declaration attributes. + xmlns_uri = 'http://www.w3.org/2000/xmlns/' + xmlns_attrs = getattr(self, '_xmlns_attrs', None) + if xmlns_attrs is not None: + for aname, value in xmlns_attrs: + attrs._attrs[(xmlns_uri, aname)] = value + self._xmlns_attrs = [] + uri, localname = name + if uri: + # When using namespaces, the reader may or may not + # provide us with the original name. If not, create + # *a* valid tagName from the current context. + if tagName is None: + prefix = self._current_context[uri] + if prefix: + tagName = prefix + ":" + localname + else: + tagName = localname + if self.document: + node = self.document.createElementNS(uri, tagName) + else: + node = self.buildDocument(uri, tagName) + else: + # When the tagname is not prefixed, it just appears as + # localname + if self.document: + node = self.document.createElement(localname) + else: + node = self.buildDocument(None, localname) + + for aname,value in attrs.items(): + a_uri, a_localname = aname + if a_uri == xmlns_uri: + if a_localname == 'xmlns': + qname = a_localname + else: + qname = 'xmlns:' + a_localname + attr = self.document.createAttributeNS(a_uri, qname) + node.setAttributeNodeNS(attr) + elif a_uri: + prefix = self._current_context[a_uri] + if prefix: + qname = prefix + ":" + a_localname + else: + qname = a_localname + attr = self.document.createAttributeNS(a_uri, qname) + node.setAttributeNodeNS(attr) + else: + attr = self.document.createAttribute(a_localname) + node.setAttributeNode(attr) + attr.value = value + + self.lastEvent[1] = [(START_ELEMENT, node), None] + self.lastEvent = self.lastEvent[1] + self.push(node) + + PullDOM.startElementNS = startElementNS + +# +# This is a runtime guerilla patch for minidom so +# that xmlns prefixed attributes dont raise AttributeErrors +# during cloning. +# +# Namespace declarations can appear in any start-tag, must look for xmlns +# prefixed attribute names during cloning. +# +# key (attr.namespaceURI, tag) +# ('http://www.w3.org/2000/xmlns/', u'xsd') +# ('http://www.w3.org/2000/xmlns/', 'xmlns') +# +# xml.dom.minidom.Attr.nodeName = xmlns:xsd +# xml.dom.minidom.Attr.value = = http://www.w3.org/2001/XMLSchema + +if 1: + def _clone_node(node, deep, newOwnerDocument): + """ + Clone a node and give it the new owner document. + Called by Node.cloneNode and Document.importNode + """ + if node.ownerDocument.isSameNode(newOwnerDocument): + operation = xml.dom.UserDataHandler.NODE_CLONED + else: + operation = xml.dom.UserDataHandler.NODE_IMPORTED + if node.nodeType == xml.dom.minidom.Node.ELEMENT_NODE: + clone = newOwnerDocument.createElementNS(node.namespaceURI, + node.nodeName) + for attr in node.attributes.values(): + clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) + + prefix, tag = xml.dom.minidom._nssplit(attr.nodeName) + if prefix == 'xmlns': + a = clone.getAttributeNodeNS(attr.namespaceURI, tag) + elif prefix: + a = clone.getAttributeNodeNS(attr.namespaceURI, tag) + else: + a = clone.getAttributeNodeNS(attr.namespaceURI, attr.nodeName) + a.specified = attr.specified + + if deep: + for child in node.childNodes: + c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) + clone.appendChild(c) + elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_FRAGMENT_NODE: + clone = newOwnerDocument.createDocumentFragment() + if deep: + for child in node.childNodes: + c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) + clone.appendChild(c) + + elif node.nodeType == xml.dom.minidom.Node.TEXT_NODE: + clone = newOwnerDocument.createTextNode(node.data) + elif node.nodeType == xml.dom.minidom.Node.CDATA_SECTION_NODE: + clone = newOwnerDocument.createCDATASection(node.data) + elif node.nodeType == xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE: + clone = newOwnerDocument.createProcessingInstruction(node.target, + node.data) + elif node.nodeType == xml.dom.minidom.Node.COMMENT_NODE: + clone = newOwnerDocument.createComment(node.data) + elif node.nodeType == xml.dom.minidom.Node.ATTRIBUTE_NODE: + clone = newOwnerDocument.createAttributeNS(node.namespaceURI, + node.nodeName) + clone.specified = True + clone.value = node.value + elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_TYPE_NODE: + assert node.ownerDocument is not newOwnerDocument + operation = xml.dom.UserDataHandler.NODE_IMPORTED + clone = newOwnerDocument.implementation.createDocumentType( + node.name, node.publicId, node.systemId) + clone.ownerDocument = newOwnerDocument + if deep: + clone.entities._seq = [] + clone.notations._seq = [] + for n in node.notations._seq: + notation = xml.dom.minidom.Notation(n.nodeName, n.publicId, n.systemId) + notation.ownerDocument = newOwnerDocument + clone.notations._seq.append(notation) + if hasattr(n, '_call_user_data_handler'): + n._call_user_data_handler(operation, n, notation) + for e in node.entities._seq: + entity = xml.dom.minidom.Entity(e.nodeName, e.publicId, e.systemId, + e.notationName) + entity.actualEncoding = e.actualEncoding + entity.encoding = e.encoding + entity.version = e.version + entity.ownerDocument = newOwnerDocument + clone.entities._seq.append(entity) + if hasattr(e, '_call_user_data_handler'): + e._call_user_data_handler(operation, n, entity) + else: + # Note the cloning of Document and DocumentType nodes is + # implemenetation specific. minidom handles those cases + # directly in the cloneNode() methods. + raise xml.dom.NotSupportedErr("Cannot clone node %s" % repr(node)) + + # Check for _call_user_data_handler() since this could conceivably + # used with other DOM implementations (one of the FourThought + # DOMs, perhaps?). + if hasattr(node, '_call_user_data_handler'): + node._call_user_data_handler(operation, node, clone) + return clone + + xml.dom.minidom._clone_node = _clone_node diff --git a/SOAPpy/wstools/WSDLTools.py b/SOAPpy/wstools/WSDLTools.py new file mode 100755 index 0000000..ad4e58e --- /dev/null +++ b/SOAPpy/wstools/WSDLTools.py @@ -0,0 +1,1336 @@ +# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. + +ident = "$Id: WSDLTools.py,v 1.23 2004/09/09 04:37:55 boverhof Exp $" + +from Utility import DOM, Collection, CollectionNS +from XMLSchema import XMLSchema, SchemaReader, WSDLToolsAdapter +from Namespaces import WSR, WSA +from StringIO import StringIO +import urllib + + +class WSDLReader: + """A WSDLReader creates WSDL instances from urls and xml data.""" + + # Custom subclasses of WSDLReader may wish to implement a caching + # strategy or other optimizations. Because application needs vary + # so widely, we don't try to provide any caching by default. + + def loadFromStream(self, stream, name=None): + """Return a WSDL instance loaded from a stream object.""" + document = DOM.loadDocument(stream) + wsdl = WSDL() + if name: + wsdl.location = name + elif hasattr(stream, 'name'): + wsdl.location = stream.name + wsdl.load(document) + return wsdl + + def loadFromURL(self, url): + """Return a WSDL instance loaded from the given url.""" + document = DOM.loadFromURL(url) + wsdl = WSDL() + wsdl.location = url + wsdl.load(document) + return wsdl + + def loadFromString(self, data): + """Return a WSDL instance loaded from an xml string.""" + return self.loadFromStream(StringIO(data)) + + def loadFromFile(self, filename): + """Return a WSDL instance loaded from the given file.""" + file = open(filename, 'rb') + try: + wsdl = self.loadFromStream(file) + finally: + file.close() + return wsdl + +class WSDL: + """A WSDL object models a WSDL service description. WSDL objects + may be created manually or loaded from an xml representation + using a WSDLReader instance.""" + + def __init__(self, targetNamespace=None, strict=1): + self.targetNamespace = targetNamespace or 'urn:this-document.wsdl' + self.documentation = '' + self.location = None + self.document = None + self.name = None + self.services = CollectionNS(self) + self.messages = CollectionNS(self) + self.portTypes = CollectionNS(self) + self.bindings = CollectionNS(self) + #self.imports = Collection(self) + self.types = Types(self) + self.extensions = [] + self.strict = strict + + def __del__(self): + if self.document is not None: + self.document.unlink() + + version = '1.1' + + def addService(self, name, documentation='', targetNamespace=None): + if self.services.has_key(name): + raise WSDLError( + 'Duplicate service element: %s' % name + ) + item = Service(name, documentation) + if targetNamespace: + item.targetNamespace = targetNamespace + self.services[name] = item + return item + + def addMessage(self, name, documentation='', targetNamespace=None): + if self.messages.has_key(name): + raise WSDLError( + 'Duplicate message element: %s.' % name + ) + item = Message(name, documentation) + if targetNamespace: + item.targetNamespace = targetNamespace + self.messages[name] = item + return item + + def addPortType(self, name, documentation='', targetNamespace=None): + if self.portTypes.has_key(name): + raise WSDLError( + 'Duplicate portType element: name' + ) + item = PortType(name, documentation) + if targetNamespace: + item.targetNamespace = targetNamespace + self.portTypes[name] = item + return item + + def addBinding(self, name, type, documentation='', targetNamespace=None): + if self.bindings.has_key(name): + raise WSDLError( + 'Duplicate binding element: %s' % name + ) + item = Binding(name, type, documentation) + if targetNamespace: + item.targetNamespace = targetNamespace + self.bindings[name] = item + return item + + #def addImport(self, namespace, location): + # item = ImportElement(namespace, location) + # self.imports[namespace] = item + # return item + + def load(self, document): + # We save a reference to the DOM document to ensure that elements + # saved as "extensions" will continue to have a meaningful context + # for things like namespace references. The lifetime of the DOM + # document is bound to the lifetime of the WSDL instance. + self.document = document + + definitions = DOM.getElement(document, 'definitions', None, None) + if definitions is None: + raise WSDLError( + 'Missing element.' + ) + self.version = DOM.WSDLUriToVersion(definitions.namespaceURI) + NS_WSDL = DOM.GetWSDLUri(self.version) + + self.targetNamespace = DOM.getAttr(definitions, 'targetNamespace', + None, None) + self.name = DOM.getAttr(definitions, 'name', None, None) + self.documentation = GetDocumentation(definitions) + + # Resolve (recursively) any import elements in the document. + imported = {} + base_location = self.location + while 1: + #XXX + imports = [] + for element in DOM.getElements(definitions, 'import', NS_WSDL): + location = DOM.getAttr(element, 'location') + # Resolve relative location, and save + location = urllib.basejoin(base_location, location) + + if not imported.has_key(location): + imports.append(element) + + if not imports: + break + for element in imports: + location = DOM.getAttr(element, 'location') + self._import(document, element, base_location) + location = urllib.basejoin(base_location, location) + imported[location] = 1 + base_location = '' + + #reader = SchemaReader(base_url=self.location) + for element in DOM.getElements(definitions, None, None): + targetNamespace = DOM.getAttr(element, 'targetNamespace') + localName = element.localName + + if not DOM.nsUriMatch(element.namespaceURI, NS_WSDL): + if localName == 'schema': + reader = SchemaReader(base_url=self.location) + schema = reader.loadFromNode(WSDLToolsAdapter(self), element) + schema.setBaseUrl(self.location) + self.types.addSchema(schema) + else: + self.extensions.append(element) + continue + + elif localName == 'message': + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + message = self.addMessage(name, docs, targetNamespace) + parts = DOM.getElements(element, 'part', NS_WSDL) + message.load(parts) + continue + + elif localName == 'portType': + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + ptype = self.addPortType(name, docs, targetNamespace) + #operations = DOM.getElements(element, 'operation', NS_WSDL) + #ptype.load(operations) + ptype.load(element) + continue + + elif localName == 'binding': + name = DOM.getAttr(element, 'name') + type = DOM.getAttr(element, 'type', default=None) + if type is None: + raise WSDLError( + 'Missing type attribute for binding %s.' % name + ) + type = ParseQName(type, element) + docs = GetDocumentation(element) + binding = self.addBinding(name, type, docs, targetNamespace) + operations = DOM.getElements(element, 'operation', NS_WSDL) + binding.load(operations) + binding.load_ex(GetExtensions(element)) + continue + + elif localName == 'service': + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + service = self.addService(name, docs, targetNamespace) + ports = DOM.getElements(element, 'port', NS_WSDL) + service.load(ports) + service.load_ex(GetExtensions(element)) + continue + + elif localName == 'types': + self.types.documentation = GetDocumentation(element) + base_location = DOM.getAttr(element, 'base-location') + if base_location: + element.removeAttribute('base-location') + base_location = base_location or self.location + reader = SchemaReader(base_url=base_location) + for item in DOM.getElements(element, None, None): + if item.localName == 'schema': + schema = reader.loadFromNode(WSDLToolsAdapter(self), item) + # XXX could have been imported + #schema.setBaseUrl(self.location) + schema.setBaseUrl(base_location) + self.types.addSchema(schema) + else: + self.types.addExtension(item) + # XXX remove the attribute + # element.removeAttribute('base-location') + continue + + def _import(self, document, element, base_location=None): + '''Algo take element's children, clone them, + and add them to the main document. Support for relative + locations is a bit complicated. The orig document context + is lost, so we need to store base location in DOM elements + representing , by creating a special temporary + "base-location" attribute, and , by resolving + the relative "location" and storing it as "location". + + document -- document we are loading + element -- DOM Element representing + base_location -- location of document from which this + was gleaned. + ''' + namespace = DOM.getAttr(element, 'namespace', default=None) + location = DOM.getAttr(element, 'location', default=None) + if namespace is None or location is None: + raise WSDLError( + 'Invalid import element (missing namespace or location).' + ) + if base_location: + location = urllib.basejoin(base_location, location) + element.setAttributeNS(None, 'location', location) + + #location = urllib.basejoin(self.location, location) + #obimport = self.addImport(namespace, location) + #obimport._loaded = 1 + + importdoc = DOM.loadFromURL(location) + try: + if location.find('#') > -1: + idref = location.split('#')[-1] + imported = DOM.getElementById(importdoc, idref) + else: + imported = importdoc.documentElement + if imported is None: + raise WSDLError( + 'Import target element not found for: %s' % location + ) + + imported_tns = DOM.findTargetNS(imported) + if imported_tns != namespace: + return + + if imported.localName == 'definitions': + imported_nodes = imported.childNodes + else: + imported_nodes = [imported] + parent = element.parentNode + for node in imported_nodes: + if node.nodeType != node.ELEMENT_NODE: + continue + child = DOM.importNode(document, node, 1) + parent.appendChild(child) + child.setAttribute('targetNamespace', namespace) + attrsNS = imported._attrsNS + for attrkey in attrsNS.keys(): + if attrkey[0] == DOM.NS_XMLNS: + attr = attrsNS[attrkey].cloneNode(1) + child.setAttributeNode(attr) + + #XXX Quick Hack, should be in WSDL Namespace. + if child.localName == 'import': + rlocation = child.getAttributeNS(None, 'location') + alocation = urllib.basejoin(location, rlocation) + child.setAttribute('location', alocation) + elif child.localName == 'types': + child.setAttribute('base-location', location) + + finally: + importdoc.unlink() + return location + +class Element: + """A class that provides common functions for WSDL element classes.""" + def __init__(self, name=None, documentation=''): + self.name = name + self.documentation = documentation + self.extensions = [] + + def addExtension(self, item): + self.extensions.append(item) + + +class ImportElement(Element): + def __init__(self, namespace, location): + self.namespace = namespace + self.location = location + + _loaded = None + + +class Types(Collection): + default = lambda self,k: k.targetNamespace + def __init__(self, parent): + Collection.__init__(self, parent) + self.documentation = '' + self.extensions = [] + + def addSchema(self, schema): + name = schema.targetNamespace + self[name] = schema + return schema + + def addExtension(self, item): + self.extensions.append(item) + + +class Message(Element): + def __init__(self, name, documentation=''): + Element.__init__(self, name, documentation) + self.parts = Collection(self) + + def addPart(self, name, type=None, element=None): + if self.parts.has_key(name): + raise WSDLError( + 'Duplicate message part element: %s' % name + ) + if type is None and element is None: + raise WSDLError( + 'Missing type or element attribute for part: %s' % name + ) + item = MessagePart(name) + item.element = element + item.type = type + self.parts[name] = item + return item + + def load(self, elements): + for element in elements: + name = DOM.getAttr(element, 'name') + part = MessagePart(name) + self.parts[name] = part + elemref = DOM.getAttr(element, 'element', default=None) + typeref = DOM.getAttr(element, 'type', default=None) + if typeref is None and elemref is None: + raise WSDLError( + 'No type or element attribute for part: %s' % name + ) + if typeref is not None: + part.type = ParseTypeRef(typeref, element) + if elemref is not None: + part.element = ParseTypeRef(elemref, element) + + +class MessagePart(Element): + def __init__(self, name): + Element.__init__(self, name, '') + self.element = None + self.type = None + + def getWSDL(self): + """Return the WSDL object that contains this Message Part.""" + return self.parent().parent().parent().parent() + + def getTypeDefinition(self): + wsdl = self.getWSDL() + nsuri,name = self.type + schema = wsdl.types.get(nsuri, {}) + return schema.get(name) + + def getElementDeclaration(self): + wsdl = self.getWSDL() + nsuri,name = self.element + schema = wsdl.types.get(nsuri, {}) + return schema.get(name) + + +class PortType(Element): + '''PortType has a anyAttribute, thus must provide for an extensible + mechanism for supporting such attributes. ResourceProperties is + specified in WS-ResourceProperties. wsa:Action is specified in + WS-Address. + + Instance Data: + name -- name attribute + resourceProperties -- optional. wsr:ResourceProperties attribute, + value is a QName this is Parsed into a (namespaceURI, name) + that represents a Global Element Declaration. + operations + ''' + + def __init__(self, name, documentation=''): + Element.__init__(self, name, documentation) + self.operations = Collection(self) + self.resourceProperties = None + + def getWSDL(self): + return self.parent().parent() + + def getResourceProperties(self): + return self.resourceProperties + + def addOperation(self, name, documentation='', parameterOrder=None): + item = Operation(name, documentation, parameterOrder) + self.operations[name] = item + return item + + def load(self, element): + self.name = DOM.getAttr(element, 'name') + self.documentation = GetDocumentation(element) + + if DOM.hasAttr(element, 'ResourceProperties', WSR.PROPERTIES): + rpref = DOM.getAttr(element, 'ResourceProperties', WSR.PROPERTIES) + self.resourceProperties = ParseQName(rpref, element) + + NS_WSDL = DOM.GetWSDLUri(self.getWSDL().version) + elements = DOM.getElements(element, 'operation', NS_WSDL) + for element in elements: + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + param_order = DOM.getAttr(element, 'parameterOrder', default=None) + if param_order is not None: + param_order = param_order.split(' ') + operation = self.addOperation(name, docs, param_order) + + item = DOM.getElement(element, 'input', None, None) + if item is not None: + name = DOM.getAttr(item, 'name') + docs = GetDocumentation(item) + msgref = DOM.getAttr(item, 'message') + message = ParseQName(msgref, item) + action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) + operation.setInput(message, name, docs, action) + + item = DOM.getElement(element, 'output', None, None) + if item is not None: + name = DOM.getAttr(item, 'name') + docs = GetDocumentation(item) + msgref = DOM.getAttr(item, 'message') + message = ParseQName(msgref, item) + action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) + operation.setOutput(message, name, docs, action) + + for item in DOM.getElements(element, 'fault', None): + name = DOM.getAttr(item, 'name') + docs = GetDocumentation(item) + msgref = DOM.getAttr(item, 'message') + message = ParseQName(msgref, item) + action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) + operation.addFault(message, name, docs, action) + + + +class Operation(Element): + def __init__(self, name, documentation='', parameterOrder=None): + Element.__init__(self, name, documentation) + self.parameterOrder = parameterOrder + self.faults = Collection(self) + self.input = None + self.output = None + + def getPortType(self): + return self.parent().parent() + + def getInputAction(self): + """wsa:Action attribute""" + return GetWSAActionInput(self) + + def getInputMessage(self): + if self.input is None: + return None + wsdl = self.getPortType().getWSDL() + return wsdl.messages[self.input.message] + + def getOutputAction(self): + """wsa:Action attribute""" + return GetWSAActionOutput(self) + + def getOutputMessage(self): + if self.output is None: + return None + wsdl = self.getPortType().getWSDL() + return wsdl.messages[self.output.message] + + def getFaultAction(self, name): + """wsa:Action attribute""" + return GetWSAActionFault(self, name) + + def getFaultMessage(self, name): + wsdl = self.getPortType().getWSDL() + return wsdl.messages[self.faults[name].message] + + def addFault(self, message, name, documentation='', action=None): + if self.faults.has_key(name): + raise WSDLError( + 'Duplicate fault element: %s' % name + ) + item = MessageRole('fault', message, name, documentation, action) + self.faults[name] = item + return item + + def setInput(self, message, name='', documentation='', action=None): + self.input = MessageRole('input', message, name, documentation, action) + return self.input + + def setOutput(self, message, name='', documentation='', action=None): + self.output = MessageRole('output', message, name, documentation, action) + return self.output + + +class MessageRole(Element): + def __init__(self, type, message, name='', documentation='', action=None): + Element.__init__(self, name, documentation) + self.message = message + self.type = type + self.action = action + + +class Binding(Element): + def __init__(self, name, type, documentation=''): + Element.__init__(self, name, documentation) + self.operations = Collection(self) + self.type = type + + def getWSDL(self): + """Return the WSDL object that contains this binding.""" + return self.parent().parent() + + def getPortType(self): + """Return the PortType object associated with this binding.""" + return self.getWSDL().portTypes[self.type] + + def findBinding(self, kind): + for item in self.extensions: + if isinstance(item, kind): + return item + return None + + def findBindings(self, kind): + return [ item for item in self.extensions if isinstance(item, kind) ] + + def addOperationBinding(self, name, documentation=''): + item = OperationBinding(name, documentation) + self.operations[name] = item + return item + + def load(self, elements): + for element in elements: + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + opbinding = self.addOperationBinding(name, docs) + opbinding.load_ex(GetExtensions(element)) + + item = DOM.getElement(element, 'input', None, None) + if item is not None: + mbinding = MessageRoleBinding('input') + mbinding.documentation = GetDocumentation(item) + opbinding.input = mbinding + mbinding.load_ex(GetExtensions(item)) + + item = DOM.getElement(element, 'output', None, None) + if item is not None: + mbinding = MessageRoleBinding('output') + mbinding.documentation = GetDocumentation(item) + opbinding.output = mbinding + mbinding.load_ex(GetExtensions(item)) + + for item in DOM.getElements(element, 'fault', None): + name = DOM.getAttr(item, 'name') + mbinding = MessageRoleBinding('fault', name) + mbinding.documentation = GetDocumentation(item) + opbinding.faults[name] = mbinding + mbinding.load_ex(GetExtensions(item)) + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_SOAP_BINDING_ALL and name == 'binding': + transport = DOM.getAttr(e, 'transport', default=None) + style = DOM.getAttr(e, 'style', default='document') + ob = SoapBinding(transport, style) + self.addExtension(ob) + continue + elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'binding': + verb = DOM.getAttr(e, 'verb') + ob = HttpBinding(verb) + self.addExtension(ob) + continue + else: + self.addExtension(e) + + +class OperationBinding(Element): + def __init__(self, name, documentation=''): + Element.__init__(self, name, documentation) + self.input = None + self.output = None + self.faults = Collection(self) + + def getBinding(self): + """Return the parent Binding object of the operation binding.""" + return self.parent().parent() + + def getOperation(self): + """Return the abstract Operation associated with this binding.""" + return self.getBinding().getPortType().operations[self.name] + + def findBinding(self, kind): + for item in self.extensions: + if isinstance(item, kind): + return item + return None + + def findBindings(self, kind): + return [ item for item in self.extensions if isinstance(item, kind) ] + + def addInputBinding(self, binding): + if self.input is None: + self.input = MessageRoleBinding('input') + self.input.addExtension(binding) + return binding + + def addOutputBinding(self, binding): + if self.output is None: + self.output = MessageRoleBinding('output') + self.output.addExtension(binding) + return binding + + def addFaultBinding(self, name, binding): + fault = self.get(name, None) + if fault is None: + fault = MessageRoleBinding('fault', name) + fault.addExtension(binding) + return binding + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_SOAP_BINDING_ALL and name == 'operation': + soapaction = DOM.getAttr(e, 'soapAction', default=None) + style = DOM.getAttr(e, 'style', default=None) + ob = SoapOperationBinding(soapaction, style) + self.addExtension(ob) + continue + elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'operation': + location = DOM.getAttr(e, 'location') + ob = HttpOperationBinding(location) + self.addExtension(ob) + continue + else: + self.addExtension(e) + + +class MessageRoleBinding(Element): + def __init__(self, type, name='', documentation=''): + Element.__init__(self, name, documentation) + self.type = type + + def findBinding(self, kind): + for item in self.extensions: + if isinstance(item, kind): + return item + return None + + def findBindings(self, kind): + return [ item for item in self.extensions if isinstance(item, kind) ] + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_SOAP_BINDING_ALL and name == 'body': + encstyle = DOM.getAttr(e, 'encodingStyle', default=None) + namespace = DOM.getAttr(e, 'namespace', default=None) + parts = DOM.getAttr(e, 'parts', default=None) + use = DOM.getAttr(e, 'use', default=None) + if use is None: + raise WSDLError( + 'Invalid soap:body binding element.' + ) + ob = SoapBodyBinding(use, namespace, encstyle, parts) + self.addExtension(ob) + continue + + elif ns in DOM.NS_SOAP_BINDING_ALL and name == 'fault': + encstyle = DOM.getAttr(e, 'encodingStyle', default=None) + namespace = DOM.getAttr(e, 'namespace', default=None) + name = DOM.getAttr(e, 'name', default=None) + use = DOM.getAttr(e, 'use', default=None) + if use is None or name is None: + raise WSDLError( + 'Invalid soap:fault binding element.' + ) + ob = SoapFaultBinding(name, use, namespace, encstyle) + self.addExtension(ob) + continue + + elif ns in DOM.NS_SOAP_BINDING_ALL and name in ( + 'header', 'headerfault' + ): + encstyle = DOM.getAttr(e, 'encodingStyle', default=None) + namespace = DOM.getAttr(e, 'namespace', default=None) + message = DOM.getAttr(e, 'message') + part = DOM.getAttr(e, 'part') + use = DOM.getAttr(e, 'use') + if name == 'header': + _class = SoapHeaderBinding + else: + _class = SoapHeaderFaultBinding + message = ParseQName(message, e) + ob = _class(message, part, use, namespace, encstyle) + self.addExtension(ob) + continue + + elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'urlReplacement': + ob = HttpUrlReplacementBinding() + self.addExtension(ob) + continue + + elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'urlEncoded': + ob = HttpUrlEncodedBinding() + self.addExtension(ob) + continue + + elif ns in DOM.NS_MIME_BINDING_ALL and name == 'multipartRelated': + ob = MimeMultipartRelatedBinding() + self.addExtension(ob) + ob.load_ex(GetExtensions(e)) + continue + + elif ns in DOM.NS_MIME_BINDING_ALL and name == 'content': + part = DOM.getAttr(e, 'part', default=None) + type = DOM.getAttr(e, 'type', default=None) + ob = MimeContentBinding(part, type) + self.addExtension(ob) + continue + + elif ns in DOM.NS_MIME_BINDING_ALL and name == 'mimeXml': + part = DOM.getAttr(e, 'part', default=None) + ob = MimeXmlBinding(part) + self.addExtension(ob) + continue + + else: + self.addExtension(e) + + +class Service(Element): + def __init__(self, name, documentation=''): + Element.__init__(self, name, documentation) + self.ports = Collection(self) + + def getWSDL(self): + return self.parent().parent() + + def addPort(self, name, binding, documentation=''): + item = Port(name, binding, documentation) + self.ports[name] = item + return item + + def load(self, elements): + for element in elements: + name = DOM.getAttr(element, 'name', default=None) + docs = GetDocumentation(element) + binding = DOM.getAttr(element, 'binding', default=None) + if name is None or binding is None: + raise WSDLError( + 'Invalid port element.' + ) + binding = ParseQName(binding, element) + port = self.addPort(name, binding, docs) + port.load_ex(GetExtensions(element)) + + def load_ex(self, elements): + for e in elements: + self.addExtension(e) + + +class Port(Element): + def __init__(self, name, binding, documentation=''): + Element.__init__(self, name, documentation) + self.binding = binding + + def getService(self): + """Return the Service object associated with this port.""" + return self.parent().parent() + + def getBinding(self): + """Return the Binding object that is referenced by this port.""" + wsdl = self.getService().getWSDL() + return wsdl.bindings[self.binding] + + def getPortType(self): + """Return the PortType object that is referenced by this port.""" + wsdl = self.getService().getWSDL() + binding = wsdl.bindings[self.binding] + return wsdl.portTypes[binding.type] + + def getAddressBinding(self): + """A convenience method to obtain the extension element used + as the address binding for the port, or None if undefined.""" + for item in self.extensions: + if isinstance(item, SoapAddressBinding) or \ + isinstance(item, HttpAddressBinding): + return item + raise WSDLError( + 'No address binding found in port.' + ) + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_SOAP_BINDING_ALL and name == 'address': + location = DOM.getAttr(e, 'location', default=None) + ob = SoapAddressBinding(location) + self.addExtension(ob) + continue + elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'address': + location = DOM.getAttr(e, 'location', default=None) + ob = HttpAddressBinding(location) + self.addExtension(ob) + continue + else: + self.addExtension(e) + + +class SoapBinding: + def __init__(self, transport, style='rpc'): + self.transport = transport + self.style = style + + +class SoapAddressBinding: + def __init__(self, location): + self.location = location + + +class SoapOperationBinding: + def __init__(self, soapAction=None, style=None): + self.soapAction = soapAction + self.style = style + + +class SoapBodyBinding: + def __init__(self, use, namespace=None, encodingStyle=None, parts=None): + if not use in ('literal', 'encoded'): + raise WSDLError( + 'Invalid use attribute value: %s' % use + ) + self.encodingStyle = encodingStyle + self.namespace = namespace + if type(parts) in (type(''), type(u'')): + parts = parts.split() + self.parts = parts + self.use = use + +class SoapFaultBinding: + def __init__(self, name, use, namespace=None, encodingStyle=None): + if not use in ('literal', 'encoded'): + raise WSDLError( + 'Invalid use attribute value: %s' % use + ) + self.encodingStyle = encodingStyle + self.namespace = namespace + self.name = name + self.use = use + + +class SoapHeaderBinding: + def __init__(self, message, part, use, namespace=None, encodingStyle=None): + if not use in ('literal', 'encoded'): + raise WSDLError( + 'Invalid use attribute value: %s' % use + ) + self.encodingStyle = encodingStyle + self.namespace = namespace + self.message = message + self.part = part + self.use = use + + tagname = 'header' + +class SoapHeaderFaultBinding(SoapHeaderBinding): + tagname = 'headerfault' + + +class HttpBinding: + def __init__(self, verb): + self.verb = verb + +class HttpAddressBinding: + def __init__(self, location): + self.location = location + + +class HttpOperationBinding: + def __init__(self, location): + self.location = location + +class HttpUrlReplacementBinding: + pass + + +class HttpUrlEncodedBinding: + pass + + +class MimeContentBinding: + def __init__(self, part=None, type=None): + self.part = part + self.type = type + + +class MimeXmlBinding: + def __init__(self, part=None): + self.part = part + + +class MimeMultipartRelatedBinding: + def __init__(self): + self.parts = [] + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_MIME_BINDING_ALL and name == 'part': + self.parts.append(MimePartBinding()) + continue + + +class MimePartBinding: + def __init__(self): + self.items = [] + + def load_ex(self, elements): + for e in elements: + ns, name = e.namespaceURI, e.localName + if ns in DOM.NS_MIME_BINDING_ALL and name == 'content': + part = DOM.getAttr(e, 'part', default=None) + type = DOM.getAttr(e, 'type', default=None) + ob = MimeContentBinding(part, type) + self.items.append(ob) + continue + + elif ns in DOM.NS_MIME_BINDING_ALL and name == 'mimeXml': + part = DOM.getAttr(e, 'part', default=None) + ob = MimeXmlBinding(part) + self.items.append(ob) + continue + + elif ns in DOM.NS_SOAP_BINDING_ALL and name == 'body': + encstyle = DOM.getAttr(e, 'encodingStyle', default=None) + namespace = DOM.getAttr(e, 'namespace', default=None) + parts = DOM.getAttr(e, 'parts', default=None) + use = DOM.getAttr(e, 'use', default=None) + if use is None: + raise WSDLError( + 'Invalid soap:body binding element.' + ) + ob = SoapBodyBinding(use, namespace, encstyle, parts) + self.items.append(ob) + continue + + +class WSDLError(Exception): + pass + + + +def DeclareNSPrefix(writer, prefix, nsuri): + if writer.hasNSPrefix(nsuri): + return + writer.declareNSPrefix(prefix, nsuri) + +def ParseTypeRef(value, element): + parts = value.split(':', 1) + if len(parts) == 1: + return (DOM.findTargetNS(element), value) + nsuri = DOM.findNamespaceURI(parts[0], element) + return (nsuri, parts[1]) + +def ParseQName(value, element): + nameref = value.split(':', 1) + if len(nameref) == 2: + nsuri = DOM.findNamespaceURI(nameref[0], element) + name = nameref[-1] + else: + nsuri = DOM.findTargetNS(element) + name = nameref[-1] + return nsuri, name + +def GetDocumentation(element): + docnode = DOM.getElement(element, 'documentation', None, None) + if docnode is not None: + return DOM.getElementText(docnode) + return '' + +def GetExtensions(element): + return [ item for item in DOM.getElements(element, None, None) + if item.namespaceURI != DOM.NS_WSDL ] + +def GetWSAActionFault(operation, name): + """Find wsa:Action attribute, and return value or WSA.FAULT + for the default. + """ + attr = operation.faults[name].action + if attr is not None: + return attr + return WSA.FAULT + +def GetWSAActionInput(operation): + """Find wsa:Action attribute, and return value or the default.""" + attr = operation.input.action + if attr is not None: + return attr + portType = operation.getPortType() + targetNamespace = portType.getWSDL().targetNamespace + ptName = portType.name + msgName = operation.input.name + if not msgName: + msgName = operation.name + 'Request' + if targetNamespace.endswith('/'): + return '%s%s/%s' %(targetNamespace, ptName, msgName) + return '%s/%s/%s' %(targetNamespace, ptName, msgName) + +def GetWSAActionOutput(operation): + """Find wsa:Action attribute, and return value or the default.""" + attr = operation.output.action + if attr is not None: + return attr + targetNamespace = operation.getPortType().getWSDL().targetNamespace + ptName = operation.getPortType().name + msgName = operation.output.name + if not msgName: + msgName = operation.name + 'Response' + if targetNamespace.endswith('/'): + return '%s%s/%s' %(targetNamespace, ptName, msgName) + return '%s/%s/%s' %(targetNamespace, ptName, msgName) + +def FindExtensions(object, kind, t_type=type(())): + if isinstance(kind, t_type): + result = [] + namespaceURI, name = kind + return [ item for item in object.extensions + if hasattr(item, 'nodeType') \ + and DOM.nsUriMatch(namespaceURI, item.namespaceURI) \ + and item.name == name ] + return [ item for item in object.extensions if isinstance(item, kind) ] + +def FindExtension(object, kind, t_type=type(())): + if isinstance(kind, t_type): + namespaceURI, name = kind + for item in object.extensions: + if hasattr(item, 'nodeType') \ + and DOM.nsUriMatch(namespaceURI, item.namespaceURI) \ + and item.name == name: + return item + else: + for item in object.extensions: + if isinstance(item, kind): + return item + return None + + +class SOAPCallInfo: + """SOAPCallInfo captures the important binding information about a + SOAP operation, in a structure that is easier to work with than + raw WSDL structures.""" + + def __init__(self, methodName): + self.methodName = methodName + self.inheaders = [] + self.outheaders = [] + self.inparams = [] + self.outparams = [] + self.retval = None + + encodingStyle = DOM.NS_SOAP_ENC + documentation = '' + soapAction = None + transport = None + namespace = None + location = None + use = 'encoded' + style = 'rpc' + + def addInParameter(self, name, type, namespace=None, element_type=0): + """Add an input parameter description to the call info.""" + parameter = ParameterInfo(name, type, namespace, element_type) + self.inparams.append(parameter) + return parameter + + def addOutParameter(self, name, type, namespace=None, element_type=0): + """Add an output parameter description to the call info.""" + parameter = ParameterInfo(name, type, namespace, element_type) + self.outparams.append(parameter) + return parameter + + def setReturnParameter(self, name, type, namespace=None, element_type=0): + """Set the return parameter description for the call info.""" + parameter = ParameterInfo(name, type, namespace, element_type) + self.retval = parameter + return parameter + + def addInHeaderInfo(self, name, type, namespace, element_type=0, + mustUnderstand=0): + """Add an input SOAP header description to the call info.""" + headerinfo = HeaderInfo(name, type, namespace, element_type) + if mustUnderstand: + headerinfo.mustUnderstand = 1 + self.inheaders.append(headerinfo) + return headerinfo + + def addOutHeaderInfo(self, name, type, namespace, element_type=0, + mustUnderstand=0): + """Add an output SOAP header description to the call info.""" + headerinfo = HeaderInfo(name, type, namespace, element_type) + if mustUnderstand: + headerinfo.mustUnderstand = 1 + self.outheaders.append(headerinfo) + return headerinfo + + def getInParameters(self): + """Return a sequence of the in parameters of the method.""" + return self.inparams + + def getOutParameters(self): + """Return a sequence of the out parameters of the method.""" + return self.outparams + + def getReturnParameter(self): + """Return param info about the return value of the method.""" + return self.retval + + def getInHeaders(self): + """Return a sequence of the in headers of the method.""" + return self.inheaders + + def getOutHeaders(self): + """Return a sequence of the out headers of the method.""" + return self.outheaders + + +class ParameterInfo: + """A ParameterInfo object captures parameter binding information.""" + def __init__(self, name, type, namespace=None, element_type=0): + if element_type: + self.element_type = 1 + if namespace is not None: + self.namespace = namespace + self.name = name + self.type = type + + element_type = 0 + namespace = None + default = None + + +class HeaderInfo(ParameterInfo): + """A HeaderInfo object captures SOAP header binding information.""" + def __init__(self, name, type, namespace, element_type=None): + ParameterInfo.__init__(self, name, type, namespace, element_type) + + mustUnderstand = 0 + actor = None + + +def callInfoFromWSDL(port, name): + """Return a SOAPCallInfo given a WSDL port and operation name.""" + wsdl = port.getService().getWSDL() + binding = port.getBinding() + portType = binding.getPortType() + operation = portType.operations[name] + opbinding = binding.operations[name] + messages = wsdl.messages + callinfo = SOAPCallInfo(name) + + addrbinding = port.getAddressBinding() + if not isinstance(addrbinding, SoapAddressBinding): + raise ValueError, 'Unsupported binding type.' + callinfo.location = addrbinding.location + + soapbinding = binding.findBinding(SoapBinding) + if soapbinding is None: + raise ValueError, 'Missing soap:binding element.' + callinfo.transport = soapbinding.transport + callinfo.style = soapbinding.style or 'document' + + soap_op_binding = opbinding.findBinding(SoapOperationBinding) + if soap_op_binding is not None: + callinfo.soapAction = soap_op_binding.soapAction + callinfo.style = soap_op_binding.style or callinfo.style + + parameterOrder = operation.parameterOrder + + if operation.input is not None: + message = messages[operation.input.message] + msgrole = opbinding.input + + mime = msgrole.findBinding(MimeMultipartRelatedBinding) + if mime is not None: + raise ValueError, 'Mime bindings are not supported.' + else: + for item in msgrole.findBindings(SoapHeaderBinding): + part = messages[item.message].parts[item.part] + header = callinfo.addInHeaderInfo( + part.name, + part.element or part.type, + item.namespace, + element_type = part.element and 1 or 0 + ) + header.encodingStyle = item.encodingStyle + + body = msgrole.findBinding(SoapBodyBinding) + if body is None: + raise ValueError, 'Missing soap:body binding.' + callinfo.encodingStyle = body.encodingStyle + callinfo.namespace = body.namespace + callinfo.use = body.use + + if body.parts is not None: + parts = [] + for name in body.parts: + parts.append(message.parts[name]) + else: + parts = message.parts.values() + + for part in parts: + callinfo.addInParameter( + part.name, + part.element or part.type, + element_type = part.element and 1 or 0 + ) + + if operation.output is not None: + try: + message = messages[operation.output.message] + except KeyError: + if self.strict: + raise RuntimeError( + "Recieved message not defined in the WSDL schema: %s" % + operation.output.message) + else: + message = wsdl.addMessage(operation.output.message) + print "Warning:", \ + "Recieved message not defined in the WSDL schema.", \ + "Adding it." + print "Message:", operation.output.message + + msgrole = opbinding.output + + mime = msgrole.findBinding(MimeMultipartRelatedBinding) + if mime is not None: + raise ValueError, 'Mime bindings are not supported.' + else: + for item in msgrole.findBindings(SoapHeaderBinding): + part = messages[item.message].parts[item.part] + header = callinfo.addOutHeaderInfo( + part.name, + part.element or part.type, + item.namespace, + element_type = part.element and 1 or 0 + ) + header.encodingStyle = item.encodingStyle + + body = msgrole.findBinding(SoapBodyBinding) + if body is None: + raise ValueError, 'Missing soap:body binding.' + callinfo.encodingStyle = body.encodingStyle + callinfo.namespace = body.namespace + callinfo.use = body.use + + if body.parts is not None: + parts = [] + for name in body.parts: + parts.append(message.parts[name]) + else: + parts = message.parts.values() + + if parts: + # XXX no idea what this is for, but it breaks everything. jrb + #callinfo.setReturnParameter( + # parts[0].name, + # parts[0].element or parts[0].type, + # element_type = parts[0].element and 1 or 0 + # ) + #for part in parts[1:]: + for part in parts: + callinfo.addOutParameter( + part.name, + part.element or part.type, + element_type = part.element and 1 or 0 + ) + + return callinfo diff --git a/SOAPpy/wstools/XMLSchema.py b/SOAPpy/wstools/XMLSchema.py new file mode 100755 index 0000000..aaaaffc --- /dev/null +++ b/SOAPpy/wstools/XMLSchema.py @@ -0,0 +1,2976 @@ +# Copyright (c) 2003, The Regents of the University of California, +# through Lawrence Berkeley National Laboratory (subject to receipt of +# any required approvals from the U.S. Dept. of Energy). All rights +# reserved. +# +# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. + +ident = "$Id: XMLSchema.py,v 1.38 2004/06/23 20:10:26 boverhof Exp $" + +import types, weakref, urllib, sys +from threading import RLock +from Namespaces import XMLNS +from Utility import DOM, DOMException, Collection, SplitQName +from StringIO import StringIO + +def GetSchema(component): + """convience function for finding the parent XMLSchema instance. + """ + parent = component + while not isinstance(parent, XMLSchema): + parent = parent._parent() + return parent + +class SchemaReader: + """A SchemaReader creates XMLSchema objects from urls and xml data. + """ + def __init__(self, domReader=None, base_url=None): + """domReader -- class must implement DOMAdapterInterface + base_url -- base url string + """ + self.__base_url = base_url + self.__readerClass = domReader + if not self.__readerClass: + self.__readerClass = DOMAdapter + self._includes = {} + self._imports = {} + + def __setImports(self, schema): + """Add dictionary of imports to schema instance. + schema -- XMLSchema instance + """ + for ns,val in schema.imports.items(): + if self._imports.has_key(ns): + schema.addImportSchema(self._imports[ns]) + + def __setIncludes(self, schema): + """Add dictionary of includes to schema instance. + schema -- XMLSchema instance + """ + for schemaLocation, val in schema.includes.items(): + if self._includes.has_key(schemaLocation): + schema.addIncludeSchema(self._imports[schemaLocation]) + + def addSchemaByLocation(self, location, schema): + """provide reader with schema document for a location. + """ + self._includes[location] = schema + + def addSchemaByNamespace(self, schema): + """provide reader with schema document for a targetNamespace. + """ + self._imports[schema.targetNamespace] = schema + + def loadFromNode(self, parent, element): + """element -- DOM node or document + parent -- WSDLAdapter instance + """ + reader = self.__readerClass(element) + schema = XMLSchema(parent) + #HACK to keep a reference + schema.wsdl = parent + schema.setBaseUrl(self.__base_url) + schema.load(reader) + return schema + + def loadFromStream(self, file): + """Return an XMLSchema instance loaded from a file object. + file -- file object + """ + reader = self.__readerClass() + reader.loadDocument(file) + schema = XMLSchema() + schema.setBaseUrl(self.__base_url) + schema.load(reader) + self.__setIncludes(schema) + self.__setImports(schema) + return schema + + def loadFromString(self, data): + """Return an XMLSchema instance loaded from an XML string. + data -- XML string + """ + return self.loadFromStream(StringIO(data)) + + def loadFromURL(self, url): + """Return an XMLSchema instance loaded from the given url. + url -- URL to dereference + """ + if not url.endswith('xsd'): + raise SchemaError, 'unknown file type %s' %url + reader = self.__readerClass() + if self.__base_url: + url = urllib.basejoin(self.__base_url,url) + reader.loadFromURL(url) + schema = XMLSchema() + schema.setBaseUrl(self.__base_url) + schema.load(reader) + self.__setIncludes(schema) + self.__setImports(schema) + return schema + + def loadFromFile(self, filename): + """Return an XMLSchema instance loaded from the given file. + filename -- name of file to open + """ + file = open(filename, 'rb') + try: schema = self.loadFromStream(file) + finally: file.close() + return schema + + +class SchemaError(Exception): + pass + +########################### +# DOM Utility Adapters +########################## +class DOMAdapterInterface: + def hasattr(self, attr, ns=None): + """return true if node has attribute + attr -- attribute to check for + ns -- namespace of attribute, by default None + """ + raise NotImplementedError, 'adapter method not implemented' + + def getContentList(self, *contents): + """returns an ordered list of child nodes + *contents -- list of node names to return + """ + raise NotImplementedError, 'adapter method not implemented' + + def setAttributeDictionary(self, attributes): + """set attribute dictionary + """ + raise NotImplementedError, 'adapter method not implemented' + + def getAttributeDictionary(self): + """returns a dict of node's attributes + """ + raise NotImplementedError, 'adapter method not implemented' + + def getNamespace(self, prefix): + """returns namespace referenced by prefix. + """ + raise NotImplementedError, 'adapter method not implemented' + + def getTagName(self): + """returns tagName of node + """ + raise NotImplementedError, 'adapter method not implemented' + + + def getParentNode(self): + """returns parent element in DOMAdapter or None + """ + raise NotImplementedError, 'adapter method not implemented' + + def loadDocument(self, file): + """load a Document from a file object + file -- + """ + raise NotImplementedError, 'adapter method not implemented' + + def loadFromURL(self, url): + """load a Document from an url + url -- URL to dereference + """ + raise NotImplementedError, 'adapter method not implemented' + + +class DOMAdapter(DOMAdapterInterface): + """Adapter for ZSI.Utility.DOM + """ + def __init__(self, node=None): + """Reset all instance variables. + element -- DOM document, node, or None + """ + if hasattr(node, 'documentElement'): + self.__node = node.documentElement + else: + self.__node = node + self.__attributes = None + + def hasattr(self, attr, ns=None): + """attr -- attribute + ns -- optional namespace, None means unprefixed attribute. + """ + if not self.__attributes: + self.setAttributeDictionary() + if ns: + return self.__attributes.get(ns,{}).has_key(attr) + return self.__attributes.has_key(attr) + + def getContentList(self, *contents): + nodes = [] + ELEMENT_NODE = self.__node.ELEMENT_NODE + for child in DOM.getElements(self.__node, None): + if child.nodeType == ELEMENT_NODE and\ + SplitQName(child.tagName)[1] in contents: + nodes.append(child) + return map(self.__class__, nodes) + + def setAttributeDictionary(self): + self.__attributes = {} + for v in self.__node._attrs.values(): + self.__attributes[v.nodeName] = v.nodeValue + + def getAttributeDictionary(self): + if not self.__attributes: + self.setAttributeDictionary() + return self.__attributes + + def getTagName(self): + return self.__node.tagName + + def getParentNode(self): + if self.__node.parentNode.nodeType == self.__node.ELEMENT_NODE: + return DOMAdapter(self.__node.parentNode) + return None + + def getNamespace(self, prefix): + """prefix -- deference namespace prefix in node's context. + Ascends parent nodes until found. + """ + namespace = None + if prefix == 'xmlns': + namespace = DOM.findDefaultNS(prefix, self.__node) + else: + try: + namespace = DOM.findNamespaceURI(prefix, self.__node) + except DOMException, ex: + if prefix != 'xml': + raise SchemaError, '%s namespace not declared for %s'\ + %(prefix, self.__node._get_tagName()) + namespace = XMLNS.XML + return namespace + + def loadDocument(self, file): + self.__node = DOM.loadDocument(file) + if hasattr(self.__node, 'documentElement'): + self.__node = self.__node.documentElement + + def loadFromURL(self, url): + self.__node = DOM.loadFromURL(url) + if hasattr(self.__node, 'documentElement'): + self.__node = self.__node.documentElement + + +class XMLBase: + """ These class variables are for string indentation. + """ + __indent = 0 + __rlock = RLock() + + def __str__(self): + XMLBase.__rlock.acquire() + XMLBase.__indent += 1 + tmp = "<" + str(self.__class__) + '>\n' + for k,v in self.__dict__.items(): + tmp += "%s* %s = %s\n" %(XMLBase.__indent*' ', k, v) + XMLBase.__indent -= 1 + XMLBase.__rlock.release() + return tmp + + +"""Marker Interface: can determine something about an instances properties by using + the provided convenience functions. + +""" +class DefinitionMarker: + """marker for definitions + """ + pass + +class DeclarationMarker: + """marker for declarations + """ + pass + +class AttributeMarker: + """marker for attributes + """ + pass + +class AttributeGroupMarker: + """marker for attribute groups + """ + pass + +class WildCardMarker: + """marker for wildcards + """ + pass + +class ElementMarker: + """marker for wildcards + """ + pass + +class ReferenceMarker: + """marker for references + """ + pass + +class ModelGroupMarker: + """marker for model groups + """ + pass + +class ExtensionMarker: + """marker for extensions + """ + pass + +class RestrictionMarker: + """marker for restrictions + """ + facets = ['enumeration', 'length', 'maxExclusive', 'maxInclusive',\ + 'maxLength', 'minExclusive', 'minInclusive', 'minLength',\ + 'pattern', 'fractionDigits', 'totalDigits', 'whiteSpace'] + +class SimpleMarker: + """marker for simple type information + """ + pass + +class ComplexMarker: + """marker for complex type information + """ + pass + +class LocalMarker: + """marker for complex type information + """ + pass + + +class MarkerInterface: + def isDefinition(self): + return isinstance(self, DefinitionMarker) + + def isDeclaration(self): + return isinstance(self, DeclarationMarker) + + def isAttribute(self): + return isinstance(self, AttributeMarker) + + def isAttributeGroup(self): + return isinstance(self, AttributeGroupMarker) + + def isElement(self): + return isinstance(self, ElementMarker) + + def isReference(self): + return isinstance(self, ReferenceMarker) + + def isWildCard(self): + return isinstance(self, WildCardMarker) + + def isModelGroup(self): + return isinstance(self, ModelGroupMarker) + + def isExtension(self): + return isinstance(self, ExtensionMarker) + + def isRestriction(self): + return isinstance(self, RestrictionMarker) + + def isSimple(self): + return isinstance(self, SimpleMarker) + + def isComplex(self): + return isinstance(self, ComplexMarker) + + def isLocal(self): + return isinstance(self, LocalMarker) + + +########################################################## +# Schema Components +######################################################### +class XMLSchemaComponent(XMLBase, MarkerInterface): + """ + class variables: + required -- list of required attributes + attributes -- dict of default attribute values, including None. + Value can be a function for runtime dependencies. + contents -- dict of namespace keyed content lists. + 'xsd' content of xsd namespace. + xmlns_key -- key for declared xmlns namespace. + xmlns -- xmlns is special prefix for namespace dictionary + xml -- special xml prefix for xml namespace. + """ + required = [] + attributes = {} + contents = {} + xmlns_key = '' + xmlns = 'xmlns' + xml = 'xml' + + def __init__(self, parent=None): + """parent -- parent instance + instance variables: + attributes -- dictionary of node's attributes + """ + self.attributes = None + self._parent = parent + if self._parent: + self._parent = weakref.ref(parent) + + if not self.__class__ == XMLSchemaComponent\ + and not (type(self.__class__.required) == type(XMLSchemaComponent.required)\ + and type(self.__class__.attributes) == type(XMLSchemaComponent.attributes)\ + and type(self.__class__.contents) == type(XMLSchemaComponent.contents)): + raise RuntimeError, 'Bad type for a class variable in %s' %self.__class__ + + def getTargetNamespace(self): + """return targetNamespace + """ + parent = self + targetNamespace = 'targetNamespace' + tns = self.attributes.get(targetNamespace) + while not tns: + parent = parent._parent() + tns = parent.attributes.get(targetNamespace) + return tns + + def getTypeDefinition(self, attribute): + """attribute -- attribute with a QName value (eg. type). + collection -- check types collection in parent Schema instance + """ + return self.getQNameAttribute('types', attribute) + + def getElementDeclaration(self, attribute): + """attribute -- attribute with a QName value (eg. element). + collection -- check elements collection in parent Schema instance. + """ + return self.getQNameAttribute('elements', attribute) + + def getQNameAttribute(self, collection, attribute): + """returns object instance representing QName --> (namespace,name), + or if does not exist return None. + attribute -- an information item attribute, with a QName value. + collection -- collection in parent Schema instance to search. + """ + obj = None + tdc = self.attributes.get(attribute) + if tdc: + parent = GetSchema(self) + targetNamespace = tdc.getTargetNamespace() + if parent.targetNamespace == targetNamespace: + item = tdc.getName() + try: + obj = getattr(parent, collection)[item] + except KeyError, ex: + raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\ + %(targetNamespace, collection, item) + elif parent.imports.has_key(targetNamespace): + schema = parent.imports[targetNamespace].getSchema() + item = tdc.getName() + try: + obj = getattr(schema, collection)[item] + except KeyError, ex: + raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\ + %(targetNamespace, collection, item) + return obj + + def getXMLNS(self, prefix=None): + """deference prefix or by default xmlns, returns namespace. + """ + if prefix == XMLSchemaComponent.xml: + return XMLNS.XML + parent = self + ns = self.attributes[XMLSchemaComponent.xmlns].get(prefix or\ + XMLSchemaComponent.xmlns_key) + while not ns: + parent = parent._parent() + ns = parent.attributes[XMLSchemaComponent.xmlns].get(prefix or\ + XMLSchemaComponent.xmlns_key) + if not ns and isinstance(parent, WSDLToolsAdapter): + raise SchemaError, 'unknown prefix %s' %prefix + return ns + + def getAttribute(self, attribute): + """return requested attribute or None + """ + return self.attributes.get(attribute) + + def setAttributes(self, node): + """Sets up attribute dictionary, checks for required attributes and + sets default attribute values. attr is for default attribute values + determined at runtime. + + structure of attributes dictionary + ['xmlns'][xmlns_key] -- xmlns namespace + ['xmlns'][prefix] -- declared namespace prefix + [namespace][prefix] -- attributes declared in a namespace + [attribute] -- attributes w/o prefix, default namespaces do + not directly apply to attributes, ie Name can't collide + with QName. + """ + self.attributes = {XMLSchemaComponent.xmlns:{}} + for k,v in node.getAttributeDictionary().items(): + prefix,value = SplitQName(k) + if value == XMLSchemaComponent.xmlns: + self.attributes[value][prefix or XMLSchemaComponent.xmlns_key] = v + elif prefix: + ns = node.getNamespace(prefix) + if not ns: + raise SchemaError, 'no namespace for attribute prefix %s'\ + %prefix + if not self.attributes.has_key(ns): + self.attributes[ns] = {} + elif self.attributes[ns].has_key(value): + raise SchemaError, 'attribute %s declared multiple times in %s'\ + %(value, ns) + self.attributes[ns][value] = v + elif not self.attributes.has_key(value): + self.attributes[value] = v + else: + raise SchemaError, 'attribute %s declared multiple times' %value + + self.__checkAttributes() + self.__setAttributeDefaults() + + #set QNames + for k in ['type', 'element', 'base', 'ref', 'substitutionGroup', 'itemType']: + if self.attributes.has_key(k): + prefix, value = SplitQName(self.attributes.get(k)) + self.attributes[k] = \ + TypeDescriptionComponent((self.getXMLNS(prefix), value)) + + #Union, memberTypes is a whitespace separated list of QNames + for k in ['memberTypes']: + if self.attributes.has_key(k): + qnames = self.attributes[k] + self.attributes[k] = [] + for qname in qnames.split(): + prefix, value = SplitQName(qname) + self.attributes['memberTypes'].append(\ + TypeDescriptionComponent(\ + (self.getXMLNS(prefix), value))) + + def getContents(self, node): + """retrieve xsd contents + """ + return node.getContentList(*self.__class__.contents['xsd']) + + def __setAttributeDefaults(self): + """Looks for default values for unset attributes. If + class variable representing attribute is None, then + it must be defined as an instance variable. + """ + for k,v in self.__class__.attributes.items(): + if v and not self.attributes.has_key(k): + if isinstance(v, types.FunctionType): + self.attributes[k] = v(self) + else: + self.attributes[k] = v + + def __checkAttributes(self): + """Checks that required attributes have been defined, + attributes w/default cannot be required. Checks + all defined attributes are legal, attribute + references are not subject to this test. + """ + for a in self.__class__.required: + if not self.attributes.has_key(a): + raise SchemaError,\ + 'class instance %s, missing required attribute %s'\ + %(self.__class__, a) + for a in self.attributes.keys(): + if (a not in (XMLSchemaComponent.xmlns, XMLNS.XML)) and\ + (a not in self.__class__.attributes.keys()) and not\ + (self.isAttribute() and self.isReference()): + raise SchemaError, '%s, unknown attribute' %a + + +class WSDLToolsAdapter(XMLSchemaComponent): + """WSDL Adapter to grab the attributes from the wsdl document node. + """ + attributes = {'name':None, 'targetNamespace':None} + + def __init__(self, wsdl): + #XMLSchemaComponent.__init__(self, None) + XMLSchemaComponent.__init__(self, parent=wsdl) + self.setAttributes(DOMAdapter(wsdl.document)) + + def getImportSchemas(self): + """returns WSDLTools.WSDL types Collection + """ + return self._parent().types + + +class Notation(XMLSchemaComponent): + """ + parent: + schema + attributes: + id -- ID + name -- NCName, Required + public -- token, Required + system -- anyURI + contents: + annotation? + """ + required = ['name', 'public'] + attributes = {'id':None, 'name':None, 'public':None, 'system':None} + contents = {'xsd':('annotation')} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class Annotation(XMLSchemaComponent): + """ + parent: + all,any,anyAttribute,attribute,attributeGroup,choice,complexContent, + complexType,element,extension,field,group,import,include,key,keyref, + list,notation,redefine,restriction,schema,selector,simpleContent, + simpleType,union,unique + attributes: + id -- ID + contents: + (documentation | appinfo)* + """ + attributes = {'id':None} + contents = {'xsd':('documentation', 'appinfo')} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'documentation': + #print_debug('class %s, documentation skipped' %self.__class__, 5) + continue + elif component == 'appinfo': + #print_debug('class %s, appinfo skipped' %self.__class__, 5) + continue + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + + class Documentation(XMLSchemaComponent): + """ + parent: + annotation + attributes: + source, anyURI + xml:lang, language + contents: + mixed, any + """ + attributes = {'source':None, 'xml:lang':None} + contents = {'xsd':('mixed', 'any')} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'mixed': + #print_debug('class %s, mixed skipped' %self.__class__, 5) + continue + elif component == 'any': + #print_debug('class %s, any skipped' %self.__class__, 5) + continue + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + + class Appinfo(XMLSchemaComponent): + """ + parent: + annotation + attributes: + source, anyURI + contents: + mixed, any + """ + attributes = {'source':None, 'anyURI':None} + contents = {'xsd':('mixed', 'any')} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'mixed': + #print_debug('class %s, mixed skipped' %self.__class__, 5) + continue + elif component == 'any': + #print_debug('class %s, any skipped' %self.__class__, 5) + continue + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + +class XMLSchemaFake: + # This is temporary, for the benefit of WSDL until the real thing works. + def __init__(self, element): + self.targetNamespace = DOM.getAttr(element, 'targetNamespace') + self.element = element + +class XMLSchema(XMLSchemaComponent): + """A schema is a collection of schema components derived from one + or more schema documents, that is, one or more element + information items. It represents the abstract notion of a schema + rather than a single schema document (or other representation). + + + parent: + ROOT + attributes: + id -- ID + version -- token + xml:lang -- language + targetNamespace -- anyURI + attributeFormDefault -- 'qualified' | 'unqualified', 'unqualified' + elementFormDefault -- 'qualified' | 'unqualified', 'unqualified' + blockDefault -- '#all' | list of + ('substitution | 'extension' | 'restriction') + finalDefault -- '#all' | list of + ('extension' | 'restriction' | 'list' | 'union') + + contents: + ((include | import | redefine | annotation)*, + (attribute, attributeGroup, complexType, element, group, + notation, simpleType)*, annotation*)* + + + attributes -- schema attributes + imports -- import statements + includes -- include statements + redefines -- + types -- global simpleType, complexType definitions + elements -- global element declarations + attr_decl -- global attribute declarations + attr_groups -- attribute Groups + model_groups -- model Groups + notations -- global notations + """ + attributes = {'id':None, + 'version':None, + 'xml:lang':None, + 'targetNamespace':None, + 'attributeFormDefault':'unqualified', + 'elementFormDefault':'unqualified', + 'blockDefault':None, + 'finalDefault':None} + contents = {'xsd':('include', 'import', 'redefine', 'annotation', 'attribute',\ + 'attributeGroup', 'complexType', 'element', 'group',\ + 'notation', 'simpleType', 'annotation')} + empty_namespace = '' + + def __init__(self, parent=None): + """parent -- + instance variables: + targetNamespace -- schema's declared targetNamespace, or empty string. + _imported_schemas -- namespace keyed dict of schema dependencies, if + a schema is provided instance will not resolve import statement. + _included_schemas -- schemaLocation keyed dict of component schemas, + if schema is provided instance will not resolve include statement. + _base_url -- needed for relative URLs support, only works with URLs + relative to initial document. + includes -- collection of include statements + imports -- collection of import statements + elements -- collection of global element declarations + types -- collection of global type definitions + attr_decl -- collection of global attribute declarations + attr_groups -- collection of global attribute group definitions + model_groups -- collection of model group definitions + notations -- collection of notations + + """ + self.targetNamespace = None + XMLSchemaComponent.__init__(self, parent) + f = lambda k: k.attributes['name'] + ns = lambda k: k.attributes['namespace'] + sl = lambda k: k.attributes['schemaLocation'] + self.includes = Collection(self, key=sl) + self.imports = Collection(self, key=ns) + self.elements = Collection(self, key=f) + self.types = Collection(self, key=f) + self.attr_decl = Collection(self, key=f) + self.attr_groups = Collection(self, key=f) + self.model_groups = Collection(self, key=f) + self.notations = Collection(self, key=f) + + self._imported_schemas = {} + self._included_schemas = {} + self._base_url = None + + def addImportSchema(self, schema): + """for resolving import statements in Schema instance + schema -- schema instance + _imported_schemas + """ + if not isinstance(schema, XMLSchema): + raise TypeError, 'expecting a Schema instance' + if schema.targetNamespace != self.targetNamespace: + self._imported_schemas[schema.targetNamespace] = schema + else: + raise SchemaError, 'import schema bad targetNamespace' + + def addIncludeSchema(self, schemaLocation, schema): + """for resolving include statements in Schema instance + schemaLocation -- schema location + schema -- schema instance + _included_schemas + """ + if not isinstance(schema, XMLSchema): + raise TypeError, 'expecting a Schema instance' + if not schema.targetNamespace or\ + schema.targetNamespace == self.targetNamespace: + self._included_schemas[schemaLocation] = schema + else: + raise SchemaError, 'include schema bad targetNamespace' + + def setImportSchemas(self, schema_dict): + """set the import schema dictionary, which is used to + reference depedent schemas. + """ + self._imported_schemas = schema_dict + + def getImportSchemas(self): + """get the import schema dictionary, which is used to + reference depedent schemas. + """ + return self._imported_schemas + + def getSchemaNamespacesToImport(self): + """returns tuple of namespaces the schema instance has declared + itself to be depedent upon. + """ + return tuple(self.includes.keys()) + + def setIncludeSchemas(self, schema_dict): + """set the include schema dictionary, which is keyed with + schemaLocation (uri). + This is a means of providing + schemas to the current schema for content inclusion. + """ + self._included_schemas = schema_dict + + def getIncludeSchemas(self): + """get the include schema dictionary, which is keyed with + schemaLocation (uri). + """ + return self._included_schemas + + def getBaseUrl(self): + """get base url, used for normalizing all relative uri's + """ + return self._base_url + + def setBaseUrl(self, url): + """set base url, used for normalizing all relative uri's + """ + self._base_url = url + + def getElementFormDefault(self): + """return elementFormDefault attribute + """ + return self.attributes.get('elementFormDefault') + + def getAttributeFormDefault(self): + """return attributeFormDefault attribute + """ + return self.attributes.get('attributeFormDefault') + + def getBlockDefault(self): + """return blockDefault attribute + """ + return self.attributes.get('blockDefault') + + def getFinalDefault(self): + """return finalDefault attribute + """ + return self.attributes.get('finalDefault') + + def load(self, node): + pnode = node.getParentNode() + if pnode: + pname = SplitQName(pnode.getTagName())[1] + if pname == 'types': + attributes = {} + self.setAttributes(pnode) + attributes.update(self.attributes) + self.setAttributes(node) + for k,v in attributes['xmlns'].items(): + if not self.attributes['xmlns'].has_key(k): + self.attributes['xmlns'][k] = v + else: + self.setAttributes(node) + else: + self.setAttributes(node) + + self.targetNamespace = self.getTargetNamespace() + contents = self.getContents(node) + + indx = 0 + num = len(contents) + while indx < num: + while indx < num: + node = contents[indx] + component = SplitQName(node.getTagName())[1] + + if component == 'include': + tp = self.__class__.Include(self) + tp.fromDom(node) + self.includes[tp.attributes['schemaLocation']] = tp + + schema = tp.getSchema() + if schema.targetNamespace and \ + schema.targetNamespace != self.targetNamespace: + raise SchemaError, 'included schema bad targetNamespace' + + for collection in ['imports','elements','types',\ + 'attr_decl','attr_groups','model_groups','notations']: + for k,v in getattr(schema,collection).items(): + if not getattr(self,collection).has_key(k): + v._parent = weakref.ref(self) + getattr(self,collection)[k] = v + + elif component == 'import': + tp = self.__class__.Import(self) + tp.fromDom(node) + import_ns = tp.getAttribute('namespace') + if import_ns: + if import_ns == self.targetNamespace: + raise SchemaError,\ + 'import and schema have same targetNamespace' + self.imports[import_ns] = tp + else: + self.imports[self.__class__.empty_namespace] = tp + + if not self.getImportSchemas().has_key(import_ns) and\ + tp.getAttribute('schemaLocation'): + self.addImportSchema(tp.getSchema()) + + elif component == 'redefine': + #print_debug('class %s, redefine skipped' %self.__class__, 5) + pass + elif component == 'annotation': + #print_debug('class %s, annotation skipped' %self.__class__, 5) + pass + else: + break + indx += 1 + + # (attribute, attributeGroup, complexType, element, group, + # notation, simpleType)*, annotation*)* + while indx < num: + node = contents[indx] + component = SplitQName(node.getTagName())[1] + + if component == 'attribute': + tp = AttributeDeclaration(self) + tp.fromDom(node) + self.attr_decl[tp.getAttribute('name')] = tp + elif component == 'attributeGroup': + tp = AttributeGroupDefinition(self) + tp.fromDom(node) + self.attr_groups[tp.getAttribute('name')] = tp + elif component == 'complexType': + tp = ComplexType(self) + tp.fromDom(node) + self.types[tp.getAttribute('name')] = tp + elif component == 'element': + tp = ElementDeclaration(self) + tp.fromDom(node) + self.elements[tp.getAttribute('name')] = tp + elif component == 'group': + tp = ModelGroupDefinition(self) + tp.fromDom(node) + self.model_groups[tp.getAttribute('name')] = tp + elif component == 'notation': + tp = Notation(self) + tp.fromDom(node) + self.notations[tp.getAttribute('name')] = tp + elif component == 'simpleType': + tp = SimpleType(self) + tp.fromDom(node) + self.types[tp.getAttribute('name')] = tp + else: + break + indx += 1 + + while indx < num: + node = contents[indx] + component = SplitQName(node.getTagName())[1] + + if component == 'annotation': + #print_debug('class %s, annotation 2 skipped' %self.__class__, 5) + pass + else: + break + indx += 1 + + + class Import(XMLSchemaComponent): + """ + parent: + schema + attributes: + id -- ID + namespace -- anyURI + schemaLocation -- anyURI + contents: + annotation? + """ + attributes = {'id':None, + 'namespace':None, + 'schemaLocation':None} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self._schema = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + if self.attributes['namespace'] == self._parent().attributes['targetNamespace']: + raise SchemaError, 'namespace of schema and import match' + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + def getSchema(self): + """if schema is not defined, first look for a Schema class instance + in parent Schema. Else if not defined resolve schemaLocation + and create a new Schema class instance, and keep a hard reference. + """ + if not self._schema: + ns = self.attributes['namespace'] + schema = self._parent().getImportSchemas().get(ns) + if not schema and self._parent()._parent: + schema = self._parent()._parent().getImportSchemas().get(ns) + if not schema: + url = self.attributes.get('schemaLocation') + if not url: + raise SchemaError, 'namespace(%s) is unknown' %ns + base_url = self._parent().getBaseUrl() + reader = SchemaReader(base_url=base_url) + reader._imports = self._parent().getImportSchemas() + reader._includes = self._parent().getIncludeSchemas() + self._schema = reader.loadFromURL(url) + return self._schema or schema + + + class Include(XMLSchemaComponent): + """ + parent: + schema + attributes: + id -- ID + schemaLocation -- anyURI, required + contents: + annotation? + """ + required = ['schemaLocation'] + attributes = {'id':None, + 'schemaLocation':None} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self._schema = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + def getSchema(self): + """if schema is not defined, first look for a Schema class instance + in parent Schema. Else if not defined resolve schemaLocation + and create a new Schema class instance. + """ + if not self._schema: + #schema = self._parent()._parent() + schema = self._parent() + #self._schema = schema.getIncludeSchemas(\ + # self.attributes['schemaLocation']) + self._schema = schema.getIncludeSchemas().get(\ + self.attributes['schemaLocation'] + ) + if not self._schema: + url = self.attributes['schemaLocation'] + reader = SchemaReader(base_url=schema.getBaseUrl()) + reader._imports = schema.getImportSchemas() + reader._includes = schema.getIncludeSchemas() + self._schema = reader.loadFromURL(url) + return self._schema + + +class AttributeDeclaration(XMLSchemaComponent,\ + AttributeMarker,\ + DeclarationMarker): + """ + parent: + schema + attributes: + id -- ID + name -- NCName, required + type -- QName + default -- string + fixed -- string + contents: + annotation?, simpleType? + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'type':None, + 'default':None, + 'fixed':None} + contents = {'xsd':['annotation','simpleType']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + """ No list or union support + """ + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + elif component == 'simpleType': + self.content = AnonymousSimpleType(self) + self.content.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class LocalAttributeDeclaration(AttributeDeclaration,\ + AttributeMarker,\ + LocalMarker,\ + DeclarationMarker): + """ + parent: + complexType, restriction, extension, attributeGroup + attributes: + id -- ID + name -- NCName, required + type -- QName + form -- ('qualified' | 'unqualified'), schema.attributeFormDefault + use -- ('optional' | 'prohibited' | 'required'), optional + default -- string + fixed -- string + contents: + annotation?, simpleType? + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'type':None, + 'form':lambda self: GetSchema(self).getAttributeFormDefault(), + 'use':'optional', + 'default':None, + 'fixed':None} + contents = {'xsd':['annotation','simpleType']} + + def __init__(self, parent): + AttributeDeclaration.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + elif component == 'simpleType': + self.content = AnonymousSimpleType(self) + self.content.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class AttributeWildCard(XMLSchemaComponent,\ + AttributeMarker,\ + DeclarationMarker,\ + WildCardMarker): + """ + parents: + complexType, restriction, extension, attributeGroup + attributes: + id -- ID + namespace -- '##any' | '##other' | + (anyURI* | '##targetNamespace' | '##local'), ##any + processContents -- 'lax' | 'skip' | 'strict', strict + contents: + annotation? + """ + attributes = {'id':None, + 'namespace':'##any', + 'processContents':'strict'} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class AttributeReference(XMLSchemaComponent,\ + AttributeMarker,\ + ReferenceMarker): + """ + parents: + complexType, restriction, extension, attributeGroup + attributes: + id -- ID + ref -- QName, required + use -- ('optional' | 'prohibited' | 'required'), optional + default -- string + fixed -- string + contents: + annotation? + """ + required = ['ref'] + attributes = {'id':None, + 'ref':None, + 'use':'optional', + 'default':None, + 'fixed':None} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class AttributeGroupDefinition(XMLSchemaComponent,\ + AttributeGroupMarker,\ + DefinitionMarker): + """ + parents: + schema, redefine + attributes: + id -- ID + name -- NCName, required + contents: + annotation?, (attribute | attributeGroup)*, anyAttribute? + """ + required = ['name'] + attributes = {'id':None, + 'name':None} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.attr_content = None + + def getAttributeContent(self): + return self.attr_content + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for indx in range(len(contents)): + component = SplitQName(contents[indx].getTagName())[1] + if (component == 'annotation') and (not indx): + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + elif (component == 'attribute'): + if contents[indx].hasattr('name'): + content.append(AttributeDeclaration()) + elif contents[indx].hasattr('ref'): + content.append(AttributeReference()) + else: + raise SchemaError, 'Unknown attribute type' + content[-1].fromDom(contents[indx]) + elif (component == 'attributeGroup'): + content.append(AttributeGroupReference()) + content[-1].fromDom(contents[indx]) + elif (component == 'anyAttribute') and (len(contents) == x+1): + content.append(AttributeWildCard()) + content[-1].fromDom(contents[indx]) + else: + raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) + + self.attr_content = tuple(content) + +class AttributeGroupReference(XMLSchemaComponent,\ + AttributeGroupMarker,\ + ReferenceMarker): + """ + parents: + complexType, restriction, extension, attributeGroup + attributes: + id -- ID + ref -- QName, required + contents: + annotation? + """ + required = ['ref'] + attributes = {'id':None, + 'ref':None} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + + +###################################################### +# Elements +##################################################### +class IdentityConstrants(XMLSchemaComponent): + """Allow one to uniquely identify nodes in a document and ensure the + integrity of references between them. + + attributes -- dictionary of attributes + selector -- XPath to selected nodes + fields -- list of XPath to key field + """ + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.selector = None + self.fields = None + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + fields = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + elif component == 'selector': + self.selector = self.Selector(self) + self.selector.fromDom(i) + continue + elif component == 'field': + fields.append(self.Field(self)) + fields[-1].fromDom(i) + continue + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.fields = tuple(fields) + + + class Constraint(XMLSchemaComponent): + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + class Selector(Constraint): + """ + parent: + unique, key, keyref + attributes: + id -- ID + xpath -- XPath subset, required + contents: + annotation? + """ + required = ['xpath'] + attributes = {'id':None, + 'xpath':None} + contents = {'xsd':['annotation']} + + class Field(Constraint): + """ + parent: + unique, key, keyref + attributes: + id -- ID + xpath -- XPath subset, required + contents: + annotation? + """ + required = ['xpath'] + attributes = {'id':None, + 'xpath':None} + contents = {'xsd':['annotation']} + + +class Unique(IdentityConstrants): + """ Enforce fields are unique w/i a specified scope. + + parent: + element + attributes: + id -- ID + name -- NCName, required + contents: + annotation?, selector, field+ + """ + required = ['name'] + attributes = {'id':None, + 'name':None} + contents = {'xsd':['annotation', 'selector', 'field']} + + +class Key(IdentityConstrants): + """ Enforce fields are unique w/i a specified scope, and all + field values are present w/i document. Fields cannot + be nillable. + + parent: + element + attributes: + id -- ID + name -- NCName, required + contents: + annotation?, selector, field+ + """ + required = ['name'] + attributes = {'id':None, + 'name':None} + contents = {'xsd':['annotation', 'selector', 'field']} + + +class KeyRef(IdentityConstrants): + """ Ensure a match between two sets of values in an + instance. + parent: + element + attributes: + id -- ID + name -- NCName, required + refer -- QName, required + contents: + annotation?, selector, field+ + """ + required = ['name', 'refer'] + attributes = {'id':None, + 'name':None, + 'refer':None} + contents = {'xsd':['annotation', 'selector', 'field']} + + +class ElementDeclaration(XMLSchemaComponent,\ + ElementMarker,\ + DeclarationMarker): + """ + parents: + schema + attributes: + id -- ID + name -- NCName, required + type -- QName + default -- string + fixed -- string + nillable -- boolean, false + abstract -- boolean, false + substitutionGroup -- QName + block -- ('#all' | ('substition' | 'extension' | 'restriction')*), + schema.blockDefault + final -- ('#all' | ('extension' | 'restriction')*), + schema.finalDefault + contents: + annotation?, (simpleType,complexType)?, (key | keyref | unique)* + + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'type':None, + 'default':None, + 'fixed':None, + 'nillable':0, + 'abstract':0, + 'substitutionGroup':None, + 'block':lambda self: self._parent().getBlockDefault(), + 'final':lambda self: self._parent().getFinalDefault()} + contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ + 'keyref', 'unique']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + self.constraints = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + constraints = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + elif component == 'simpleType' and not self.content: + self.content = AnonymousSimpleType(self) + self.content.fromDom(i) + elif component == 'complexType' and not self.content: + self.content = LocalComplexType(self) + self.content.fromDom(i) + elif component == 'key': + constraints.append(Key(self)) + constraints[-1].fromDom(i) + elif component == 'keyref': + constraints.append(KeyRef(self)) + constraints[-1].fromDom(i) + elif component == 'unique': + constraints.append(Unique(self)) + constraints[-1].fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.constraints = tuple(constraints) + + +class LocalElementDeclaration(ElementDeclaration,\ + LocalMarker): + """ + parents: + all, choice, sequence + attributes: + id -- ID + name -- NCName, required + form -- ('qualified' | 'unqualified'), schema.elementFormDefault + type -- QName + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + default -- string + fixed -- string + nillable -- boolean, false + block -- ('#all' | ('extension' | 'restriction')*), schema.blockDefault + contents: + annotation?, (simpleType,complexType)?, (key | keyref | unique)* + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'form':lambda self: GetSchema(self).getElementFormDefault(), + 'type':None, + 'minOccurs':'1', + 'maxOccurs':'1', + 'default':None, + 'fixed':None, + 'nillable':0, + 'abstract':0, + 'block':lambda self: GetSchema(self).getBlockDefault()} + contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ + 'keyref', 'unique']} + + +class ElementReference(XMLSchemaComponent,\ + ElementMarker,\ + ReferenceMarker): + """ + parents: + all, choice, sequence + attributes: + id -- ID + ref -- QName, required + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + contents: + annotation? + """ + required = ['ref'] + attributes = {'id':None, + 'ref':None, + 'minOccurs':'1', + 'maxOccurs':'1'} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.annotation = None + self.setAttributes(node) + for i in self.getContents(node): + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class ElementWildCard(LocalElementDeclaration,\ + WildCardMarker): + """ + parents: + choice, sequence + attributes: + id -- ID + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + namespace -- '##any' | '##other' | + (anyURI* | '##targetNamespace' | '##local'), ##any + processContents -- 'lax' | 'skip' | 'strict', strict + contents: + annotation? + """ + required = [] + attributes = {'id':None, + 'minOccurs':'1', + 'maxOccurs':'1', + 'namespace':'##any', + 'processContents':'strict'} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.annotation = None + self.setAttributes(node) + for i in self.getContents(node): + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +###################################################### +# Model Groups +##################################################### +class Sequence(XMLSchemaComponent,\ + ModelGroupMarker): + """ + parents: + complexType, extension, restriction, group, choice, sequence + attributes: + id -- ID + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + + contents: + annotation?, (element | group | choice | sequence | any)* + """ + attributes = {'id':None, + 'minOccurs':'1', + 'maxOccurs':'1'} + contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ + 'any']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + continue + elif component == 'element': + if i.hasattr('ref'): + content.append(ElementReference(self)) + else: + content.append(LocalElementDeclaration(self)) + elif component == 'group': + content.append(ModelGroupReference(self)) + elif component == 'choice': + content.append(Choice(self)) + elif component == 'sequence': + content.append(Sequence(self)) + elif component == 'any': + content.append(ElementWildCard(self)) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + content[-1].fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + +class All(XMLSchemaComponent,\ + ModelGroupMarker): + """ + parents: + complexType, extension, restriction, group + attributes: + id -- ID + minOccurs -- '0' | '1', 1 + maxOccurs -- '1', 1 + + contents: + annotation?, element* + """ + attributes = {'id':None, + 'minOccurs':'1', + 'maxOccurs':'1'} + contents = {'xsd':['annotation', 'element']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + continue + elif component == 'element': + if i.hasattr('ref'): + content.append(ElementReference(self)) + else: + content.append(LocalElementDeclaration(self)) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + content[-1].fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + +class Choice(XMLSchemaComponent,\ + ModelGroupMarker): + """ + parents: + complexType, extension, restriction, group, choice, sequence + attributes: + id -- ID + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + + contents: + annotation?, (element | group | choice | sequence | any)* + """ + attributes = {'id':None, + 'minOccurs':'1', + 'maxOccurs':'1'} + contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ + 'any']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + continue + elif component == 'element': + if i.hasattr('ref'): + content.append(ElementReference(self)) + else: + content.append(LocalElementDeclaration(self)) + elif component == 'group': + content.append(ModelGroupReference(self)) + elif component == 'choice': + content.append(Choice(self)) + elif component == 'sequence': + content.append(Sequence(self)) + elif component == 'any': + content.append(ElementWildCard(self)) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + content[-1].fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + +class ModelGroupDefinition(XMLSchemaComponent,\ + ModelGroupMarker,\ + DefinitionMarker): + """ + parents: + redefine, schema + attributes: + id -- ID + name -- NCName, required + + contents: + annotation?, (all | choice | sequence)? + """ + required = ['name'] + attributes = {'id':None, + 'name':None} + contents = {'xsd':['annotation', 'all', 'choice', 'sequence']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + continue + elif component == 'all' and not self.content: + self.content = All(self) + elif component == 'choice' and not self.content: + self.content = Choice(self) + elif component == 'sequence' and not self.content: + self.content = Sequence(self) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class ModelGroupReference(XMLSchemaComponent,\ + ModelGroupMarker,\ + ReferenceMarker): + """ + parents: + choice, complexType, extension, restriction, sequence + attributes: + id -- ID + ref -- NCName, required + minOccurs -- Whole Number, 1 + maxOccurs -- (Whole Number | 'unbounded'), 1 + + contents: + annotation? + """ + required = ['ref'] + attributes = {'id':None, + 'ref':None, + 'minOccurs':'1', + 'maxOccurs':'1'} + contents = {'xsd':['annotation']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + + +class ComplexType(XMLSchemaComponent,\ + DefinitionMarker,\ + ComplexMarker): + """ + parents: + redefine, schema + attributes: + id -- ID + name -- NCName, required + mixed -- boolean, false + abstract -- boolean, false + block -- ('#all' | ('extension' | 'restriction')*), schema.blockDefault + final -- ('#all' | ('extension' | 'restriction')*), schema.finalDefault + + contents: + annotation?, (simpleContent | complexContent | + ((group | all | choice | sequence)?, (attribute | attributeGroup)*, anyAttribute?)) + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'mixed':0, + 'abstract':0, + 'block':lambda self: self._parent().getBlockDefault(), + 'final':lambda self: self._parent().getFinalDefault()} + contents = {'xsd':['annotation', 'simpleContent', 'complexContent',\ + 'group', 'all', 'choice', 'sequence', 'attribute', 'attributeGroup',\ + 'anyAttribute', 'any']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + self.attr_content = None + + def getAttributeContent(self): + return self.attr_content + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + indx = 0 + num = len(contents) + #XXX ugly + if not num: + return + component = SplitQName(contents[indx].getTagName())[1] + if component == 'annotation': + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + indx += 1 + component = SplitQName(contents[indx].getTagName())[1] + + self.content = None + if component == 'simpleContent': + self.content = self.__class__.SimpleContent(self) + self.content.fromDom(contents[indx]) + elif component == 'complexContent': + self.content = self.__class__.ComplexContent(self) + self.content.fromDom(contents[indx]) + else: + if component == 'all': + self.content = All(self) + elif component == 'choice': + self.content = Choice(self) + elif component == 'sequence': + self.content = Sequence(self) + elif component == 'group': + self.content = ModelGroupReference(self) + + if self.content: + self.content.fromDom(contents[indx]) + indx += 1 + + self.attr_content = [] + while indx < num: + component = SplitQName(contents[indx].getTagName())[1] + if component == 'attribute': + if contents[indx].hasattr('ref'): + self.attr_content.append(AttributeReference(self)) + else: + self.attr_content.append(LocalAttributeDeclaration(self)) + elif component == 'attributeGroup': + self.attr_content.append(AttributeGroupReference(self)) + elif component == 'anyAttribute': + self.attr_content.append(AttributeWildCard(self)) + else: + raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) + self.attr_content[-1].fromDom(contents[indx]) + indx += 1 + + class _DerivedType(XMLSchemaComponent): + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.derivation = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + for i in contents: + component = SplitQName(i.getTagName())[1] + if component in self.__class__.contents['xsd']: + if component == 'annotation' and not self.annotation: + self.annotation = Annotation(self) + self.annotation.fromDom(i) + continue + elif component == 'restriction' and not self.derivation: + self.derivation = self.__class__.Restriction(self) + elif component == 'extension' and not self.derivation: + self.derivation = self.__class__.Extension(self) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.derivation.fromDom(i) + + class ComplexContent(_DerivedType,\ + ComplexMarker): + """ + parents: + complexType + attributes: + id -- ID + mixed -- boolean, false + + contents: + annotation?, (restriction | extension) + """ + attributes = {'id':None, + 'mixed':0 } + contents = {'xsd':['annotation', 'restriction', 'extension']} + + class _DerivationBase(XMLSchemaComponent): + """, + parents: + complexContent + attributes: + id -- ID + base -- QName, required + + contents: + annotation?, (group | all | choice | sequence)?, + (attribute | attributeGroup)*, anyAttribute? + """ + required = ['base'] + attributes = {'id':None, + 'base':None } + contents = {'xsd':['annotation', 'group', 'all', 'choice',\ + 'sequence', 'attribute', 'attributeGroup', 'anyAttribute']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + self.attr_content = None + + def getAttributeContent(self): + return self.attr_content + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + indx = 0 + num = len(contents) + #XXX ugly + if not num: + return + component = SplitQName(contents[indx].getTagName())[1] + if component == 'annotation': + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + indx += 1 + component = SplitQName(contents[indx].getTagName())[1] + + if component == 'all': + self.content = All(self) + self.content.fromDom(contents[indx]) + indx += 1 + elif component == 'choice': + self.content = Choice(self) + self.content.fromDom(contents[indx]) + indx += 1 + elif component == 'sequence': + self.content = Sequence(self) + self.content.fromDom(contents[indx]) + indx += 1 + elif component == 'group': + self.content = ModelGroupReference(self) + self.content.fromDom(contents[indx]) + indx += 1 + else: + self.content = None + + self.attr_content = [] + while indx < num: + component = SplitQName(contents[indx].getTagName())[1] + if component == 'attribute': + if contents[indx].hasattr('ref'): + self.attr_content.append(AttributeReference(self)) + else: + self.attr_content.append(LocalAttributeDeclaration(self)) + elif component == 'attributeGroup': + if contents[indx].hasattr('ref'): + self.attr_content.append(AttributeGroupReference(self)) + else: + self.attr_content.append(AttributeGroupDefinition(self)) + elif component == 'anyAttribute': + self.attr_content.append(AttributeWildCard(self)) + else: + raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) + self.attr_content[-1].fromDom(contents[indx]) + indx += 1 + + class Extension(_DerivationBase, + ExtensionMarker): + """ + parents: + complexContent + attributes: + id -- ID + base -- QName, required + + contents: + annotation?, (group | all | choice | sequence)?, + (attribute | attributeGroup)*, anyAttribute? + """ + pass + + class Restriction(_DerivationBase,\ + RestrictionMarker): + """ + parents: + complexContent + attributes: + id -- ID + base -- QName, required + + contents: + annotation?, (group | all | choice | sequence)?, + (attribute | attributeGroup)*, anyAttribute? + """ + pass + + + class SimpleContent(_DerivedType,\ + SimpleMarker): + """ + parents: + complexType + attributes: + id -- ID + + contents: + annotation?, (restriction | extension) + """ + attributes = {'id':None} + contents = {'xsd':['annotation', 'restriction', 'extension']} + + class Extension(XMLSchemaComponent,\ + ExtensionMarker): + """ + parents: + simpleContent + attributes: + id -- ID + base -- QName, required + + contents: + annotation?, (attribute | attributeGroup)*, anyAttribute? + """ + required = ['base'] + attributes = {'id':None, + 'base':None } + contents = {'xsd':['annotation', 'attribute', 'attributeGroup', + 'anyAttribute']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.attr_content = None + + def getAttributeContent(self): + return self.attr_content + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + + indx = 0 + num = len(contents) + component = SplitQName(contents[indx].getTagName())[1] + if component == 'annotation': + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + indx += 1 + component = SplitQName(contents[indx].getTagName())[1] + + content = [] + while indx < num: + component = SplitQName(contents[indx].getTagName())[1] + if component == 'attribute': + if contents[indx].hasattr('ref'): + content.append(AttributeReference(self)) + else: + content.append(LocalAttributeDeclaration(self)) + elif component == 'attributeGroup': + content.append(AttributeGroupReference(self)) + elif component == 'anyAttribute': + content.append(AttributeWildCard(self)) + else: + raise SchemaError, 'Unknown component (%s)'\ + %(contents[indx].getTagName()) + content[-1].fromDom(contents[indx]) + indx += 1 + self.attr_content = tuple(content) + + + class Restriction(XMLSchemaComponent,\ + RestrictionMarker): + """ + parents: + simpleContent + attributes: + id -- ID + base -- QName, required + + contents: + annotation?, simpleType?, (enumeration | length | + maxExclusive | maxInclusive | maxLength | minExclusive | + minInclusive | minLength | pattern | fractionDigits | + totalDigits | whiteSpace)*, (attribute | attributeGroup)*, + anyAttribute? + """ + required = ['base'] + attributes = {'id':None, + 'base':None } + contents = {'xsd':['annotation', 'simpleType', 'attribute',\ + 'attributeGroup', 'anyAttribute'] + RestrictionMarker.facets} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + self.attr_content = None + + def getAttributeContent(self): + return self.attr_content + + def fromDom(self, node): + self.content = [] + self.setAttributes(node) + contents = self.getContents(node) + + indx = 0 + num = len(contents) + component = SplitQName(contents[indx].getTagName())[1] + if component == 'annotation': + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + indx += 1 + component = SplitQName(contents[indx].getTagName())[1] + + content = [] + while indx < num: + component = SplitQName(contents[indx].getTagName())[1] + if component == 'attribute': + if contents[indx].hasattr('ref'): + content.append(AttributeReference(self)) + else: + content.append(LocalAttributeDeclaration(self)) + elif component == 'attributeGroup': + content.append(AttributeGroupReference(self)) + elif component == 'anyAttribute': + content.append(AttributeWildCard(self)) + elif component == 'simpleType': + self.content.append(LocalSimpleType(self)) + self.content[-1].fromDom(contents[indx]) + else: + raise SchemaError, 'Unknown component (%s)'\ + %(contents[indx].getTagName()) + content[-1].fromDom(contents[indx]) + indx += 1 + self.attr_content = tuple(content) + + +class LocalComplexType(ComplexType,\ + LocalMarker): + """ + parents: + element + attributes: + id -- ID + mixed -- boolean, false + + contents: + annotation?, (simpleContent | complexContent | + ((group | all | choice | sequence)?, (attribute | attributeGroup)*, anyAttribute?)) + """ + required = [] + attributes = {'id':None, + 'mixed':0} + + +class SimpleType(XMLSchemaComponent,\ + DefinitionMarker,\ + SimpleMarker): + """ + parents: + redefine, schema + attributes: + id -- ID + name -- NCName, required + final -- ('#all' | ('extension' | 'restriction' | 'list' | 'union')*), + schema.finalDefault + + contents: + annotation?, (restriction | list | union) + """ + required = ['name'] + attributes = {'id':None, + 'name':None, + 'final':lambda self: self._parent().getFinalDefault()} + contents = {'xsd':['annotation', 'restriction', 'list', 'union']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + for child in contents: + component = SplitQName(child.getTagName())[1] + if component == 'annotation': + self.annotation = Annotation(self) + self.annotation.fromDom(child) + continue + break + else: + return + if component == 'restriction': + self.content = self.__class__.Restriction(self) + elif component == 'list': + self.content = self.__class__.List(self) + elif component == 'union': + self.content = self.__class__.Union(self) + else: + raise SchemaError, 'Unknown component (%s)' %(component) + self.content.fromDom(child) + + class Restriction(XMLSchemaComponent,\ + RestrictionMarker): + """ + parents: + simpleType + attributes: + id -- ID + base -- QName, required or simpleType child + + contents: + annotation?, simpleType?, (enumeration | length | + maxExclusive | maxInclusive | maxLength | minExclusive | + minInclusive | minLength | pattern | fractionDigits | + totalDigits | whiteSpace)* + """ + attributes = {'id':None, + 'base':None } + contents = {'xsd':['annotation', 'simpleType']+RestrictionMarker.facets} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for indx in range(len(contents)): + component = SplitQName(contents[indx].getTagName())[1] + if (component == 'annotation') and (not indx): + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + continue + elif (component == 'simpleType') and (not indx or indx == 1): + content.append(AnonymousSimpleType(self)) + content[-1].fromDom(contents[indx]) + elif component in RestrictionMarker.facets: + #print_debug('%s class instance, skipping %s' %(self.__class__, component)) + pass + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + + class Union(XMLSchemaComponent): + """ + parents: + simpleType + attributes: + id -- ID + memberTypes -- list of QNames, required or simpleType child. + + contents: + annotation?, simpleType* + """ + attributes = {'id':None, + 'memberTypes':None } + contents = {'xsd':['annotation', 'simpleType']} + + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + content = [] + + for indx in range(len(contents)): + component = SplitQName(contents[indx].getTagName())[1] + if (component == 'annotation') and (not indx): + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + elif (component == 'simpleType'): + content.append(AnonymousSimpleType(self)) + content[-1].fromDom(contents[indx]) + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + self.content = tuple(content) + + class List(XMLSchemaComponent): + """ + parents: + simpleType + attributes: + id -- ID + itemType -- QName, required or simpleType child. + + contents: + annotation?, simpleType? + """ + attributes = {'id':None, + 'itemType':None } + contents = {'xsd':['annotation', 'simpleType']} + def __init__(self, parent): + XMLSchemaComponent.__init__(self, parent) + self.annotation = None + self.content = None + + def fromDom(self, node): + self.setAttributes(node) + contents = self.getContents(node) + self.content = [] + + for indx in range(len(contents)): + component = SplitQName(contents[indx].getTagName())[1] + if (component == 'annotation') and (not indx): + self.annotation = Annotation(self) + self.annotation.fromDom(contents[indx]) + elif (component == 'simpleType'): + self.content = AnonymousSimpleType(self) + self.content.fromDom(contents[indx]) + break + else: + raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) + + +class AnonymousSimpleType(SimpleType,\ + SimpleMarker): + """ + parents: + attribute, element, list, restriction, union + attributes: + id -- ID + + contents: + annotation?, (restriction | list | union) + """ + required = [] + attributes = {'id':None} + + +class Redefine: + """ + parents: + attributes: + + contents: + """ + pass + +########################### +########################### + + +if sys.version_info[:2] >= (2, 2): + tupleClass = tuple +else: + import UserTuple + tupleClass = UserTuple.UserTuple + +class TypeDescriptionComponent(tupleClass): + """Tuple of length 2, consisting of + a namespace and unprefixed name. + """ + def __init__(self, args): + """args -- (namespace, name) + Remove the name's prefix, irrelevant. + """ + if len(args) != 2: + raise TypeError, 'expecting tuple (namespace, name), got %s' %args + elif args[1].find(':') >= 0: + args = (args[0], SplitQName(args[1])[1]) + tuple.__init__(self, args) + return + + def getTargetNamespace(self): + return self[0] + + def getName(self): + return self[1] + + +''' +import string, types, base64, re +from Utility import DOM, Collection +from StringIO import StringIO + + +class SchemaReader: + """A SchemaReader creates XMLSchema objects from urls and xml data.""" + + def loadFromStream(self, file): + """Return an XMLSchema instance loaded from a file object.""" + document = DOM.loadDocument(file) + schema = XMLSchema() + schema.load(document) + return schema + + def loadFromString(self, data): + """Return an XMLSchema instance loaded from an xml string.""" + return self.loadFromStream(StringIO(data)) + + def loadFromURL(self, url): + """Return an XMLSchema instance loaded from the given url.""" + document = DOM.loadFromURL(url) + schema = XMLSchema() + schema.location = url + schema.load(document) + return schema + + def loadFromFile(self, filename): + """Return an XMLSchema instance loaded from the given file.""" + file = open(filename, 'rb') + try: schema = self.loadFromStream(file) + finally: file.close() + return schema + +class SchemaError(Exception): + pass + +class XMLSchema: + # This is temporary, for the benefit of WSDL until the real thing works. + def __init__(self, element): + self.targetNamespace = DOM.getAttr(element, 'targetNamespace') + self.element = element + +class realXMLSchema: + """A schema is a collection of schema components derived from one + or more schema documents, that is, one or more element + information items. It represents the abstract notion of a schema + rather than a single schema document (or other representation).""" + def __init__(self): + self.simpleTypes = Collection(self) + self.complexTypes = Collection(self) + self.attributes = Collection(self) + self.elements = Collection(self) + self.attrGroups = Collection(self) + self.idConstraints=None + self.modelGroups = None + self.notations = None + self.extensions = [] + + targetNamespace = None + attributeFormDefault = 'unqualified' + elementFormDefault = 'unqualified' + blockDefault = None + finalDefault = None + location = None + version = None + id = None + + def load(self, document): + if document.nodeType == document.DOCUMENT_NODE: + schema = DOM.getElement(document, 'schema', None, None) + else: + schema = document + if schema is None: + raise SchemaError('Missing element.') + + self.namespace = namespace = schema.namespaceURI + if not namespace in DOM.NS_XSD_ALL: + raise SchemaError( + 'Unknown XML schema namespace: %s.' % self.namespace + ) + + for attrname in ( + 'targetNamespace', 'attributeFormDefault', 'elementFormDefault', + 'blockDefault', 'finalDefault', 'version', 'id' + ): + value = DOM.getAttr(schema, attrname, None, None) + if value is not None: + setattr(self, attrname, value) + + + # Resolve imports and includes here? +## imported = {} +## while 1: +## imports = [] +## for element in DOM.getElements(definitions, 'import', NS_WSDL): +## location = DOM.getAttr(element, 'location') +## if not imported.has_key(location): +## imports.append(element) +## if not imports: +## break +## for element in imports: +## self._import(document, element) +## imported[location] = 1 + + for element in DOM.getElements(schema, None, None): + localName = element.localName + + if not DOM.nsUriMatch(element.namespaceURI, namespace): + self.extensions.append(element) + continue + + elif localName == 'message': + name = DOM.getAttr(element, 'name') + docs = GetDocumentation(element) + message = self.addMessage(name, docs) + parts = DOM.getElements(element, 'part', NS_WSDL) + message.load(parts) + continue + + def _import(self, document, element): + namespace = DOM.getAttr(element, 'namespace', default=None) + location = DOM.getAttr(element, 'location', default=None) + if namespace is None or location is None: + raise WSDLError( + 'Invalid import element (missing namespace or location).' + ) + + # Sort-of support relative locations to simplify unit testing. The + # WSDL specification actually doesn't allow relative URLs, so its + # ok that this only works with urls relative to the initial document. + location = urllib.basejoin(self.location, location) + + obimport = self.addImport(namespace, location) + obimport._loaded = 1 + + importdoc = DOM.loadFromURL(location) + try: + if location.find('#') > -1: + idref = location.split('#')[-1] + imported = DOM.getElementById(importdoc, idref) + else: + imported = importdoc.documentElement + if imported is None: + raise WSDLError( + 'Import target element not found for: %s' % location + ) + + imported_tns = DOM.getAttr(imported, 'targetNamespace') + importer_tns = namespace + + if imported_tns != importer_tns: + return + + if imported.localName == 'definitions': + imported_nodes = imported.childNodes + else: + imported_nodes = [imported] + parent = element.parentNode + for node in imported_nodes: + if node.nodeType != node.ELEMENT_NODE: + continue + child = DOM.importNode(document, node, 1) + parent.appendChild(child) + child.setAttribute('targetNamespace', importer_tns) + attrsNS = imported._attrsNS + for attrkey in attrsNS.keys(): + if attrkey[0] == DOM.NS_XMLNS: + attr = attrsNS[attrkey].cloneNode(1) + child.setAttributeNode(attr) + finally: + importdoc.unlink() + + +class Element: + """Common base class for element representation classes.""" + def __init__(self, name=None, documentation=''): + self.name = name + self.documentation = documentation + self.extensions = [] + + def addExtension(self, item): + self.extensions.append(item) + + +class SimpleTypeDefinition: + """Represents an xml schema simple type definition.""" + +class ComplexTypeDefinition: + """Represents an xml schema complex type definition.""" + +class AttributeDeclaration: + """Represents an xml schema attribute declaration.""" + +class ElementDeclaration: + """Represents an xml schema element declaration.""" + def __init__(self, name, type=None, targetNamespace=None): + self.name = name + + targetNamespace = None + annotation = None + nillable = 0 + abstract = 0 + default = None + fixed = None + scope = 'global' + type = None + form = 0 + # Things we will not worry about for now. + id_constraint_defs = None + sub_group_exclude = None + sub_group_affils = None + disallowed_subs = None + + + + + + + + + + +class AttributeGroupDefinition: + """Represents an xml schema attribute group definition.""" + +class IdentityConstraintDefinition: + """Represents an xml schema identity constraint definition.""" + +class ModelGroupDefinition: + """Represents an xml schema model group definition.""" + +class NotationDeclaration: + """Represents an xml schema notation declaration.""" + +class Annotation: + """Represents an xml schema annotation.""" + +class ModelGroup: + """Represents an xml schema model group.""" + +class Particle: + """Represents an xml schema particle.""" + +class WildCard: + """Represents an xml schema wildcard.""" + +class AttributeUse: + """Represents an xml schema attribute use.""" + + +class ElementComponent: + namespace = '' + name = '' + type = None + form = 'qualified | unqualified' + scope = 'global or complex def' + constraint = ('value', 'default | fixed') + nillable = 0 + id_constraint_defs = None + sub_group_affil = None + sub_group_exclusions = None + disallowed_subs = 'substitution, extension, restriction' + abstract = 0 + minOccurs = 1 + maxOccurs = 1 + ref = '' + +class AttributeThing: + name = '' + namespace = '' + typeName = '' + typeUri = '' + scope = 'global | local to complex def' + constraint = ('value:default', 'value:fixed') + use = 'optional | prohibited | required' + +class ElementDataType: + namespace = '' + name = '' + element_form = 'qualified | unqualified' + attr_form = None + type_name = '' + type_uri = '' + def __init__(self, name, namespace, type_name, type_uri): + self.namespace = namespace + self.name = name + # type may be anonymous... + self.type_name = type_name + self.type_uri = type_uri + + def checkValue(self, value, context): + # Delegate value checking to the type of the element. + typeref = (self.type_uri, self.type_name) + handler = context.serializer.getType(typeref) + return handler.checkValue(value, context) + + def serialize(self, name, namespace, value, context, **kwargs): + if context.check_values: + self.checkValue(value, context) + # Delegate serialization to the type of the element. + typeref = (self.type_uri, self.type_name) + handler = context.serializer.getType(typeref) + return handler.serialize(self.name, self.namespace, value, context) + + def deserialize(self, element, context): + if element_is_null(element, context): + return None + # Delegate deserialization to the type of the element. + typeref = (self.type_uri, self.type_name) + handler = context.serializer.getType(typeref) + return handler.deserialize(element, context) + + + +def parse_schema(data): + targetNS = '' + attributeFormDefault = 0 + elementFormDefault = 0 + blockDefault = '' + finalDefault = '' + language = None + version = None + id = '' +''' diff --git a/SOAPpy/wstools/XMLname.py b/SOAPpy/wstools/XMLname.py new file mode 100755 index 0000000..532f02b --- /dev/null +++ b/SOAPpy/wstools/XMLname.py @@ -0,0 +1,88 @@ +"""Translate strings to and from SOAP 1.2 XML name encoding + +Implements rules for mapping application defined name to XML names +specified by the w3 SOAP working group for SOAP version 1.2 in +Appendix A of "SOAP Version 1.2 Part 2: Adjuncts", W3C Working Draft +17, December 2001, + +Also see . + +Author: Gregory R. Warnes +Date:: 2002-04-25 +Version 0.9.0 + +""" + +ident = "$Id: XMLname.py,v 1.2 2003/05/20 21:10:14 warnes Exp $" + +from re import * + + +def _NCNameChar(x): + return x.isalpha() or x.isdigit() or x=="." or x=='-' or x=="_" + + +def _NCNameStartChar(x): + return x.isalpha() or x=="_" + + +def _toUnicodeHex(x): + hexval = hex(ord(x[0]))[2:] + hexlen = len(hexval) + # Make hexval have either 4 or 8 digits by prepending 0's + if (hexlen==1): hexval = "000" + hexval + elif (hexlen==2): hexval = "00" + hexval + elif (hexlen==3): hexval = "0" + hexval + elif (hexlen==4): hexval = "" + hexval + elif (hexlen==5): hexval = "000" + hexval + elif (hexlen==6): hexval = "00" + hexval + elif (hexlen==7): hexval = "0" + hexval + elif (hexlen==8): hexval = "" + hexval + else: raise Exception, "Illegal Value returned from hex(ord(x))" + + return "_x"+ hexval + "_" + + +def _fromUnicodeHex(x): + return eval( r'u"\u'+x[2:-1]+'"' ) + + +def toXMLname(string): + """Convert string to a XML name.""" + if string.find(':') != -1 : + (prefix, localname) = string.split(':',1) + else: + prefix = None + localname = string + + T = unicode(localname) + + N = len(localname) + X = []; + for i in range(N) : + if i< N-1 and T[i]==u'_' and T[i+1]==u'x': + X.append(u'_x005F_') + elif i==0 and N >= 3 and \ + ( T[0]==u'x' or T[0]==u'X' ) and \ + ( T[1]==u'm' or T[1]==u'M' ) and \ + ( T[2]==u'l' or T[2]==u'L' ): + X.append(u'_xFFFF_' + T[0]) + elif (not _NCNameChar(T[i])) or (i==0 and not _NCNameStartChar(T[i])): + X.append(_toUnicodeHex(T[i])) + else: + X.append(T[i]) + + return u''.join(X) + + +def fromXMLname(string): + """Convert XML name to unicode string.""" + + retval = sub(r'_xFFFF_','', string ) + + def fun( matchobj ): + return _fromUnicodeHex( matchobj.group(0) ) + + retval = sub(r'_x[0-9A-Za-z]+_', fun, retval ) + + return retval diff --git a/SOAPpy/wstools/__init__.py b/SOAPpy/wstools/__init__.py new file mode 100644 index 0000000..12a584f --- /dev/null +++ b/SOAPpy/wstools/__init__.py @@ -0,0 +1,36 @@ +#! /usr/bin/env python +"""WSDL parsing services package for Web Services for Python.""" + +ident = "$Id: __init__.py,v 1.8 2004/09/09 23:32:09 boverhof Exp $" + +import WSDLTools +import XMLname +from logging import getLogger as _getLogger +import logging.config as _config + +LOGGING = 'logging.txt' +DEBUG = True + +# +# If LOGGING configuration file is not found, turn off logging +# and use _noLogger class because logging module's performance +# is terrible. +# + +try: + _config.fileConfig(LOGGING) +except: + DEBUG = False + + +class Base: + def __init__(self, module=__name__): + self.logger = _noLogger() + if DEBUG is True: + self.logger = _getLogger('%s-%s(%x)' %(module, self.__class__, id(self))) + +class _noLogger: + def __init__(self, *args): pass + def warning(self, *args): pass + def debug(self, *args): pass + def error(self, *args): pass diff --git a/SOAPpy/wstools/test/__init__.py b/SOAPpy/wstools/test/__init__.py new file mode 100644 index 0000000..d5a5350 --- /dev/null +++ b/SOAPpy/wstools/test/__init__.py @@ -0,0 +1,5 @@ +#! /usr/bin/env python +"""wstools.WSDLTools.WSDLReader tests directory.""" + +import utils + diff --git a/SOAPpy/wstools/test/test_t1.py b/SOAPpy/wstools/test/test_t1.py new file mode 100644 index 0000000..5c33899 --- /dev/null +++ b/SOAPpy/wstools/test/test_t1.py @@ -0,0 +1,20 @@ +############################################################################ +# Joshua R. Boverhof, David W. Robertson, LBNL +# See LBNLCopyright for copyright notice! +########################################################################### +import unittest +import test_wsdl +import utils + +def makeTestSuite(): + suite = unittest.TestSuite() + suite.addTest(test_wsdl.makeTestSuite("services_by_file")) + return suite + +def main(): + loader = utils.MatchTestLoader(True, None, "makeTestSuite") + unittest.main(defaultTest="makeTestSuite", testLoader=loader) + +if __name__ == "__main__" : main() + + diff --git a/SOAPpy/wstools/test/test_wsdl.py b/SOAPpy/wstools/test/test_wsdl.py new file mode 100644 index 0000000..90b0c4d --- /dev/null +++ b/SOAPpy/wstools/test/test_wsdl.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python + +############################################################################ +# Joshua R. Boverhof, David W. Robertson, LBNL +# See LBNLCopyright for copyright notice! +########################################################################### + +import sys, unittest +import ConfigParser +from ZSI.wstools.Utility import DOM +from ZSI.wstools.WSDLTools import WSDLReader +from ZSI.wstools.TimeoutSocket import TimeoutError + +class WSDLToolsTestCase(unittest.TestCase): + + def __init__(self, methodName='runTest'): + unittest.TestCase.__init__(self, methodName) + + def setUp(self): + self.path = nameGenerator.next() + print self.path + sys.stdout.flush() + + def __str__(self): + teststr = unittest.TestCase.__str__(self) + if hasattr(self, "path"): + return "%s: %s" % (teststr, self.path ) + else: + return "%s" % (teststr) + + def checkWSDLCollection(self, tag_name, component, key='name'): + if self.wsdl is None: + return + definition = self.wsdl.document.documentElement + version = DOM.WSDLUriToVersion(definition.namespaceURI) + nspname = DOM.GetWSDLUri(version) + for node in DOM.getElements(definition, tag_name, nspname): + name = DOM.getAttr(node, key) + comp = component[name] + self.failUnlessEqual(eval('comp.%s' %key), name) + + def checkXSDCollection(self, tag_name, component, node, key='name'): + for cnode in DOM.getElements(node, tag_name): + name = DOM.getAttr(cnode, key) + component[name] + + def test_all(self): + try: + if self.path[:7] == 'http://': + self.wsdl = WSDLReader().loadFromURL(self.path) + else: + self.wsdl = WSDLReader().loadFromFile(self.path) + + except TimeoutError: + print "connection timed out" + sys.stdout.flush() + return + except: + self.path = self.path + ": load failed, unable to start" + raise + + try: + self.checkWSDLCollection('service', self.wsdl.services) + except: + self.path = self.path + ": wsdl.services" + raise + + try: + self.checkWSDLCollection('message', self.wsdl.messages) + except: + self.path = self.path + ": wsdl.messages" + raise + + try: + self.checkWSDLCollection('portType', self.wsdl.portTypes) + except: + self.path = self.path + ": wsdl.portTypes" + raise + + try: + self.checkWSDLCollection('binding', self.wsdl.bindings) + except: + self.path = self.path + ": wsdl.bindings" + raise + + try: + self.checkWSDLCollection('import', self.wsdl.imports, key='namespace') + except: + self.path = self.path + ": wsdl.imports" + raise + + try: + for key in self.wsdl.types.keys(): + schema = self.wsdl.types[key] + self.failUnlessEqual(key, schema.getTargetNamespace()) + + definition = self.wsdl.document.documentElement + version = DOM.WSDLUriToVersion(definition.namespaceURI) + nspname = DOM.GetWSDLUri(version) + for node in DOM.getElements(definition, 'types', nspname): + for snode in DOM.getElements(node, 'schema'): + tns = DOM.findTargetNS(snode) + schema = self.wsdl.types[tns] + self.schemaAttributesDeclarations(schema, snode) + self.schemaAttributeGroupDeclarations(schema, snode) + self.schemaElementDeclarations(schema, snode) + self.schemaTypeDefinitions(schema, snode) + except: + self.path = self.path + ": wsdl.types" + raise + + if self.wsdl.extensions: + print 'No check for WSDLTools(%s) Extensions:' %(self.wsdl.name) + for ext in self.wsdl.extensions: print '\t', ext + + def schemaAttributesDeclarations(self, schema, node): + self.checkXSDCollection('attribute', schema.attr_decl, node) + + def schemaAttributeGroupDeclarations(self, schema, node): + self.checkXSDCollection('group', schema.attr_groups, node) + + def schemaElementDeclarations(self, schema, node): + self.checkXSDCollection('element', schema.elements, node) + + def schemaTypeDefinitions(self, schema, node): + self.checkXSDCollection('complexType', schema.types, node) + self.checkXSDCollection('simpleType', schema.types, node) + + +def setUpOptions(section): + cp = ConfigParser.ConfigParser() + cp.read('config.txt') + if not cp.sections(): + print 'fatal error: configuration file config.txt not present' + sys.exit(0) + if not cp.has_section(section): + print '%s section not present in configuration file, exiting' % section + sys.exit(0) + return cp, len(cp.options(section)) + +def getOption(cp, section): + for name, value in cp.items(section): + yield value + +def makeTestSuite(section='services_by_file'): + global nameGenerator + + cp, numTests = setUpOptions(section) + nameGenerator = getOption(cp, section) + suite = unittest.TestSuite() + for i in range(0, numTests): + suite.addTest(unittest.makeSuite(WSDLToolsTestCase, 'test_')) + return suite + + +def main(): + unittest.main(defaultTest="makeTestSuite") + + +if __name__ == "__main__" : main() diff --git a/SOAPpy/wstools/test/test_wstools.py b/SOAPpy/wstools/test/test_wstools.py new file mode 100644 index 0000000..0e0f958 --- /dev/null +++ b/SOAPpy/wstools/test/test_wstools.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +############################################################################ +# Joshua R. Boverhof, David W. Robertson, LBNL +# See LBNLCopyright for copyright notice! +########################################################################### + +import unittest, tarfile, os, ConfigParser +import test_wsdl + + +SECTION='files' +CONFIG_FILE = 'config.txt' + +def extractFiles(section, option): + config = ConfigParser.ConfigParser() + config.read(CONFIG_FILE) + archives = config.get(section, option) + archives = eval(archives) + for file in archives: + tar = tarfile.open(file) + if not os.access(tar.membernames[0], os.R_OK): + for i in tar.getnames(): + tar.extract(i) + +def makeTestSuite(): + suite = unittest.TestSuite() + suite.addTest(test_wsdl.makeTestSuite("services_by_file")) + return suite + +def main(): + extractFiles(SECTION, 'archives') + unittest.main(defaultTest="makeTestSuite") + +if __name__ == "__main__" : main() + + diff --git a/SOAPpy/wstools/test/test_wstools_net.py b/SOAPpy/wstools/test/test_wstools_net.py new file mode 100644 index 0000000..880cff3 --- /dev/null +++ b/SOAPpy/wstools/test/test_wstools_net.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +############################################################################ +# Joshua R. Boverhof, David W. Robertson, LBNL +# See LBNLCopyright for copyright notice! +########################################################################### +import unittest +import test_wsdl + +def makeTestSuite(): + suite = unittest.TestSuite() + suite.addTest(test_wsdl.makeTestSuite("services_by_http")) + return suite + +def main(): + unittest.main(defaultTest="makeTestSuite") + +if __name__ == "__main__" : main() + + From 49758fe71669c51bd8a0bf38b813bb3de290197e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 15:17:43 -0800 Subject: [PATCH 143/179] from: https://coherence.beebits.net/browser/trunk/coherence/upnp/core/soap_lite.py?format=raw [git-p4: depot-paths = "//depot/": change = 1102] --- soap_lite.py | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 soap_lite.py diff --git a/soap_lite.py b/soap_lite.py new file mode 100644 index 0000000..b521c1d --- /dev/null +++ b/soap_lite.py @@ -0,0 +1,111 @@ +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# Copyright 2007 - Frank Scholz + +""" SOAP-lite + + some simple functions to implement the SOAP msgs + needed by UPnP with ElementTree + + inspired by ElementSOAP.py +""" + +from coherence.extern.et import ET + +NS_SOAP_ENV = "{http://schemas.xmlsoap.org/soap/envelope/}" +NS_SOAP_ENC = "{http://schemas.xmlsoap.org/soap/encoding/}" +NS_XSI = "{http://www.w3.org/1999/XMLSchema-instance}" +NS_XSD = "{http://www.w3.org/1999/XMLSchema}" + +SOAP_ENCODING = "http://schemas.xmlsoap.org/soap/encoding/" + +UPNPERRORS = {401:'Invalid Action', + 402:'Invalid Args', + 501:'Action Failed', + 600:'Argument Value Invalid', + 601:'Argument Value Out of Range', + 602:'Optional Action Not Implemented', + 603:'Out Of Memory', + 604:'Human Intervention Required', + 605:'String Argument Too Long', + 606:'Action Not Authorized', + 607:'Signature Failure', + 608:'Signature Missing', + 609:'Not Encrypted', + 610:'Invalid Sequence', + 611:'Invalid Control URL', + 612:'No Such Session',} + +def build_soap_error(status,description='without words'): + """ builds an UPnP SOAP error msg + """ + root = ET.Element('s:Fault') + ET.SubElement(root,'faultcode').text='s:Client' + ET.SubElement(root,'faultstring').text='UPnPError' + e = ET.SubElement(root,'detail') + e = ET.SubElement(e, 'UPnPError') + e.attrib['xmlns']='urn:schemas-upnp-org:control-1-0' + ET.SubElement(e,'errorCode').text=str(status) + ET.SubElement(e,'errorDescription').text=UPNPERRORS.get(status,description) + return build_soap_call(None, root, encoding=None) + +def build_soap_call(method, arguments, is_response=False, + encoding=SOAP_ENCODING, + envelope_attrib=None, + typed=None): + """ create a shell for a SOAP request or response element + - set method to none to omitt the method element and + add the arguments directly to the body (for an error msg) + - arguments can be a dict or an ET.Element + """ + envelope = ET.Element("s:Envelope") + if envelope_attrib: + for n in envelope_attrib: + envelope.attrib.update({n[0] : n[1]}) + else: + envelope.attrib.update({'s:encodingStyle' : "http://schemas.xmlsoap.org/soap/encoding/"}) + envelope.attrib.update({'xmlns:s' :"http://schemas.xmlsoap.org/soap/envelope/"}) + + body = ET.SubElement(envelope, "s:Body") + + if method: + # append the method call + if is_response is True: + method += "Response" + re = ET.SubElement(body,method) + if encoding: + re.set(NS_SOAP_ENV + "encodingStyle", encoding) + else: + re = body + + # append the arguments + if isinstance(arguments,dict): + type_map = {str: 'xsd:string', + unicode: 'xsd:string', + int: 'xsd:int', + float: 'xsd:float', + bool: 'xsd:boolean'} + + for arg_name, arg_val in arguments.iteritems(): + arg_type = type_map[type(arg_val)] + if arg_type == 'xsd:string' and type(arg_val) == unicode: + arg_val = arg_val.encode('utf-8') + if arg_type == 'xsd:int' or arg_type == 'xsd:float': + arg_val = str(arg_val) + if arg_type == 'xsd:boolean': + arg_val = arg_val.lower() + + e = ET.SubElement(re, arg_name) + if typed and arg_type: + if not isinstance(type, ET.QName): + arg_type = ET.QName("http://www.w3.org/1999/XMLSchema", arg_type) + e.set(NS_XSI + "type", arg_type) + e.text = arg_val + else: + re.append(arguments) + + + + preamble = """""" + return preamble + ET.tostring(envelope,'utf-8') From ff20e42c0e7ba728b269e4bd7313d2c2ab91eff1 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 23:44:33 -0800 Subject: [PATCH 144/179] find ET where I put it... make it support long's.. [git-p4: depot-paths = "//depot/": change = 1103] --- soap_lite.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soap_lite.py b/soap_lite.py index b521c1d..d5ac1c3 100644 --- a/soap_lite.py +++ b/soap_lite.py @@ -11,7 +11,7 @@ inspired by ElementSOAP.py """ -from coherence.extern.et import ET +from et import ET NS_SOAP_ENV = "{http://schemas.xmlsoap.org/soap/envelope/}" NS_SOAP_ENC = "{http://schemas.xmlsoap.org/soap/encoding/}" @@ -84,6 +84,7 @@ def build_soap_call(method, arguments, is_response=False, type_map = {str: 'xsd:string', unicode: 'xsd:string', int: 'xsd:int', + long: 'xsd:int', float: 'xsd:float', bool: 'xsd:boolean'} From d1dcaec7bf02d67abd1854baef9a7be1f9142c63 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 23:49:33 -0800 Subject: [PATCH 145/179] turns out that using soap_lite from Coherence was easier than teaching SOAPpy about namespaces... [git-p4: depot-paths = "//depot/": change = 1104] --- SOAPpy/Config.py | 202 -- SOAPpy/Errors.py | 79 - SOAPpy/NS.py | 104 - SOAPpy/Parser.py | 1024 -------- SOAPpy/SOAPBuilder.py | 620 ----- SOAPpy/Types.py | 1734 ------------- SOAPpy/Utilities.py | 178 -- SOAPpy/__init__.py | 15 - SOAPpy/version.py | 2 - SOAPpy/wstools/Namespaces.py | 92 - SOAPpy/wstools/TimeoutSocket.py | 179 -- SOAPpy/wstools/UserTuple.py | 99 - SOAPpy/wstools/Utility.py | 839 ------- SOAPpy/wstools/WSDLTools.py | 1336 ---------- SOAPpy/wstools/XMLSchema.py | 2976 ----------------------- SOAPpy/wstools/XMLname.py | 88 - SOAPpy/wstools/__init__.py | 36 - SOAPpy/wstools/test/__init__.py | 5 - SOAPpy/wstools/test/test_t1.py | 20 - SOAPpy/wstools/test/test_wsdl.py | 160 -- SOAPpy/wstools/test/test_wstools.py | 37 - SOAPpy/wstools/test/test_wstools_net.py | 20 - 22 files changed, 9845 deletions(-) delete mode 100644 SOAPpy/Config.py delete mode 100644 SOAPpy/Errors.py delete mode 100644 SOAPpy/NS.py delete mode 100644 SOAPpy/Parser.py delete mode 100644 SOAPpy/SOAPBuilder.py delete mode 100644 SOAPpy/Types.py delete mode 100644 SOAPpy/Utilities.py delete mode 100644 SOAPpy/__init__.py delete mode 100644 SOAPpy/version.py delete mode 100755 SOAPpy/wstools/Namespaces.py delete mode 100755 SOAPpy/wstools/TimeoutSocket.py delete mode 100755 SOAPpy/wstools/UserTuple.py delete mode 100755 SOAPpy/wstools/Utility.py delete mode 100755 SOAPpy/wstools/WSDLTools.py delete mode 100755 SOAPpy/wstools/XMLSchema.py delete mode 100755 SOAPpy/wstools/XMLname.py delete mode 100644 SOAPpy/wstools/__init__.py delete mode 100644 SOAPpy/wstools/test/__init__.py delete mode 100644 SOAPpy/wstools/test/test_t1.py delete mode 100644 SOAPpy/wstools/test/test_wsdl.py delete mode 100644 SOAPpy/wstools/test/test_wstools.py delete mode 100644 SOAPpy/wstools/test/test_wstools_net.py diff --git a/SOAPpy/Config.py b/SOAPpy/Config.py deleted file mode 100644 index 3ec4dfe..0000000 --- a/SOAPpy/Config.py +++ /dev/null @@ -1,202 +0,0 @@ -""" -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -ident = '$Id: Config.py,v 1.9 2004/01/31 04:20:05 warnes Exp $' -from version import __version__ - -import copy, socket -from types import * - -from NS import NS - -################################################################################ -# Configuration class -################################################################################ - -class SOAPConfig: - __readonly = ('SSLserver', 'SSLclient', 'GSIserver', 'GSIclient') - - def __init__(self, config = None, **kw): - d = self.__dict__ - - if config: - if not isinstance(config, SOAPConfig): - raise AttributeError, \ - "initializer must be SOAPConfig instance" - - s = config.__dict__ - - for k, v in s.items(): - if k[0] != '_': - d[k] = v - else: - # Setting debug also sets returnFaultInfo, - # dumpHeadersIn, dumpHeadersOut, dumpSOAPIn, and dumpSOAPOut - self.debug = 0 - self.dumpFaultInfo = 1 - # Setting namespaceStyle sets typesNamespace, typesNamespaceURI, - # schemaNamespace, and schemaNamespaceURI - self.namespaceStyle = '1999' - self.strictNamespaces = 0 - self.typed = 1 - self.buildWithNamespacePrefix = 1 - self.returnAllAttrs = 0 - - # Strict checking of range for floats and doubles - self.strict_range = 0 - - # Default encoding for dictionary keys - self.dict_encoding = 'ascii' - - # New argument name handling mechanism. See - # README.MethodParameterNaming for details - self.specialArgs = 1 - - # If unwrap_results=1 and there is only element in the struct, - # SOAPProxy will assume that this element is the result - # and return it rather than the struct containing it. - # Otherwise SOAPproxy will return the struct with all the - # elements as attributes. - self.unwrap_results = 1 - - # Automatically convert SOAP complex types, and - # (recursively) public contents into the corresponding - # python types. (Private subobjects have names that start - # with '_'.) - # - # Conversions: - # - faultType --> raise python exception - # - arrayType --> array - # - compoundType --> dictionary - # - self.simplify_objects = 0 - - # Per-class authorization method. If this is set, before - # calling a any class method, the specified authorization - # method will be called. If it returns 1, the method call - # will proceed, otherwise the call will throw with an - # authorization error. - self.authMethod = None - - # Globus Support if pyGlobus.io available - try: - from pyGlobus import io; - d['GSIserver'] = 1 - d['GSIclient'] = 1 - except: - d['GSIserver'] = 0 - d['GSIclient'] = 0 - - - # Server SSL support if M2Crypto.SSL available - try: - from M2Crypto import SSL - d['SSLserver'] = 1 - except: - d['SSLserver'] = 0 - - # Client SSL support if socket.ssl available - try: - from socket import ssl - d['SSLclient'] = 1 - except: - d['SSLclient'] = 0 - - for k, v in kw.items(): - if k[0] != '_': - setattr(self, k, v) - - def __setattr__(self, name, value): - if name in self.__readonly: - raise AttributeError, "readonly configuration setting" - - d = self.__dict__ - - if name in ('typesNamespace', 'typesNamespaceURI', - 'schemaNamespace', 'schemaNamespaceURI'): - - if name[-3:] == 'URI': - base, uri = name[:-3], 1 - else: - base, uri = name, 0 - - if type(value) == StringType: - if NS.NSMAP.has_key(value): - n = (value, NS.NSMAP[value]) - elif NS.NSMAP_R.has_key(value): - n = (NS.NSMAP_R[value], value) - else: - raise AttributeError, "unknown namespace" - elif type(value) in (ListType, TupleType): - if uri: - n = (value[1], value[0]) - else: - n = (value[0], value[1]) - else: - raise AttributeError, "unknown namespace type" - - d[base], d[base + 'URI'] = n - - try: - d['namespaceStyle'] = \ - NS.STMAP_R[(d['typesNamespace'], d['schemaNamespace'])] - except: - d['namespaceStyle'] = '' - - elif name == 'namespaceStyle': - value = str(value) - - if not NS.STMAP.has_key(value): - raise AttributeError, "unknown namespace style" - - d[name] = value - n = d['typesNamespace'] = NS.STMAP[value][0] - d['typesNamespaceURI'] = NS.NSMAP[n] - n = d['schemaNamespace'] = NS.STMAP[value][1] - d['schemaNamespaceURI'] = NS.NSMAP[n] - - elif name == 'debug': - d[name] = \ - d['returnFaultInfo'] = \ - d['dumpHeadersIn'] = \ - d['dumpHeadersOut'] = \ - d['dumpSOAPIn'] = \ - d['dumpSOAPOut'] = value - - else: - d[name] = value - - -Config = SOAPConfig() diff --git a/SOAPpy/Errors.py b/SOAPpy/Errors.py deleted file mode 100644 index 88e2984..0000000 --- a/SOAPpy/Errors.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -################################################################################ -# -# SOAPpy - Cayce Ullman (cayce@actzero.com) -# Brian Matthews (blm@actzero.com) -# Gregory Warnes (gregory_r_warnes@groton.pfizer.com) -# Christopher Blunck (blunck@gst.com) -# -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -ident = '$Id: Errors.py,v 1.4 2004/01/31 04:20:05 warnes Exp $' -from version import __version__ - -import exceptions - -################################################################################ -# Exceptions -################################################################################ -class Error(exceptions.Exception): - def __init__(self, msg): - self.msg = msg - def __str__(self): - return "" % self.msg - __repr__ = __str__ - def __call__(self): - return (msg,) - -class RecursionError(Error): - pass - -class UnknownTypeError(Error): - pass - -class HTTPError(Error): - # indicates an HTTP protocol error - def __init__(self, code, msg): - self.code = code - self.msg = msg - def __str__(self): - return "" % (self.code, self.msg) - __repr__ = __str__ - def __call___(self): - return (self.code, self.msg, ) - -class UnderflowError(exceptions.ArithmeticError): - pass - diff --git a/SOAPpy/NS.py b/SOAPpy/NS.py deleted file mode 100644 index 658a20e..0000000 --- a/SOAPpy/NS.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -################################################################################ -# -# SOAPpy - Cayce Ullman (cayce@actzero.com) -# Brian Matthews (blm@actzero.com) -# Gregory Warnes (gregory_r_warnes@groton.pfizer.com) -# Christopher Blunck (blunck@gst.com) -# -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -from __future__ import nested_scopes - -ident = '$Id: NS.py,v 1.3 2004/01/31 04:20:05 warnes Exp $' -from version import __version__ - -############################################################################## -# Namespace Class -################################################################################ -def invertDict(dict): - d = {} - - for k, v in dict.items(): - d[v] = k - - return d - -class NS: - XML = "http://www.w3.org/XML/1998/namespace" - - ENV = "http://schemas.xmlsoap.org/soap/envelope/" - ENC = "http://schemas.xmlsoap.org/soap/encoding/" - - XSD = "http://www.w3.org/1999/XMLSchema" - XSD2 = "http://www.w3.org/2000/10/XMLSchema" - XSD3 = "http://www.w3.org/2001/XMLSchema" - - XSD_L = [XSD, XSD2, XSD3] - EXSD_L= [ENC, XSD, XSD2, XSD3] - - XSI = "http://www.w3.org/1999/XMLSchema-instance" - XSI2 = "http://www.w3.org/2000/10/XMLSchema-instance" - XSI3 = "http://www.w3.org/2001/XMLSchema-instance" - XSI_L = [XSI, XSI2, XSI3] - - URN = "http://soapinterop.org/xsd" - - # For generated messages - XML_T = "xml" - ENV_T = "SOAP-ENV" - ENC_T = "SOAP-ENC" - XSD_T = "xsd" - XSD2_T= "xsd2" - XSD3_T= "xsd3" - XSI_T = "xsi" - XSI2_T= "xsi2" - XSI3_T= "xsi3" - URN_T = "urn" - - NSMAP = {ENV_T: ENV, ENC_T: ENC, XSD_T: XSD, XSD2_T: XSD2, - XSD3_T: XSD3, XSI_T: XSI, XSI2_T: XSI2, XSI3_T: XSI3, - URN_T: URN} - NSMAP_R = invertDict(NSMAP) - - STMAP = {'1999': (XSD_T, XSI_T), '2000': (XSD2_T, XSI2_T), - '2001': (XSD3_T, XSI3_T)} - STMAP_R = invertDict(STMAP) - - def __init__(self): - raise Error, "Don't instantiate this" - - - diff --git a/SOAPpy/Parser.py b/SOAPpy/Parser.py deleted file mode 100644 index aee364d..0000000 --- a/SOAPpy/Parser.py +++ /dev/null @@ -1,1024 +0,0 @@ -# SOAPpy modules -from Config import Config -from Types import * -from NS import NS -from Utilities import * - -import string -import fpconst -import xml.sax -from wstools.XMLname import fromXMLname - -try: from M2Crypto import SSL -except: pass - -ident = '$Id: Parser.py,v 1.14 2004/01/31 04:20:05 warnes Exp $' -from version import __version__ - - -################################################################################ -# SOAP Parser -################################################################################ -class RefHolder: - def __init__(self, name, frame): - self.name = name - self.parent = frame - self.pos = len(frame) - self.subpos = frame.namecounts.get(name, 0) - - def __repr__(self): - return "<%s %s at %d>" % (self.__class__, self.name, id(self)) - - def __str__(self): - return "<%s %s at %d>" % (self.__class__, self.name, id(self)) - -class SOAPParser(xml.sax.handler.ContentHandler): - class Frame: - def __init__(self, name, kind = None, attrs = {}, rules = {}): - self.name = name - self.kind = kind - self.attrs = attrs - self.rules = rules - - self.contents = [] - self.names = [] - self.namecounts = {} - self.subattrs = [] - - def append(self, name, data, attrs): - self.names.append(name) - self.contents.append(data) - self.subattrs.append(attrs) - - if self.namecounts.has_key(name): - self.namecounts[name] += 1 - else: - self.namecounts[name] = 1 - - def _placeItem(self, name, value, pos, subpos = 0, attrs = None): - self.contents[pos] = value - - if attrs: - self.attrs.update(attrs) - - def __len__(self): - return len(self.contents) - - def __repr__(self): - return "<%s %s at %d>" % (self.__class__, self.name, id(self)) - - def __init__(self, rules = None): - xml.sax.handler.ContentHandler.__init__(self) - self.body = None - self.header = None - self.attrs = {} - self._data = None - self._next = "E" # Keeping state for message validity - self._stack = [self.Frame('SOAP')] - - # Make two dictionaries to store the prefix <-> URI mappings, and - # initialize them with the default - self._prem = {NS.XML_T: NS.XML} - self._prem_r = {NS.XML: NS.XML_T} - self._ids = {} - self._refs = {} - self._rules = rules - - def startElementNS(self, name, qname, attrs): - # Workaround two sax bugs - if name[0] == None and name[1][0] == ' ': - name = (None, name[1][1:]) - else: - name = tuple(name) - - # First some checking of the layout of the message - - if self._next == "E": - if name[1] != 'Envelope': - raise Error, "expected `SOAP-ENV:Envelope', gto `%s:%s'" % \ - (self._prem_r[name[0]], name[1]) - if name[0] != NS.ENV: - raise faultType, ("%s:VersionMismatch" % NS.ENV_T, - "Don't understand version `%s' Envelope" % name[0]) - else: - self._next = "HorB" - elif self._next == "HorB": - if name[0] == NS.ENV and name[1] in ("Header", "Body"): - self._next = None - else: - raise Error, \ - "expected `SOAP-ENV:Header' or `SOAP-ENV:Body', " \ - "got `%s'" % self._prem_r[name[0]] + ':' + name[1] - elif self._next == "B": - if name == (NS.ENV, "Body"): - self._next = None - else: - raise Error, "expected `SOAP-ENV:Body', got `%s'" % \ - self._prem_r[name[0]] + ':' + name[1] - elif self._next == "": - raise Error, "expected nothing, got `%s'" % \ - self._prem_r[name[0]] + ':' + name[1] - - if len(self._stack) == 2: - rules = self._rules - else: - try: - rules = self._stack[-1].rules[name[1]] - except: - rules = None - - if type(rules) not in (NoneType, DictType): - kind = rules - else: - kind = attrs.get((NS.ENC, 'arrayType')) - - if kind != None: - del attrs._attrs[(NS.ENC, 'arrayType')] - - i = kind.find(':') - if i >= 0: - kind = (self._prem[kind[:i]], kind[i + 1:]) - else: - kind = None - - self.pushFrame(self.Frame(name[1], kind, attrs._attrs, rules)) - - self._data = [] # Start accumulating - - def pushFrame(self, frame): - self._stack.append(frame) - - def popFrame(self): - return self._stack.pop() - - def endElementNS(self, name, qname): - # Workaround two sax bugs - if name[0] == None and name[1][0] == ' ': - ns, name = None, name[1][1:] - else: - ns, name = tuple(name) - - name = fromXMLname(name) # convert to SOAP 1.2 XML name encoding - - if self._next == "E": - raise Error, "didn't get SOAP-ENV:Envelope" - if self._next in ("HorB", "B"): - raise Error, "didn't get SOAP-ENV:Body" - - cur = self.popFrame() - attrs = cur.attrs - - idval = None - - if attrs.has_key((None, 'id')): - idval = attrs[(None, 'id')] - - if self._ids.has_key(idval): - raise Error, "duplicate id `%s'" % idval - - del attrs[(None, 'id')] - - root = 1 - - if len(self._stack) == 3: - if attrs.has_key((NS.ENC, 'root')): - root = int(attrs[(NS.ENC, 'root')]) - - # Do some preliminary checks. First, if root="0" is present, - # the element must have an id. Next, if root="n" is present, - # n something other than 0 or 1, raise an exception. - - if root == 0: - if idval == None: - raise Error, "non-root element must have an id" - elif root != 1: - raise Error, "SOAP-ENC:root must be `0' or `1'" - - del attrs[(NS.ENC, 'root')] - - while 1: - href = attrs.get((None, 'href')) - if href: - if href[0] != '#': - raise Error, "Non-local hrefs are not yet suppported." - if self._data != None and string.join(self._data, "").strip() != '': - raise Error, "hrefs can't have data" - - href = href[1:] - - if self._ids.has_key(href): - data = self._ids[href] - else: - data = RefHolder(name, self._stack[-1]) - - if self._refs.has_key(href): - self._refs[href].append(data) - else: - self._refs[href] = [data] - - del attrs[(None, 'href')] - - break - - kind = None - - if attrs: - for i in NS.XSI_L: - if attrs.has_key((i, 'type')): - kind = attrs[(i, 'type')] - del attrs[(i, 'type')] - - if kind != None: - i = kind.find(':') - if i >= 0: - kind = (self._prem[kind[:i]], kind[i + 1:]) - else: -# XXX What to do here? (None, kind) is just going to fail in convertType - kind = (None, kind) - - null = 0 - - if attrs: - for i in (NS.XSI, NS.XSI2): - if attrs.has_key((i, 'null')): - null = attrs[(i, 'null')] - del attrs[(i, 'null')] - - if attrs.has_key((NS.XSI3, 'nil')): - null = attrs[(NS.XSI3, 'nil')] - del attrs[(NS.XSI3, 'nil')] - - - ## Check for nil - - # check for nil='true' - if type(null) in (StringType, UnicodeType): - if null.lower() == 'true': - null = 1 - - # check for nil=1, but watch out for string values - try: - null = int(null) - except ValueError, e: - if not e[0].startswith("invalid literal for int()"): - raise e - null = 0 - - if null: - if len(cur) or \ - (self._data != None and string.join(self._data, "").strip() != ''): - raise Error, "nils can't have data" - - data = None - - break - - if len(self._stack) == 2: - if (ns, name) == (NS.ENV, "Header"): - self.header = data = headerType(attrs = attrs) - self._next = "B" - break - elif (ns, name) == (NS.ENV, "Body"): - self.body = data = bodyType(attrs = attrs) - self._next = "" - break - elif len(self._stack) == 3 and self._next == None: - if (ns, name) == (NS.ENV, "Fault"): - data = faultType() - self._next = "" - break - - if cur.rules != None: - rule = cur.rules - - if type(rule) in (StringType, UnicodeType): -# XXX Need a namespace here - rule = (None, rule) - elif type(rule) == ListType: - rule = tuple(rule) - -# XXX What if rule != kind? - if callable(rule): - data = rule(string.join(self._data, "")) - elif type(rule) == DictType: - data = structType(name = (ns, name), attrs = attrs) - else: - data = self.convertType(string.join(self._data, ""), - rule, attrs) - - break - - if (kind == None and cur.kind != None) or \ - (kind == (NS.ENC, 'Array')): - kind = cur.kind - - if kind == None: - kind = 'ur-type[%d]' % len(cur) - else: - kind = kind[1] - - if len(cur.namecounts) == 1: - elemsname = cur.names[0] - else: - elemsname = None - - data = self.startArray((ns, name), kind, attrs, elemsname) - - break - - if len(self._stack) == 3 and kind == None and \ - len(cur) == 0 and \ - (self._data == None or string.join(self._data, "").strip() == ''): - data = structType(name = (ns, name), attrs = attrs) - break - - if len(cur) == 0 and ns != NS.URN: - # Nothing's been added to the current frame so it must be a - # simple type. - - if kind == None: - # If the current item's container is an array, it will - # have a kind. If so, get the bit before the first [, - # which is the type of the array, therefore the type of - # the current item. - - kind = self._stack[-1].kind - - if kind != None: - i = kind[1].find('[') - if i >= 0: - kind = (kind[0], kind[1][:i]) - elif ns != None: - kind = (ns, name) - - if kind != None: - try: - data = self.convertType(string.join(self._data, ""), - kind, attrs) - except UnknownTypeError: - data = None - else: - data = None - - if data == None: - if self._data == None: - data = '' - else: - data = string.join(self._data, "") - - if len(attrs) == 0: - try: data = str(data) - except: pass - - break - - data = structType(name = (ns, name), attrs = attrs) - - break - - if isinstance(data, compoundType): - for i in range(len(cur)): - v = cur.contents[i] - data._addItem(cur.names[i], v, cur.subattrs[i]) - - if isinstance(v, RefHolder): - v.parent = data - - if root: - self._stack[-1].append(name, data, attrs) - - if idval != None: - self._ids[idval] = data - - if self._refs.has_key(idval): - for i in self._refs[idval]: - i.parent._placeItem(i.name, data, i.pos, i.subpos, attrs) - - del self._refs[idval] - - self.attrs[id(data)] = attrs - - if isinstance(data, anyType): - data._setAttrs(attrs) - - self._data = None # Stop accumulating - - def endDocument(self): - if len(self._refs) == 1: - raise Error, \ - "unresolved reference " + self._refs.keys()[0] - elif len(self._refs) > 1: - raise Error, \ - "unresolved references " + ', '.join(self._refs.keys()) - - def startPrefixMapping(self, prefix, uri): - self._prem[prefix] = uri - self._prem_r[uri] = prefix - - def endPrefixMapping(self, prefix): - try: - del self._prem_r[self._prem[prefix]] - del self._prem[prefix] - except: - pass - - def characters(self, c): - if self._data != None: - self._data.append(c) - - arrayre = '^(?:(?P[^:]*):)?' \ - '(?P[^[]+)' \ - '(?:\[(?P,*)\])?' \ - '(?:\[(?P\d+(?:,\d+)*)?\])$' - - def startArray(self, name, kind, attrs, elemsname): - if type(self.arrayre) == StringType: - self.arrayre = re.compile (self.arrayre) - - offset = attrs.get((NS.ENC, "offset")) - - if offset != None: - del attrs[(NS.ENC, "offset")] - - try: - if offset[0] == '[' and offset[-1] == ']': - offset = int(offset[1:-1]) - if offset < 0: - raise Exception - else: - raise Exception - except: - raise AttributeError, "invalid Array offset" - else: - offset = 0 - - try: - m = self.arrayre.search(kind) - - if m == None: - raise Exception - - t = m.group('type') - - if t == 'ur-type': - return arrayType(None, name, attrs, offset, m.group('rank'), - m.group('asize'), elemsname) - elif m.group('ns') != None: - return typedArrayType(None, name, - (self._prem[m.group('ns')], t), attrs, offset, - m.group('rank'), m.group('asize'), elemsname) - else: - return typedArrayType(None, name, (None, t), attrs, offset, - m.group('rank'), m.group('asize'), elemsname) - except: - raise AttributeError, "invalid Array type `%s'" % kind - - # Conversion - - class DATETIMECONSTS: - SIGNre = '(?P-?)' - CENTURYre = '(?P\d{2,})' - YEARre = '(?P\d{2})' - MONTHre = '(?P\d{2})' - DAYre = '(?P\d{2})' - HOURre = '(?P\d{2})' - MINUTEre = '(?P\d{2})' - SECONDre = '(?P\d{2}(?:\.\d*)?)' - TIMEZONEre = '(?PZ)|(?P[-+])(?P\d{2}):' \ - '(?P\d{2})' - BOSre = '^\s*' - EOSre = '\s*$' - - __allres = {'sign': SIGNre, 'century': CENTURYre, 'year': YEARre, - 'month': MONTHre, 'day': DAYre, 'hour': HOURre, - 'minute': MINUTEre, 'second': SECONDre, 'timezone': TIMEZONEre, - 'b': BOSre, 'e': EOSre} - - dateTime = '%(b)s%(sign)s%(century)s%(year)s-%(month)s-%(day)sT' \ - '%(hour)s:%(minute)s:%(second)s(%(timezone)s)?%(e)s' % __allres - timeInstant = dateTime - timePeriod = dateTime - time = '%(b)s%(hour)s:%(minute)s:%(second)s(%(timezone)s)?%(e)s' % \ - __allres - date = '%(b)s%(sign)s%(century)s%(year)s-%(month)s-%(day)s' \ - '(%(timezone)s)?%(e)s' % __allres - century = '%(b)s%(sign)s%(century)s(%(timezone)s)?%(e)s' % __allres - gYearMonth = '%(b)s%(sign)s%(century)s%(year)s-%(month)s' \ - '(%(timezone)s)?%(e)s' % __allres - gYear = '%(b)s%(sign)s%(century)s%(year)s(%(timezone)s)?%(e)s' % \ - __allres - year = gYear - gMonthDay = '%(b)s--%(month)s-%(day)s(%(timezone)s)?%(e)s' % __allres - recurringDate = gMonthDay - gDay = '%(b)s---%(day)s(%(timezone)s)?%(e)s' % __allres - recurringDay = gDay - gMonth = '%(b)s--%(month)s--(%(timezone)s)?%(e)s' % __allres - month = gMonth - - recurringInstant = '%(b)s%(sign)s(%(century)s|-)(%(year)s|-)-' \ - '(%(month)s|-)-(%(day)s|-)T' \ - '(%(hour)s|-):(%(minute)s|-):(%(second)s|-)' \ - '(%(timezone)s)?%(e)s' % __allres - - duration = '%(b)s%(sign)sP' \ - '((?P\d+)Y)?' \ - '((?P\d+)M)?' \ - '((?P\d+)D)?' \ - '((?PT)' \ - '((?P\d+)H)?' \ - '((?P\d+)M)?' \ - '((?P\d*(?:\.\d*)?)S)?)?%(e)s' % \ - __allres - - timeDuration = duration - - # The extra 31 on the front is: - # - so the tuple is 1-based - # - so months[month-1] is December's days if month is 1 - - months = (31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) - - def convertDateTime(self, value, kind): - def getZoneOffset(d): - zoffs = 0 - - try: - if d['zulu'] == None: - zoffs = 60 * int(d['tzhour']) + int(d['tzminute']) - if d['tzsign'] != '-': - zoffs = -zoffs - except TypeError: - pass - - return zoffs - - def applyZoneOffset(months, zoffs, date, minfield, posday = 1): - if zoffs == 0 and (minfield > 4 or 0 <= date[5] < 60): - return date - - if minfield > 5: date[5] = 0 - if minfield > 4: date[4] = 0 - - if date[5] < 0: - date[4] += int(date[5]) / 60 - date[5] %= 60 - - date[4] += zoffs - - if minfield > 3 or 0 <= date[4] < 60: return date - - date[3] += date[4] / 60 - date[4] %= 60 - - if minfield > 2 or 0 <= date[3] < 24: return date - - date[2] += date[3] / 24 - date[3] %= 24 - - if minfield > 1: - if posday and date[2] <= 0: - date[2] += 31 # zoffs is at most 99:59, so the - # day will never be less than -3 - return date - - while 1: - # The date[1] == 3 (instead of == 2) is because we're - # going back a month, so we need to know if the previous - # month is February, so we test if this month is March. - - leap = minfield == 0 and date[1] == 3 and \ - date[0] % 4 == 0 and \ - (date[0] % 100 != 0 or date[0] % 400 == 0) - - if 0 < date[2] <= months[date[1]] + leap: break - - date[2] += months[date[1] - 1] + leap - - date[1] -= 1 - - if date[1] > 0: break - - date[1] = 12 - - if minfield > 0: break - - date[0] -= 1 - - return date - - try: - exp = getattr(self.DATETIMECONSTS, kind) - except AttributeError: - return None - - if type(exp) == StringType: - exp = re.compile(exp) - setattr (self.DATETIMECONSTS, kind, exp) - - m = exp.search(value) - - try: - if m == None: - raise Exception - - d = m.groupdict() - f = ('century', 'year', 'month', 'day', - 'hour', 'minute', 'second') - fn = len(f) # Index of first non-None value - r = [] - - if kind in ('duration', 'timeDuration'): - if d['sep'] != None and d['hour'] == None and \ - d['minute'] == None and d['second'] == None: - raise Exception - - f = f[1:] - - for i in range(len(f)): - s = d[f[i]] - - if s != None: - if f[i] == 'second': - s = float(s) - else: - try: s = int(s) - except ValueError: s = long(s) - - if i < fn: fn = i - - r.append(s) - - if fn > len(r): # Any non-Nones? - raise Exception - - if d['sign'] == '-': - r[fn] = -r[fn] - - return tuple(r) - - if kind == 'recurringInstant': - for i in range(len(f)): - s = d[f[i]] - - if s == None or s == '-': - if i > fn: - raise Exception - s = None - else: - if i < fn: - fn = i - - if f[i] == 'second': - s = float(s) - else: - try: - s = int(s) - except ValueError: - s = long(s) - - r.append(s) - - s = r.pop(0) - - if fn == 0: - r[0] += s * 100 - else: - fn -= 1 - - if fn < len(r) and d['sign'] == '-': - r[fn] = -r[fn] - - cleanDate(r, fn) - - return tuple(applyZoneOffset(self.DATETIMECONSTS.months, - getZoneOffset(d), r, fn, 0)) - - r = [0, 0, 1, 1, 0, 0, 0] - - for i in range(len(f)): - field = f[i] - - s = d.get(field) - - if s != None: - if field == 'second': - s = float(s) - else: - try: - s = int(s) - except ValueError: - s = long(s) - - if i < fn: - fn = i - - r[i] = s - - if fn > len(r): # Any non-Nones? - raise Exception - - s = r.pop(0) - - if fn == 0: - r[0] += s * 100 - else: - fn -= 1 - - if d.get('sign') == '-': - r[fn] = -r[fn] - - cleanDate(r, fn) - - zoffs = getZoneOffset(d) - - if zoffs: - r = applyZoneOffset(self.DATETIMECONSTS.months, zoffs, r, fn) - - if kind == 'century': - return r[0] / 100 - - s = [] - - for i in range(1, len(f)): - if d.has_key(f[i]): - s.append(r[i - 1]) - - if len(s) == 1: - return s[0] - return tuple(s) - except Exception, e: - raise Error, "invalid %s value `%s' - %s" % (kind, value, e) - - intlimits = \ - { - 'nonPositiveInteger': (0, None, 0), - 'non-positive-integer': (0, None, 0), - 'negativeInteger': (0, None, -1), - 'negative-integer': (0, None, -1), - 'long': (1, -9223372036854775808L, - 9223372036854775807L), - 'int': (0, -2147483648L, 2147483647), - 'short': (0, -32768, 32767), - 'byte': (0, -128, 127), - 'nonNegativeInteger': (0, 0, None), - 'non-negative-integer': (0, 0, None), - 'positiveInteger': (0, 1, None), - 'positive-integer': (0, 1, None), - 'unsignedLong': (1, 0, 18446744073709551615L), - 'unsignedInt': (0, 0, 4294967295L), - 'unsignedShort': (0, 0, 65535), - 'unsignedByte': (0, 0, 255), - } - floatlimits = \ - { - 'float': (7.0064923216240861E-46, -3.4028234663852886E+38, - 3.4028234663852886E+38), - 'double': (2.4703282292062327E-324, -1.7976931348623158E+308, - 1.7976931348623157E+308), - } - zerofloatre = '[1-9]' - - - - - - def convertType(self, d, t, attrs, config=Config): - return self.convertToBasicTypes(d, t, attrs, config) - - - def convertToSOAPpyTypes(self, d, t, attrs, config=Config): - pass - - - def convertToBasicTypes(self, d, t, attrs, config=Config): - dnn = d or '' - - if t[0] in NS.EXSD_L: - if t[1] == "integer": - try: - d = int(d) - if len(attrs): - d = long(d) - except: - d = long(d) - return d - if self.intlimits.has_key (t[1]): # integer types - l = self.intlimits[t[1]] - try: d = int(d) - except: d = long(d) - - if l[1] != None and d < l[1]: - raise UnderflowError, "%s too small" % d - if l[2] != None and d > l[2]: - raise OverflowError, "%s too large" % d - - if l[0] or len(attrs): - return long(d) - return d - if t[1] == "string": - if len(attrs): - return unicode(dnn) - try: - return str(dnn) - except: - return dnn - if t[1] == "boolean": - d = d.strip().lower() - if d in ('0', 'false'): - return 0 - if d in ('1', 'true'): - return 1 - raise AttributeError, "invalid boolean value" - if t[1] in ('double','float'): - l = self.floatlimits[t[1]] - s = d.strip().lower() - - d = float(s) - - if config.strict_range: - if d < l[1]: raise UnderflowError - if d > l[2]: raise OverflowError - else: - # some older SOAP impementations (notably SOAP4J, - # Apache SOAP) return "infinity" instead of "INF" - # so check the first 3 characters for a match. - if s == "nan": - return fpconst.NaN - elif s[0:3] in ("inf", "+inf"): - return fpconst.PosInf - elif s[0:3] == "-inf": - return fpconst.NegInf - - if fpconst.isNaN(d): - if s != 'nan': - raise ValueError, "invalid %s: %s" % (t[1], s) - elif fpconst.isNegInf(d): - if s != '-inf': - raise UnderflowError, "%s too small: %s" % (t[1], s) - elif fpconst.isPosInf(d): - if s != 'inf': - raise OverflowError, "%s too large: %s" % (t[1], s) - elif d < 0 and d < l[1]: - raise UnderflowError, "%s too small: %s" % (t[1], s) - elif d > 0 and ( d < l[0] or d > l[2] ): - raise OverflowError, "%s too large: %s" % (t[1], s) - elif d == 0: - if type(self.zerofloatre) == StringType: - self.zerofloatre = re.compile(self.zerofloatre) - - if self.zerofloatre.search(s): - raise UnderflowError, "invalid %s: %s" % (t[1], s) - - return d - if t[1] in ("dateTime", "date", "timeInstant", "time"): - return self.convertDateTime(d, t[1]) - if t[1] == "decimal": - return float(d) - if t[1] in ("language", "QName", "NOTATION", "NMTOKEN", "Name", - "NCName", "ID", "IDREF", "ENTITY"): - return collapseWhiteSpace(d) - if t[1] in ("IDREFS", "ENTITIES", "NMTOKENS"): - d = collapseWhiteSpace(d) - return d.split() - if t[0] in NS.XSD_L: - if t[1] in ("base64", "base64Binary"): - if d: - return base64.decodestring(d) - else: - return '' - if t[1] == "hexBinary": - if d: - return decodeHexString(d) - else: - return - if t[1] == "anyURI": - return urllib.unquote(collapseWhiteSpace(d)) - if t[1] in ("normalizedString", "token"): - return collapseWhiteSpace(d) - if t[0] == NS.ENC: - if t[1] == "base64": - if d: - return base64.decodestring(d) - else: - return '' - if t[0] == NS.XSD: - if t[1] == "binary": - try: - e = attrs[(None, 'encoding')] - - if d: - if e == 'hex': - return decodeHexString(d) - elif e == 'base64': - return base64.decodestring(d) - else: - return '' - except: - pass - - raise Error, "unknown or missing binary encoding" - if t[1] == "uri": - return urllib.unquote(collapseWhiteSpace(d)) - if t[1] == "recurringInstant": - return self.convertDateTime(d, t[1]) - if t[0] in (NS.XSD2, NS.ENC): - if t[1] == "uriReference": - return urllib.unquote(collapseWhiteSpace(d)) - if t[1] == "timePeriod": - return self.convertDateTime(d, t[1]) - if t[1] in ("century", "year"): - return self.convertDateTime(d, t[1]) - if t[0] in (NS.XSD, NS.XSD2, NS.ENC): - if t[1] == "timeDuration": - return self.convertDateTime(d, t[1]) - if t[0] == NS.XSD3: - if t[1] == "anyURI": - return urllib.unquote(collapseWhiteSpace(d)) - if t[1] in ("gYearMonth", "gMonthDay"): - return self.convertDateTime(d, t[1]) - if t[1] == "gYear": - return self.convertDateTime(d, t[1]) - if t[1] == "gMonth": - return self.convertDateTime(d, t[1]) - if t[1] == "gDay": - return self.convertDateTime(d, t[1]) - if t[1] == "duration": - return self.convertDateTime(d, t[1]) - if t[0] in (NS.XSD2, NS.XSD3): - if t[1] == "token": - return collapseWhiteSpace(d) - if t[1] == "recurringDate": - return self.convertDateTime(d, t[1]) - if t[1] == "month": - return self.convertDateTime(d, t[1]) - if t[1] == "recurringDay": - return self.convertDateTime(d, t[1]) - if t[0] == NS.XSD2: - if t[1] == "CDATA": - return collapseWhiteSpace(d) - - raise UnknownTypeError, "unknown type `%s'" % (t[0] + ':' + t[1]) - - -################################################################################ -# call to SOAPParser that keeps all of the info -################################################################################ -def _parseSOAP(xml_str, rules = None): - try: - from cStringIO import StringIO - except ImportError: - from StringIO import StringIO - - parser = xml.sax.make_parser() - t = SOAPParser(rules = rules) - parser.setContentHandler(t) - e = xml.sax.handler.ErrorHandler() - parser.setErrorHandler(e) - - inpsrc = xml.sax.xmlreader.InputSource() - inpsrc.setByteStream(StringIO(xml_str)) - - # turn on namespace mangeling - parser.setFeature(xml.sax.handler.feature_namespaces,1) - - try: - parser.parse(inpsrc) - except xml.sax.SAXParseException, e: - parser._parser = None - raise e - - return t - -################################################################################ -# SOAPParser's more public interface -################################################################################ -def parseSOAP(xml_str, attrs = 0): - t = _parseSOAP(xml_str) - - if attrs: - return t.body, t.attrs - return t.body - - -def parseSOAPRPC(xml_str, header = 0, body = 0, attrs = 0, rules = None): - #config=Config, unwrap_outer=1): - - t = _parseSOAP(xml_str, rules = rules) - p = t.body[0] - - # Empty string, for RPC this translates into a void - if type(p) in (type(''), type(u'')) and p in ('', u''): - name = "Response" - for k in t.body.__dict__.keys(): - if k[0] != "_": - name = k - p = structType(name) - - if header or body or attrs: - ret = (p,) - if header : ret += (t.header,) - if body: ret += (t.body,) - if attrs: ret += (t.attrs,) - return ret - else: - return p diff --git a/SOAPpy/SOAPBuilder.py b/SOAPpy/SOAPBuilder.py deleted file mode 100644 index e375a41..0000000 --- a/SOAPpy/SOAPBuilder.py +++ /dev/null @@ -1,620 +0,0 @@ -""" -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -ident = '$Id: SOAPBuilder.py,v 1.19 2004/04/10 04:28:46 irjudson Exp $' -from version import __version__ - -import cgi -import copy -from wstools.XMLname import toXMLname, fromXMLname -import fpconst - -# SOAPpy modules -from Config import Config -from NS import NS -from Types import * - -# Test whether this Python version has Types.BooleanType -# If it doesn't have it, then False and True are serialized as integers -try: - BooleanType - pythonHasBooleanType = 1 -except NameError: - pythonHasBooleanType = 0 - -################################################################################ -# SOAP Builder -################################################################################ -class SOAPBuilder: - _xml_top = '\n' - _xml_enc_top = '\n' - _env_top = '%(ENV_T)s:Envelope %(ENV_T)s:encodingStyle="%(ENC)s"' % \ - NS.__dict__ - _env_bot = '\n' % NS.__dict__ - - # Namespaces potentially defined in the Envelope tag. - - _env_ns = {NS.ENC: NS.ENC_T, NS.ENV: NS.ENV_T, - NS.XSD: NS.XSD_T, NS.XSD2: NS.XSD2_T, NS.XSD3: NS.XSD3_T, - NS.XSI: NS.XSI_T, NS.XSI2: NS.XSI2_T, NS.XSI3: NS.XSI3_T} - - def __init__(self, args = (), kw = {}, method = None, namespace = None, - header = None, methodattrs = None, envelope = 1, encoding = 'UTF-8', - use_refs = 0, config = Config, noroot = 0): - - # Test the encoding, raising an exception if it's not known - if encoding != None: - ''.encode(encoding) - - self.args = args - self.kw = kw - self.envelope = envelope - self.encoding = encoding - self.method = method - self.namespace = namespace - self.header = header - self.methodattrs= methodattrs - self.use_refs = use_refs - self.config = config - self.out = [] - self.tcounter = 0 - self.ncounter = 1 - self.icounter = 1 - self.envns = {} - self.ids = {} - self.depth = 0 - self.multirefs = [] - self.multis = 0 - self.body = not isinstance(args, bodyType) - self.noroot = noroot - - def build(self): - if Config.debug: print "In build." - ns_map = {} - - # Cache whether typing is on or not - typed = self.config.typed - - if self.header: - # Create a header. - self.dump(self.header, "Header", typed = typed) - self.header = None # Wipe it out so no one is using it. - - if self.body: - # Call genns to record that we've used SOAP-ENV. - self.depth += 1 - body_ns = self.genns(ns_map, NS.ENV)[0] - self.out.append("<%sBody>\n" % body_ns) - - if self.method: - self.depth += 1 - a = '' - if self.methodattrs: - for (k, v) in self.methodattrs.items(): - a += ' %s="%s"' % (k, v) - - if self.namespace: # Use the namespace info handed to us - methodns, n = self.genns(ns_map, self.namespace) - else: - methodns, n = '', '' - - self.out.append('<%s%s%s%s%s>\n' % ( - methodns, self.method, n, a, self.genroot(ns_map))) - - try: - if type(self.args) != TupleType: - args = (self.args,) - else: - args = self.args - - for i in args: - self.dump(i, typed = typed, ns_map = ns_map) - - if hasattr(self.config, "argsOrdering") and self.config.argsOrdering.has_key(self.method): - for k in self.config.argsOrdering.get(self.method): - self.dump(self.kw.get(k), k, typed = typed, ns_map = ns_map) - else: - for (k, v) in self.kw.items(): - self.dump(v, k, typed = typed, ns_map = ns_map) - - except RecursionError: - if self.use_refs == 0: - # restart - b = SOAPBuilder(args = self.args, kw = self.kw, - method = self.method, namespace = self.namespace, - header = self.header, methodattrs = self.methodattrs, - envelope = self.envelope, encoding = self.encoding, - use_refs = 1, config = self.config) - return b.build() - raise - - if self.method: - self.out.append("\n" % (methodns, self.method)) - self.depth -= 1 - - if self.body: - # dump may add to self.multirefs, but the for loop will keep - # going until it has used all of self.multirefs, even those - # entries added while in the loop. - - self.multis = 1 - - for obj, tag in self.multirefs: - self.dump(obj, tag, typed = typed, ns_map = ns_map) - - self.out.append("\n" % body_ns) - self.depth -= 1 - - if self.envelope: - e = map (lambda ns: ' xmlns:%s="%s"' % (ns[1], ns[0]), - self.envns.items()) - - self.out = ['<', self._env_top] + e + ['>\n'] + \ - self.out + \ - [self._env_bot] - - if self.encoding != None: - self.out.insert(0, self._xml_enc_top % self.encoding) - return ''.join(self.out).encode(self.encoding) - - self.out.insert(0, self._xml_top) - return ''.join(self.out) - - def gentag(self): - if Config.debug: print "In gentag." - self.tcounter += 1 - return "v%d" % self.tcounter - - def genns(self, ns_map, nsURI): - if nsURI == None: - return ('', '') - - if type(nsURI) == TupleType: # already a tuple - if len(nsURI) == 2: - ns, nsURI = nsURI - else: - ns, nsURI = None, nsURI[0] - else: - ns = None - - if ns_map.has_key(nsURI): - return (ns_map[nsURI] + ':', '') - - if self._env_ns.has_key(nsURI): - ns = self.envns[nsURI] = ns_map[nsURI] = self._env_ns[nsURI] - return (ns + ':', '') - - if not ns: - ns = "ns%d" % self.ncounter - self.ncounter += 1 - ns_map[nsURI] = ns - if self.config.buildWithNamespacePrefix: - return (ns + ':', ' xmlns:%s="%s"' % (ns, nsURI)) - else: - return ('', ' xmlns="%s"' % (nsURI)) - - def genroot(self, ns_map): - if self.noroot: - return '' - - if self.depth != 2: - return '' - - ns, n = self.genns(ns_map, NS.ENC) - return ' %sroot="%d"%s' % (ns, not self.multis, n) - - # checkref checks an element to see if it needs to be encoded as a - # multi-reference element or not. If it returns None, the element has - # been handled and the caller can continue with subsequent elements. - # If it returns a string, the string should be included in the opening - # tag of the marshaled element. - - def checkref(self, obj, tag, ns_map): - if self.depth < 2: - return '' - - if not self.ids.has_key(id(obj)): - n = self.ids[id(obj)] = self.icounter - self.icounter = n + 1 - - if self.use_refs == 0: - return '' - - if self.depth == 2: - return ' id="i%d"' % n - - self.multirefs.append((obj, tag)) - else: - if self.use_refs == 0: - raise RecursionError, "Cannot serialize recursive object" - - n = self.ids[id(obj)] - - if self.multis and self.depth == 2: - return ' id="i%d"' % n - - self.out.append('<%s href="#i%d"%s/>\n' % - (tag, n, self.genroot(ns_map))) - return None - - # dumpers - - def dump(self, obj, tag = None, typed = 1, ns_map = {}): - if Config.debug: print "In dump.", "obj=", obj - ns_map = ns_map.copy() - self.depth += 1 - - if type(tag) not in (NoneType, StringType, UnicodeType): - raise KeyError, "tag must be a string or None" - - try: - meth = getattr(self, "dump_" + type(obj).__name__) - except AttributeError: - if type(obj) == LongType: - obj_type = "integer" - elif pythonHasBooleanType and type(obj) == BooleanType: - obj_type = "boolean" - else: - obj_type = type(obj).__name__ - - self.out.append(self.dumper(None, obj_type, obj, tag, typed, - ns_map, self.genroot(ns_map))) - else: - meth(obj, tag, typed, ns_map) - - - self.depth -= 1 - - # generic dumper - def dumper(self, nsURI, obj_type, obj, tag, typed = 1, ns_map = {}, - rootattr = '', id = '', - xml = '<%(tag)s%(type)s%(id)s%(attrs)s%(root)s>%(data)s\n'): - if Config.debug: print "In dumper." - - if nsURI == None: - nsURI = self.config.typesNamespaceURI - - tag = tag or self.gentag() - - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - a = n = t = '' - if typed and obj_type: - ns, n = self.genns(ns_map, nsURI) - ins = self.genns(ns_map, self.config.schemaNamespaceURI)[0] - t = ' %stype="%s%s"%s' % (ins, ns, obj_type, n) - - try: a = obj._marshalAttrs(ns_map, self) - except: pass - - try: data = obj._marshalData() - except: - if (obj_type != "string"): # strings are already encoded - data = cgi.escape(str(obj)) - else: - data = obj - - - return xml % {"tag": tag, "type": t, "data": data, "root": rootattr, - "id": id, "attrs": a} - - def dump_float(self, obj, tag, typed = 1, ns_map = {}): - if Config.debug: print "In dump_float." - tag = tag or self.gentag() - - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - if Config.strict_range: - doubleType(obj) - - if fpconst.isPosInf(obj): - obj = "INF" - elif fpconst.isNegInf(obj): - obj = "-INF" - elif fpconst.isNaN(obj): - obj = "NaN" - else: - obj = str(obj) - - # Note: python 'float' is actually a SOAP 'double'. - self.out.append(self.dumper(None, "double", obj, tag, typed, ns_map, - self.genroot(ns_map))) - - def dump_string(self, obj, tag, typed = 0, ns_map = {}): - if Config.debug: print "In dump_string." - tag = tag or self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - id = self.checkref(obj, tag, ns_map) - if id == None: - return - - try: data = obj._marshalData() - except: data = obj - - self.out.append(self.dumper(None, "string", cgi.escape(data), tag, - typed, ns_map, self.genroot(ns_map), id)) - - dump_str = dump_string # For Python 2.2+ - dump_unicode = dump_string - - def dump_None(self, obj, tag, typed = 0, ns_map = {}): - if Config.debug: print "In dump_None." - tag = tag or self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - ns = self.genns(ns_map, self.config.schemaNamespaceURI)[0] - - self.out.append('<%s %snull="1"%s/>\n' % - (tag, ns, self.genroot(ns_map))) - - dump_NoneType = dump_None # For Python 2.2+ - - def dump_list(self, obj, tag, typed = 1, ns_map = {}): - if Config.debug: print "In dump_list.", "obj=", obj - tag = tag or self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - if type(obj) == InstanceType: - data = obj.data - else: - data = obj - - id = self.checkref(obj, tag, ns_map) - if id == None: - return - - try: - sample = data[0] - empty = 0 - except: - # preserve type if present - if getattr(obj,"_typed",None) and getattr(obj,"_type",None): - if getattr(obj, "_complexType", None): - sample = typedArrayType(typed=obj._type, - complexType = obj._complexType) - sample._typename = obj._type - obj._ns = NS.URN - else: - sample = typedArrayType(typed=obj._type) - else: - sample = structType() - empty = 1 - - # First scan list to see if all are the same type - same_type = 1 - - if not empty: - for i in data[1:]: - if type(sample) != type(i) or \ - (type(sample) == InstanceType and \ - sample.__class__ != i.__class__): - same_type = 0 - break - - ndecl = '' - if same_type: - if (isinstance(sample, structType)) or \ - type(sample) == DictType or \ - (isinstance(sample, anyType) and \ - (getattr(sample, "_complexType", None) and \ - sample._complexType)): # force to urn struct - try: - tns = obj._ns or NS.URN - except: - tns = NS.URN - - ns, ndecl = self.genns(ns_map, tns) - - try: - typename = sample._typename - except: - typename = "SOAPStruct" - - t = ns + typename - - elif isinstance(sample, anyType): - ns = sample._validNamespaceURI(self.config.typesNamespaceURI, - self.config.strictNamespaces) - if ns: - ns, ndecl = self.genns(ns_map, ns) - t = ns + sample._type - else: - t = 'ur-type' - else: - typename = type(sample).__name__ - - # For Python 2.2+ - if type(sample) == StringType: typename = 'string' - - # HACK: python 'float' is actually a SOAP 'double'. - if typename=="float": typename="double" - t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ - typename - - else: - t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ - "ur-type" - - try: a = obj._marshalAttrs(ns_map, self) - except: a = '' - - ens, edecl = self.genns(ns_map, NS.ENC) - ins, idecl = self.genns(ns_map, self.config.schemaNamespaceURI) - - self.out.append( - '<%s %sarrayType="%s[%d]" %stype="%sArray"%s%s%s%s%s%s>\n' % - (tag, ens, t, len(data), ins, ens, ndecl, edecl, idecl, - self.genroot(ns_map), id, a)) - - typed = not same_type - - try: elemsname = obj._elemsname - except: elemsname = "item" - - for i in data: - self.dump(i, elemsname, typed, ns_map) - - self.out.append('\n' % tag) - - dump_tuple = dump_list - - def dump_dictionary(self, obj, tag, typed = 1, ns_map = {}): - if Config.debug: print "In dump_dictionary." - tag = tag or self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - id = self.checkref(obj, tag, ns_map) - if id == None: - return - - try: a = obj._marshalAttrs(ns_map, self) - except: a = '' - - self.out.append('<%s%s%s%s>\n' % - (tag, id, a, self.genroot(ns_map))) - - for (k, v) in obj.items(): - if k[0] != "_": - self.dump(v, k, 1, ns_map) - - self.out.append('\n' % tag) - - dump_dict = dump_dictionary # For Python 2.2+ - - def dump_instance(self, obj, tag, typed = 1, ns_map = {}): - if Config.debug: print "In dump_instance.", "obj=", obj, "tag=", tag - if not tag: - # If it has a name use it. - if isinstance(obj, anyType) and obj._name: - tag = obj._name - else: - tag = self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding - - if isinstance(obj, arrayType): # Array - self.dump_list(obj, tag, typed, ns_map) - return - - if isinstance(obj, faultType): # Fault - cns, cdecl = self.genns(ns_map, NS.ENC) - vns, vdecl = self.genns(ns_map, NS.ENV) - self.out.append('''<%sFault %sroot="1"%s%s> -%s -%s -''' % (vns, cns, vdecl, cdecl, obj.faultcode, obj.faultstring)) - if hasattr(obj, "detail"): - self.dump(obj.detail, "detail", typed, ns_map) - self.out.append("\n" % vns) - return - - r = self.genroot(ns_map) - - try: a = obj._marshalAttrs(ns_map, self) - except: a = '' - - if isinstance(obj, voidType): # void - self.out.append("<%s%s%s>\n" % (tag, a, r, tag)) - return - - id = self.checkref(obj, tag, ns_map) - if id == None: - return - - if isinstance(obj, structType): - # Check for namespace - ndecl = '' - ns = obj._validNamespaceURI(self.config.typesNamespaceURI, - self.config.strictNamespaces) - if ns: - ns, ndecl = self.genns(ns_map, ns) - tag = ns + tag - self.out.append("<%s%s%s%s%s>\n" % (tag, ndecl, id, a, r)) - - keylist = obj.__dict__.keys() - - # first write out items with order information - if hasattr(obj, '_keyord'): - for i in range(len(obj._keyord)): - self.dump(obj._aslist(i), obj._keyord[i], 1, ns_map) - keylist.remove(obj._keyord[i]) - - # now write out the rest - for k in keylist: - if (k[0] != "_"): - self.dump(getattr(obj,k), k, 1, ns_map) - - if isinstance(obj, bodyType): - self.multis = 1 - - for v, k in self.multirefs: - self.dump(v, k, typed = typed, ns_map = ns_map) - - self.out.append('\n' % tag) - - elif isinstance(obj, anyType): - t = '' - - if typed: - ns = obj._validNamespaceURI(self.config.typesNamespaceURI, - self.config.strictNamespaces) - if ns: - ons, ondecl = self.genns(ns_map, ns) - ins, indecl = self.genns(ns_map, - self.config.schemaNamespaceURI) - t = ' %stype="%s%s"%s%s' % \ - (ins, ons, obj._type, ondecl, indecl) - - self.out.append('<%s%s%s%s%s>%s\n' % - (tag, t, id, a, r, obj._marshalData(), tag)) - - else: # Some Class - self.out.append('<%s%s%s>\n' % (tag, id, r)) - - for (k, v) in obj.__dict__.items(): - if k[0] != "_": - self.dump(v, k, 1, ns_map) - - self.out.append('\n' % tag) - - -################################################################################ -# SOAPBuilder's more public interface -################################################################################ -def buildSOAP(args=(), kw={}, method=None, namespace=None, header=None, - methodattrs=None,envelope=1,encoding='UTF-8',config=Config,noroot = 0): - t = SOAPBuilder(args=args,kw=kw, method=method, namespace=namespace, - header=header, methodattrs=methodattrs,envelope=envelope, - encoding=encoding, config=config,noroot=noroot) - return t.build() diff --git a/SOAPpy/Types.py b/SOAPpy/Types.py deleted file mode 100644 index b4d9a57..0000000 --- a/SOAPpy/Types.py +++ /dev/null @@ -1,1734 +0,0 @@ -""" -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -ident = '$Id: Types.py,v 1.17 2004/09/11 03:03:33 warnes Exp $' -from version import __version__ - -from __future__ import nested_scopes - -import UserList -import base64 -import cgi -import urllib -import copy -import re -import time -from types import * - -# SOAPpy modules -from Errors import * -from NS import NS -from Utilities import encodeHexString, cleanDate -from Config import Config - -############################################################################### -# Utility functions -############################################################################### - -def isPrivate(name): return name[0]=='_' -def isPublic(name): return name[0]!='_' - -############################################################################### -# Types and Wrappers -############################################################################### - -class anyType: - _validURIs = (NS.XSD, NS.XSD2, NS.XSD3, NS.ENC) - - def __init__(self, data = None, name = None, typed = 1, attrs = None): - if self.__class__ == anyType: - raise Error, "anyType can't be instantiated directly" - - if type(name) in (ListType, TupleType): - self._ns, self._name = name - else: - self._ns = self._validURIs[0] - self._name = name - - self._typed = typed - self._attrs = {} - - self._cache = None - self._type = self._typeName() - - self._data = self._checkValueSpace(data) - - if attrs != None: - self._setAttrs(attrs) - - def __str__(self): - if hasattr(self,'_name') and self._name: - return "<%s %s at %d>" % (self.__class__, self._name, id(self)) - return "<%s at %d>" % (self.__class__, id(self)) - - __repr__ = __str__ - - def _checkValueSpace(self, data): - return data - - def _marshalData(self): - return str(self._data) - - def _marshalAttrs(self, ns_map, builder): - a = '' - - for attr, value in self._attrs.items(): - ns, n = builder.genns(ns_map, attr[0]) - a += n + ' %s%s="%s"' % \ - (ns, attr[1], cgi.escape(str(value), 1)) - - return a - - def _fixAttr(self, attr): - if type(attr) in (StringType, UnicodeType): - attr = (None, attr) - elif type(attr) == ListType: - attr = tuple(attr) - elif type(attr) != TupleType: - raise AttributeError, "invalid attribute type" - - if len(attr) != 2: - raise AttributeError, "invalid attribute length" - - if type(attr[0]) not in (NoneType, StringType, UnicodeType): - raise AttributeError, "invalid attribute namespace URI type" - - return attr - - def _getAttr(self, attr): - attr = self._fixAttr(attr) - - try: - return self._attrs[attr] - except: - return None - - def _setAttr(self, attr, value): - attr = self._fixAttr(attr) - - if type(value) is StringType: - value = unicode(value) - - self._attrs[attr] = value - - - def _setAttrs(self, attrs): - if type(attrs) in (ListType, TupleType): - for i in range(0, len(attrs), 2): - self._setAttr(attrs[i], attrs[i + 1]) - - return - - if type(attrs) == DictType: - d = attrs - elif isinstance(attrs, anyType): - d = attrs._attrs - else: - raise AttributeError, "invalid attribute type" - - for attr, value in d.items(): - self._setAttr(attr, value) - - def _setMustUnderstand(self, val): - self._setAttr((NS.ENV, "mustUnderstand"), val) - - def _getMustUnderstand(self): - return self._getAttr((NS.ENV, "mustUnderstand")) - - def _setActor(self, val): - self._setAttr((NS.ENV, "actor"), val) - - def _getActor(self): - return self._getAttr((NS.ENV, "actor")) - - def _typeName(self): - return self.__class__.__name__[:-4] - - def _validNamespaceURI(self, URI, strict): - if not hasattr(self, '_typed') or not self._typed: - return None - if URI in self._validURIs: - return URI - if not strict: - return self._ns - raise AttributeError, \ - "not a valid namespace for type %s" % self._type - -class voidType(anyType): - pass - -class stringType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type:" % self._type - - return data - -class untypedType(stringType): - def __init__(self, data = None, name = None, attrs = None): - stringType.__init__(self, data, name, 0, attrs) - -class IDType(stringType): pass -class NCNameType(stringType): pass -class NameType(stringType): pass -class ENTITYType(stringType): pass -class IDREFType(stringType): pass -class languageType(stringType): pass -class NMTOKENType(stringType): pass -class QNameType(stringType): pass - -class tokenType(anyType): - _validURIs = (NS.XSD2, NS.XSD3) - __invalidre = '[\n\t]|^ | $| ' - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - if type(self.__invalidre) == StringType: - self.__invalidre = re.compile(self.__invalidre) - - if self.__invalidre.search(data): - raise ValueError, "invalid %s value" % self._type - - return data - -class normalizedStringType(anyType): - _validURIs = (NS.XSD3,) - __invalidre = '[\n\r\t]' - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - if type(self.__invalidre) == StringType: - self.__invalidre = re.compile(self.__invalidre) - - if self.__invalidre.search(data): - raise ValueError, "invalid %s value" % self._type - - return data - -class CDATAType(normalizedStringType): - _validURIs = (NS.XSD2,) - -class booleanType(anyType): - def __int__(self): - return self._data - - __nonzero__ = __int__ - - def _marshalData(self): - return ['false', 'true'][self._data] - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if data in (0, '0', 'false', ''): - return 0 - if data in (1, '1', 'true'): - return 1 - raise ValueError, "invalid %s value" % self._type - -class decimalType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType, FloatType): - raise Error, "invalid %s value" % self._type - - return data - -class floatType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType, FloatType) or \ - data < -3.4028234663852886E+38 or \ - data > 3.4028234663852886E+38: - raise ValueError, "invalid %s value: %s" % (self._type, repr(data)) - - return data - - def _marshalData(self): - return "%.18g" % self._data # More precision - -class doubleType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType, FloatType) or \ - data < -1.7976931348623158E+308 or \ - data > 1.7976931348623157E+308: - raise ValueError, "invalid %s value: %s" % (self._type, repr(data)) - - return data - - def _marshalData(self): - return "%.18g" % self._data # More precision - -class durationType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - try: - # A tuple or a scalar is OK, but make them into a list - - if type(data) == TupleType: - data = list(data) - elif type(data) != ListType: - data = [data] - - if len(data) > 6: - raise Exception, "too many values" - - # Now check the types of all the components, and find - # the first nonzero element along the way. - - f = -1 - - for i in range(len(data)): - if data[i] == None: - data[i] = 0 - continue - - if type(data[i]) not in \ - (IntType, LongType, FloatType): - raise Exception, "element %d a bad type" % i - - if data[i] and f == -1: - f = i - - # If they're all 0, just use zero seconds. - - if f == -1: - self._cache = 'PT0S' - - return (0,) * 6 - - # Make sure only the last nonzero element has a decimal fraction - # and only the first element is negative. - - d = -1 - - for i in range(f, len(data)): - if data[i]: - if d != -1: - raise Exception, \ - "all except the last nonzero element must be " \ - "integers" - if data[i] < 0 and i > f: - raise Exception, \ - "only the first nonzero element can be negative" - elif data[i] != long(data[i]): - d = i - - # Pad the list on the left if necessary. - - if len(data) < 6: - n = 6 - len(data) - f += n - d += n - data = [0] * n + data - - # Save index of the first nonzero element and the decimal - # element for _marshalData. - - self.__firstnonzero = f - self.__decimal = d - - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - t = 0 - - if d[self.__firstnonzero] < 0: - s = '-P' - else: - s = 'P' - - t = 0 - - for i in range(self.__firstnonzero, len(d)): - if d[i]: - if i > 2 and not t: - s += 'T' - t = 1 - if self.__decimal == i: - s += "%g" % abs(d[i]) - else: - s += "%d" % long(abs(d[i])) - s += ['Y', 'M', 'D', 'H', 'M', 'S'][i] - - self._cache = s - - return self._cache - -class timeDurationType(durationType): - _validURIs = (NS.XSD, NS.XSD2, NS.ENC) - -class dateTimeType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.time() - - if (type(data) in (IntType, LongType)): - data = list(time.gmtime(data)[:6]) - elif (type(data) == FloatType): - f = data - int(data) - data = list(time.gmtime(int(data))[:6]) - data[5] += f - elif type(data) in (ListType, TupleType): - if len(data) < 6: - raise Exception, "not enough values" - if len(data) > 9: - raise Exception, "too many values" - - data = list(data[:6]) - - cleanDate(data) - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - s = "%04d-%02d-%02dT%02d:%02d:%02d" % ((abs(d[0]),) + d[1:]) - if d[0] < 0: - s = '-' + s - f = d[5] - int(d[5]) - if f != 0: - s += ("%g" % f)[1:] - s += 'Z' - - self._cache = s - - return self._cache - -class recurringInstantType(anyType): - _validURIs = (NS.XSD,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = list(time.gmtime(time.time())[:6]) - if (type(data) in (IntType, LongType)): - data = list(time.gmtime(data)[:6]) - elif (type(data) == FloatType): - f = data - int(data) - data = list(time.gmtime(int(data))[:6]) - data[5] += f - elif type(data) in (ListType, TupleType): - if len(data) < 1: - raise Exception, "not enough values" - if len(data) > 9: - raise Exception, "too many values" - - data = list(data[:6]) - - if len(data) < 6: - data += [0] * (6 - len(data)) - - f = len(data) - - for i in range(f): - if data[i] == None: - if f < i: - raise Exception, \ - "only leftmost elements can be none" - else: - f = i - break - - cleanDate(data, f) - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - e = list(d) - neg = '' - - if not e[0]: - e[0] = '--' - else: - if e[0] < 0: - neg = '-' - e[0] = abs(e[0]) - if e[0] < 100: - e[0] = '-' + "%02d" % e[0] - else: - e[0] = "%04d" % e[0] - - for i in range(1, len(e)): - if e[i] == None or (i < 3 and e[i] == 0): - e[i] = '-' - else: - if e[i] < 0: - neg = '-' - e[i] = abs(e[i]) - - e[i] = "%02d" % e[i] - - if d[5]: - f = abs(d[5] - int(d[5])) - - if f: - e[5] += ("%g" % f)[1:] - - s = "%s%s-%s-%sT%s:%s:%sZ" % ((neg,) + tuple(e)) - - self._cache = s - - return self._cache - -class timeInstantType(dateTimeType): - _validURIs = (NS.XSD, NS.XSD2, NS.ENC) - -class timePeriodType(dateTimeType): - _validURIs = (NS.XSD2, NS.ENC) - -class timeType(anyType): - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[3:6] - elif (type(data) == FloatType): - f = data - int(data) - data = list(time.gmtime(int(data))[3:6]) - data[2] += f - elif type(data) in (IntType, LongType): - data = time.gmtime(data)[3:6] - elif type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[3:6] - elif len(data) > 3: - raise Exception, "too many values" - - data = [None, None, None] + list(data) - - if len(data) < 6: - data += [0] * (6 - len(data)) - - cleanDate(data, 3) - - data = data[3:] - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - s = '' - - s = time.strftime("%H:%M:%S", (0, 0, 0) + d + (0, 0, -1)) - f = d[2] - int(d[2]) - if f != 0: - s += ("%g" % f)[1:] - s += 'Z' - - self._cache = s - - return self._cache - -class dateType(anyType): - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[0:3] - elif type(data) in (IntType, LongType, FloatType): - data = time.gmtime(data)[0:3] - elif type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[0:3] - elif len(data) > 3: - raise Exception, "too many values" - - data = list(data) - - if len(data) < 3: - data += [1, 1, 1][len(data):] - - data += [0, 0, 0] - - cleanDate(data) - - data = data[:3] - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - s = "%04d-%02d-%02dZ" % ((abs(d[0]),) + d[1:]) - if d[0] < 0: - s = '-' + s - - self._cache = s - - return self._cache - -class gYearMonthType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[0:2] - elif type(data) in (IntType, LongType, FloatType): - data = time.gmtime(data)[0:2] - elif type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[0:2] - elif len(data) > 2: - raise Exception, "too many values" - - data = list(data) - - if len(data) < 2: - data += [1, 1][len(data):] - - data += [1, 0, 0, 0] - - cleanDate(data) - - data = data[:2] - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - d = self._data - s = "%04d-%02dZ" % ((abs(d[0]),) + d[1:]) - if d[0] < 0: - s = '-' + s - - self._cache = s - - return self._cache - -class gYearType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[0:1] - elif type(data) in (IntType, LongType, FloatType): - data = [data] - - if type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[0:1] - elif len(data) < 1: - raise Exception, "too few values" - elif len(data) > 1: - raise Exception, "too many values" - - if type(data[0]) == FloatType: - try: s = int(data[0]) - except: s = long(data[0]) - - if s != data[0]: - raise Exception, "not integral" - - data = [s] - elif type(data[0]) not in (IntType, LongType): - raise Exception, "bad type" - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return data[0] - - def _marshalData(self): - if self._cache == None: - d = self._data - s = "%04dZ" % abs(d) - if d < 0: - s = '-' + s - - self._cache = s - - return self._cache - -class centuryType(anyType): - _validURIs = (NS.XSD2, NS.ENC) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[0:1] / 100 - elif type(data) in (IntType, LongType, FloatType): - data = [data] - - if type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[0:1] / 100 - elif len(data) < 1: - raise Exception, "too few values" - elif len(data) > 1: - raise Exception, "too many values" - - if type(data[0]) == FloatType: - try: s = int(data[0]) - except: s = long(data[0]) - - if s != data[0]: - raise Exception, "not integral" - - data = [s] - elif type(data[0]) not in (IntType, LongType): - raise Exception, "bad type" - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return data[0] - - def _marshalData(self): - if self._cache == None: - d = self._data - s = "%02dZ" % abs(d) - if d < 0: - s = '-' + s - - self._cache = s - - return self._cache - -class yearType(gYearType): - _validURIs = (NS.XSD2, NS.ENC) - -class gMonthDayType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[1:3] - elif type(data) in (IntType, LongType, FloatType): - data = time.gmtime(data)[1:3] - elif type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[0:2] - elif len(data) > 2: - raise Exception, "too many values" - - data = list(data) - - if len(data) < 2: - data += [1, 1][len(data):] - - data = [0] + data + [0, 0, 0] - - cleanDate(data, 1) - - data = data[1:3] - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return tuple(data) - - def _marshalData(self): - if self._cache == None: - self._cache = "--%02d-%02dZ" % self._data - - return self._cache - -class recurringDateType(gMonthDayType): - _validURIs = (NS.XSD2, NS.ENC) - -class gMonthType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[1:2] - elif type(data) in (IntType, LongType, FloatType): - data = [data] - - if type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[1:2] - elif len(data) < 1: - raise Exception, "too few values" - elif len(data) > 1: - raise Exception, "too many values" - - if type(data[0]) == FloatType: - try: s = int(data[0]) - except: s = long(data[0]) - - if s != data[0]: - raise Exception, "not integral" - - data = [s] - elif type(data[0]) not in (IntType, LongType): - raise Exception, "bad type" - - if data[0] < 1 or data[0] > 12: - raise Exception, "bad value" - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return data[0] - - def _marshalData(self): - if self._cache == None: - self._cache = "--%02d--Z" % self._data - - return self._cache - -class monthType(gMonthType): - _validURIs = (NS.XSD2, NS.ENC) - -class gDayType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - try: - if data == None: - data = time.gmtime(time.time())[2:3] - elif type(data) in (IntType, LongType, FloatType): - data = [data] - - if type(data) in (ListType, TupleType): - if len(data) == 9: - data = data[2:3] - elif len(data) < 1: - raise Exception, "too few values" - elif len(data) > 1: - raise Exception, "too many values" - - if type(data[0]) == FloatType: - try: s = int(data[0]) - except: s = long(data[0]) - - if s != data[0]: - raise Exception, "not integral" - - data = [s] - elif type(data[0]) not in (IntType, LongType): - raise Exception, "bad type" - - if data[0] < 1 or data[0] > 31: - raise Exception, "bad value" - else: - raise Exception, "invalid type" - except Exception, e: - raise ValueError, "invalid %s value - %s" % (self._type, e) - - return data[0] - - def _marshalData(self): - if self._cache == None: - self._cache = "---%02dZ" % self._data - - return self._cache - -class recurringDayType(gDayType): - _validURIs = (NS.XSD2, NS.ENC) - -class hexBinaryType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - return data - - def _marshalData(self): - if self._cache == None: - self._cache = encodeHexString(self._data) - - return self._cache - -class base64BinaryType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - return data - - def _marshalData(self): - if self._cache == None: - self._cache = base64.encodestring(self._data) - - return self._cache - -class base64Type(base64BinaryType): - _validURIs = (NS.ENC,) - -class binaryType(anyType): - _validURIs = (NS.XSD, NS.ENC) - - def __init__(self, data, name = None, typed = 1, encoding = 'base64', - attrs = None): - - anyType.__init__(self, data, name, typed, attrs) - - self._setAttr('encoding', encoding) - - def _marshalData(self): - if self._cache == None: - if self._getAttr((None, 'encoding')) == 'base64': - self._cache = base64.encodestring(self._data) - else: - self._cache = encodeHexString(self._data) - - return self._cache - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - return data - - def _setAttr(self, attr, value): - attr = self._fixAttr(attr) - - if attr[1] == 'encoding': - if attr[0] != None or value not in ('base64', 'hex'): - raise AttributeError, "invalid encoding" - - self._cache = None - - anyType._setAttr(self, attr, value) - - -class anyURIType(anyType): - _validURIs = (NS.XSD3,) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (StringType, UnicodeType): - raise AttributeError, "invalid %s type" % self._type - - return data - - def _marshalData(self): - if self._cache == None: - self._cache = urllib.quote(self._data) - - return self._cache - -class uriType(anyURIType): - _validURIs = (NS.XSD,) - -class uriReferenceType(anyURIType): - _validURIs = (NS.XSD2,) - -class NOTATIONType(anyType): - def __init__(self, data, name = None, typed = 1, attrs = None): - - if self.__class__ == NOTATIONType: - raise Error, "a NOTATION can't be instantiated directly" - - anyType.__init__(self, data, name, typed, attrs) - -class ENTITIESType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) in (StringType, UnicodeType): - return (data,) - - if type(data) not in (ListType, TupleType) or \ - filter (lambda x: type(x) not in (StringType, UnicodeType), data): - raise AttributeError, "invalid %s type" % self._type - - return data - - def _marshalData(self): - return ' '.join(self._data) - -class IDREFSType(ENTITIESType): pass -class NMTOKENSType(ENTITIESType): pass - -class integerType(anyType): - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType): - raise ValueError, "invalid %s value" % self._type - - return data - -class nonPositiveIntegerType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or data > 0: - raise ValueError, "invalid %s value" % self._type - - return data - -class non_Positive_IntegerType(nonPositiveIntegerType): - _validURIs = (NS.XSD,) - - def _typeName(self): - return 'non-positive-integer' - -class negativeIntegerType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or data >= 0: - raise ValueError, "invalid %s value" % self._type - - return data - -class negative_IntegerType(negativeIntegerType): - _validURIs = (NS.XSD,) - - def _typeName(self): - return 'negative-integer' - -class longType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < -9223372036854775808L or \ - data > 9223372036854775807L: - raise ValueError, "invalid %s value" % self._type - - return data - -class intType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < -2147483648L or \ - data > 2147483647: - raise ValueError, "invalid %s value" % self._type - - return data - -class shortType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < -32768 or \ - data > 32767: - raise ValueError, "invalid %s value" % self._type - - return data - -class byteType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < -128 or \ - data > 127: - raise ValueError, "invalid %s value" % self._type - - return data - -class nonNegativeIntegerType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or data < 0: - raise ValueError, "invalid %s value" % self._type - - return data - -class non_Negative_IntegerType(nonNegativeIntegerType): - _validURIs = (NS.XSD,) - - def _typeName(self): - return 'non-negative-integer' - -class unsignedLongType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < 0 or \ - data > 18446744073709551615L: - raise ValueError, "invalid %s value" % self._type - - return data - -class unsignedIntType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < 0 or \ - data > 4294967295L: - raise ValueError, "invalid %s value" % self._type - - return data - -class unsignedShortType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < 0 or \ - data > 65535: - raise ValueError, "invalid %s value" % self._type - - return data - -class unsignedByteType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or \ - data < 0 or \ - data > 255: - raise ValueError, "invalid %s value" % self._type - - return data - -class positiveIntegerType(anyType): - _validURIs = (NS.XSD2, NS.XSD3, NS.ENC) - - def _checkValueSpace(self, data): - if data == None: - raise ValueError, "must supply initial %s value" % self._type - - if type(data) not in (IntType, LongType) or data <= 0: - raise ValueError, "invalid %s value" % self._type - - return data - -class positive_IntegerType(positiveIntegerType): - _validURIs = (NS.XSD,) - - def _typeName(self): - return 'positive-integer' - -# Now compound types - -class compoundType(anyType): - def __init__(self, data = None, name = None, typed = 1, attrs = None): - if self.__class__ == compoundType: - raise Error, "a compound can't be instantiated directly" - - anyType.__init__(self, data, name, typed, attrs) - self._keyord = [] - - if type(data) == DictType: - self.__dict__.update(data) - - def _aslist(self, item=None): - if item: - return self.__dict__[self._keyord[item]] - else: - return map( lambda x: self.__dict__[x], self._keyord) - - def _asdict(self, item=None, encoding=Config.dict_encoding): - if item: - if type(item) in (UnicodeType,StringType): - item = item.encode(encoding) - return self.__dict__[item] - else: - retval = {} - def fun(x): retval[x.encode(encoding)] = self.__dict__[x] - - if hasattr(self, '_keyord'): - map( fun, self._keyord) - else: - for name in dir(self): - if isPublic(name): - retval[name] = getattr(self,name) - return retval - - - def __getitem__(self, item): - if type(item) == IntType: - return self.__dict__[self._keyord[item]] - else: - return getattr(self, item) - - def __len__(self): - return len(self._keyord) - - def __nonzero__(self): - return 1 - - def _keys(self): - return filter(lambda x: x[0] != '_', self.__dict__.keys()) - - def _addItem(self, name, value, attrs = None): - - if name in self._keyord: - if type(self.__dict__[name]) != ListType: - self.__dict__[name] = [self.__dict__[name]] - self.__dict__[name].append(value) - else: - self.__dict__[name] = value - self._keyord.append(name) - - def _placeItem(self, name, value, pos, subpos = 0, attrs = None): - - if subpos == 0 and type(self.__dict__[name]) != ListType: - self.__dict__[name] = value - else: - self.__dict__[name][subpos] = value - - self._keyord[pos] = name - - - def _getItemAsList(self, name, default = []): - try: - d = self.__dict__[name] - except: - return default - - if type(d) == ListType: - return d - return [d] - - def __str__(self): - return anyType.__str__(self) + ": " + str(self._asdict()) - - def __repr__(self): - return self.__str__() - -class structType(compoundType): - pass - -class headerType(structType): - _validURIs = (NS.ENV,) - - def __init__(self, data = None, typed = 1, attrs = None): - structType.__init__(self, data, "Header", typed, attrs) - -class bodyType(structType): - _validURIs = (NS.ENV,) - - def __init__(self, data = None, typed = 1, attrs = None): - structType.__init__(self, data, "Body", typed, attrs) - -class arrayType(UserList.UserList, compoundType): - def __init__(self, data = None, name = None, attrs = None, - offset = 0, rank = None, asize = 0, elemsname = None): - - if data: - if type(data) not in (ListType, TupleType): - raise Error, "Data must be a sequence" - - UserList.UserList.__init__(self, data) - compoundType.__init__(self, data, name, 0, attrs) - - self._elemsname = elemsname or "item" - - if data == None: - self._rank = rank - - # According to 5.4.2.2 in the SOAP spec, each element in a - # sparse array must have a position. _posstate keeps track of - # whether we've seen a position or not. It's possible values - # are: - # -1 No elements have been added, so the state is indeterminate - # 0 An element without a position has been added, so no - # elements can have positions - # 1 An element with a position has been added, so all elements - # must have positions - - self._posstate = -1 - - self._full = 0 - - if asize in ('', None): - asize = '0' - - self._dims = map (lambda x: int(x), str(asize).split(',')) - self._dims.reverse() # It's easier to work with this way - self._poss = [0] * len(self._dims) # This will end up - # reversed too - - for i in range(len(self._dims)): - if self._dims[i] < 0 or \ - self._dims[i] == 0 and len(self._dims) > 1: - raise TypeError, "invalid Array dimensions" - - if offset > 0: - self._poss[i] = offset % self._dims[i] - offset = int(offset / self._dims[i]) - - # Don't break out of the loop if offset is 0 so we test all the - # dimensions for > 0. - if offset: - raise AttributeError, "invalid Array offset" - - a = [None] * self._dims[0] - - for i in range(1, len(self._dims)): - b = [] - - for j in range(self._dims[i]): - b.append(copy.deepcopy(a)) - - a = b - - self.data = a - - - def _aslist(self, item=None): - if item: - return self.data[int(item)] - else: - return self.data - - def _asdict(self, item=None, encoding=Config.dict_encoding): - if item: - if type(item) in (UnicodeType,StringType): - item = item.encode(encoding) - return self.data[int(item)] - else: - retval = {} - def fun(x): retval[str(x).encode(encoding)] = self.data[x] - - map( fun, range(len(self.data)) ) - return retval - - def __getitem__(self, item): - try: - return self.data[int(item)] - except ValueError: - return getattr(self, item) - - def __len__(self): - return len(self.data) - - def __nonzero__(self): - return 1 - - def __str__(self): - return anyType.__str__(self) + ": " + str(self._aslist()) - - def _keys(self): - return filter(lambda x: x[0] != '_', self.__dict__.keys()) - - def _addItem(self, name, value, attrs): - if self._full: - raise ValueError, "Array is full" - - pos = attrs.get((NS.ENC, 'position')) - - if pos != None: - if self._posstate == 0: - raise AttributeError, \ - "all elements in a sparse Array must have a " \ - "position attribute" - - self._posstate = 1 - - try: - if pos[0] == '[' and pos[-1] == ']': - pos = map (lambda x: int(x), pos[1:-1].split(',')) - pos.reverse() - - if len(pos) == 1: - pos = pos[0] - - curpos = [0] * len(self._dims) - - for i in range(len(self._dims)): - curpos[i] = pos % self._dims[i] - pos = int(pos / self._dims[i]) - - if pos == 0: - break - - if pos: - raise Exception - elif len(pos) != len(self._dims): - raise Exception - else: - for i in range(len(self._dims)): - if pos[i] >= self._dims[i]: - raise Exception - - curpos = pos - else: - raise Exception - except: - raise AttributeError, \ - "invalid Array element position %s" % str(pos) - else: - if self._posstate == 1: - raise AttributeError, \ - "only elements in a sparse Array may have a " \ - "position attribute" - - self._posstate = 0 - - curpos = self._poss - - a = self.data - - for i in range(len(self._dims) - 1, 0, -1): - a = a[curpos[i]] - - if curpos[0] >= len(a): - a += [None] * (len(a) - curpos[0] + 1) - - a[curpos[0]] = value - - if pos == None: - self._poss[0] += 1 - - for i in range(len(self._dims) - 1): - if self._poss[i] < self._dims[i]: - break - - self._poss[i] = 0 - self._poss[i + 1] += 1 - - if self._dims[-1] and self._poss[-1] >= self._dims[-1]: - self._full = 1 - - def _placeItem(self, name, value, pos, subpos, attrs = None): - curpos = [0] * len(self._dims) - - for i in range(len(self._dims)): - if self._dims[i] == 0: - curpos[0] = pos - break - - curpos[i] = pos % self._dims[i] - pos = int(pos / self._dims[i]) - - if pos == 0: - break - - if self._dims[i] != 0 and pos: - raise Error, "array index out of range" - - a = self.data - - for i in range(len(self._dims) - 1, 0, -1): - a = a[curpos[i]] - - if curpos[0] >= len(a): - a += [None] * (len(a) - curpos[0] + 1) - - a[curpos[0]] = value - -class typedArrayType(arrayType): - def __init__(self, data = None, name = None, typed = None, attrs = None, - offset = 0, rank = None, asize = 0, elemsname = None, complexType = 0): - - arrayType.__init__(self, data, name, attrs, offset, rank, asize, - elemsname) - - self._typed = 1 - self._type = typed - self._complexType = complexType - -class faultType(structType, Error): - def __init__(self, faultcode = "", faultstring = "", detail = None): - self.faultcode = faultcode - self.faultstring = faultstring - if detail != None: - self.detail = detail - - structType.__init__(self, None, 0) - - def _setDetail(self, detail = None): - if detail != None: - self.detail = detail - else: - try: del self.detail - except AttributeError: pass - - def __repr__(self): - if getattr(self, 'detail', None) != None: - return "" % (self.faultcode, - self.faultstring, - self.detail) - else: - return "" % (self.faultcode, self.faultstring) - - __str__ = __repr__ - - def __call__(self): - return (self.faultcode, self.faultstring, self.detail) - -class SOAPException(Exception): - def __init__(self, code="", string="", detail=None): - self.value = ("SOAPpy SOAP Exception", code, string, detail) - self.code = code - self.string = string - self.detail = detail - - def __str__(self): - return repr(self.value) - -class RequiredHeaderMismatch(Exception): - def __init__(self, value): - self.value = value - - def __str__(self): - return repr(self.value) - -class MethodNotFound(Exception): - def __init__(self, value): - (val, detail) = value.split(":") - self.value = val - self.detail = detail - - def __str__(self): - return repr(self.value, self.detail) - -class AuthorizationFailed(Exception): - def __init__(self, value): - self.value = value - - def __str__(self): - return repr(self.value) - -class MethodFailed(Exception): - def __init__(self, value): - self.value = value - - def __str__(self): - return repr(self.value) - -####### -# Convert complex SOAPpy objects to native python equivalents -####### - -def simplify(object, level=0): - """ - Convert the SOAPpy objects and thier contents to simple python types. - - This function recursively converts the passed 'container' object, - and all public subobjects. (Private subobjects have names that - start with '_'.) - - Conversions: - - faultType --> raise python exception - - arrayType --> array - - compoundType --> dictionary - """ - - if level > 10: - return object - - if isinstance( object, faultType ): - if object.faultstring == "Required Header Misunderstood": - raise RequiredHeaderMismatch(object.detail) - elif object.faultstring == "Method Not Found": - raise MethodNotFound(object.detail) - elif object.faultstring == "Authorization Failed": - raise AuthorizationFailed(object.detail) - elif object.faultstring == "Method Failed": - raise MethodFailed(object.detail) - else: - se = SOAPException(object.faultcode, object.faultstring, - object.detail) - raise se - elif isinstance( object, arrayType ): - data = object._aslist() - for k in range(len(data)): - data[k] = simplify(data[k], level=level+1) - return data - elif isinstance( object, compoundType ) or isinstance(object, structType): - data = object._asdict() - for k in data.keys(): - if isPublic(k): - data[k] = simplify(data[k], level=level+1) - return data - elif type(object)==DictType: - for k in object.keys(): - if isPublic(k): - object[k] = simplify(object[k]) - return object - elif type(object)==list: - for k in range(len(object)): - object[k] = simplify(object[k]) - return object - else: - return object - - -def simplify_contents(object, level=0): - """ - Convert the contents of SOAPpy objects to simple python types. - - This function recursively converts the sub-objects contained in a - 'container' object to simple python types. - - Conversions: - - faultType --> raise python exception - - arrayType --> array - - compoundType --> dictionary - """ - - if level>10: return object - - if isinstance( object, faultType ): - for k in object._keys(): - if isPublic(k): - setattr(object, k, simplify(object[k], level=level+1)) - raise object - elif isinstance( object, arrayType ): - data = object._aslist() - for k in range(len(data)): - object[k] = simplify(data[k], level=level+1) - elif isinstance(object, structType): - data = object._asdict() - for k in data.keys(): - if isPublic(k): - setattr(object, k, simplify(data[k], level=level+1)) - elif isinstance( object, compoundType ) : - data = object._asdict() - for k in data.keys(): - if isPublic(k): - object[k] = simplify(data[k], level=level+1) - elif type(object)==DictType: - for k in object.keys(): - if isPublic(k): - object[k] = simplify(object[k]) - elif type(object)==list: - for k in range(len(object)): - object[k] = simplify(object[k]) - - return object - - diff --git a/SOAPpy/Utilities.py b/SOAPpy/Utilities.py deleted file mode 100644 index 03d3433..0000000 --- a/SOAPpy/Utilities.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -################################################################################ -# Copyright (c) 2003, Pfizer -# Copyright (c) 2001, Cayce Ullman. -# Copyright (c) 2001, Brian Matthews. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# Neither the name of actzero, inc. nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -################################################################################ -""" - -ident = '$Id: Utilities.py,v 1.4 2004/01/31 04:20:06 warnes Exp $' -from version import __version__ - -import exceptions -import copy -import re -import string -import sys -from types import * - -# SOAPpy modules -from Errors import * - -################################################################################ -# Utility infielders -################################################################################ -def collapseWhiteSpace(s): - return re.sub('\s+', ' ', s).strip() - -def decodeHexString(data): - conv = { - '0': 0x0, '1': 0x1, '2': 0x2, '3': 0x3, '4': 0x4, - '5': 0x5, '6': 0x6, '7': 0x7, '8': 0x8, '9': 0x9, - - 'a': 0xa, 'b': 0xb, 'c': 0xc, 'd': 0xd, 'e': 0xe, - 'f': 0xf, - - 'A': 0xa, 'B': 0xb, 'C': 0xc, 'D': 0xd, 'E': 0xe, - 'F': 0xf, - } - - ws = string.whitespace - - bin = '' - - i = 0 - - while i < len(data): - if data[i] not in ws: - break - i += 1 - - low = 0 - - while i < len(data): - c = data[i] - - if c in string.whitespace: - break - - try: - c = conv[c] - except KeyError: - raise ValueError, \ - "invalid hex string character `%s'" % c - - if low: - bin += chr(high * 16 + c) - low = 0 - else: - high = c - low = 1 - - i += 1 - - if low: - raise ValueError, "invalid hex string length" - - while i < len(data): - if data[i] not in string.whitespace: - raise ValueError, \ - "invalid hex string character `%s'" % c - - i += 1 - - return bin - -def encodeHexString(data): - h = '' - - for i in data: - h += "%02X" % ord(i) - - return h - -def leapMonth(year, month): - return month == 2 and \ - year % 4 == 0 and \ - (year % 100 != 0 or year % 400 == 0) - -def cleanDate(d, first = 0): - ranges = (None, (1, 12), (1, 31), (0, 23), (0, 59), (0, 61)) - months = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) - names = ('year', 'month', 'day', 'hours', 'minutes', 'seconds') - - if len(d) != 6: - raise ValueError, "date must have 6 elements" - - for i in range(first, 6): - s = d[i] - - if type(s) == FloatType: - if i < 5: - try: - s = int(s) - except OverflowError: - if i > 0: - raise - s = long(s) - - if s != d[i]: - raise ValueError, "%s must be integral" % names[i] - - d[i] = s - elif type(s) == LongType: - try: s = int(s) - except: pass - elif type(s) != IntType: - raise TypeError, "%s isn't a valid type" % names[i] - - if i == first and s < 0: - continue - - if ranges[i] != None and \ - (s < ranges[i][0] or ranges[i][1] < s): - raise ValueError, "%s out of range" % names[i] - - if first < 6 and d[5] >= 61: - raise ValueError, "seconds out of range" - - if first < 2: - leap = first < 1 and leapMonth(d[0], d[1]) - - if d[2] > months[d[1]] + leap: - raise ValueError, "day out of range" - -def debugHeader(title): - s = '*** ' + title + ' ' - print s + ('*' * (72 - len(s))) - -def debugFooter(title): - print '*' * 72 - sys.stdout.flush() diff --git a/SOAPpy/__init__.py b/SOAPpy/__init__.py deleted file mode 100644 index 0e039f8..0000000 --- a/SOAPpy/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ - -ident = '$Id: __init__.py,v 1.9 2004/01/31 04:20:06 warnes Exp $' -from version import __version__ - -from Client import * -from Config import * -from Errors import * -from NS import * -from Parser import * -from SOAPBuilder import * -from Server import * -from Types import * -from Utilities import * -import wstools -import WSDL diff --git a/SOAPpy/version.py b/SOAPpy/version.py deleted file mode 100644 index eda6139..0000000 --- a/SOAPpy/version.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__="0.11.6" - diff --git a/SOAPpy/wstools/Namespaces.py b/SOAPpy/wstools/Namespaces.py deleted file mode 100755 index 60eaa0f..0000000 --- a/SOAPpy/wstools/Namespaces.py +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env python -"""Namespace module, so you don't need PyXML -""" - -try: - from xml.ns import SOAP, SCHEMA, WSDL, XMLNS, DSIG, ENCRYPTION -except: - class SOAP: - ENV = "http://schemas.xmlsoap.org/soap/envelope/" - ENC = "http://schemas.xmlsoap.org/soap/encoding/" - ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next" - - class SCHEMA: - XSD1 = "http://www.w3.org/1999/XMLSchema" - XSD2 = "http://www.w3.org/2000/10/XMLSchema" - XSD3 = "http://www.w3.org/2001/XMLSchema" - XSD_LIST = [ XSD1, XSD2, XSD3 ] - XSI1 = "http://www.w3.org/1999/XMLSchema-instance" - XSI2 = "http://www.w3.org/2000/10/XMLSchema-instance" - XSI3 = "http://www.w3.org/2001/XMLSchema-instance" - XSI_LIST = [ XSI1, XSI2, XSI3 ] - BASE = XSD3 - - class WSDL: - BASE = "http://schemas.xmlsoap.org/wsdl/" - BIND_HTTP = "http://schemas.xmlsoap.org/wsdl/http/" - BIND_MIME = "http://schemas.xmlsoap.org/wsdl/mime/" - BIND_SOAP = "http://schemas.xmlsoap.org/wsdl/soap/" - - class XMLNS: - BASE = "http://www.w3.org/2000/xmlns/" - XML = "http://www.w3.org/XML/1998/namespace" - HTML = "http://www.w3.org/TR/REC-html40" - - class DSIG: - BASE = "http://www.w3.org/2000/09/xmldsig#" - C14N = "http://www.w3.org/TR/2000/CR-xml-c14n-20010315" - C14N_COMM = "http://www.w3.org/TR/2000/CR-xml-c14n-20010315#WithComments" - C14N_EXCL = "http://www.w3.org/2001/10/xml-exc-c14n#" - DIGEST_MD2 = "http://www.w3.org/2000/09/xmldsig#md2" - DIGEST_MD5 = "http://www.w3.org/2000/09/xmldsig#md5" - DIGEST_SHA1 = "http://www.w3.org/2000/09/xmldsig#sha1" - ENC_BASE64 = "http://www.w3.org/2000/09/xmldsig#base64" - ENVELOPED = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" - HMAC_SHA1 = "http://www.w3.org/2000/09/xmldsig#hmac-sha1" - SIG_DSA_SHA1 = "http://www.w3.org/2000/09/xmldsig#dsa-sha1" - SIG_RSA_SHA1 = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" - XPATH = "http://www.w3.org/TR/1999/REC-xpath-19991116" - XSLT = "http://www.w3.org/TR/1999/REC-xslt-19991116" - - class ENCRYPTION: - BASE = "http://www.w3.org/2001/04/xmlenc#" - BLOCK_3DES = "http://www.w3.org/2001/04/xmlenc#des-cbc" - BLOCK_AES128 = "http://www.w3.org/2001/04/xmlenc#aes128-cbc" - BLOCK_AES192 = "http://www.w3.org/2001/04/xmlenc#aes192-cbc" - BLOCK_AES256 = "http://www.w3.org/2001/04/xmlenc#aes256-cbc" - DIGEST_RIPEMD160 = "http://www.w3.org/2001/04/xmlenc#ripemd160" - DIGEST_SHA256 = "http://www.w3.org/2001/04/xmlenc#sha256" - DIGEST_SHA512 = "http://www.w3.org/2001/04/xmlenc#sha512" - KA_DH = "http://www.w3.org/2001/04/xmlenc#dh" - KT_RSA_1_5 = "http://www.w3.org/2001/04/xmlenc#rsa-1_5" - KT_RSA_OAEP = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" - STREAM_ARCFOUR = "http://www.w3.org/2001/04/xmlenc#arcfour" - WRAP_3DES = "http://www.w3.org/2001/04/xmlenc#kw-3des" - WRAP_AES128 = "http://www.w3.org/2001/04/xmlenc#kw-aes128" - WRAP_AES192 = "http://www.w3.org/2001/04/xmlenc#kw-aes192" - WRAP_AES256 = "http://www.w3.org/2001/04/xmlenc#kw-aes256" - - -class WSSE: - BASE = "http://schemas.xmlsoap.org/ws/2002/04/secext" - -class WSU: - BASE = "http://schemas.xmlsoap.org/ws/2002/04/utility" - UTILITY = "http://schemas.xmlsoap.org/ws/2002/07/utility" - -class WSR: - PROPERTIES = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceProperties" - LIFETIME = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime" - -class WSA: - ADDRESS = "http://schemas.xmlsoap.org/ws/2003/03/addressing" - ADDRESS2004 = "http://schemas.xmlsoap.org/ws/2004/03/addressing" - ANONYMOUS = "%s/role/anonymous" %ADDRESS - ANONYMOUS2004 = "%s/role/anonymous" %ADDRESS2004 - FAULT = "http://schemas.xmlsoap.org/ws/2004/03/addressing/fault" - -class WSP: - POLICY = "http://schemas.xmlsoap.org/ws/2002/12/policy" - - - diff --git a/SOAPpy/wstools/TimeoutSocket.py b/SOAPpy/wstools/TimeoutSocket.py deleted file mode 100755 index 2d804dd..0000000 --- a/SOAPpy/wstools/TimeoutSocket.py +++ /dev/null @@ -1,179 +0,0 @@ -"""Based on code from timeout_socket.py, with some tweaks for compatibility. - These tweaks should really be rolled back into timeout_socket, but it's - not totally clear who is maintaining it at this point. In the meantime, - we'll use a different module name for our tweaked version to avoid any - confusion. - - The original timeout_socket is by: - - Scott Cotton - Lloyd Zusman - Phil Mayes - Piers Lauder - Radovan Garabik -""" - -ident = "$Id: TimeoutSocket.py,v 1.2 2003/05/20 21:10:12 warnes Exp $" - -import string, socket, select, errno - -WSAEINVAL = getattr(errno, 'WSAEINVAL', 10022) - - -class TimeoutSocket: - """A socket imposter that supports timeout limits.""" - - def __init__(self, timeout=20, sock=None): - self.timeout = float(timeout) - self.inbuf = '' - if sock is None: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock = sock - self.sock.setblocking(0) - self._rbuf = '' - self._wbuf = '' - - def __getattr__(self, name): - # Delegate to real socket attributes. - return getattr(self.sock, name) - - def connect(self, *addr): - timeout = self.timeout - sock = self.sock - try: - # Non-blocking mode - sock.setblocking(0) - apply(sock.connect, addr) - sock.setblocking(timeout != 0) - return 1 - except socket.error,why: - if not timeout: - raise - sock.setblocking(1) - if len(why.args) == 1: - code = 0 - else: - code, why = why - if code not in ( - errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK - ): - raise - r,w,e = select.select([],[sock],[],timeout) - if w: - try: - apply(sock.connect, addr) - return 1 - except socket.error,why: - if len(why.args) == 1: - code = 0 - else: - code, why = why - if code in (errno.EISCONN, WSAEINVAL): - return 1 - raise - raise TimeoutError('socket connect() timeout.') - - def send(self, data, flags=0): - total = len(data) - next = 0 - while 1: - r, w, e = select.select([],[self.sock], [], self.timeout) - if w: - buff = data[next:next + 8192] - sent = self.sock.send(buff, flags) - next = next + sent - if next == total: - return total - continue - raise TimeoutError('socket send() timeout.') - - def recv(self, amt, flags=0): - if select.select([self.sock], [], [], self.timeout)[0]: - return self.sock.recv(amt, flags) - raise TimeoutError('socket recv() timeout.') - - buffsize = 4096 - handles = 1 - - def makefile(self, mode="r", buffsize=-1): - self.handles = self.handles + 1 - self.mode = mode - return self - - def close(self): - self.handles = self.handles - 1 - if self.handles == 0 and self.sock.fileno() >= 0: - self.sock.close() - - def read(self, n=-1): - if not isinstance(n, type(1)): - n = -1 - if n >= 0: - k = len(self._rbuf) - if n <= k: - data = self._rbuf[:n] - self._rbuf = self._rbuf[n:] - return data - n = n - k - L = [self._rbuf] - self._rbuf = "" - while n > 0: - new = self.recv(max(n, self.buffsize)) - if not new: break - k = len(new) - if k > n: - L.append(new[:n]) - self._rbuf = new[n:] - break - L.append(new) - n = n - k - return "".join(L) - k = max(4096, self.buffsize) - L = [self._rbuf] - self._rbuf = "" - while 1: - new = self.recv(k) - if not new: break - L.append(new) - k = min(k*2, 1024**2) - return "".join(L) - - def readline(self, limit=-1): - data = "" - i = self._rbuf.find('\n') - while i < 0 and not (0 < limit <= len(self._rbuf)): - new = self.recv(self.buffsize) - if not new: break - i = new.find('\n') - if i >= 0: i = i + len(self._rbuf) - self._rbuf = self._rbuf + new - if i < 0: i = len(self._rbuf) - else: i = i+1 - if 0 <= limit < len(self._rbuf): i = limit - data, self._rbuf = self._rbuf[:i], self._rbuf[i:] - return data - - def readlines(self, sizehint = 0): - total = 0 - list = [] - while 1: - line = self.readline() - if not line: break - list.append(line) - total += len(line) - if sizehint and total >= sizehint: - break - return list - - def writelines(self, list): - self.send(''.join(list)) - - def write(self, data): - self.send(data) - - def flush(self): - pass - - -class TimeoutError(Exception): - pass diff --git a/SOAPpy/wstools/UserTuple.py b/SOAPpy/wstools/UserTuple.py deleted file mode 100755 index 5b193e7..0000000 --- a/SOAPpy/wstools/UserTuple.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -A more or less complete user-defined wrapper around tuple objects. -Adapted version of the standard library's UserList. - -Taken from Stefan Schwarzer's ftputil library, available at -, and used under this license: - - - - -Copyright (C) 1999, Stefan Schwarzer -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -- Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -- Neither the name of the above author nor the names of the - contributors to the software may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -""" - - - - -# $Id: UserTuple.py,v 1.1 2003/07/21 14:18:54 warnes Exp $ - -#XXX tuple instances (in Python 2.2) contain also: -# __class__, __delattr__, __getattribute__, __hash__, __new__, -# __reduce__, __setattr__, __str__ -# What about these? - -class UserTuple: - def __init__(self, inittuple=None): - self.data = () - if inittuple is not None: - # XXX should this accept an arbitrary sequence? - if type(inittuple) == type(self.data): - self.data = inittuple - elif isinstance(inittuple, UserTuple): - # this results in - # self.data is inittuple.data - # but that's ok for tuples because they are - # immutable. (Builtin tuples behave the same.) - self.data = inittuple.data[:] - else: - # the same applies here; (t is tuple(t)) == 1 - self.data = tuple(inittuple) - def __repr__(self): return repr(self.data) - def __lt__(self, other): return self.data < self.__cast(other) - def __le__(self, other): return self.data <= self.__cast(other) - def __eq__(self, other): return self.data == self.__cast(other) - def __ne__(self, other): return self.data != self.__cast(other) - def __gt__(self, other): return self.data > self.__cast(other) - def __ge__(self, other): return self.data >= self.__cast(other) - def __cast(self, other): - if isinstance(other, UserTuple): return other.data - else: return other - def __cmp__(self, other): - return cmp(self.data, self.__cast(other)) - def __contains__(self, item): return item in self.data - def __len__(self): return len(self.data) - def __getitem__(self, i): return self.data[i] - def __getslice__(self, i, j): - i = max(i, 0); j = max(j, 0) - return self.__class__(self.data[i:j]) - def __add__(self, other): - if isinstance(other, UserTuple): - return self.__class__(self.data + other.data) - elif isinstance(other, type(self.data)): - return self.__class__(self.data + other) - else: - return self.__class__(self.data + tuple(other)) - # dir( () ) contains no __radd__ (at least in Python 2.2) - def __mul__(self, n): - return self.__class__(self.data*n) - __rmul__ = __mul__ - diff --git a/SOAPpy/wstools/Utility.py b/SOAPpy/wstools/Utility.py deleted file mode 100755 index b2bfb3c..0000000 --- a/SOAPpy/wstools/Utility.py +++ /dev/null @@ -1,839 +0,0 @@ -# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. - -ident = "$Id: Utility.py,v 1.15 2004/04/29 01:40:49 boverhof Exp $" - -import types -import string, httplib, smtplib, urllib, socket, weakref -import xml.dom.minidom -from string import join, strip, split -from UserDict import UserDict -from StringIO import StringIO -from TimeoutSocket import TimeoutSocket, TimeoutError -from urlparse import urlparse -from httplib import HTTPConnection, HTTPSConnection -from exceptions import Exception - -try: - from xml.dom.ext import SplitQName -except: - def SplitQName(qname): - '''SplitQName(qname) -> (string, string) - - Split Qualified Name into a tuple of len 2, consisting - of the prefix and the local name. - - (prefix, localName) - - Special Cases: - xmlns -- (localName, 'xmlns') - None -- (None, localName) - ''' - - l = qname.split(':') - if len(l) == 1: - l.insert(0, None) - elif len(l) == 2: - if l[0] == 'xmlns': - l.reverse() - else: - return - return tuple(l) - -class RecursionError(Exception): - """Used to indicate a HTTP redirect recursion.""" - pass - -class HTTPResponse: - """Captures the information in an HTTP response message.""" - - def __init__(self, response): - self.status = response.status - self.reason = response.reason - self.headers = response.msg - self.body = response.read() or None - response.close() - -class TimeoutHTTP(HTTPConnection): - """A custom http connection object that supports socket timeout.""" - def __init__(self, host, port=None, timeout=20): - HTTPConnection.__init__(self, host, port) - self.timeout = timeout - - def connect(self): - self.sock = TimeoutSocket(self.timeout) - self.sock.connect((self.host, self.port)) - - -class TimeoutHTTPS(HTTPSConnection): - """A custom https object that supports socket timeout. Note that this - is not really complete. The builtin SSL support in the Python socket - module requires a real socket (type) to be passed in to be hooked to - SSL. That means our fake socket won't work and our timeout hacks are - bypassed for send and recv calls. Since our hack _is_ in place at - connect() time, it should at least provide some timeout protection.""" - def __init__(self, host, port=None, timeout=20, **kwargs): - HTTPSConnection.__init__(self, str(host), port, **kwargs) - self.timeout = timeout - - def connect(self): - sock = TimeoutSocket(self.timeout) - sock.connect((self.host, self.port)) - realsock = getattr(sock.sock, '_sock', sock.sock) - ssl = socket.ssl(realsock, self.key_file, self.cert_file) - self.sock = httplib.FakeSocket(sock, ssl) - -def urlopen(url, timeout=20, redirects=None): - """A minimal urlopen replacement hack that supports timeouts for http. - Note that this supports GET only.""" - scheme, host, path, params, query, frag = urlparse(url) - if not scheme in ('http', 'https'): - return urllib.urlopen(url) - if params: path = '%s;%s' % (path, params) - if query: path = '%s?%s' % (path, query) - if frag: path = '%s#%s' % (path, frag) - - if scheme == 'https': - # If ssl is not compiled into Python, you will not get an exception - # until a conn.endheaders() call. We need to know sooner, so use - # getattr. - if hasattr(socket, 'ssl'): - conn = TimeoutHTTPS(host, None, timeout) - else: - import M2Crypto - ctx = M2Crypto.SSL.Context() - ctx.set_session_timeout(timeout) - conn = M2Crypto.httpslib.HTTPSConnection(host, ssl_context=ctx) - #conn.set_debuglevel(1) - else: - conn = TimeoutHTTP(host, None, timeout) - - conn.putrequest('GET', path) - conn.putheader('Connection', 'close') - conn.endheaders() - response = None - while 1: - response = conn.getresponse() - if response.status != 100: - break - conn._HTTPConnection__state = httplib._CS_REQ_SENT - conn._HTTPConnection__response = None - - status = response.status - - # If we get an HTTP redirect, we will follow it automatically. - if status >= 300 and status < 400: - location = response.msg.getheader('location') - if location is not None: - response.close() - if redirects is not None and redirects.has_key(location): - raise RecursionError( - 'Circular HTTP redirection detected.' - ) - if redirects is None: - redirects = {} - redirects[location] = 1 - return urlopen(location, timeout, redirects) - raise HTTPResponse(response) - - if not (status >= 200 and status < 300): - raise HTTPResponse(response) - - body = StringIO(response.read()) - response.close() - return body - -class DOM: - """The DOM singleton defines a number of XML related constants and - provides a number of utility methods for DOM related tasks. It - also provides some basic abstractions so that the rest of the - package need not care about actual DOM implementation in use.""" - - # Namespace stuff related to the SOAP specification. - - NS_SOAP_ENV_1_1 = 'http://schemas.xmlsoap.org/soap/envelope/' - NS_SOAP_ENC_1_1 = 'http://schemas.xmlsoap.org/soap/encoding/' - - NS_SOAP_ENV_1_2 = 'http://www.w3.org/2001/06/soap-envelope' - NS_SOAP_ENC_1_2 = 'http://www.w3.org/2001/06/soap-encoding' - - NS_SOAP_ENV_ALL = (NS_SOAP_ENV_1_1, NS_SOAP_ENV_1_2) - NS_SOAP_ENC_ALL = (NS_SOAP_ENC_1_1, NS_SOAP_ENC_1_2) - - NS_SOAP_ENV = NS_SOAP_ENV_1_1 - NS_SOAP_ENC = NS_SOAP_ENC_1_1 - - _soap_uri_mapping = { - NS_SOAP_ENV_1_1 : '1.1', - NS_SOAP_ENV_1_2 : '1.2', - } - - SOAP_ACTOR_NEXT_1_1 = 'http://schemas.xmlsoap.org/soap/actor/next' - SOAP_ACTOR_NEXT_1_2 = 'http://www.w3.org/2001/06/soap-envelope/actor/next' - SOAP_ACTOR_NEXT_ALL = (SOAP_ACTOR_NEXT_1_1, SOAP_ACTOR_NEXT_1_2) - - def SOAPUriToVersion(self, uri): - """Return the SOAP version related to an envelope uri.""" - value = self._soap_uri_mapping.get(uri) - if value is not None: - return value - raise ValueError( - 'Unsupported SOAP envelope uri: %s' % uri - ) - - def GetSOAPEnvUri(self, version): - """Return the appropriate SOAP envelope uri for a given - human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENV_%s' % join(split(version, '.'), '_') - value = getattr(self, attrname, None) - if value is not None: - return value - raise ValueError( - 'Unsupported SOAP version: %s' % version - ) - - def GetSOAPEncUri(self, version): - """Return the appropriate SOAP encoding uri for a given - human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENC_%s' % join(split(version, '.'), '_') - value = getattr(self, attrname, None) - if value is not None: - return value - raise ValueError( - 'Unsupported SOAP version: %s' % version - ) - - def GetSOAPActorNextUri(self, version): - """Return the right special next-actor uri for a given - human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'SOAP_ACTOR_NEXT_%s' % join(split(version, '.'), '_') - value = getattr(self, attrname, None) - if value is not None: - return value - raise ValueError( - 'Unsupported SOAP version: %s' % version - ) - - - # Namespace stuff related to XML Schema. - - NS_XSD_99 = 'http://www.w3.org/1999/XMLSchema' - NS_XSI_99 = 'http://www.w3.org/1999/XMLSchema-instance' - - NS_XSD_00 = 'http://www.w3.org/2000/10/XMLSchema' - NS_XSI_00 = 'http://www.w3.org/2000/10/XMLSchema-instance' - - NS_XSD_01 = 'http://www.w3.org/2001/XMLSchema' - NS_XSI_01 = 'http://www.w3.org/2001/XMLSchema-instance' - - NS_XSD_ALL = (NS_XSD_99, NS_XSD_00, NS_XSD_01) - NS_XSI_ALL = (NS_XSI_99, NS_XSI_00, NS_XSI_01) - - NS_XSD = NS_XSD_01 - NS_XSI = NS_XSI_01 - - _xsd_uri_mapping = { - NS_XSD_99 : NS_XSI_99, - NS_XSD_00 : NS_XSI_00, - NS_XSD_01 : NS_XSI_01, - } - - for key, value in _xsd_uri_mapping.items(): - _xsd_uri_mapping[value] = key - - - def InstanceUriForSchemaUri(self, uri): - """Return the appropriate matching XML Schema instance uri for - the given XML Schema namespace uri.""" - return self._xsd_uri_mapping.get(uri) - - def SchemaUriForInstanceUri(self, uri): - """Return the appropriate matching XML Schema namespace uri for - the given XML Schema instance namespace uri.""" - return self._xsd_uri_mapping.get(uri) - - - # Namespace stuff related to WSDL. - - NS_WSDL_1_1 = 'http://schemas.xmlsoap.org/wsdl/' - NS_WSDL_ALL = (NS_WSDL_1_1,) - NS_WSDL = NS_WSDL_1_1 - - NS_SOAP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/soap/' - NS_HTTP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/http/' - NS_MIME_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/mime/' - - NS_SOAP_BINDING_ALL = (NS_SOAP_BINDING_1_1,) - NS_HTTP_BINDING_ALL = (NS_HTTP_BINDING_1_1,) - NS_MIME_BINDING_ALL = (NS_MIME_BINDING_1_1,) - - NS_SOAP_BINDING = NS_SOAP_BINDING_1_1 - NS_HTTP_BINDING = NS_HTTP_BINDING_1_1 - NS_MIME_BINDING = NS_MIME_BINDING_1_1 - - NS_SOAP_HTTP_1_1 = 'http://schemas.xmlsoap.org/soap/http' - NS_SOAP_HTTP_ALL = (NS_SOAP_HTTP_1_1,) - NS_SOAP_HTTP = NS_SOAP_HTTP_1_1 - - - _wsdl_uri_mapping = { - NS_WSDL_1_1 : '1.1', - } - - def WSDLUriToVersion(self, uri): - """Return the WSDL version related to a WSDL namespace uri.""" - value = self._wsdl_uri_mapping.get(uri) - if value is not None: - return value - raise ValueError( - 'Unsupported SOAP envelope uri: %s' % uri - ) - - def GetWSDLUri(self, version): - attr = 'NS_WSDL_%s' % join(split(version, '.'), '_') - value = getattr(self, attr, None) - if value is not None: - return value - raise ValueError( - 'Unsupported WSDL version: %s' % version - ) - - def GetWSDLSoapBindingUri(self, version): - attr = 'NS_SOAP_BINDING_%s' % join(split(version, '.'), '_') - value = getattr(self, attr, None) - if value is not None: - return value - raise ValueError( - 'Unsupported WSDL version: %s' % version - ) - - def GetWSDLHttpBindingUri(self, version): - attr = 'NS_HTTP_BINDING_%s' % join(split(version, '.'), '_') - value = getattr(self, attr, None) - if value is not None: - return value - raise ValueError( - 'Unsupported WSDL version: %s' % version - ) - - def GetWSDLMimeBindingUri(self, version): - attr = 'NS_MIME_BINDING_%s' % join(split(version, '.'), '_') - value = getattr(self, attr, None) - if value is not None: - return value - raise ValueError( - 'Unsupported WSDL version: %s' % version - ) - - def GetWSDLHttpTransportUri(self, version): - attr = 'NS_SOAP_HTTP_%s' % join(split(version, '.'), '_') - value = getattr(self, attr, None) - if value is not None: - return value - raise ValueError( - 'Unsupported WSDL version: %s' % version - ) - - - # Other xml namespace constants. - NS_XMLNS = 'http://www.w3.org/2000/xmlns/' - - - - def isElement(self, node, name, nsuri=None): - """Return true if the given node is an element with the given - name and optional namespace uri.""" - if node.nodeType != node.ELEMENT_NODE: - return 0 - return node.localName == name and \ - (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) - - def getElement(self, node, name, nsuri=None, default=join): - """Return the first child of node with a matching name and - namespace uri, or the default if one is provided.""" - nsmatch = self.nsUriMatch - ELEMENT_NODE = node.ELEMENT_NODE - for child in node.childNodes: - if child.nodeType == ELEMENT_NODE: - if ((child.localName == name or name is None) and - (nsuri is None or nsmatch(child.namespaceURI, nsuri)) - ): - return child - if default is not join: - return default - raise KeyError, name - - def getElementById(self, node, id, default=join): - """Return the first child of node matching an id reference.""" - attrget = self.getAttr - ELEMENT_NODE = node.ELEMENT_NODE - for child in node.childNodes: - if child.nodeType == ELEMENT_NODE: - if attrget(child, 'id') == id: - return child - if default is not join: - return default - raise KeyError, name - - def getMappingById(self, document, depth=None, element=None, - mapping=None, level=1): - """Create an id -> element mapping of those elements within a - document that define an id attribute. The depth of the search - may be controlled by using the (1-based) depth argument.""" - if document is not None: - element = document.documentElement - mapping = {} - attr = element._attrs.get('id', None) - if attr is not None: - mapping[attr.value] = element - if depth is None or depth > level: - level = level + 1 - ELEMENT_NODE = element.ELEMENT_NODE - for child in element.childNodes: - if child.nodeType == ELEMENT_NODE: - self.getMappingById(None, depth, child, mapping, level) - return mapping - - def getElements(self, node, name, nsuri=None): - """Return a sequence of the child elements of the given node that - match the given name and optional namespace uri.""" - nsmatch = self.nsUriMatch - result = [] - ELEMENT_NODE = node.ELEMENT_NODE - for child in node.childNodes: - if child.nodeType == ELEMENT_NODE: - if ((child.localName == name or name is None) and ( - (nsuri is None) or nsmatch(child.namespaceURI, nsuri))): - result.append(child) - return result - - def hasAttr(self, node, name, nsuri=None): - """Return true if element has attribute with the given name and - optional nsuri. If nsuri is not specified, returns true if an - attribute exists with the given name with any namespace.""" - if nsuri is None: - if node.hasAttribute(name): - return True - return False - return node.hasAttributeNS(nsuri, name) - - def getAttr(self, node, name, nsuri=None, default=join): - """Return the value of the attribute named 'name' with the - optional nsuri, or the default if one is specified. If - nsuri is not specified, an attribute that matches the - given name will be returned regardless of namespace.""" - if nsuri is None: - result = node._attrs.get(name, None) - if result is None: - for item in node._attrsNS.keys(): - if item[1] == name: - result = node._attrsNS[item] - break - else: - result = node._attrsNS.get((nsuri, name), None) - if result is not None: - return result.value - if default is not join: - return default - return '' - - def getAttrs(self, node): - """Return a Collection of all attributes - """ - attrs = {} - for k,v in node._attrs.items(): - attrs[k] = v.value - return attrs - - def getElementText(self, node, preserve_ws=None): - """Return the text value of an xml element node. Leading and trailing - whitespace is stripped from the value unless the preserve_ws flag - is passed with a true value.""" - result = [] - for child in node.childNodes: - nodetype = child.nodeType - if nodetype == child.TEXT_NODE or \ - nodetype == child.CDATA_SECTION_NODE: - result.append(child.nodeValue) - value = join(result, '') - if preserve_ws is None: - value = strip(value) - return value - - def findNamespaceURI(self, prefix, node): - """Find a namespace uri given a prefix and a context node.""" - attrkey = (self.NS_XMLNS, prefix) - DOCUMENT_NODE = node.DOCUMENT_NODE - ELEMENT_NODE = node.ELEMENT_NODE - while 1: - if node.nodeType != ELEMENT_NODE: - node = node.parentNode - continue - result = node._attrsNS.get(attrkey, None) - if result is not None: - return result.value - if hasattr(node, '__imported__'): - raise DOMException('Value for prefix %s not found.' % prefix) - node = node.parentNode - if node.nodeType == DOCUMENT_NODE: - raise DOMException('Value for prefix %s not found.' % prefix) - - def findDefaultNS(self, node): - """Return the current default namespace uri for the given node.""" - attrkey = (self.NS_XMLNS, 'xmlns') - DOCUMENT_NODE = node.DOCUMENT_NODE - ELEMENT_NODE = node.ELEMENT_NODE - while 1: - if node.nodeType != ELEMENT_NODE: - node = node.parentNode - continue - result = node._attrsNS.get(attrkey, None) - if result is not None: - return result.value - if hasattr(node, '__imported__'): - raise DOMException('Cannot determine default namespace.') - node = node.parentNode - if node.nodeType == DOCUMENT_NODE: - raise DOMException('Cannot determine default namespace.') - - def findTargetNS(self, node): - """Return the defined target namespace uri for the given node.""" - attrget = self.getAttr - attrkey = (self.NS_XMLNS, 'xmlns') - DOCUMENT_NODE = node.DOCUMENT_NODE - ELEMENT_NODE = node.ELEMENT_NODE - while 1: - if node.nodeType != ELEMENT_NODE: - node = node.parentNode - continue - result = attrget(node, 'targetNamespace', default=None) - if result is not None: - return result - node = node.parentNode - if node.nodeType == DOCUMENT_NODE: - raise DOMException('Cannot determine target namespace.') - - def getTypeRef(self, element): - """Return (namespaceURI, name) for a type attribue of the given - element, or None if the element does not have a type attribute.""" - typeattr = self.getAttr(element, 'type', default=None) - if typeattr is None: - return None - parts = typeattr.split(':', 1) - if len(parts) == 2: - nsuri = self.findNamespaceURI(parts[0], element) - else: - nsuri = self.findDefaultNS(element) - return (nsuri, parts[1]) - - def importNode(self, document, node, deep=0): - """Implements (well enough for our purposes) DOM node import.""" - nodetype = node.nodeType - if nodetype in (node.DOCUMENT_NODE, node.DOCUMENT_TYPE_NODE): - raise DOMException('Illegal node type for importNode') - if nodetype == node.ENTITY_REFERENCE_NODE: - deep = 0 - clone = node.cloneNode(deep) - self._setOwnerDoc(document, clone) - clone.__imported__ = 1 - return clone - - def _setOwnerDoc(self, document, node): - node.ownerDocument = document - for child in node.childNodes: - self._setOwnerDoc(document, child) - - def nsUriMatch(self, value, wanted, strict=0, tt=type(())): - """Return a true value if two namespace uri values match.""" - if value == wanted or (type(wanted) is tt) and value in wanted: - return 1 - if not strict: - wanted = type(wanted) is tt and wanted or (wanted,) - value = value[-1:] != '/' and value or value[:-1] - for item in wanted: - if item == value or item[:-1] == value: - return 1 - return 0 - - def createDocument(self, nsuri, qname, doctype=None): - """Create a new writable DOM document object.""" - impl = xml.dom.minidom.getDOMImplementation() - return impl.createDocument(nsuri, qname, doctype) - - def loadDocument(self, data): - """Load an xml file from a file-like object and return a DOM - document instance.""" - return xml.dom.minidom.parse(data) - - def loadFromURL(self, url): - """Load an xml file from a URL and return a DOM document.""" - file = urlopen(url) - try: result = self.loadDocument(file) - finally: file.close() - return result - - -class DOMException(Exception): - pass - -DOM = DOM() - - -class Collection(UserDict): - """Helper class for maintaining ordered named collections.""" - default = lambda self,k: k.name - def __init__(self, parent, key=None): - UserDict.__init__(self) - self.parent = weakref.ref(parent) - self.list = [] - self._func = key or self.default - - def __getitem__(self, key): - if type(key) is type(1): - return self.list[key] - return self.data[key] - - def __setitem__(self, key, item): - item.parent = weakref.ref(self) - self.list.append(item) - self.data[key] = item - - def keys(self): - return map(lambda i: self._func(i), self.list) - - def items(self): - return map(lambda i: (self._func(i), i), self.list) - - def values(self): - return self.list - - -class CollectionNS(UserDict): - """Helper class for maintaining ordered named collections.""" - default = lambda self,k: k.name - def __init__(self, parent, key=None): - UserDict.__init__(self) - self.parent = weakref.ref(parent) - self.targetNamespace = None - self.list = [] - self._func = key or self.default - - def __getitem__(self, key): - self.targetNamespace = self.parent().targetNamespace - if type(key) is types.IntType: - return self.list[key] - elif self.__isSequence(key): - nsuri,name = key - return self.data[nsuri][name] - return self.data[self.parent().targetNamespace][key] - - def __setitem__(self, key, item): - item.parent = weakref.ref(self) - self.list.append(item) - targetNamespace = getattr(item, 'targetNamespace', self.parent().targetNamespace) - if not self.data.has_key(targetNamespace): - self.data[targetNamespace] = {} - self.data[targetNamespace][key] = item - - def __isSequence(self, key): - return (type(key) in (types.TupleType,types.ListType) and len(key) == 2) - - def keys(self): - keys = [] - for tns in self.data.keys(): - keys.append(map(lambda i: (tns,self._func(i)), self.data[tns].values())) - return keys - - def items(self): - return map(lambda i: (self._func(i), i), self.list) - - def values(self): - return self.list - - - -# This is a runtime guerilla patch for pulldom (used by minidom) so -# that xml namespace declaration attributes are not lost in parsing. -# We need them to do correct QName linking for XML Schema and WSDL. -# The patch has been submitted to SF for the next Python version. - -from xml.dom.pulldom import PullDOM, START_ELEMENT -if 1: - def startPrefixMapping(self, prefix, uri): - if not hasattr(self, '_xmlns_attrs'): - self._xmlns_attrs = [] - self._xmlns_attrs.append((prefix or 'xmlns', uri)) - self._ns_contexts.append(self._current_context.copy()) - self._current_context[uri] = prefix or '' - - PullDOM.startPrefixMapping = startPrefixMapping - - def startElementNS(self, name, tagName , attrs): - # Retrieve xml namespace declaration attributes. - xmlns_uri = 'http://www.w3.org/2000/xmlns/' - xmlns_attrs = getattr(self, '_xmlns_attrs', None) - if xmlns_attrs is not None: - for aname, value in xmlns_attrs: - attrs._attrs[(xmlns_uri, aname)] = value - self._xmlns_attrs = [] - uri, localname = name - if uri: - # When using namespaces, the reader may or may not - # provide us with the original name. If not, create - # *a* valid tagName from the current context. - if tagName is None: - prefix = self._current_context[uri] - if prefix: - tagName = prefix + ":" + localname - else: - tagName = localname - if self.document: - node = self.document.createElementNS(uri, tagName) - else: - node = self.buildDocument(uri, tagName) - else: - # When the tagname is not prefixed, it just appears as - # localname - if self.document: - node = self.document.createElement(localname) - else: - node = self.buildDocument(None, localname) - - for aname,value in attrs.items(): - a_uri, a_localname = aname - if a_uri == xmlns_uri: - if a_localname == 'xmlns': - qname = a_localname - else: - qname = 'xmlns:' + a_localname - attr = self.document.createAttributeNS(a_uri, qname) - node.setAttributeNodeNS(attr) - elif a_uri: - prefix = self._current_context[a_uri] - if prefix: - qname = prefix + ":" + a_localname - else: - qname = a_localname - attr = self.document.createAttributeNS(a_uri, qname) - node.setAttributeNodeNS(attr) - else: - attr = self.document.createAttribute(a_localname) - node.setAttributeNode(attr) - attr.value = value - - self.lastEvent[1] = [(START_ELEMENT, node), None] - self.lastEvent = self.lastEvent[1] - self.push(node) - - PullDOM.startElementNS = startElementNS - -# -# This is a runtime guerilla patch for minidom so -# that xmlns prefixed attributes dont raise AttributeErrors -# during cloning. -# -# Namespace declarations can appear in any start-tag, must look for xmlns -# prefixed attribute names during cloning. -# -# key (attr.namespaceURI, tag) -# ('http://www.w3.org/2000/xmlns/', u'xsd') -# ('http://www.w3.org/2000/xmlns/', 'xmlns') -# -# xml.dom.minidom.Attr.nodeName = xmlns:xsd -# xml.dom.minidom.Attr.value = = http://www.w3.org/2001/XMLSchema - -if 1: - def _clone_node(node, deep, newOwnerDocument): - """ - Clone a node and give it the new owner document. - Called by Node.cloneNode and Document.importNode - """ - if node.ownerDocument.isSameNode(newOwnerDocument): - operation = xml.dom.UserDataHandler.NODE_CLONED - else: - operation = xml.dom.UserDataHandler.NODE_IMPORTED - if node.nodeType == xml.dom.minidom.Node.ELEMENT_NODE: - clone = newOwnerDocument.createElementNS(node.namespaceURI, - node.nodeName) - for attr in node.attributes.values(): - clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) - - prefix, tag = xml.dom.minidom._nssplit(attr.nodeName) - if prefix == 'xmlns': - a = clone.getAttributeNodeNS(attr.namespaceURI, tag) - elif prefix: - a = clone.getAttributeNodeNS(attr.namespaceURI, tag) - else: - a = clone.getAttributeNodeNS(attr.namespaceURI, attr.nodeName) - a.specified = attr.specified - - if deep: - for child in node.childNodes: - c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) - clone.appendChild(c) - elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_FRAGMENT_NODE: - clone = newOwnerDocument.createDocumentFragment() - if deep: - for child in node.childNodes: - c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) - clone.appendChild(c) - - elif node.nodeType == xml.dom.minidom.Node.TEXT_NODE: - clone = newOwnerDocument.createTextNode(node.data) - elif node.nodeType == xml.dom.minidom.Node.CDATA_SECTION_NODE: - clone = newOwnerDocument.createCDATASection(node.data) - elif node.nodeType == xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE: - clone = newOwnerDocument.createProcessingInstruction(node.target, - node.data) - elif node.nodeType == xml.dom.minidom.Node.COMMENT_NODE: - clone = newOwnerDocument.createComment(node.data) - elif node.nodeType == xml.dom.minidom.Node.ATTRIBUTE_NODE: - clone = newOwnerDocument.createAttributeNS(node.namespaceURI, - node.nodeName) - clone.specified = True - clone.value = node.value - elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_TYPE_NODE: - assert node.ownerDocument is not newOwnerDocument - operation = xml.dom.UserDataHandler.NODE_IMPORTED - clone = newOwnerDocument.implementation.createDocumentType( - node.name, node.publicId, node.systemId) - clone.ownerDocument = newOwnerDocument - if deep: - clone.entities._seq = [] - clone.notations._seq = [] - for n in node.notations._seq: - notation = xml.dom.minidom.Notation(n.nodeName, n.publicId, n.systemId) - notation.ownerDocument = newOwnerDocument - clone.notations._seq.append(notation) - if hasattr(n, '_call_user_data_handler'): - n._call_user_data_handler(operation, n, notation) - for e in node.entities._seq: - entity = xml.dom.minidom.Entity(e.nodeName, e.publicId, e.systemId, - e.notationName) - entity.actualEncoding = e.actualEncoding - entity.encoding = e.encoding - entity.version = e.version - entity.ownerDocument = newOwnerDocument - clone.entities._seq.append(entity) - if hasattr(e, '_call_user_data_handler'): - e._call_user_data_handler(operation, n, entity) - else: - # Note the cloning of Document and DocumentType nodes is - # implemenetation specific. minidom handles those cases - # directly in the cloneNode() methods. - raise xml.dom.NotSupportedErr("Cannot clone node %s" % repr(node)) - - # Check for _call_user_data_handler() since this could conceivably - # used with other DOM implementations (one of the FourThought - # DOMs, perhaps?). - if hasattr(node, '_call_user_data_handler'): - node._call_user_data_handler(operation, node, clone) - return clone - - xml.dom.minidom._clone_node = _clone_node diff --git a/SOAPpy/wstools/WSDLTools.py b/SOAPpy/wstools/WSDLTools.py deleted file mode 100755 index ad4e58e..0000000 --- a/SOAPpy/wstools/WSDLTools.py +++ /dev/null @@ -1,1336 +0,0 @@ -# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. - -ident = "$Id: WSDLTools.py,v 1.23 2004/09/09 04:37:55 boverhof Exp $" - -from Utility import DOM, Collection, CollectionNS -from XMLSchema import XMLSchema, SchemaReader, WSDLToolsAdapter -from Namespaces import WSR, WSA -from StringIO import StringIO -import urllib - - -class WSDLReader: - """A WSDLReader creates WSDL instances from urls and xml data.""" - - # Custom subclasses of WSDLReader may wish to implement a caching - # strategy or other optimizations. Because application needs vary - # so widely, we don't try to provide any caching by default. - - def loadFromStream(self, stream, name=None): - """Return a WSDL instance loaded from a stream object.""" - document = DOM.loadDocument(stream) - wsdl = WSDL() - if name: - wsdl.location = name - elif hasattr(stream, 'name'): - wsdl.location = stream.name - wsdl.load(document) - return wsdl - - def loadFromURL(self, url): - """Return a WSDL instance loaded from the given url.""" - document = DOM.loadFromURL(url) - wsdl = WSDL() - wsdl.location = url - wsdl.load(document) - return wsdl - - def loadFromString(self, data): - """Return a WSDL instance loaded from an xml string.""" - return self.loadFromStream(StringIO(data)) - - def loadFromFile(self, filename): - """Return a WSDL instance loaded from the given file.""" - file = open(filename, 'rb') - try: - wsdl = self.loadFromStream(file) - finally: - file.close() - return wsdl - -class WSDL: - """A WSDL object models a WSDL service description. WSDL objects - may be created manually or loaded from an xml representation - using a WSDLReader instance.""" - - def __init__(self, targetNamespace=None, strict=1): - self.targetNamespace = targetNamespace or 'urn:this-document.wsdl' - self.documentation = '' - self.location = None - self.document = None - self.name = None - self.services = CollectionNS(self) - self.messages = CollectionNS(self) - self.portTypes = CollectionNS(self) - self.bindings = CollectionNS(self) - #self.imports = Collection(self) - self.types = Types(self) - self.extensions = [] - self.strict = strict - - def __del__(self): - if self.document is not None: - self.document.unlink() - - version = '1.1' - - def addService(self, name, documentation='', targetNamespace=None): - if self.services.has_key(name): - raise WSDLError( - 'Duplicate service element: %s' % name - ) - item = Service(name, documentation) - if targetNamespace: - item.targetNamespace = targetNamespace - self.services[name] = item - return item - - def addMessage(self, name, documentation='', targetNamespace=None): - if self.messages.has_key(name): - raise WSDLError( - 'Duplicate message element: %s.' % name - ) - item = Message(name, documentation) - if targetNamespace: - item.targetNamespace = targetNamespace - self.messages[name] = item - return item - - def addPortType(self, name, documentation='', targetNamespace=None): - if self.portTypes.has_key(name): - raise WSDLError( - 'Duplicate portType element: name' - ) - item = PortType(name, documentation) - if targetNamespace: - item.targetNamespace = targetNamespace - self.portTypes[name] = item - return item - - def addBinding(self, name, type, documentation='', targetNamespace=None): - if self.bindings.has_key(name): - raise WSDLError( - 'Duplicate binding element: %s' % name - ) - item = Binding(name, type, documentation) - if targetNamespace: - item.targetNamespace = targetNamespace - self.bindings[name] = item - return item - - #def addImport(self, namespace, location): - # item = ImportElement(namespace, location) - # self.imports[namespace] = item - # return item - - def load(self, document): - # We save a reference to the DOM document to ensure that elements - # saved as "extensions" will continue to have a meaningful context - # for things like namespace references. The lifetime of the DOM - # document is bound to the lifetime of the WSDL instance. - self.document = document - - definitions = DOM.getElement(document, 'definitions', None, None) - if definitions is None: - raise WSDLError( - 'Missing element.' - ) - self.version = DOM.WSDLUriToVersion(definitions.namespaceURI) - NS_WSDL = DOM.GetWSDLUri(self.version) - - self.targetNamespace = DOM.getAttr(definitions, 'targetNamespace', - None, None) - self.name = DOM.getAttr(definitions, 'name', None, None) - self.documentation = GetDocumentation(definitions) - - # Resolve (recursively) any import elements in the document. - imported = {} - base_location = self.location - while 1: - #XXX - imports = [] - for element in DOM.getElements(definitions, 'import', NS_WSDL): - location = DOM.getAttr(element, 'location') - # Resolve relative location, and save - location = urllib.basejoin(base_location, location) - - if not imported.has_key(location): - imports.append(element) - - if not imports: - break - for element in imports: - location = DOM.getAttr(element, 'location') - self._import(document, element, base_location) - location = urllib.basejoin(base_location, location) - imported[location] = 1 - base_location = '' - - #reader = SchemaReader(base_url=self.location) - for element in DOM.getElements(definitions, None, None): - targetNamespace = DOM.getAttr(element, 'targetNamespace') - localName = element.localName - - if not DOM.nsUriMatch(element.namespaceURI, NS_WSDL): - if localName == 'schema': - reader = SchemaReader(base_url=self.location) - schema = reader.loadFromNode(WSDLToolsAdapter(self), element) - schema.setBaseUrl(self.location) - self.types.addSchema(schema) - else: - self.extensions.append(element) - continue - - elif localName == 'message': - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - message = self.addMessage(name, docs, targetNamespace) - parts = DOM.getElements(element, 'part', NS_WSDL) - message.load(parts) - continue - - elif localName == 'portType': - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - ptype = self.addPortType(name, docs, targetNamespace) - #operations = DOM.getElements(element, 'operation', NS_WSDL) - #ptype.load(operations) - ptype.load(element) - continue - - elif localName == 'binding': - name = DOM.getAttr(element, 'name') - type = DOM.getAttr(element, 'type', default=None) - if type is None: - raise WSDLError( - 'Missing type attribute for binding %s.' % name - ) - type = ParseQName(type, element) - docs = GetDocumentation(element) - binding = self.addBinding(name, type, docs, targetNamespace) - operations = DOM.getElements(element, 'operation', NS_WSDL) - binding.load(operations) - binding.load_ex(GetExtensions(element)) - continue - - elif localName == 'service': - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - service = self.addService(name, docs, targetNamespace) - ports = DOM.getElements(element, 'port', NS_WSDL) - service.load(ports) - service.load_ex(GetExtensions(element)) - continue - - elif localName == 'types': - self.types.documentation = GetDocumentation(element) - base_location = DOM.getAttr(element, 'base-location') - if base_location: - element.removeAttribute('base-location') - base_location = base_location or self.location - reader = SchemaReader(base_url=base_location) - for item in DOM.getElements(element, None, None): - if item.localName == 'schema': - schema = reader.loadFromNode(WSDLToolsAdapter(self), item) - # XXX could have been imported - #schema.setBaseUrl(self.location) - schema.setBaseUrl(base_location) - self.types.addSchema(schema) - else: - self.types.addExtension(item) - # XXX remove the attribute - # element.removeAttribute('base-location') - continue - - def _import(self, document, element, base_location=None): - '''Algo take element's children, clone them, - and add them to the main document. Support for relative - locations is a bit complicated. The orig document context - is lost, so we need to store base location in DOM elements - representing , by creating a special temporary - "base-location" attribute, and , by resolving - the relative "location" and storing it as "location". - - document -- document we are loading - element -- DOM Element representing - base_location -- location of document from which this - was gleaned. - ''' - namespace = DOM.getAttr(element, 'namespace', default=None) - location = DOM.getAttr(element, 'location', default=None) - if namespace is None or location is None: - raise WSDLError( - 'Invalid import element (missing namespace or location).' - ) - if base_location: - location = urllib.basejoin(base_location, location) - element.setAttributeNS(None, 'location', location) - - #location = urllib.basejoin(self.location, location) - #obimport = self.addImport(namespace, location) - #obimport._loaded = 1 - - importdoc = DOM.loadFromURL(location) - try: - if location.find('#') > -1: - idref = location.split('#')[-1] - imported = DOM.getElementById(importdoc, idref) - else: - imported = importdoc.documentElement - if imported is None: - raise WSDLError( - 'Import target element not found for: %s' % location - ) - - imported_tns = DOM.findTargetNS(imported) - if imported_tns != namespace: - return - - if imported.localName == 'definitions': - imported_nodes = imported.childNodes - else: - imported_nodes = [imported] - parent = element.parentNode - for node in imported_nodes: - if node.nodeType != node.ELEMENT_NODE: - continue - child = DOM.importNode(document, node, 1) - parent.appendChild(child) - child.setAttribute('targetNamespace', namespace) - attrsNS = imported._attrsNS - for attrkey in attrsNS.keys(): - if attrkey[0] == DOM.NS_XMLNS: - attr = attrsNS[attrkey].cloneNode(1) - child.setAttributeNode(attr) - - #XXX Quick Hack, should be in WSDL Namespace. - if child.localName == 'import': - rlocation = child.getAttributeNS(None, 'location') - alocation = urllib.basejoin(location, rlocation) - child.setAttribute('location', alocation) - elif child.localName == 'types': - child.setAttribute('base-location', location) - - finally: - importdoc.unlink() - return location - -class Element: - """A class that provides common functions for WSDL element classes.""" - def __init__(self, name=None, documentation=''): - self.name = name - self.documentation = documentation - self.extensions = [] - - def addExtension(self, item): - self.extensions.append(item) - - -class ImportElement(Element): - def __init__(self, namespace, location): - self.namespace = namespace - self.location = location - - _loaded = None - - -class Types(Collection): - default = lambda self,k: k.targetNamespace - def __init__(self, parent): - Collection.__init__(self, parent) - self.documentation = '' - self.extensions = [] - - def addSchema(self, schema): - name = schema.targetNamespace - self[name] = schema - return schema - - def addExtension(self, item): - self.extensions.append(item) - - -class Message(Element): - def __init__(self, name, documentation=''): - Element.__init__(self, name, documentation) - self.parts = Collection(self) - - def addPart(self, name, type=None, element=None): - if self.parts.has_key(name): - raise WSDLError( - 'Duplicate message part element: %s' % name - ) - if type is None and element is None: - raise WSDLError( - 'Missing type or element attribute for part: %s' % name - ) - item = MessagePart(name) - item.element = element - item.type = type - self.parts[name] = item - return item - - def load(self, elements): - for element in elements: - name = DOM.getAttr(element, 'name') - part = MessagePart(name) - self.parts[name] = part - elemref = DOM.getAttr(element, 'element', default=None) - typeref = DOM.getAttr(element, 'type', default=None) - if typeref is None and elemref is None: - raise WSDLError( - 'No type or element attribute for part: %s' % name - ) - if typeref is not None: - part.type = ParseTypeRef(typeref, element) - if elemref is not None: - part.element = ParseTypeRef(elemref, element) - - -class MessagePart(Element): - def __init__(self, name): - Element.__init__(self, name, '') - self.element = None - self.type = None - - def getWSDL(self): - """Return the WSDL object that contains this Message Part.""" - return self.parent().parent().parent().parent() - - def getTypeDefinition(self): - wsdl = self.getWSDL() - nsuri,name = self.type - schema = wsdl.types.get(nsuri, {}) - return schema.get(name) - - def getElementDeclaration(self): - wsdl = self.getWSDL() - nsuri,name = self.element - schema = wsdl.types.get(nsuri, {}) - return schema.get(name) - - -class PortType(Element): - '''PortType has a anyAttribute, thus must provide for an extensible - mechanism for supporting such attributes. ResourceProperties is - specified in WS-ResourceProperties. wsa:Action is specified in - WS-Address. - - Instance Data: - name -- name attribute - resourceProperties -- optional. wsr:ResourceProperties attribute, - value is a QName this is Parsed into a (namespaceURI, name) - that represents a Global Element Declaration. - operations - ''' - - def __init__(self, name, documentation=''): - Element.__init__(self, name, documentation) - self.operations = Collection(self) - self.resourceProperties = None - - def getWSDL(self): - return self.parent().parent() - - def getResourceProperties(self): - return self.resourceProperties - - def addOperation(self, name, documentation='', parameterOrder=None): - item = Operation(name, documentation, parameterOrder) - self.operations[name] = item - return item - - def load(self, element): - self.name = DOM.getAttr(element, 'name') - self.documentation = GetDocumentation(element) - - if DOM.hasAttr(element, 'ResourceProperties', WSR.PROPERTIES): - rpref = DOM.getAttr(element, 'ResourceProperties', WSR.PROPERTIES) - self.resourceProperties = ParseQName(rpref, element) - - NS_WSDL = DOM.GetWSDLUri(self.getWSDL().version) - elements = DOM.getElements(element, 'operation', NS_WSDL) - for element in elements: - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - param_order = DOM.getAttr(element, 'parameterOrder', default=None) - if param_order is not None: - param_order = param_order.split(' ') - operation = self.addOperation(name, docs, param_order) - - item = DOM.getElement(element, 'input', None, None) - if item is not None: - name = DOM.getAttr(item, 'name') - docs = GetDocumentation(item) - msgref = DOM.getAttr(item, 'message') - message = ParseQName(msgref, item) - action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) - operation.setInput(message, name, docs, action) - - item = DOM.getElement(element, 'output', None, None) - if item is not None: - name = DOM.getAttr(item, 'name') - docs = GetDocumentation(item) - msgref = DOM.getAttr(item, 'message') - message = ParseQName(msgref, item) - action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) - operation.setOutput(message, name, docs, action) - - for item in DOM.getElements(element, 'fault', None): - name = DOM.getAttr(item, 'name') - docs = GetDocumentation(item) - msgref = DOM.getAttr(item, 'message') - message = ParseQName(msgref, item) - action = DOM.getAttr(item, 'Action', WSA.ADDRESS, None) - operation.addFault(message, name, docs, action) - - - -class Operation(Element): - def __init__(self, name, documentation='', parameterOrder=None): - Element.__init__(self, name, documentation) - self.parameterOrder = parameterOrder - self.faults = Collection(self) - self.input = None - self.output = None - - def getPortType(self): - return self.parent().parent() - - def getInputAction(self): - """wsa:Action attribute""" - return GetWSAActionInput(self) - - def getInputMessage(self): - if self.input is None: - return None - wsdl = self.getPortType().getWSDL() - return wsdl.messages[self.input.message] - - def getOutputAction(self): - """wsa:Action attribute""" - return GetWSAActionOutput(self) - - def getOutputMessage(self): - if self.output is None: - return None - wsdl = self.getPortType().getWSDL() - return wsdl.messages[self.output.message] - - def getFaultAction(self, name): - """wsa:Action attribute""" - return GetWSAActionFault(self, name) - - def getFaultMessage(self, name): - wsdl = self.getPortType().getWSDL() - return wsdl.messages[self.faults[name].message] - - def addFault(self, message, name, documentation='', action=None): - if self.faults.has_key(name): - raise WSDLError( - 'Duplicate fault element: %s' % name - ) - item = MessageRole('fault', message, name, documentation, action) - self.faults[name] = item - return item - - def setInput(self, message, name='', documentation='', action=None): - self.input = MessageRole('input', message, name, documentation, action) - return self.input - - def setOutput(self, message, name='', documentation='', action=None): - self.output = MessageRole('output', message, name, documentation, action) - return self.output - - -class MessageRole(Element): - def __init__(self, type, message, name='', documentation='', action=None): - Element.__init__(self, name, documentation) - self.message = message - self.type = type - self.action = action - - -class Binding(Element): - def __init__(self, name, type, documentation=''): - Element.__init__(self, name, documentation) - self.operations = Collection(self) - self.type = type - - def getWSDL(self): - """Return the WSDL object that contains this binding.""" - return self.parent().parent() - - def getPortType(self): - """Return the PortType object associated with this binding.""" - return self.getWSDL().portTypes[self.type] - - def findBinding(self, kind): - for item in self.extensions: - if isinstance(item, kind): - return item - return None - - def findBindings(self, kind): - return [ item for item in self.extensions if isinstance(item, kind) ] - - def addOperationBinding(self, name, documentation=''): - item = OperationBinding(name, documentation) - self.operations[name] = item - return item - - def load(self, elements): - for element in elements: - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - opbinding = self.addOperationBinding(name, docs) - opbinding.load_ex(GetExtensions(element)) - - item = DOM.getElement(element, 'input', None, None) - if item is not None: - mbinding = MessageRoleBinding('input') - mbinding.documentation = GetDocumentation(item) - opbinding.input = mbinding - mbinding.load_ex(GetExtensions(item)) - - item = DOM.getElement(element, 'output', None, None) - if item is not None: - mbinding = MessageRoleBinding('output') - mbinding.documentation = GetDocumentation(item) - opbinding.output = mbinding - mbinding.load_ex(GetExtensions(item)) - - for item in DOM.getElements(element, 'fault', None): - name = DOM.getAttr(item, 'name') - mbinding = MessageRoleBinding('fault', name) - mbinding.documentation = GetDocumentation(item) - opbinding.faults[name] = mbinding - mbinding.load_ex(GetExtensions(item)) - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_SOAP_BINDING_ALL and name == 'binding': - transport = DOM.getAttr(e, 'transport', default=None) - style = DOM.getAttr(e, 'style', default='document') - ob = SoapBinding(transport, style) - self.addExtension(ob) - continue - elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'binding': - verb = DOM.getAttr(e, 'verb') - ob = HttpBinding(verb) - self.addExtension(ob) - continue - else: - self.addExtension(e) - - -class OperationBinding(Element): - def __init__(self, name, documentation=''): - Element.__init__(self, name, documentation) - self.input = None - self.output = None - self.faults = Collection(self) - - def getBinding(self): - """Return the parent Binding object of the operation binding.""" - return self.parent().parent() - - def getOperation(self): - """Return the abstract Operation associated with this binding.""" - return self.getBinding().getPortType().operations[self.name] - - def findBinding(self, kind): - for item in self.extensions: - if isinstance(item, kind): - return item - return None - - def findBindings(self, kind): - return [ item for item in self.extensions if isinstance(item, kind) ] - - def addInputBinding(self, binding): - if self.input is None: - self.input = MessageRoleBinding('input') - self.input.addExtension(binding) - return binding - - def addOutputBinding(self, binding): - if self.output is None: - self.output = MessageRoleBinding('output') - self.output.addExtension(binding) - return binding - - def addFaultBinding(self, name, binding): - fault = self.get(name, None) - if fault is None: - fault = MessageRoleBinding('fault', name) - fault.addExtension(binding) - return binding - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_SOAP_BINDING_ALL and name == 'operation': - soapaction = DOM.getAttr(e, 'soapAction', default=None) - style = DOM.getAttr(e, 'style', default=None) - ob = SoapOperationBinding(soapaction, style) - self.addExtension(ob) - continue - elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'operation': - location = DOM.getAttr(e, 'location') - ob = HttpOperationBinding(location) - self.addExtension(ob) - continue - else: - self.addExtension(e) - - -class MessageRoleBinding(Element): - def __init__(self, type, name='', documentation=''): - Element.__init__(self, name, documentation) - self.type = type - - def findBinding(self, kind): - for item in self.extensions: - if isinstance(item, kind): - return item - return None - - def findBindings(self, kind): - return [ item for item in self.extensions if isinstance(item, kind) ] - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_SOAP_BINDING_ALL and name == 'body': - encstyle = DOM.getAttr(e, 'encodingStyle', default=None) - namespace = DOM.getAttr(e, 'namespace', default=None) - parts = DOM.getAttr(e, 'parts', default=None) - use = DOM.getAttr(e, 'use', default=None) - if use is None: - raise WSDLError( - 'Invalid soap:body binding element.' - ) - ob = SoapBodyBinding(use, namespace, encstyle, parts) - self.addExtension(ob) - continue - - elif ns in DOM.NS_SOAP_BINDING_ALL and name == 'fault': - encstyle = DOM.getAttr(e, 'encodingStyle', default=None) - namespace = DOM.getAttr(e, 'namespace', default=None) - name = DOM.getAttr(e, 'name', default=None) - use = DOM.getAttr(e, 'use', default=None) - if use is None or name is None: - raise WSDLError( - 'Invalid soap:fault binding element.' - ) - ob = SoapFaultBinding(name, use, namespace, encstyle) - self.addExtension(ob) - continue - - elif ns in DOM.NS_SOAP_BINDING_ALL and name in ( - 'header', 'headerfault' - ): - encstyle = DOM.getAttr(e, 'encodingStyle', default=None) - namespace = DOM.getAttr(e, 'namespace', default=None) - message = DOM.getAttr(e, 'message') - part = DOM.getAttr(e, 'part') - use = DOM.getAttr(e, 'use') - if name == 'header': - _class = SoapHeaderBinding - else: - _class = SoapHeaderFaultBinding - message = ParseQName(message, e) - ob = _class(message, part, use, namespace, encstyle) - self.addExtension(ob) - continue - - elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'urlReplacement': - ob = HttpUrlReplacementBinding() - self.addExtension(ob) - continue - - elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'urlEncoded': - ob = HttpUrlEncodedBinding() - self.addExtension(ob) - continue - - elif ns in DOM.NS_MIME_BINDING_ALL and name == 'multipartRelated': - ob = MimeMultipartRelatedBinding() - self.addExtension(ob) - ob.load_ex(GetExtensions(e)) - continue - - elif ns in DOM.NS_MIME_BINDING_ALL and name == 'content': - part = DOM.getAttr(e, 'part', default=None) - type = DOM.getAttr(e, 'type', default=None) - ob = MimeContentBinding(part, type) - self.addExtension(ob) - continue - - elif ns in DOM.NS_MIME_BINDING_ALL and name == 'mimeXml': - part = DOM.getAttr(e, 'part', default=None) - ob = MimeXmlBinding(part) - self.addExtension(ob) - continue - - else: - self.addExtension(e) - - -class Service(Element): - def __init__(self, name, documentation=''): - Element.__init__(self, name, documentation) - self.ports = Collection(self) - - def getWSDL(self): - return self.parent().parent() - - def addPort(self, name, binding, documentation=''): - item = Port(name, binding, documentation) - self.ports[name] = item - return item - - def load(self, elements): - for element in elements: - name = DOM.getAttr(element, 'name', default=None) - docs = GetDocumentation(element) - binding = DOM.getAttr(element, 'binding', default=None) - if name is None or binding is None: - raise WSDLError( - 'Invalid port element.' - ) - binding = ParseQName(binding, element) - port = self.addPort(name, binding, docs) - port.load_ex(GetExtensions(element)) - - def load_ex(self, elements): - for e in elements: - self.addExtension(e) - - -class Port(Element): - def __init__(self, name, binding, documentation=''): - Element.__init__(self, name, documentation) - self.binding = binding - - def getService(self): - """Return the Service object associated with this port.""" - return self.parent().parent() - - def getBinding(self): - """Return the Binding object that is referenced by this port.""" - wsdl = self.getService().getWSDL() - return wsdl.bindings[self.binding] - - def getPortType(self): - """Return the PortType object that is referenced by this port.""" - wsdl = self.getService().getWSDL() - binding = wsdl.bindings[self.binding] - return wsdl.portTypes[binding.type] - - def getAddressBinding(self): - """A convenience method to obtain the extension element used - as the address binding for the port, or None if undefined.""" - for item in self.extensions: - if isinstance(item, SoapAddressBinding) or \ - isinstance(item, HttpAddressBinding): - return item - raise WSDLError( - 'No address binding found in port.' - ) - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_SOAP_BINDING_ALL and name == 'address': - location = DOM.getAttr(e, 'location', default=None) - ob = SoapAddressBinding(location) - self.addExtension(ob) - continue - elif ns in DOM.NS_HTTP_BINDING_ALL and name == 'address': - location = DOM.getAttr(e, 'location', default=None) - ob = HttpAddressBinding(location) - self.addExtension(ob) - continue - else: - self.addExtension(e) - - -class SoapBinding: - def __init__(self, transport, style='rpc'): - self.transport = transport - self.style = style - - -class SoapAddressBinding: - def __init__(self, location): - self.location = location - - -class SoapOperationBinding: - def __init__(self, soapAction=None, style=None): - self.soapAction = soapAction - self.style = style - - -class SoapBodyBinding: - def __init__(self, use, namespace=None, encodingStyle=None, parts=None): - if not use in ('literal', 'encoded'): - raise WSDLError( - 'Invalid use attribute value: %s' % use - ) - self.encodingStyle = encodingStyle - self.namespace = namespace - if type(parts) in (type(''), type(u'')): - parts = parts.split() - self.parts = parts - self.use = use - -class SoapFaultBinding: - def __init__(self, name, use, namespace=None, encodingStyle=None): - if not use in ('literal', 'encoded'): - raise WSDLError( - 'Invalid use attribute value: %s' % use - ) - self.encodingStyle = encodingStyle - self.namespace = namespace - self.name = name - self.use = use - - -class SoapHeaderBinding: - def __init__(self, message, part, use, namespace=None, encodingStyle=None): - if not use in ('literal', 'encoded'): - raise WSDLError( - 'Invalid use attribute value: %s' % use - ) - self.encodingStyle = encodingStyle - self.namespace = namespace - self.message = message - self.part = part - self.use = use - - tagname = 'header' - -class SoapHeaderFaultBinding(SoapHeaderBinding): - tagname = 'headerfault' - - -class HttpBinding: - def __init__(self, verb): - self.verb = verb - -class HttpAddressBinding: - def __init__(self, location): - self.location = location - - -class HttpOperationBinding: - def __init__(self, location): - self.location = location - -class HttpUrlReplacementBinding: - pass - - -class HttpUrlEncodedBinding: - pass - - -class MimeContentBinding: - def __init__(self, part=None, type=None): - self.part = part - self.type = type - - -class MimeXmlBinding: - def __init__(self, part=None): - self.part = part - - -class MimeMultipartRelatedBinding: - def __init__(self): - self.parts = [] - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_MIME_BINDING_ALL and name == 'part': - self.parts.append(MimePartBinding()) - continue - - -class MimePartBinding: - def __init__(self): - self.items = [] - - def load_ex(self, elements): - for e in elements: - ns, name = e.namespaceURI, e.localName - if ns in DOM.NS_MIME_BINDING_ALL and name == 'content': - part = DOM.getAttr(e, 'part', default=None) - type = DOM.getAttr(e, 'type', default=None) - ob = MimeContentBinding(part, type) - self.items.append(ob) - continue - - elif ns in DOM.NS_MIME_BINDING_ALL and name == 'mimeXml': - part = DOM.getAttr(e, 'part', default=None) - ob = MimeXmlBinding(part) - self.items.append(ob) - continue - - elif ns in DOM.NS_SOAP_BINDING_ALL and name == 'body': - encstyle = DOM.getAttr(e, 'encodingStyle', default=None) - namespace = DOM.getAttr(e, 'namespace', default=None) - parts = DOM.getAttr(e, 'parts', default=None) - use = DOM.getAttr(e, 'use', default=None) - if use is None: - raise WSDLError( - 'Invalid soap:body binding element.' - ) - ob = SoapBodyBinding(use, namespace, encstyle, parts) - self.items.append(ob) - continue - - -class WSDLError(Exception): - pass - - - -def DeclareNSPrefix(writer, prefix, nsuri): - if writer.hasNSPrefix(nsuri): - return - writer.declareNSPrefix(prefix, nsuri) - -def ParseTypeRef(value, element): - parts = value.split(':', 1) - if len(parts) == 1: - return (DOM.findTargetNS(element), value) - nsuri = DOM.findNamespaceURI(parts[0], element) - return (nsuri, parts[1]) - -def ParseQName(value, element): - nameref = value.split(':', 1) - if len(nameref) == 2: - nsuri = DOM.findNamespaceURI(nameref[0], element) - name = nameref[-1] - else: - nsuri = DOM.findTargetNS(element) - name = nameref[-1] - return nsuri, name - -def GetDocumentation(element): - docnode = DOM.getElement(element, 'documentation', None, None) - if docnode is not None: - return DOM.getElementText(docnode) - return '' - -def GetExtensions(element): - return [ item for item in DOM.getElements(element, None, None) - if item.namespaceURI != DOM.NS_WSDL ] - -def GetWSAActionFault(operation, name): - """Find wsa:Action attribute, and return value or WSA.FAULT - for the default. - """ - attr = operation.faults[name].action - if attr is not None: - return attr - return WSA.FAULT - -def GetWSAActionInput(operation): - """Find wsa:Action attribute, and return value or the default.""" - attr = operation.input.action - if attr is not None: - return attr - portType = operation.getPortType() - targetNamespace = portType.getWSDL().targetNamespace - ptName = portType.name - msgName = operation.input.name - if not msgName: - msgName = operation.name + 'Request' - if targetNamespace.endswith('/'): - return '%s%s/%s' %(targetNamespace, ptName, msgName) - return '%s/%s/%s' %(targetNamespace, ptName, msgName) - -def GetWSAActionOutput(operation): - """Find wsa:Action attribute, and return value or the default.""" - attr = operation.output.action - if attr is not None: - return attr - targetNamespace = operation.getPortType().getWSDL().targetNamespace - ptName = operation.getPortType().name - msgName = operation.output.name - if not msgName: - msgName = operation.name + 'Response' - if targetNamespace.endswith('/'): - return '%s%s/%s' %(targetNamespace, ptName, msgName) - return '%s/%s/%s' %(targetNamespace, ptName, msgName) - -def FindExtensions(object, kind, t_type=type(())): - if isinstance(kind, t_type): - result = [] - namespaceURI, name = kind - return [ item for item in object.extensions - if hasattr(item, 'nodeType') \ - and DOM.nsUriMatch(namespaceURI, item.namespaceURI) \ - and item.name == name ] - return [ item for item in object.extensions if isinstance(item, kind) ] - -def FindExtension(object, kind, t_type=type(())): - if isinstance(kind, t_type): - namespaceURI, name = kind - for item in object.extensions: - if hasattr(item, 'nodeType') \ - and DOM.nsUriMatch(namespaceURI, item.namespaceURI) \ - and item.name == name: - return item - else: - for item in object.extensions: - if isinstance(item, kind): - return item - return None - - -class SOAPCallInfo: - """SOAPCallInfo captures the important binding information about a - SOAP operation, in a structure that is easier to work with than - raw WSDL structures.""" - - def __init__(self, methodName): - self.methodName = methodName - self.inheaders = [] - self.outheaders = [] - self.inparams = [] - self.outparams = [] - self.retval = None - - encodingStyle = DOM.NS_SOAP_ENC - documentation = '' - soapAction = None - transport = None - namespace = None - location = None - use = 'encoded' - style = 'rpc' - - def addInParameter(self, name, type, namespace=None, element_type=0): - """Add an input parameter description to the call info.""" - parameter = ParameterInfo(name, type, namespace, element_type) - self.inparams.append(parameter) - return parameter - - def addOutParameter(self, name, type, namespace=None, element_type=0): - """Add an output parameter description to the call info.""" - parameter = ParameterInfo(name, type, namespace, element_type) - self.outparams.append(parameter) - return parameter - - def setReturnParameter(self, name, type, namespace=None, element_type=0): - """Set the return parameter description for the call info.""" - parameter = ParameterInfo(name, type, namespace, element_type) - self.retval = parameter - return parameter - - def addInHeaderInfo(self, name, type, namespace, element_type=0, - mustUnderstand=0): - """Add an input SOAP header description to the call info.""" - headerinfo = HeaderInfo(name, type, namespace, element_type) - if mustUnderstand: - headerinfo.mustUnderstand = 1 - self.inheaders.append(headerinfo) - return headerinfo - - def addOutHeaderInfo(self, name, type, namespace, element_type=0, - mustUnderstand=0): - """Add an output SOAP header description to the call info.""" - headerinfo = HeaderInfo(name, type, namespace, element_type) - if mustUnderstand: - headerinfo.mustUnderstand = 1 - self.outheaders.append(headerinfo) - return headerinfo - - def getInParameters(self): - """Return a sequence of the in parameters of the method.""" - return self.inparams - - def getOutParameters(self): - """Return a sequence of the out parameters of the method.""" - return self.outparams - - def getReturnParameter(self): - """Return param info about the return value of the method.""" - return self.retval - - def getInHeaders(self): - """Return a sequence of the in headers of the method.""" - return self.inheaders - - def getOutHeaders(self): - """Return a sequence of the out headers of the method.""" - return self.outheaders - - -class ParameterInfo: - """A ParameterInfo object captures parameter binding information.""" - def __init__(self, name, type, namespace=None, element_type=0): - if element_type: - self.element_type = 1 - if namespace is not None: - self.namespace = namespace - self.name = name - self.type = type - - element_type = 0 - namespace = None - default = None - - -class HeaderInfo(ParameterInfo): - """A HeaderInfo object captures SOAP header binding information.""" - def __init__(self, name, type, namespace, element_type=None): - ParameterInfo.__init__(self, name, type, namespace, element_type) - - mustUnderstand = 0 - actor = None - - -def callInfoFromWSDL(port, name): - """Return a SOAPCallInfo given a WSDL port and operation name.""" - wsdl = port.getService().getWSDL() - binding = port.getBinding() - portType = binding.getPortType() - operation = portType.operations[name] - opbinding = binding.operations[name] - messages = wsdl.messages - callinfo = SOAPCallInfo(name) - - addrbinding = port.getAddressBinding() - if not isinstance(addrbinding, SoapAddressBinding): - raise ValueError, 'Unsupported binding type.' - callinfo.location = addrbinding.location - - soapbinding = binding.findBinding(SoapBinding) - if soapbinding is None: - raise ValueError, 'Missing soap:binding element.' - callinfo.transport = soapbinding.transport - callinfo.style = soapbinding.style or 'document' - - soap_op_binding = opbinding.findBinding(SoapOperationBinding) - if soap_op_binding is not None: - callinfo.soapAction = soap_op_binding.soapAction - callinfo.style = soap_op_binding.style or callinfo.style - - parameterOrder = operation.parameterOrder - - if operation.input is not None: - message = messages[operation.input.message] - msgrole = opbinding.input - - mime = msgrole.findBinding(MimeMultipartRelatedBinding) - if mime is not None: - raise ValueError, 'Mime bindings are not supported.' - else: - for item in msgrole.findBindings(SoapHeaderBinding): - part = messages[item.message].parts[item.part] - header = callinfo.addInHeaderInfo( - part.name, - part.element or part.type, - item.namespace, - element_type = part.element and 1 or 0 - ) - header.encodingStyle = item.encodingStyle - - body = msgrole.findBinding(SoapBodyBinding) - if body is None: - raise ValueError, 'Missing soap:body binding.' - callinfo.encodingStyle = body.encodingStyle - callinfo.namespace = body.namespace - callinfo.use = body.use - - if body.parts is not None: - parts = [] - for name in body.parts: - parts.append(message.parts[name]) - else: - parts = message.parts.values() - - for part in parts: - callinfo.addInParameter( - part.name, - part.element or part.type, - element_type = part.element and 1 or 0 - ) - - if operation.output is not None: - try: - message = messages[operation.output.message] - except KeyError: - if self.strict: - raise RuntimeError( - "Recieved message not defined in the WSDL schema: %s" % - operation.output.message) - else: - message = wsdl.addMessage(operation.output.message) - print "Warning:", \ - "Recieved message not defined in the WSDL schema.", \ - "Adding it." - print "Message:", operation.output.message - - msgrole = opbinding.output - - mime = msgrole.findBinding(MimeMultipartRelatedBinding) - if mime is not None: - raise ValueError, 'Mime bindings are not supported.' - else: - for item in msgrole.findBindings(SoapHeaderBinding): - part = messages[item.message].parts[item.part] - header = callinfo.addOutHeaderInfo( - part.name, - part.element or part.type, - item.namespace, - element_type = part.element and 1 or 0 - ) - header.encodingStyle = item.encodingStyle - - body = msgrole.findBinding(SoapBodyBinding) - if body is None: - raise ValueError, 'Missing soap:body binding.' - callinfo.encodingStyle = body.encodingStyle - callinfo.namespace = body.namespace - callinfo.use = body.use - - if body.parts is not None: - parts = [] - for name in body.parts: - parts.append(message.parts[name]) - else: - parts = message.parts.values() - - if parts: - # XXX no idea what this is for, but it breaks everything. jrb - #callinfo.setReturnParameter( - # parts[0].name, - # parts[0].element or parts[0].type, - # element_type = parts[0].element and 1 or 0 - # ) - #for part in parts[1:]: - for part in parts: - callinfo.addOutParameter( - part.name, - part.element or part.type, - element_type = part.element and 1 or 0 - ) - - return callinfo diff --git a/SOAPpy/wstools/XMLSchema.py b/SOAPpy/wstools/XMLSchema.py deleted file mode 100755 index aaaaffc..0000000 --- a/SOAPpy/wstools/XMLSchema.py +++ /dev/null @@ -1,2976 +0,0 @@ -# Copyright (c) 2003, The Regents of the University of California, -# through Lawrence Berkeley National Laboratory (subject to receipt of -# any required approvals from the U.S. Dept. of Energy). All rights -# reserved. -# -# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. - -ident = "$Id: XMLSchema.py,v 1.38 2004/06/23 20:10:26 boverhof Exp $" - -import types, weakref, urllib, sys -from threading import RLock -from Namespaces import XMLNS -from Utility import DOM, DOMException, Collection, SplitQName -from StringIO import StringIO - -def GetSchema(component): - """convience function for finding the parent XMLSchema instance. - """ - parent = component - while not isinstance(parent, XMLSchema): - parent = parent._parent() - return parent - -class SchemaReader: - """A SchemaReader creates XMLSchema objects from urls and xml data. - """ - def __init__(self, domReader=None, base_url=None): - """domReader -- class must implement DOMAdapterInterface - base_url -- base url string - """ - self.__base_url = base_url - self.__readerClass = domReader - if not self.__readerClass: - self.__readerClass = DOMAdapter - self._includes = {} - self._imports = {} - - def __setImports(self, schema): - """Add dictionary of imports to schema instance. - schema -- XMLSchema instance - """ - for ns,val in schema.imports.items(): - if self._imports.has_key(ns): - schema.addImportSchema(self._imports[ns]) - - def __setIncludes(self, schema): - """Add dictionary of includes to schema instance. - schema -- XMLSchema instance - """ - for schemaLocation, val in schema.includes.items(): - if self._includes.has_key(schemaLocation): - schema.addIncludeSchema(self._imports[schemaLocation]) - - def addSchemaByLocation(self, location, schema): - """provide reader with schema document for a location. - """ - self._includes[location] = schema - - def addSchemaByNamespace(self, schema): - """provide reader with schema document for a targetNamespace. - """ - self._imports[schema.targetNamespace] = schema - - def loadFromNode(self, parent, element): - """element -- DOM node or document - parent -- WSDLAdapter instance - """ - reader = self.__readerClass(element) - schema = XMLSchema(parent) - #HACK to keep a reference - schema.wsdl = parent - schema.setBaseUrl(self.__base_url) - schema.load(reader) - return schema - - def loadFromStream(self, file): - """Return an XMLSchema instance loaded from a file object. - file -- file object - """ - reader = self.__readerClass() - reader.loadDocument(file) - schema = XMLSchema() - schema.setBaseUrl(self.__base_url) - schema.load(reader) - self.__setIncludes(schema) - self.__setImports(schema) - return schema - - def loadFromString(self, data): - """Return an XMLSchema instance loaded from an XML string. - data -- XML string - """ - return self.loadFromStream(StringIO(data)) - - def loadFromURL(self, url): - """Return an XMLSchema instance loaded from the given url. - url -- URL to dereference - """ - if not url.endswith('xsd'): - raise SchemaError, 'unknown file type %s' %url - reader = self.__readerClass() - if self.__base_url: - url = urllib.basejoin(self.__base_url,url) - reader.loadFromURL(url) - schema = XMLSchema() - schema.setBaseUrl(self.__base_url) - schema.load(reader) - self.__setIncludes(schema) - self.__setImports(schema) - return schema - - def loadFromFile(self, filename): - """Return an XMLSchema instance loaded from the given file. - filename -- name of file to open - """ - file = open(filename, 'rb') - try: schema = self.loadFromStream(file) - finally: file.close() - return schema - - -class SchemaError(Exception): - pass - -########################### -# DOM Utility Adapters -########################## -class DOMAdapterInterface: - def hasattr(self, attr, ns=None): - """return true if node has attribute - attr -- attribute to check for - ns -- namespace of attribute, by default None - """ - raise NotImplementedError, 'adapter method not implemented' - - def getContentList(self, *contents): - """returns an ordered list of child nodes - *contents -- list of node names to return - """ - raise NotImplementedError, 'adapter method not implemented' - - def setAttributeDictionary(self, attributes): - """set attribute dictionary - """ - raise NotImplementedError, 'adapter method not implemented' - - def getAttributeDictionary(self): - """returns a dict of node's attributes - """ - raise NotImplementedError, 'adapter method not implemented' - - def getNamespace(self, prefix): - """returns namespace referenced by prefix. - """ - raise NotImplementedError, 'adapter method not implemented' - - def getTagName(self): - """returns tagName of node - """ - raise NotImplementedError, 'adapter method not implemented' - - - def getParentNode(self): - """returns parent element in DOMAdapter or None - """ - raise NotImplementedError, 'adapter method not implemented' - - def loadDocument(self, file): - """load a Document from a file object - file -- - """ - raise NotImplementedError, 'adapter method not implemented' - - def loadFromURL(self, url): - """load a Document from an url - url -- URL to dereference - """ - raise NotImplementedError, 'adapter method not implemented' - - -class DOMAdapter(DOMAdapterInterface): - """Adapter for ZSI.Utility.DOM - """ - def __init__(self, node=None): - """Reset all instance variables. - element -- DOM document, node, or None - """ - if hasattr(node, 'documentElement'): - self.__node = node.documentElement - else: - self.__node = node - self.__attributes = None - - def hasattr(self, attr, ns=None): - """attr -- attribute - ns -- optional namespace, None means unprefixed attribute. - """ - if not self.__attributes: - self.setAttributeDictionary() - if ns: - return self.__attributes.get(ns,{}).has_key(attr) - return self.__attributes.has_key(attr) - - def getContentList(self, *contents): - nodes = [] - ELEMENT_NODE = self.__node.ELEMENT_NODE - for child in DOM.getElements(self.__node, None): - if child.nodeType == ELEMENT_NODE and\ - SplitQName(child.tagName)[1] in contents: - nodes.append(child) - return map(self.__class__, nodes) - - def setAttributeDictionary(self): - self.__attributes = {} - for v in self.__node._attrs.values(): - self.__attributes[v.nodeName] = v.nodeValue - - def getAttributeDictionary(self): - if not self.__attributes: - self.setAttributeDictionary() - return self.__attributes - - def getTagName(self): - return self.__node.tagName - - def getParentNode(self): - if self.__node.parentNode.nodeType == self.__node.ELEMENT_NODE: - return DOMAdapter(self.__node.parentNode) - return None - - def getNamespace(self, prefix): - """prefix -- deference namespace prefix in node's context. - Ascends parent nodes until found. - """ - namespace = None - if prefix == 'xmlns': - namespace = DOM.findDefaultNS(prefix, self.__node) - else: - try: - namespace = DOM.findNamespaceURI(prefix, self.__node) - except DOMException, ex: - if prefix != 'xml': - raise SchemaError, '%s namespace not declared for %s'\ - %(prefix, self.__node._get_tagName()) - namespace = XMLNS.XML - return namespace - - def loadDocument(self, file): - self.__node = DOM.loadDocument(file) - if hasattr(self.__node, 'documentElement'): - self.__node = self.__node.documentElement - - def loadFromURL(self, url): - self.__node = DOM.loadFromURL(url) - if hasattr(self.__node, 'documentElement'): - self.__node = self.__node.documentElement - - -class XMLBase: - """ These class variables are for string indentation. - """ - __indent = 0 - __rlock = RLock() - - def __str__(self): - XMLBase.__rlock.acquire() - XMLBase.__indent += 1 - tmp = "<" + str(self.__class__) + '>\n' - for k,v in self.__dict__.items(): - tmp += "%s* %s = %s\n" %(XMLBase.__indent*' ', k, v) - XMLBase.__indent -= 1 - XMLBase.__rlock.release() - return tmp - - -"""Marker Interface: can determine something about an instances properties by using - the provided convenience functions. - -""" -class DefinitionMarker: - """marker for definitions - """ - pass - -class DeclarationMarker: - """marker for declarations - """ - pass - -class AttributeMarker: - """marker for attributes - """ - pass - -class AttributeGroupMarker: - """marker for attribute groups - """ - pass - -class WildCardMarker: - """marker for wildcards - """ - pass - -class ElementMarker: - """marker for wildcards - """ - pass - -class ReferenceMarker: - """marker for references - """ - pass - -class ModelGroupMarker: - """marker for model groups - """ - pass - -class ExtensionMarker: - """marker for extensions - """ - pass - -class RestrictionMarker: - """marker for restrictions - """ - facets = ['enumeration', 'length', 'maxExclusive', 'maxInclusive',\ - 'maxLength', 'minExclusive', 'minInclusive', 'minLength',\ - 'pattern', 'fractionDigits', 'totalDigits', 'whiteSpace'] - -class SimpleMarker: - """marker for simple type information - """ - pass - -class ComplexMarker: - """marker for complex type information - """ - pass - -class LocalMarker: - """marker for complex type information - """ - pass - - -class MarkerInterface: - def isDefinition(self): - return isinstance(self, DefinitionMarker) - - def isDeclaration(self): - return isinstance(self, DeclarationMarker) - - def isAttribute(self): - return isinstance(self, AttributeMarker) - - def isAttributeGroup(self): - return isinstance(self, AttributeGroupMarker) - - def isElement(self): - return isinstance(self, ElementMarker) - - def isReference(self): - return isinstance(self, ReferenceMarker) - - def isWildCard(self): - return isinstance(self, WildCardMarker) - - def isModelGroup(self): - return isinstance(self, ModelGroupMarker) - - def isExtension(self): - return isinstance(self, ExtensionMarker) - - def isRestriction(self): - return isinstance(self, RestrictionMarker) - - def isSimple(self): - return isinstance(self, SimpleMarker) - - def isComplex(self): - return isinstance(self, ComplexMarker) - - def isLocal(self): - return isinstance(self, LocalMarker) - - -########################################################## -# Schema Components -######################################################### -class XMLSchemaComponent(XMLBase, MarkerInterface): - """ - class variables: - required -- list of required attributes - attributes -- dict of default attribute values, including None. - Value can be a function for runtime dependencies. - contents -- dict of namespace keyed content lists. - 'xsd' content of xsd namespace. - xmlns_key -- key for declared xmlns namespace. - xmlns -- xmlns is special prefix for namespace dictionary - xml -- special xml prefix for xml namespace. - """ - required = [] - attributes = {} - contents = {} - xmlns_key = '' - xmlns = 'xmlns' - xml = 'xml' - - def __init__(self, parent=None): - """parent -- parent instance - instance variables: - attributes -- dictionary of node's attributes - """ - self.attributes = None - self._parent = parent - if self._parent: - self._parent = weakref.ref(parent) - - if not self.__class__ == XMLSchemaComponent\ - and not (type(self.__class__.required) == type(XMLSchemaComponent.required)\ - and type(self.__class__.attributes) == type(XMLSchemaComponent.attributes)\ - and type(self.__class__.contents) == type(XMLSchemaComponent.contents)): - raise RuntimeError, 'Bad type for a class variable in %s' %self.__class__ - - def getTargetNamespace(self): - """return targetNamespace - """ - parent = self - targetNamespace = 'targetNamespace' - tns = self.attributes.get(targetNamespace) - while not tns: - parent = parent._parent() - tns = parent.attributes.get(targetNamespace) - return tns - - def getTypeDefinition(self, attribute): - """attribute -- attribute with a QName value (eg. type). - collection -- check types collection in parent Schema instance - """ - return self.getQNameAttribute('types', attribute) - - def getElementDeclaration(self, attribute): - """attribute -- attribute with a QName value (eg. element). - collection -- check elements collection in parent Schema instance. - """ - return self.getQNameAttribute('elements', attribute) - - def getQNameAttribute(self, collection, attribute): - """returns object instance representing QName --> (namespace,name), - or if does not exist return None. - attribute -- an information item attribute, with a QName value. - collection -- collection in parent Schema instance to search. - """ - obj = None - tdc = self.attributes.get(attribute) - if tdc: - parent = GetSchema(self) - targetNamespace = tdc.getTargetNamespace() - if parent.targetNamespace == targetNamespace: - item = tdc.getName() - try: - obj = getattr(parent, collection)[item] - except KeyError, ex: - raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\ - %(targetNamespace, collection, item) - elif parent.imports.has_key(targetNamespace): - schema = parent.imports[targetNamespace].getSchema() - item = tdc.getName() - try: - obj = getattr(schema, collection)[item] - except KeyError, ex: - raise KeyError, "targetNamespace(%s) collection(%s) has no item(%s)"\ - %(targetNamespace, collection, item) - return obj - - def getXMLNS(self, prefix=None): - """deference prefix or by default xmlns, returns namespace. - """ - if prefix == XMLSchemaComponent.xml: - return XMLNS.XML - parent = self - ns = self.attributes[XMLSchemaComponent.xmlns].get(prefix or\ - XMLSchemaComponent.xmlns_key) - while not ns: - parent = parent._parent() - ns = parent.attributes[XMLSchemaComponent.xmlns].get(prefix or\ - XMLSchemaComponent.xmlns_key) - if not ns and isinstance(parent, WSDLToolsAdapter): - raise SchemaError, 'unknown prefix %s' %prefix - return ns - - def getAttribute(self, attribute): - """return requested attribute or None - """ - return self.attributes.get(attribute) - - def setAttributes(self, node): - """Sets up attribute dictionary, checks for required attributes and - sets default attribute values. attr is for default attribute values - determined at runtime. - - structure of attributes dictionary - ['xmlns'][xmlns_key] -- xmlns namespace - ['xmlns'][prefix] -- declared namespace prefix - [namespace][prefix] -- attributes declared in a namespace - [attribute] -- attributes w/o prefix, default namespaces do - not directly apply to attributes, ie Name can't collide - with QName. - """ - self.attributes = {XMLSchemaComponent.xmlns:{}} - for k,v in node.getAttributeDictionary().items(): - prefix,value = SplitQName(k) - if value == XMLSchemaComponent.xmlns: - self.attributes[value][prefix or XMLSchemaComponent.xmlns_key] = v - elif prefix: - ns = node.getNamespace(prefix) - if not ns: - raise SchemaError, 'no namespace for attribute prefix %s'\ - %prefix - if not self.attributes.has_key(ns): - self.attributes[ns] = {} - elif self.attributes[ns].has_key(value): - raise SchemaError, 'attribute %s declared multiple times in %s'\ - %(value, ns) - self.attributes[ns][value] = v - elif not self.attributes.has_key(value): - self.attributes[value] = v - else: - raise SchemaError, 'attribute %s declared multiple times' %value - - self.__checkAttributes() - self.__setAttributeDefaults() - - #set QNames - for k in ['type', 'element', 'base', 'ref', 'substitutionGroup', 'itemType']: - if self.attributes.has_key(k): - prefix, value = SplitQName(self.attributes.get(k)) - self.attributes[k] = \ - TypeDescriptionComponent((self.getXMLNS(prefix), value)) - - #Union, memberTypes is a whitespace separated list of QNames - for k in ['memberTypes']: - if self.attributes.has_key(k): - qnames = self.attributes[k] - self.attributes[k] = [] - for qname in qnames.split(): - prefix, value = SplitQName(qname) - self.attributes['memberTypes'].append(\ - TypeDescriptionComponent(\ - (self.getXMLNS(prefix), value))) - - def getContents(self, node): - """retrieve xsd contents - """ - return node.getContentList(*self.__class__.contents['xsd']) - - def __setAttributeDefaults(self): - """Looks for default values for unset attributes. If - class variable representing attribute is None, then - it must be defined as an instance variable. - """ - for k,v in self.__class__.attributes.items(): - if v and not self.attributes.has_key(k): - if isinstance(v, types.FunctionType): - self.attributes[k] = v(self) - else: - self.attributes[k] = v - - def __checkAttributes(self): - """Checks that required attributes have been defined, - attributes w/default cannot be required. Checks - all defined attributes are legal, attribute - references are not subject to this test. - """ - for a in self.__class__.required: - if not self.attributes.has_key(a): - raise SchemaError,\ - 'class instance %s, missing required attribute %s'\ - %(self.__class__, a) - for a in self.attributes.keys(): - if (a not in (XMLSchemaComponent.xmlns, XMLNS.XML)) and\ - (a not in self.__class__.attributes.keys()) and not\ - (self.isAttribute() and self.isReference()): - raise SchemaError, '%s, unknown attribute' %a - - -class WSDLToolsAdapter(XMLSchemaComponent): - """WSDL Adapter to grab the attributes from the wsdl document node. - """ - attributes = {'name':None, 'targetNamespace':None} - - def __init__(self, wsdl): - #XMLSchemaComponent.__init__(self, None) - XMLSchemaComponent.__init__(self, parent=wsdl) - self.setAttributes(DOMAdapter(wsdl.document)) - - def getImportSchemas(self): - """returns WSDLTools.WSDL types Collection - """ - return self._parent().types - - -class Notation(XMLSchemaComponent): - """ - parent: - schema - attributes: - id -- ID - name -- NCName, Required - public -- token, Required - system -- anyURI - contents: - annotation? - """ - required = ['name', 'public'] - attributes = {'id':None, 'name':None, 'public':None, 'system':None} - contents = {'xsd':('annotation')} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class Annotation(XMLSchemaComponent): - """ - parent: - all,any,anyAttribute,attribute,attributeGroup,choice,complexContent, - complexType,element,extension,field,group,import,include,key,keyref, - list,notation,redefine,restriction,schema,selector,simpleContent, - simpleType,union,unique - attributes: - id -- ID - contents: - (documentation | appinfo)* - """ - attributes = {'id':None} - contents = {'xsd':('documentation', 'appinfo')} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'documentation': - #print_debug('class %s, documentation skipped' %self.__class__, 5) - continue - elif component == 'appinfo': - #print_debug('class %s, appinfo skipped' %self.__class__, 5) - continue - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - - class Documentation(XMLSchemaComponent): - """ - parent: - annotation - attributes: - source, anyURI - xml:lang, language - contents: - mixed, any - """ - attributes = {'source':None, 'xml:lang':None} - contents = {'xsd':('mixed', 'any')} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'mixed': - #print_debug('class %s, mixed skipped' %self.__class__, 5) - continue - elif component == 'any': - #print_debug('class %s, any skipped' %self.__class__, 5) - continue - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - - class Appinfo(XMLSchemaComponent): - """ - parent: - annotation - attributes: - source, anyURI - contents: - mixed, any - """ - attributes = {'source':None, 'anyURI':None} - contents = {'xsd':('mixed', 'any')} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'mixed': - #print_debug('class %s, mixed skipped' %self.__class__, 5) - continue - elif component == 'any': - #print_debug('class %s, any skipped' %self.__class__, 5) - continue - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - -class XMLSchemaFake: - # This is temporary, for the benefit of WSDL until the real thing works. - def __init__(self, element): - self.targetNamespace = DOM.getAttr(element, 'targetNamespace') - self.element = element - -class XMLSchema(XMLSchemaComponent): - """A schema is a collection of schema components derived from one - or more schema documents, that is, one or more element - information items. It represents the abstract notion of a schema - rather than a single schema document (or other representation). - - - parent: - ROOT - attributes: - id -- ID - version -- token - xml:lang -- language - targetNamespace -- anyURI - attributeFormDefault -- 'qualified' | 'unqualified', 'unqualified' - elementFormDefault -- 'qualified' | 'unqualified', 'unqualified' - blockDefault -- '#all' | list of - ('substitution | 'extension' | 'restriction') - finalDefault -- '#all' | list of - ('extension' | 'restriction' | 'list' | 'union') - - contents: - ((include | import | redefine | annotation)*, - (attribute, attributeGroup, complexType, element, group, - notation, simpleType)*, annotation*)* - - - attributes -- schema attributes - imports -- import statements - includes -- include statements - redefines -- - types -- global simpleType, complexType definitions - elements -- global element declarations - attr_decl -- global attribute declarations - attr_groups -- attribute Groups - model_groups -- model Groups - notations -- global notations - """ - attributes = {'id':None, - 'version':None, - 'xml:lang':None, - 'targetNamespace':None, - 'attributeFormDefault':'unqualified', - 'elementFormDefault':'unqualified', - 'blockDefault':None, - 'finalDefault':None} - contents = {'xsd':('include', 'import', 'redefine', 'annotation', 'attribute',\ - 'attributeGroup', 'complexType', 'element', 'group',\ - 'notation', 'simpleType', 'annotation')} - empty_namespace = '' - - def __init__(self, parent=None): - """parent -- - instance variables: - targetNamespace -- schema's declared targetNamespace, or empty string. - _imported_schemas -- namespace keyed dict of schema dependencies, if - a schema is provided instance will not resolve import statement. - _included_schemas -- schemaLocation keyed dict of component schemas, - if schema is provided instance will not resolve include statement. - _base_url -- needed for relative URLs support, only works with URLs - relative to initial document. - includes -- collection of include statements - imports -- collection of import statements - elements -- collection of global element declarations - types -- collection of global type definitions - attr_decl -- collection of global attribute declarations - attr_groups -- collection of global attribute group definitions - model_groups -- collection of model group definitions - notations -- collection of notations - - """ - self.targetNamespace = None - XMLSchemaComponent.__init__(self, parent) - f = lambda k: k.attributes['name'] - ns = lambda k: k.attributes['namespace'] - sl = lambda k: k.attributes['schemaLocation'] - self.includes = Collection(self, key=sl) - self.imports = Collection(self, key=ns) - self.elements = Collection(self, key=f) - self.types = Collection(self, key=f) - self.attr_decl = Collection(self, key=f) - self.attr_groups = Collection(self, key=f) - self.model_groups = Collection(self, key=f) - self.notations = Collection(self, key=f) - - self._imported_schemas = {} - self._included_schemas = {} - self._base_url = None - - def addImportSchema(self, schema): - """for resolving import statements in Schema instance - schema -- schema instance - _imported_schemas - """ - if not isinstance(schema, XMLSchema): - raise TypeError, 'expecting a Schema instance' - if schema.targetNamespace != self.targetNamespace: - self._imported_schemas[schema.targetNamespace] = schema - else: - raise SchemaError, 'import schema bad targetNamespace' - - def addIncludeSchema(self, schemaLocation, schema): - """for resolving include statements in Schema instance - schemaLocation -- schema location - schema -- schema instance - _included_schemas - """ - if not isinstance(schema, XMLSchema): - raise TypeError, 'expecting a Schema instance' - if not schema.targetNamespace or\ - schema.targetNamespace == self.targetNamespace: - self._included_schemas[schemaLocation] = schema - else: - raise SchemaError, 'include schema bad targetNamespace' - - def setImportSchemas(self, schema_dict): - """set the import schema dictionary, which is used to - reference depedent schemas. - """ - self._imported_schemas = schema_dict - - def getImportSchemas(self): - """get the import schema dictionary, which is used to - reference depedent schemas. - """ - return self._imported_schemas - - def getSchemaNamespacesToImport(self): - """returns tuple of namespaces the schema instance has declared - itself to be depedent upon. - """ - return tuple(self.includes.keys()) - - def setIncludeSchemas(self, schema_dict): - """set the include schema dictionary, which is keyed with - schemaLocation (uri). - This is a means of providing - schemas to the current schema for content inclusion. - """ - self._included_schemas = schema_dict - - def getIncludeSchemas(self): - """get the include schema dictionary, which is keyed with - schemaLocation (uri). - """ - return self._included_schemas - - def getBaseUrl(self): - """get base url, used for normalizing all relative uri's - """ - return self._base_url - - def setBaseUrl(self, url): - """set base url, used for normalizing all relative uri's - """ - self._base_url = url - - def getElementFormDefault(self): - """return elementFormDefault attribute - """ - return self.attributes.get('elementFormDefault') - - def getAttributeFormDefault(self): - """return attributeFormDefault attribute - """ - return self.attributes.get('attributeFormDefault') - - def getBlockDefault(self): - """return blockDefault attribute - """ - return self.attributes.get('blockDefault') - - def getFinalDefault(self): - """return finalDefault attribute - """ - return self.attributes.get('finalDefault') - - def load(self, node): - pnode = node.getParentNode() - if pnode: - pname = SplitQName(pnode.getTagName())[1] - if pname == 'types': - attributes = {} - self.setAttributes(pnode) - attributes.update(self.attributes) - self.setAttributes(node) - for k,v in attributes['xmlns'].items(): - if not self.attributes['xmlns'].has_key(k): - self.attributes['xmlns'][k] = v - else: - self.setAttributes(node) - else: - self.setAttributes(node) - - self.targetNamespace = self.getTargetNamespace() - contents = self.getContents(node) - - indx = 0 - num = len(contents) - while indx < num: - while indx < num: - node = contents[indx] - component = SplitQName(node.getTagName())[1] - - if component == 'include': - tp = self.__class__.Include(self) - tp.fromDom(node) - self.includes[tp.attributes['schemaLocation']] = tp - - schema = tp.getSchema() - if schema.targetNamespace and \ - schema.targetNamespace != self.targetNamespace: - raise SchemaError, 'included schema bad targetNamespace' - - for collection in ['imports','elements','types',\ - 'attr_decl','attr_groups','model_groups','notations']: - for k,v in getattr(schema,collection).items(): - if not getattr(self,collection).has_key(k): - v._parent = weakref.ref(self) - getattr(self,collection)[k] = v - - elif component == 'import': - tp = self.__class__.Import(self) - tp.fromDom(node) - import_ns = tp.getAttribute('namespace') - if import_ns: - if import_ns == self.targetNamespace: - raise SchemaError,\ - 'import and schema have same targetNamespace' - self.imports[import_ns] = tp - else: - self.imports[self.__class__.empty_namespace] = tp - - if not self.getImportSchemas().has_key(import_ns) and\ - tp.getAttribute('schemaLocation'): - self.addImportSchema(tp.getSchema()) - - elif component == 'redefine': - #print_debug('class %s, redefine skipped' %self.__class__, 5) - pass - elif component == 'annotation': - #print_debug('class %s, annotation skipped' %self.__class__, 5) - pass - else: - break - indx += 1 - - # (attribute, attributeGroup, complexType, element, group, - # notation, simpleType)*, annotation*)* - while indx < num: - node = contents[indx] - component = SplitQName(node.getTagName())[1] - - if component == 'attribute': - tp = AttributeDeclaration(self) - tp.fromDom(node) - self.attr_decl[tp.getAttribute('name')] = tp - elif component == 'attributeGroup': - tp = AttributeGroupDefinition(self) - tp.fromDom(node) - self.attr_groups[tp.getAttribute('name')] = tp - elif component == 'complexType': - tp = ComplexType(self) - tp.fromDom(node) - self.types[tp.getAttribute('name')] = tp - elif component == 'element': - tp = ElementDeclaration(self) - tp.fromDom(node) - self.elements[tp.getAttribute('name')] = tp - elif component == 'group': - tp = ModelGroupDefinition(self) - tp.fromDom(node) - self.model_groups[tp.getAttribute('name')] = tp - elif component == 'notation': - tp = Notation(self) - tp.fromDom(node) - self.notations[tp.getAttribute('name')] = tp - elif component == 'simpleType': - tp = SimpleType(self) - tp.fromDom(node) - self.types[tp.getAttribute('name')] = tp - else: - break - indx += 1 - - while indx < num: - node = contents[indx] - component = SplitQName(node.getTagName())[1] - - if component == 'annotation': - #print_debug('class %s, annotation 2 skipped' %self.__class__, 5) - pass - else: - break - indx += 1 - - - class Import(XMLSchemaComponent): - """ - parent: - schema - attributes: - id -- ID - namespace -- anyURI - schemaLocation -- anyURI - contents: - annotation? - """ - attributes = {'id':None, - 'namespace':None, - 'schemaLocation':None} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self._schema = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - if self.attributes['namespace'] == self._parent().attributes['targetNamespace']: - raise SchemaError, 'namespace of schema and import match' - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - def getSchema(self): - """if schema is not defined, first look for a Schema class instance - in parent Schema. Else if not defined resolve schemaLocation - and create a new Schema class instance, and keep a hard reference. - """ - if not self._schema: - ns = self.attributes['namespace'] - schema = self._parent().getImportSchemas().get(ns) - if not schema and self._parent()._parent: - schema = self._parent()._parent().getImportSchemas().get(ns) - if not schema: - url = self.attributes.get('schemaLocation') - if not url: - raise SchemaError, 'namespace(%s) is unknown' %ns - base_url = self._parent().getBaseUrl() - reader = SchemaReader(base_url=base_url) - reader._imports = self._parent().getImportSchemas() - reader._includes = self._parent().getIncludeSchemas() - self._schema = reader.loadFromURL(url) - return self._schema or schema - - - class Include(XMLSchemaComponent): - """ - parent: - schema - attributes: - id -- ID - schemaLocation -- anyURI, required - contents: - annotation? - """ - required = ['schemaLocation'] - attributes = {'id':None, - 'schemaLocation':None} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self._schema = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - def getSchema(self): - """if schema is not defined, first look for a Schema class instance - in parent Schema. Else if not defined resolve schemaLocation - and create a new Schema class instance. - """ - if not self._schema: - #schema = self._parent()._parent() - schema = self._parent() - #self._schema = schema.getIncludeSchemas(\ - # self.attributes['schemaLocation']) - self._schema = schema.getIncludeSchemas().get(\ - self.attributes['schemaLocation'] - ) - if not self._schema: - url = self.attributes['schemaLocation'] - reader = SchemaReader(base_url=schema.getBaseUrl()) - reader._imports = schema.getImportSchemas() - reader._includes = schema.getIncludeSchemas() - self._schema = reader.loadFromURL(url) - return self._schema - - -class AttributeDeclaration(XMLSchemaComponent,\ - AttributeMarker,\ - DeclarationMarker): - """ - parent: - schema - attributes: - id -- ID - name -- NCName, required - type -- QName - default -- string - fixed -- string - contents: - annotation?, simpleType? - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'type':None, - 'default':None, - 'fixed':None} - contents = {'xsd':['annotation','simpleType']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - """ No list or union support - """ - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - elif component == 'simpleType': - self.content = AnonymousSimpleType(self) - self.content.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class LocalAttributeDeclaration(AttributeDeclaration,\ - AttributeMarker,\ - LocalMarker,\ - DeclarationMarker): - """ - parent: - complexType, restriction, extension, attributeGroup - attributes: - id -- ID - name -- NCName, required - type -- QName - form -- ('qualified' | 'unqualified'), schema.attributeFormDefault - use -- ('optional' | 'prohibited' | 'required'), optional - default -- string - fixed -- string - contents: - annotation?, simpleType? - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'type':None, - 'form':lambda self: GetSchema(self).getAttributeFormDefault(), - 'use':'optional', - 'default':None, - 'fixed':None} - contents = {'xsd':['annotation','simpleType']} - - def __init__(self, parent): - AttributeDeclaration.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - elif component == 'simpleType': - self.content = AnonymousSimpleType(self) - self.content.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class AttributeWildCard(XMLSchemaComponent,\ - AttributeMarker,\ - DeclarationMarker,\ - WildCardMarker): - """ - parents: - complexType, restriction, extension, attributeGroup - attributes: - id -- ID - namespace -- '##any' | '##other' | - (anyURI* | '##targetNamespace' | '##local'), ##any - processContents -- 'lax' | 'skip' | 'strict', strict - contents: - annotation? - """ - attributes = {'id':None, - 'namespace':'##any', - 'processContents':'strict'} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class AttributeReference(XMLSchemaComponent,\ - AttributeMarker,\ - ReferenceMarker): - """ - parents: - complexType, restriction, extension, attributeGroup - attributes: - id -- ID - ref -- QName, required - use -- ('optional' | 'prohibited' | 'required'), optional - default -- string - fixed -- string - contents: - annotation? - """ - required = ['ref'] - attributes = {'id':None, - 'ref':None, - 'use':'optional', - 'default':None, - 'fixed':None} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class AttributeGroupDefinition(XMLSchemaComponent,\ - AttributeGroupMarker,\ - DefinitionMarker): - """ - parents: - schema, redefine - attributes: - id -- ID - name -- NCName, required - contents: - annotation?, (attribute | attributeGroup)*, anyAttribute? - """ - required = ['name'] - attributes = {'id':None, - 'name':None} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.attr_content = None - - def getAttributeContent(self): - return self.attr_content - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for indx in range(len(contents)): - component = SplitQName(contents[indx].getTagName())[1] - if (component == 'annotation') and (not indx): - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - elif (component == 'attribute'): - if contents[indx].hasattr('name'): - content.append(AttributeDeclaration()) - elif contents[indx].hasattr('ref'): - content.append(AttributeReference()) - else: - raise SchemaError, 'Unknown attribute type' - content[-1].fromDom(contents[indx]) - elif (component == 'attributeGroup'): - content.append(AttributeGroupReference()) - content[-1].fromDom(contents[indx]) - elif (component == 'anyAttribute') and (len(contents) == x+1): - content.append(AttributeWildCard()) - content[-1].fromDom(contents[indx]) - else: - raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) - - self.attr_content = tuple(content) - -class AttributeGroupReference(XMLSchemaComponent,\ - AttributeGroupMarker,\ - ReferenceMarker): - """ - parents: - complexType, restriction, extension, attributeGroup - attributes: - id -- ID - ref -- QName, required - contents: - annotation? - """ - required = ['ref'] - attributes = {'id':None, - 'ref':None} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - - -###################################################### -# Elements -##################################################### -class IdentityConstrants(XMLSchemaComponent): - """Allow one to uniquely identify nodes in a document and ensure the - integrity of references between them. - - attributes -- dictionary of attributes - selector -- XPath to selected nodes - fields -- list of XPath to key field - """ - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.selector = None - self.fields = None - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - fields = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - elif component == 'selector': - self.selector = self.Selector(self) - self.selector.fromDom(i) - continue - elif component == 'field': - fields.append(self.Field(self)) - fields[-1].fromDom(i) - continue - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.fields = tuple(fields) - - - class Constraint(XMLSchemaComponent): - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - class Selector(Constraint): - """ - parent: - unique, key, keyref - attributes: - id -- ID - xpath -- XPath subset, required - contents: - annotation? - """ - required = ['xpath'] - attributes = {'id':None, - 'xpath':None} - contents = {'xsd':['annotation']} - - class Field(Constraint): - """ - parent: - unique, key, keyref - attributes: - id -- ID - xpath -- XPath subset, required - contents: - annotation? - """ - required = ['xpath'] - attributes = {'id':None, - 'xpath':None} - contents = {'xsd':['annotation']} - - -class Unique(IdentityConstrants): - """ Enforce fields are unique w/i a specified scope. - - parent: - element - attributes: - id -- ID - name -- NCName, required - contents: - annotation?, selector, field+ - """ - required = ['name'] - attributes = {'id':None, - 'name':None} - contents = {'xsd':['annotation', 'selector', 'field']} - - -class Key(IdentityConstrants): - """ Enforce fields are unique w/i a specified scope, and all - field values are present w/i document. Fields cannot - be nillable. - - parent: - element - attributes: - id -- ID - name -- NCName, required - contents: - annotation?, selector, field+ - """ - required = ['name'] - attributes = {'id':None, - 'name':None} - contents = {'xsd':['annotation', 'selector', 'field']} - - -class KeyRef(IdentityConstrants): - """ Ensure a match between two sets of values in an - instance. - parent: - element - attributes: - id -- ID - name -- NCName, required - refer -- QName, required - contents: - annotation?, selector, field+ - """ - required = ['name', 'refer'] - attributes = {'id':None, - 'name':None, - 'refer':None} - contents = {'xsd':['annotation', 'selector', 'field']} - - -class ElementDeclaration(XMLSchemaComponent,\ - ElementMarker,\ - DeclarationMarker): - """ - parents: - schema - attributes: - id -- ID - name -- NCName, required - type -- QName - default -- string - fixed -- string - nillable -- boolean, false - abstract -- boolean, false - substitutionGroup -- QName - block -- ('#all' | ('substition' | 'extension' | 'restriction')*), - schema.blockDefault - final -- ('#all' | ('extension' | 'restriction')*), - schema.finalDefault - contents: - annotation?, (simpleType,complexType)?, (key | keyref | unique)* - - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'type':None, - 'default':None, - 'fixed':None, - 'nillable':0, - 'abstract':0, - 'substitutionGroup':None, - 'block':lambda self: self._parent().getBlockDefault(), - 'final':lambda self: self._parent().getFinalDefault()} - contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ - 'keyref', 'unique']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - self.constraints = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - constraints = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - elif component == 'simpleType' and not self.content: - self.content = AnonymousSimpleType(self) - self.content.fromDom(i) - elif component == 'complexType' and not self.content: - self.content = LocalComplexType(self) - self.content.fromDom(i) - elif component == 'key': - constraints.append(Key(self)) - constraints[-1].fromDom(i) - elif component == 'keyref': - constraints.append(KeyRef(self)) - constraints[-1].fromDom(i) - elif component == 'unique': - constraints.append(Unique(self)) - constraints[-1].fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.constraints = tuple(constraints) - - -class LocalElementDeclaration(ElementDeclaration,\ - LocalMarker): - """ - parents: - all, choice, sequence - attributes: - id -- ID - name -- NCName, required - form -- ('qualified' | 'unqualified'), schema.elementFormDefault - type -- QName - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - default -- string - fixed -- string - nillable -- boolean, false - block -- ('#all' | ('extension' | 'restriction')*), schema.blockDefault - contents: - annotation?, (simpleType,complexType)?, (key | keyref | unique)* - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'form':lambda self: GetSchema(self).getElementFormDefault(), - 'type':None, - 'minOccurs':'1', - 'maxOccurs':'1', - 'default':None, - 'fixed':None, - 'nillable':0, - 'abstract':0, - 'block':lambda self: GetSchema(self).getBlockDefault()} - contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ - 'keyref', 'unique']} - - -class ElementReference(XMLSchemaComponent,\ - ElementMarker,\ - ReferenceMarker): - """ - parents: - all, choice, sequence - attributes: - id -- ID - ref -- QName, required - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - contents: - annotation? - """ - required = ['ref'] - attributes = {'id':None, - 'ref':None, - 'minOccurs':'1', - 'maxOccurs':'1'} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.annotation = None - self.setAttributes(node) - for i in self.getContents(node): - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class ElementWildCard(LocalElementDeclaration,\ - WildCardMarker): - """ - parents: - choice, sequence - attributes: - id -- ID - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - namespace -- '##any' | '##other' | - (anyURI* | '##targetNamespace' | '##local'), ##any - processContents -- 'lax' | 'skip' | 'strict', strict - contents: - annotation? - """ - required = [] - attributes = {'id':None, - 'minOccurs':'1', - 'maxOccurs':'1', - 'namespace':'##any', - 'processContents':'strict'} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.annotation = None - self.setAttributes(node) - for i in self.getContents(node): - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -###################################################### -# Model Groups -##################################################### -class Sequence(XMLSchemaComponent,\ - ModelGroupMarker): - """ - parents: - complexType, extension, restriction, group, choice, sequence - attributes: - id -- ID - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - - contents: - annotation?, (element | group | choice | sequence | any)* - """ - attributes = {'id':None, - 'minOccurs':'1', - 'maxOccurs':'1'} - contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ - 'any']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - continue - elif component == 'element': - if i.hasattr('ref'): - content.append(ElementReference(self)) - else: - content.append(LocalElementDeclaration(self)) - elif component == 'group': - content.append(ModelGroupReference(self)) - elif component == 'choice': - content.append(Choice(self)) - elif component == 'sequence': - content.append(Sequence(self)) - elif component == 'any': - content.append(ElementWildCard(self)) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - content[-1].fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - -class All(XMLSchemaComponent,\ - ModelGroupMarker): - """ - parents: - complexType, extension, restriction, group - attributes: - id -- ID - minOccurs -- '0' | '1', 1 - maxOccurs -- '1', 1 - - contents: - annotation?, element* - """ - attributes = {'id':None, - 'minOccurs':'1', - 'maxOccurs':'1'} - contents = {'xsd':['annotation', 'element']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - continue - elif component == 'element': - if i.hasattr('ref'): - content.append(ElementReference(self)) - else: - content.append(LocalElementDeclaration(self)) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - content[-1].fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - -class Choice(XMLSchemaComponent,\ - ModelGroupMarker): - """ - parents: - complexType, extension, restriction, group, choice, sequence - attributes: - id -- ID - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - - contents: - annotation?, (element | group | choice | sequence | any)* - """ - attributes = {'id':None, - 'minOccurs':'1', - 'maxOccurs':'1'} - contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ - 'any']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - continue - elif component == 'element': - if i.hasattr('ref'): - content.append(ElementReference(self)) - else: - content.append(LocalElementDeclaration(self)) - elif component == 'group': - content.append(ModelGroupReference(self)) - elif component == 'choice': - content.append(Choice(self)) - elif component == 'sequence': - content.append(Sequence(self)) - elif component == 'any': - content.append(ElementWildCard(self)) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - content[-1].fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - -class ModelGroupDefinition(XMLSchemaComponent,\ - ModelGroupMarker,\ - DefinitionMarker): - """ - parents: - redefine, schema - attributes: - id -- ID - name -- NCName, required - - contents: - annotation?, (all | choice | sequence)? - """ - required = ['name'] - attributes = {'id':None, - 'name':None} - contents = {'xsd':['annotation', 'all', 'choice', 'sequence']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - continue - elif component == 'all' and not self.content: - self.content = All(self) - elif component == 'choice' and not self.content: - self.content = Choice(self) - elif component == 'sequence' and not self.content: - self.content = Sequence(self) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class ModelGroupReference(XMLSchemaComponent,\ - ModelGroupMarker,\ - ReferenceMarker): - """ - parents: - choice, complexType, extension, restriction, sequence - attributes: - id -- ID - ref -- NCName, required - minOccurs -- Whole Number, 1 - maxOccurs -- (Whole Number | 'unbounded'), 1 - - contents: - annotation? - """ - required = ['ref'] - attributes = {'id':None, - 'ref':None, - 'minOccurs':'1', - 'maxOccurs':'1'} - contents = {'xsd':['annotation']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - - -class ComplexType(XMLSchemaComponent,\ - DefinitionMarker,\ - ComplexMarker): - """ - parents: - redefine, schema - attributes: - id -- ID - name -- NCName, required - mixed -- boolean, false - abstract -- boolean, false - block -- ('#all' | ('extension' | 'restriction')*), schema.blockDefault - final -- ('#all' | ('extension' | 'restriction')*), schema.finalDefault - - contents: - annotation?, (simpleContent | complexContent | - ((group | all | choice | sequence)?, (attribute | attributeGroup)*, anyAttribute?)) - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'mixed':0, - 'abstract':0, - 'block':lambda self: self._parent().getBlockDefault(), - 'final':lambda self: self._parent().getFinalDefault()} - contents = {'xsd':['annotation', 'simpleContent', 'complexContent',\ - 'group', 'all', 'choice', 'sequence', 'attribute', 'attributeGroup',\ - 'anyAttribute', 'any']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - self.attr_content = None - - def getAttributeContent(self): - return self.attr_content - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - indx = 0 - num = len(contents) - #XXX ugly - if not num: - return - component = SplitQName(contents[indx].getTagName())[1] - if component == 'annotation': - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - indx += 1 - component = SplitQName(contents[indx].getTagName())[1] - - self.content = None - if component == 'simpleContent': - self.content = self.__class__.SimpleContent(self) - self.content.fromDom(contents[indx]) - elif component == 'complexContent': - self.content = self.__class__.ComplexContent(self) - self.content.fromDom(contents[indx]) - else: - if component == 'all': - self.content = All(self) - elif component == 'choice': - self.content = Choice(self) - elif component == 'sequence': - self.content = Sequence(self) - elif component == 'group': - self.content = ModelGroupReference(self) - - if self.content: - self.content.fromDom(contents[indx]) - indx += 1 - - self.attr_content = [] - while indx < num: - component = SplitQName(contents[indx].getTagName())[1] - if component == 'attribute': - if contents[indx].hasattr('ref'): - self.attr_content.append(AttributeReference(self)) - else: - self.attr_content.append(LocalAttributeDeclaration(self)) - elif component == 'attributeGroup': - self.attr_content.append(AttributeGroupReference(self)) - elif component == 'anyAttribute': - self.attr_content.append(AttributeWildCard(self)) - else: - raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) - self.attr_content[-1].fromDom(contents[indx]) - indx += 1 - - class _DerivedType(XMLSchemaComponent): - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.derivation = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - for i in contents: - component = SplitQName(i.getTagName())[1] - if component in self.__class__.contents['xsd']: - if component == 'annotation' and not self.annotation: - self.annotation = Annotation(self) - self.annotation.fromDom(i) - continue - elif component == 'restriction' and not self.derivation: - self.derivation = self.__class__.Restriction(self) - elif component == 'extension' and not self.derivation: - self.derivation = self.__class__.Extension(self) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.derivation.fromDom(i) - - class ComplexContent(_DerivedType,\ - ComplexMarker): - """ - parents: - complexType - attributes: - id -- ID - mixed -- boolean, false - - contents: - annotation?, (restriction | extension) - """ - attributes = {'id':None, - 'mixed':0 } - contents = {'xsd':['annotation', 'restriction', 'extension']} - - class _DerivationBase(XMLSchemaComponent): - """, - parents: - complexContent - attributes: - id -- ID - base -- QName, required - - contents: - annotation?, (group | all | choice | sequence)?, - (attribute | attributeGroup)*, anyAttribute? - """ - required = ['base'] - attributes = {'id':None, - 'base':None } - contents = {'xsd':['annotation', 'group', 'all', 'choice',\ - 'sequence', 'attribute', 'attributeGroup', 'anyAttribute']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - self.attr_content = None - - def getAttributeContent(self): - return self.attr_content - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - indx = 0 - num = len(contents) - #XXX ugly - if not num: - return - component = SplitQName(contents[indx].getTagName())[1] - if component == 'annotation': - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - indx += 1 - component = SplitQName(contents[indx].getTagName())[1] - - if component == 'all': - self.content = All(self) - self.content.fromDom(contents[indx]) - indx += 1 - elif component == 'choice': - self.content = Choice(self) - self.content.fromDom(contents[indx]) - indx += 1 - elif component == 'sequence': - self.content = Sequence(self) - self.content.fromDom(contents[indx]) - indx += 1 - elif component == 'group': - self.content = ModelGroupReference(self) - self.content.fromDom(contents[indx]) - indx += 1 - else: - self.content = None - - self.attr_content = [] - while indx < num: - component = SplitQName(contents[indx].getTagName())[1] - if component == 'attribute': - if contents[indx].hasattr('ref'): - self.attr_content.append(AttributeReference(self)) - else: - self.attr_content.append(LocalAttributeDeclaration(self)) - elif component == 'attributeGroup': - if contents[indx].hasattr('ref'): - self.attr_content.append(AttributeGroupReference(self)) - else: - self.attr_content.append(AttributeGroupDefinition(self)) - elif component == 'anyAttribute': - self.attr_content.append(AttributeWildCard(self)) - else: - raise SchemaError, 'Unknown component (%s)' %(contents[indx].getTagName()) - self.attr_content[-1].fromDom(contents[indx]) - indx += 1 - - class Extension(_DerivationBase, - ExtensionMarker): - """ - parents: - complexContent - attributes: - id -- ID - base -- QName, required - - contents: - annotation?, (group | all | choice | sequence)?, - (attribute | attributeGroup)*, anyAttribute? - """ - pass - - class Restriction(_DerivationBase,\ - RestrictionMarker): - """ - parents: - complexContent - attributes: - id -- ID - base -- QName, required - - contents: - annotation?, (group | all | choice | sequence)?, - (attribute | attributeGroup)*, anyAttribute? - """ - pass - - - class SimpleContent(_DerivedType,\ - SimpleMarker): - """ - parents: - complexType - attributes: - id -- ID - - contents: - annotation?, (restriction | extension) - """ - attributes = {'id':None} - contents = {'xsd':['annotation', 'restriction', 'extension']} - - class Extension(XMLSchemaComponent,\ - ExtensionMarker): - """ - parents: - simpleContent - attributes: - id -- ID - base -- QName, required - - contents: - annotation?, (attribute | attributeGroup)*, anyAttribute? - """ - required = ['base'] - attributes = {'id':None, - 'base':None } - contents = {'xsd':['annotation', 'attribute', 'attributeGroup', - 'anyAttribute']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.attr_content = None - - def getAttributeContent(self): - return self.attr_content - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - - indx = 0 - num = len(contents) - component = SplitQName(contents[indx].getTagName())[1] - if component == 'annotation': - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - indx += 1 - component = SplitQName(contents[indx].getTagName())[1] - - content = [] - while indx < num: - component = SplitQName(contents[indx].getTagName())[1] - if component == 'attribute': - if contents[indx].hasattr('ref'): - content.append(AttributeReference(self)) - else: - content.append(LocalAttributeDeclaration(self)) - elif component == 'attributeGroup': - content.append(AttributeGroupReference(self)) - elif component == 'anyAttribute': - content.append(AttributeWildCard(self)) - else: - raise SchemaError, 'Unknown component (%s)'\ - %(contents[indx].getTagName()) - content[-1].fromDom(contents[indx]) - indx += 1 - self.attr_content = tuple(content) - - - class Restriction(XMLSchemaComponent,\ - RestrictionMarker): - """ - parents: - simpleContent - attributes: - id -- ID - base -- QName, required - - contents: - annotation?, simpleType?, (enumeration | length | - maxExclusive | maxInclusive | maxLength | minExclusive | - minInclusive | minLength | pattern | fractionDigits | - totalDigits | whiteSpace)*, (attribute | attributeGroup)*, - anyAttribute? - """ - required = ['base'] - attributes = {'id':None, - 'base':None } - contents = {'xsd':['annotation', 'simpleType', 'attribute',\ - 'attributeGroup', 'anyAttribute'] + RestrictionMarker.facets} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - self.attr_content = None - - def getAttributeContent(self): - return self.attr_content - - def fromDom(self, node): - self.content = [] - self.setAttributes(node) - contents = self.getContents(node) - - indx = 0 - num = len(contents) - component = SplitQName(contents[indx].getTagName())[1] - if component == 'annotation': - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - indx += 1 - component = SplitQName(contents[indx].getTagName())[1] - - content = [] - while indx < num: - component = SplitQName(contents[indx].getTagName())[1] - if component == 'attribute': - if contents[indx].hasattr('ref'): - content.append(AttributeReference(self)) - else: - content.append(LocalAttributeDeclaration(self)) - elif component == 'attributeGroup': - content.append(AttributeGroupReference(self)) - elif component == 'anyAttribute': - content.append(AttributeWildCard(self)) - elif component == 'simpleType': - self.content.append(LocalSimpleType(self)) - self.content[-1].fromDom(contents[indx]) - else: - raise SchemaError, 'Unknown component (%s)'\ - %(contents[indx].getTagName()) - content[-1].fromDom(contents[indx]) - indx += 1 - self.attr_content = tuple(content) - - -class LocalComplexType(ComplexType,\ - LocalMarker): - """ - parents: - element - attributes: - id -- ID - mixed -- boolean, false - - contents: - annotation?, (simpleContent | complexContent | - ((group | all | choice | sequence)?, (attribute | attributeGroup)*, anyAttribute?)) - """ - required = [] - attributes = {'id':None, - 'mixed':0} - - -class SimpleType(XMLSchemaComponent,\ - DefinitionMarker,\ - SimpleMarker): - """ - parents: - redefine, schema - attributes: - id -- ID - name -- NCName, required - final -- ('#all' | ('extension' | 'restriction' | 'list' | 'union')*), - schema.finalDefault - - contents: - annotation?, (restriction | list | union) - """ - required = ['name'] - attributes = {'id':None, - 'name':None, - 'final':lambda self: self._parent().getFinalDefault()} - contents = {'xsd':['annotation', 'restriction', 'list', 'union']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - for child in contents: - component = SplitQName(child.getTagName())[1] - if component == 'annotation': - self.annotation = Annotation(self) - self.annotation.fromDom(child) - continue - break - else: - return - if component == 'restriction': - self.content = self.__class__.Restriction(self) - elif component == 'list': - self.content = self.__class__.List(self) - elif component == 'union': - self.content = self.__class__.Union(self) - else: - raise SchemaError, 'Unknown component (%s)' %(component) - self.content.fromDom(child) - - class Restriction(XMLSchemaComponent,\ - RestrictionMarker): - """ - parents: - simpleType - attributes: - id -- ID - base -- QName, required or simpleType child - - contents: - annotation?, simpleType?, (enumeration | length | - maxExclusive | maxInclusive | maxLength | minExclusive | - minInclusive | minLength | pattern | fractionDigits | - totalDigits | whiteSpace)* - """ - attributes = {'id':None, - 'base':None } - contents = {'xsd':['annotation', 'simpleType']+RestrictionMarker.facets} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for indx in range(len(contents)): - component = SplitQName(contents[indx].getTagName())[1] - if (component == 'annotation') and (not indx): - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - continue - elif (component == 'simpleType') and (not indx or indx == 1): - content.append(AnonymousSimpleType(self)) - content[-1].fromDom(contents[indx]) - elif component in RestrictionMarker.facets: - #print_debug('%s class instance, skipping %s' %(self.__class__, component)) - pass - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - - class Union(XMLSchemaComponent): - """ - parents: - simpleType - attributes: - id -- ID - memberTypes -- list of QNames, required or simpleType child. - - contents: - annotation?, simpleType* - """ - attributes = {'id':None, - 'memberTypes':None } - contents = {'xsd':['annotation', 'simpleType']} - - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - content = [] - - for indx in range(len(contents)): - component = SplitQName(contents[indx].getTagName())[1] - if (component == 'annotation') and (not indx): - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - elif (component == 'simpleType'): - content.append(AnonymousSimpleType(self)) - content[-1].fromDom(contents[indx]) - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - self.content = tuple(content) - - class List(XMLSchemaComponent): - """ - parents: - simpleType - attributes: - id -- ID - itemType -- QName, required or simpleType child. - - contents: - annotation?, simpleType? - """ - attributes = {'id':None, - 'itemType':None } - contents = {'xsd':['annotation', 'simpleType']} - def __init__(self, parent): - XMLSchemaComponent.__init__(self, parent) - self.annotation = None - self.content = None - - def fromDom(self, node): - self.setAttributes(node) - contents = self.getContents(node) - self.content = [] - - for indx in range(len(contents)): - component = SplitQName(contents[indx].getTagName())[1] - if (component == 'annotation') and (not indx): - self.annotation = Annotation(self) - self.annotation.fromDom(contents[indx]) - elif (component == 'simpleType'): - self.content = AnonymousSimpleType(self) - self.content.fromDom(contents[indx]) - break - else: - raise SchemaError, 'Unknown component (%s)' %(i.getTagName()) - - -class AnonymousSimpleType(SimpleType,\ - SimpleMarker): - """ - parents: - attribute, element, list, restriction, union - attributes: - id -- ID - - contents: - annotation?, (restriction | list | union) - """ - required = [] - attributes = {'id':None} - - -class Redefine: - """ - parents: - attributes: - - contents: - """ - pass - -########################### -########################### - - -if sys.version_info[:2] >= (2, 2): - tupleClass = tuple -else: - import UserTuple - tupleClass = UserTuple.UserTuple - -class TypeDescriptionComponent(tupleClass): - """Tuple of length 2, consisting of - a namespace and unprefixed name. - """ - def __init__(self, args): - """args -- (namespace, name) - Remove the name's prefix, irrelevant. - """ - if len(args) != 2: - raise TypeError, 'expecting tuple (namespace, name), got %s' %args - elif args[1].find(':') >= 0: - args = (args[0], SplitQName(args[1])[1]) - tuple.__init__(self, args) - return - - def getTargetNamespace(self): - return self[0] - - def getName(self): - return self[1] - - -''' -import string, types, base64, re -from Utility import DOM, Collection -from StringIO import StringIO - - -class SchemaReader: - """A SchemaReader creates XMLSchema objects from urls and xml data.""" - - def loadFromStream(self, file): - """Return an XMLSchema instance loaded from a file object.""" - document = DOM.loadDocument(file) - schema = XMLSchema() - schema.load(document) - return schema - - def loadFromString(self, data): - """Return an XMLSchema instance loaded from an xml string.""" - return self.loadFromStream(StringIO(data)) - - def loadFromURL(self, url): - """Return an XMLSchema instance loaded from the given url.""" - document = DOM.loadFromURL(url) - schema = XMLSchema() - schema.location = url - schema.load(document) - return schema - - def loadFromFile(self, filename): - """Return an XMLSchema instance loaded from the given file.""" - file = open(filename, 'rb') - try: schema = self.loadFromStream(file) - finally: file.close() - return schema - -class SchemaError(Exception): - pass - -class XMLSchema: - # This is temporary, for the benefit of WSDL until the real thing works. - def __init__(self, element): - self.targetNamespace = DOM.getAttr(element, 'targetNamespace') - self.element = element - -class realXMLSchema: - """A schema is a collection of schema components derived from one - or more schema documents, that is, one or more element - information items. It represents the abstract notion of a schema - rather than a single schema document (or other representation).""" - def __init__(self): - self.simpleTypes = Collection(self) - self.complexTypes = Collection(self) - self.attributes = Collection(self) - self.elements = Collection(self) - self.attrGroups = Collection(self) - self.idConstraints=None - self.modelGroups = None - self.notations = None - self.extensions = [] - - targetNamespace = None - attributeFormDefault = 'unqualified' - elementFormDefault = 'unqualified' - blockDefault = None - finalDefault = None - location = None - version = None - id = None - - def load(self, document): - if document.nodeType == document.DOCUMENT_NODE: - schema = DOM.getElement(document, 'schema', None, None) - else: - schema = document - if schema is None: - raise SchemaError('Missing element.') - - self.namespace = namespace = schema.namespaceURI - if not namespace in DOM.NS_XSD_ALL: - raise SchemaError( - 'Unknown XML schema namespace: %s.' % self.namespace - ) - - for attrname in ( - 'targetNamespace', 'attributeFormDefault', 'elementFormDefault', - 'blockDefault', 'finalDefault', 'version', 'id' - ): - value = DOM.getAttr(schema, attrname, None, None) - if value is not None: - setattr(self, attrname, value) - - - # Resolve imports and includes here? -## imported = {} -## while 1: -## imports = [] -## for element in DOM.getElements(definitions, 'import', NS_WSDL): -## location = DOM.getAttr(element, 'location') -## if not imported.has_key(location): -## imports.append(element) -## if not imports: -## break -## for element in imports: -## self._import(document, element) -## imported[location] = 1 - - for element in DOM.getElements(schema, None, None): - localName = element.localName - - if not DOM.nsUriMatch(element.namespaceURI, namespace): - self.extensions.append(element) - continue - - elif localName == 'message': - name = DOM.getAttr(element, 'name') - docs = GetDocumentation(element) - message = self.addMessage(name, docs) - parts = DOM.getElements(element, 'part', NS_WSDL) - message.load(parts) - continue - - def _import(self, document, element): - namespace = DOM.getAttr(element, 'namespace', default=None) - location = DOM.getAttr(element, 'location', default=None) - if namespace is None or location is None: - raise WSDLError( - 'Invalid import element (missing namespace or location).' - ) - - # Sort-of support relative locations to simplify unit testing. The - # WSDL specification actually doesn't allow relative URLs, so its - # ok that this only works with urls relative to the initial document. - location = urllib.basejoin(self.location, location) - - obimport = self.addImport(namespace, location) - obimport._loaded = 1 - - importdoc = DOM.loadFromURL(location) - try: - if location.find('#') > -1: - idref = location.split('#')[-1] - imported = DOM.getElementById(importdoc, idref) - else: - imported = importdoc.documentElement - if imported is None: - raise WSDLError( - 'Import target element not found for: %s' % location - ) - - imported_tns = DOM.getAttr(imported, 'targetNamespace') - importer_tns = namespace - - if imported_tns != importer_tns: - return - - if imported.localName == 'definitions': - imported_nodes = imported.childNodes - else: - imported_nodes = [imported] - parent = element.parentNode - for node in imported_nodes: - if node.nodeType != node.ELEMENT_NODE: - continue - child = DOM.importNode(document, node, 1) - parent.appendChild(child) - child.setAttribute('targetNamespace', importer_tns) - attrsNS = imported._attrsNS - for attrkey in attrsNS.keys(): - if attrkey[0] == DOM.NS_XMLNS: - attr = attrsNS[attrkey].cloneNode(1) - child.setAttributeNode(attr) - finally: - importdoc.unlink() - - -class Element: - """Common base class for element representation classes.""" - def __init__(self, name=None, documentation=''): - self.name = name - self.documentation = documentation - self.extensions = [] - - def addExtension(self, item): - self.extensions.append(item) - - -class SimpleTypeDefinition: - """Represents an xml schema simple type definition.""" - -class ComplexTypeDefinition: - """Represents an xml schema complex type definition.""" - -class AttributeDeclaration: - """Represents an xml schema attribute declaration.""" - -class ElementDeclaration: - """Represents an xml schema element declaration.""" - def __init__(self, name, type=None, targetNamespace=None): - self.name = name - - targetNamespace = None - annotation = None - nillable = 0 - abstract = 0 - default = None - fixed = None - scope = 'global' - type = None - form = 0 - # Things we will not worry about for now. - id_constraint_defs = None - sub_group_exclude = None - sub_group_affils = None - disallowed_subs = None - - - - - - - - - - -class AttributeGroupDefinition: - """Represents an xml schema attribute group definition.""" - -class IdentityConstraintDefinition: - """Represents an xml schema identity constraint definition.""" - -class ModelGroupDefinition: - """Represents an xml schema model group definition.""" - -class NotationDeclaration: - """Represents an xml schema notation declaration.""" - -class Annotation: - """Represents an xml schema annotation.""" - -class ModelGroup: - """Represents an xml schema model group.""" - -class Particle: - """Represents an xml schema particle.""" - -class WildCard: - """Represents an xml schema wildcard.""" - -class AttributeUse: - """Represents an xml schema attribute use.""" - - -class ElementComponent: - namespace = '' - name = '' - type = None - form = 'qualified | unqualified' - scope = 'global or complex def' - constraint = ('value', 'default | fixed') - nillable = 0 - id_constraint_defs = None - sub_group_affil = None - sub_group_exclusions = None - disallowed_subs = 'substitution, extension, restriction' - abstract = 0 - minOccurs = 1 - maxOccurs = 1 - ref = '' - -class AttributeThing: - name = '' - namespace = '' - typeName = '' - typeUri = '' - scope = 'global | local to complex def' - constraint = ('value:default', 'value:fixed') - use = 'optional | prohibited | required' - -class ElementDataType: - namespace = '' - name = '' - element_form = 'qualified | unqualified' - attr_form = None - type_name = '' - type_uri = '' - def __init__(self, name, namespace, type_name, type_uri): - self.namespace = namespace - self.name = name - # type may be anonymous... - self.type_name = type_name - self.type_uri = type_uri - - def checkValue(self, value, context): - # Delegate value checking to the type of the element. - typeref = (self.type_uri, self.type_name) - handler = context.serializer.getType(typeref) - return handler.checkValue(value, context) - - def serialize(self, name, namespace, value, context, **kwargs): - if context.check_values: - self.checkValue(value, context) - # Delegate serialization to the type of the element. - typeref = (self.type_uri, self.type_name) - handler = context.serializer.getType(typeref) - return handler.serialize(self.name, self.namespace, value, context) - - def deserialize(self, element, context): - if element_is_null(element, context): - return None - # Delegate deserialization to the type of the element. - typeref = (self.type_uri, self.type_name) - handler = context.serializer.getType(typeref) - return handler.deserialize(element, context) - - - -def parse_schema(data): - targetNS = '' - attributeFormDefault = 0 - elementFormDefault = 0 - blockDefault = '' - finalDefault = '' - language = None - version = None - id = '' -''' diff --git a/SOAPpy/wstools/XMLname.py b/SOAPpy/wstools/XMLname.py deleted file mode 100755 index 532f02b..0000000 --- a/SOAPpy/wstools/XMLname.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Translate strings to and from SOAP 1.2 XML name encoding - -Implements rules for mapping application defined name to XML names -specified by the w3 SOAP working group for SOAP version 1.2 in -Appendix A of "SOAP Version 1.2 Part 2: Adjuncts", W3C Working Draft -17, December 2001, - -Also see . - -Author: Gregory R. Warnes -Date:: 2002-04-25 -Version 0.9.0 - -""" - -ident = "$Id: XMLname.py,v 1.2 2003/05/20 21:10:14 warnes Exp $" - -from re import * - - -def _NCNameChar(x): - return x.isalpha() or x.isdigit() or x=="." or x=='-' or x=="_" - - -def _NCNameStartChar(x): - return x.isalpha() or x=="_" - - -def _toUnicodeHex(x): - hexval = hex(ord(x[0]))[2:] - hexlen = len(hexval) - # Make hexval have either 4 or 8 digits by prepending 0's - if (hexlen==1): hexval = "000" + hexval - elif (hexlen==2): hexval = "00" + hexval - elif (hexlen==3): hexval = "0" + hexval - elif (hexlen==4): hexval = "" + hexval - elif (hexlen==5): hexval = "000" + hexval - elif (hexlen==6): hexval = "00" + hexval - elif (hexlen==7): hexval = "0" + hexval - elif (hexlen==8): hexval = "" + hexval - else: raise Exception, "Illegal Value returned from hex(ord(x))" - - return "_x"+ hexval + "_" - - -def _fromUnicodeHex(x): - return eval( r'u"\u'+x[2:-1]+'"' ) - - -def toXMLname(string): - """Convert string to a XML name.""" - if string.find(':') != -1 : - (prefix, localname) = string.split(':',1) - else: - prefix = None - localname = string - - T = unicode(localname) - - N = len(localname) - X = []; - for i in range(N) : - if i< N-1 and T[i]==u'_' and T[i+1]==u'x': - X.append(u'_x005F_') - elif i==0 and N >= 3 and \ - ( T[0]==u'x' or T[0]==u'X' ) and \ - ( T[1]==u'm' or T[1]==u'M' ) and \ - ( T[2]==u'l' or T[2]==u'L' ): - X.append(u'_xFFFF_' + T[0]) - elif (not _NCNameChar(T[i])) or (i==0 and not _NCNameStartChar(T[i])): - X.append(_toUnicodeHex(T[i])) - else: - X.append(T[i]) - - return u''.join(X) - - -def fromXMLname(string): - """Convert XML name to unicode string.""" - - retval = sub(r'_xFFFF_','', string ) - - def fun( matchobj ): - return _fromUnicodeHex( matchobj.group(0) ) - - retval = sub(r'_x[0-9A-Za-z]+_', fun, retval ) - - return retval diff --git a/SOAPpy/wstools/__init__.py b/SOAPpy/wstools/__init__.py deleted file mode 100644 index 12a584f..0000000 --- a/SOAPpy/wstools/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -#! /usr/bin/env python -"""WSDL parsing services package for Web Services for Python.""" - -ident = "$Id: __init__.py,v 1.8 2004/09/09 23:32:09 boverhof Exp $" - -import WSDLTools -import XMLname -from logging import getLogger as _getLogger -import logging.config as _config - -LOGGING = 'logging.txt' -DEBUG = True - -# -# If LOGGING configuration file is not found, turn off logging -# and use _noLogger class because logging module's performance -# is terrible. -# - -try: - _config.fileConfig(LOGGING) -except: - DEBUG = False - - -class Base: - def __init__(self, module=__name__): - self.logger = _noLogger() - if DEBUG is True: - self.logger = _getLogger('%s-%s(%x)' %(module, self.__class__, id(self))) - -class _noLogger: - def __init__(self, *args): pass - def warning(self, *args): pass - def debug(self, *args): pass - def error(self, *args): pass diff --git a/SOAPpy/wstools/test/__init__.py b/SOAPpy/wstools/test/__init__.py deleted file mode 100644 index d5a5350..0000000 --- a/SOAPpy/wstools/test/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#! /usr/bin/env python -"""wstools.WSDLTools.WSDLReader tests directory.""" - -import utils - diff --git a/SOAPpy/wstools/test/test_t1.py b/SOAPpy/wstools/test/test_t1.py deleted file mode 100644 index 5c33899..0000000 --- a/SOAPpy/wstools/test/test_t1.py +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### -import unittest -import test_wsdl -import utils - -def makeTestSuite(): - suite = unittest.TestSuite() - suite.addTest(test_wsdl.makeTestSuite("services_by_file")) - return suite - -def main(): - loader = utils.MatchTestLoader(True, None, "makeTestSuite") - unittest.main(defaultTest="makeTestSuite", testLoader=loader) - -if __name__ == "__main__" : main() - - diff --git a/SOAPpy/wstools/test/test_wsdl.py b/SOAPpy/wstools/test/test_wsdl.py deleted file mode 100644 index 90b0c4d..0000000 --- a/SOAPpy/wstools/test/test_wsdl.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python - -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### - -import sys, unittest -import ConfigParser -from ZSI.wstools.Utility import DOM -from ZSI.wstools.WSDLTools import WSDLReader -from ZSI.wstools.TimeoutSocket import TimeoutError - -class WSDLToolsTestCase(unittest.TestCase): - - def __init__(self, methodName='runTest'): - unittest.TestCase.__init__(self, methodName) - - def setUp(self): - self.path = nameGenerator.next() - print self.path - sys.stdout.flush() - - def __str__(self): - teststr = unittest.TestCase.__str__(self) - if hasattr(self, "path"): - return "%s: %s" % (teststr, self.path ) - else: - return "%s" % (teststr) - - def checkWSDLCollection(self, tag_name, component, key='name'): - if self.wsdl is None: - return - definition = self.wsdl.document.documentElement - version = DOM.WSDLUriToVersion(definition.namespaceURI) - nspname = DOM.GetWSDLUri(version) - for node in DOM.getElements(definition, tag_name, nspname): - name = DOM.getAttr(node, key) - comp = component[name] - self.failUnlessEqual(eval('comp.%s' %key), name) - - def checkXSDCollection(self, tag_name, component, node, key='name'): - for cnode in DOM.getElements(node, tag_name): - name = DOM.getAttr(cnode, key) - component[name] - - def test_all(self): - try: - if self.path[:7] == 'http://': - self.wsdl = WSDLReader().loadFromURL(self.path) - else: - self.wsdl = WSDLReader().loadFromFile(self.path) - - except TimeoutError: - print "connection timed out" - sys.stdout.flush() - return - except: - self.path = self.path + ": load failed, unable to start" - raise - - try: - self.checkWSDLCollection('service', self.wsdl.services) - except: - self.path = self.path + ": wsdl.services" - raise - - try: - self.checkWSDLCollection('message', self.wsdl.messages) - except: - self.path = self.path + ": wsdl.messages" - raise - - try: - self.checkWSDLCollection('portType', self.wsdl.portTypes) - except: - self.path = self.path + ": wsdl.portTypes" - raise - - try: - self.checkWSDLCollection('binding', self.wsdl.bindings) - except: - self.path = self.path + ": wsdl.bindings" - raise - - try: - self.checkWSDLCollection('import', self.wsdl.imports, key='namespace') - except: - self.path = self.path + ": wsdl.imports" - raise - - try: - for key in self.wsdl.types.keys(): - schema = self.wsdl.types[key] - self.failUnlessEqual(key, schema.getTargetNamespace()) - - definition = self.wsdl.document.documentElement - version = DOM.WSDLUriToVersion(definition.namespaceURI) - nspname = DOM.GetWSDLUri(version) - for node in DOM.getElements(definition, 'types', nspname): - for snode in DOM.getElements(node, 'schema'): - tns = DOM.findTargetNS(snode) - schema = self.wsdl.types[tns] - self.schemaAttributesDeclarations(schema, snode) - self.schemaAttributeGroupDeclarations(schema, snode) - self.schemaElementDeclarations(schema, snode) - self.schemaTypeDefinitions(schema, snode) - except: - self.path = self.path + ": wsdl.types" - raise - - if self.wsdl.extensions: - print 'No check for WSDLTools(%s) Extensions:' %(self.wsdl.name) - for ext in self.wsdl.extensions: print '\t', ext - - def schemaAttributesDeclarations(self, schema, node): - self.checkXSDCollection('attribute', schema.attr_decl, node) - - def schemaAttributeGroupDeclarations(self, schema, node): - self.checkXSDCollection('group', schema.attr_groups, node) - - def schemaElementDeclarations(self, schema, node): - self.checkXSDCollection('element', schema.elements, node) - - def schemaTypeDefinitions(self, schema, node): - self.checkXSDCollection('complexType', schema.types, node) - self.checkXSDCollection('simpleType', schema.types, node) - - -def setUpOptions(section): - cp = ConfigParser.ConfigParser() - cp.read('config.txt') - if not cp.sections(): - print 'fatal error: configuration file config.txt not present' - sys.exit(0) - if not cp.has_section(section): - print '%s section not present in configuration file, exiting' % section - sys.exit(0) - return cp, len(cp.options(section)) - -def getOption(cp, section): - for name, value in cp.items(section): - yield value - -def makeTestSuite(section='services_by_file'): - global nameGenerator - - cp, numTests = setUpOptions(section) - nameGenerator = getOption(cp, section) - suite = unittest.TestSuite() - for i in range(0, numTests): - suite.addTest(unittest.makeSuite(WSDLToolsTestCase, 'test_')) - return suite - - -def main(): - unittest.main(defaultTest="makeTestSuite") - - -if __name__ == "__main__" : main() diff --git a/SOAPpy/wstools/test/test_wstools.py b/SOAPpy/wstools/test/test_wstools.py deleted file mode 100644 index 0e0f958..0000000 --- a/SOAPpy/wstools/test/test_wstools.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### - -import unittest, tarfile, os, ConfigParser -import test_wsdl - - -SECTION='files' -CONFIG_FILE = 'config.txt' - -def extractFiles(section, option): - config = ConfigParser.ConfigParser() - config.read(CONFIG_FILE) - archives = config.get(section, option) - archives = eval(archives) - for file in archives: - tar = tarfile.open(file) - if not os.access(tar.membernames[0], os.R_OK): - for i in tar.getnames(): - tar.extract(i) - -def makeTestSuite(): - suite = unittest.TestSuite() - suite.addTest(test_wsdl.makeTestSuite("services_by_file")) - return suite - -def main(): - extractFiles(SECTION, 'archives') - unittest.main(defaultTest="makeTestSuite") - -if __name__ == "__main__" : main() - - diff --git a/SOAPpy/wstools/test/test_wstools_net.py b/SOAPpy/wstools/test/test_wstools_net.py deleted file mode 100644 index 880cff3..0000000 --- a/SOAPpy/wstools/test/test_wstools_net.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python - -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### -import unittest -import test_wsdl - -def makeTestSuite(): - suite = unittest.TestSuite() - suite.addTest(test_wsdl.makeTestSuite("services_by_http")) - return suite - -def main(): - unittest.main(defaultTest="makeTestSuite") - -if __name__ == "__main__" : main() - - From 6ab094a4209645f0a45ea7f8bd165f297c8fd209 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 23:56:23 -0800 Subject: [PATCH 146/179] update to use soap_lite from coherence, this makes the PS3 work... This includes other fixes like using methodResponse instead of other crap.. Thing brings it more inline w/ the UPnP spec... We now include the namespace bit, which is apparently what the PS3 needs... note that the PS3 works in the readme w/ restrictions... This removes the dependance on SOAPpy, and alsp fpconst... [git-p4: depot-paths = "//depot/": change = 1105] --- ContentDirectory.py | 13 ++-- FSStorage.py | 14 ++++- README | 22 ++++++- et.py | 145 ++++++++++++++++++++++++++++++++++++++++++++ upnp.py | 28 +++++---- 5 files changed, 198 insertions(+), 24 deletions(-) create mode 100644 et.py diff --git a/ContentDirectory.py b/ContentDirectory.py index 9ae5734..d68757f 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney __version__ = '$Change$' # $Id$ @@ -83,6 +83,7 @@ def doRecallgen(defer, fun, *args, **kwargs): class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" + namespace = 'urn:schemas-upnp-org:service:ContentDirectory:1' updateID = property(lambda x: x['0'].updateID) urlbase = property(lambda x: x._urlbase) @@ -160,20 +161,20 @@ class ContentDirectoryControl(UPnPPublisher, dict): """Required: Return the searching capabilities supported by the device.""" log.msg('GetSearchCapabilities()') - return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} + return { 'SearchCaps': '' } def soap_GetSortCapabilities(self, *args, **kwargs): """Required: Return the CSV list of meta-data tags that can be used in sortCriteria.""" log.msg('GetSortCapabilities()') - return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} + return { 'SortCaps': '' } def soap_GetSystemUpdateID(self, *args, **kwargs): """Required: Return the current value of state variable SystemUpdateID.""" log.msg('GetSystemUpdateID()') - return { 'SystemUpdateIdResponse': { 'Id': self.updateID }} + return { 'Id': self.updateID } BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') @@ -205,7 +206,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): RequestedCount = int(RequestedCount) didl = DIDLElement() - result = {} # return error code if we don't exist anymore if ObjectID not in self: @@ -231,14 +231,13 @@ class ContentDirectoryControl(UPnPPublisher, dict): r = { 'Result': didl.toString(), 'TotalMatches': total, 'NumberReturned': didl.numItems(), } - result = { 'BrowseResponse': r } if hasattr(self[ObjectID], 'updateID'): r['UpdateID'] = self[ObjectID].updateID else: r['UpdateID'] = self.updateID - return result + return r # Optional actions diff --git a/FSStorage.py b/FSStorage.py index 55049fb..ca4cb6c 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -4,7 +4,7 @@ __version__ = '$Change$' # $Id$ -ffmpeg_path = '/Users/jgurney/src/ffmpeg/ffmpeg' +ffmpeg_path = '/usr/local/bin/ffmpeg' import FileDIDL import errno @@ -143,6 +143,7 @@ class DynamTransfer(protocol.ProcessProtocol): vcodec = 'xvid' mimetype = { 'xvid': 'video/avi', 'mpeg2': 'video/mpeg', } + mimetype = { 'xvid': 'video/x-msvideo', 'mpeg2': 'video/mpeg', } request.setHeader('content-type', mimetype[vcodec]) if request.method == 'HEAD': return '' @@ -158,7 +159,7 @@ class DynamTransfer(protocol.ProcessProtocol): args = [ 'ffmpeg', '-i', path, '-b', '8000', #'-sc_threshold', '500000', '-b_strategy', '1', '-max_b_frames', '6', ] + optdict[vcodec] + audio + [ '-', ] - #log.msg(*args) + #log.msg(*[`i` for i in args]) self.proc = process.Process(reactor, ffmpeg_path, args, None, None, self) self.proc.closeStdin() @@ -174,6 +175,13 @@ class DynamicTrans(resource.Resource): self.notrans = notrans def render(self, request): + #if request.getHeader('getcontentfeatures.dlna.org'): + # request.setHeader('contentFeatures.dlna.org', 'DLNA.ORG_OP=01;DLNA.ORG_CI=0') + # # we only want the headers + # self.notrans.render(request) + # request.unregisterProducer() + # return '' + if request.postpath: # Translation request return DynamTransfer(self.path, request.postpath, request).render() @@ -197,7 +205,7 @@ class FSItem(FSObject, Item): self.res.size = os.path.getsize(self.FSpath) self.res = [ self.res ] self.res.append(Resource(self.url + '/mpeg2', 'http-get:*:%s:*' % 'video/mpeg')) - self.res.append(Resource(self.url + '/xvid', 'http-get:*:%s:*' % 'video/avi')) + self.res.append(Resource(self.url + '/xvid', 'http-get:*:%s:*' % 'video/x-msvideo')) Item.doUpdate(self) def ignoreFiles(path, fobj): diff --git a/README b/README index 1555b9f..c1a977d 100644 --- a/README +++ b/README @@ -12,6 +12,7 @@ it. Tested devices and/or programs: Intel's Media Control Point and Media Renderer D-Link DSM-520 + Sony PlayStation 3 The Intel tools are good for testing and are available at: http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm @@ -24,8 +25,12 @@ The following packages are required to run the media server: * Twisted (only core and web necessary, tested w/ 2.1.0 and Web 0.5.0) * ElementTree - * SOAPpy available from Python Web Services - * fpconst (required by SOAPpy) + +NOTE: SOAPpy is no longer required as I have included soap_lite from the +Coherence project: https://coherence.beebits.net/ . + +Thanks to Coherence for soap_lite that solved the issues w/ PS3 not seeing +the media server. For more information, check out the software page at: http://resnet.uoregon.edu/~gurney_j/jmpc/pymeds.html @@ -49,10 +54,21 @@ Ideas for future improvements: childCount isn't a required attribute. Autodetect IP address. Support sorting by other attributes. - Finish support for playing DVD stream. + Finish support for playing DVD's. v0.x: Support multiple SSDP servers on the same box. + Fix SSDP to set the max-age to 7 days. We now retransmit replies + and reannounce ourselves randomly before our original announcement + expires. This fixes the Server Disconnects I was seeing on the + DSM-520! + Change how the mpegtsmod handles multi-stream TS's. Instead of + calling tssel.py, we fixup the PAT to only contain the channel + we want. This does mean we send more data than we need, but + means that we can make the stream seekable. + Now works w/ PS3. The PS3 still has issues as it has limited + codec support (D-Link is better) and does not support AC3 audio + in MPEG-TS streams yet (not even downsampling to stereo PCM). v0.3: Include some patches for twisted in the distro, in the directory diff --git a/et.py b/et.py new file mode 100644 index 0000000..4bdf77e --- /dev/null +++ b/et.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- + +# Licensed under the MIT license +# http://opensource.org/licenses/mit-license.php + +# Copyright 2006,2007 Frank Scholz +# +# a little helper to get the proper ElementTree package + +import re + +try: + import cElementTree as ET + import elementtree + #print "we are on CET" +except ImportError: + try: + from elementtree import ElementTree as ET + import elementtree + #print "simply using ET" + except ImportError: + """ this seems to be necessary with the python2.5 on the Maemo platform """ + try: + from xml.etree import cElementTree as ET + from xml import etree as elementtree + except ImportError: + try: + from xml.etree import ElementTree as ET + from xml import etree as elementtree + except ImportError: + #print "no ElementTree module found, critical error" + raise ImportError, "no ElementTree module found, critical error" + +utf8_escape = re.compile(eval(r'u"[&<>\"]+"')) +escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +def encode_entity(text, pattern=escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m, map=elementtree.ElementTree._escape_map): + out = [] + append = out.append + for char in m.group(): + t = map.get(char) + if t is None: + t = "&#%d;" % ord(char) + append(t) + return ''.join(out) + try: + return elementtree.ElementTree._encode(pattern.sub(escape_entities, text), 'ascii') + except TypeError: + elementtree.ElementTree._raise_serialization_error(text) + +def new_encode_entity(text, pattern=utf8_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m, map=elementtree.ElementTree._escape_map): + out = [] + append = out.append + for char in m.group(): + t = map.get(char) + if t is None: + t = "&#%d;" % ord(char) + append(t) + if type(text) == unicode: + return ''.join(out) + else: + return u''.encode('utf-8').join(out) + try: + if type(text) == unicode: + return elementtree.ElementTree._encode(escape.sub(escape_entities, text), 'ascii') + else: + return elementtree.ElementTree._encode(utf8_escape.sub(escape_entities, text.decode('utf-8')), 'utf-8') + except TypeError: + + elementtree.ElementTree._raise_serialization_error(text) + +elementtree.ElementTree._encode_entity = new_encode_entity + +# it seems there are some ElementTree libs out there +# which have the alias XMLParser and some that haven't. +# +# So we just use the XMLTreeBuilder method for now +# if XMLParser isn't available. + +if not hasattr(ET, 'XMLParser'): + def XMLParser(encoding='utf-8'): + return ET.XMLTreeBuilder() + + ET.XMLParser = XMLParser + +def namespace_map_update(namespaces): + #try: + # from xml.etree import ElementTree + #except ImportError: + # from elementtree import ElementTree + + elementtree.ElementTree._namespace_map.update(namespaces) + +class ElementInterface(elementtree.ElementTree._ElementInterface): + """ helper class """ + +def indent(elem, level=0): + """ generate pretty looking XML, based upon: + http://effbot.org/zone/element-lib.htm#prettyprint + """ + i = "\n" + level*" " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + for elem in elem: + indent(elem, level+1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + +def parse_xml(data, encoding="utf-8"): + p = ET.XMLParser(encoding=encoding) + + # my version of twisted.web returns page_infos as a dictionary in + # the second item of the data list + if isinstance(data, (list, tuple)): + data, _ = data + + try: + data = data.encode(encoding) + except UnicodeDecodeError: + pass + except Exception, error: + print "parse_xml encode Exception", error + import traceback + traceback.print_exc() + + # Guess from who we're getting this? + data = data.replace('\x00','') + try: + p.feed(data) + except Exception, error: + print "parse_xml feed Exception", error + print error, repr(data) + return None + else: + return ET.ElementTree(p.close()) diff --git a/upnp.py b/upnp.py index a0a406b..9581232 100644 --- a/upnp.py +++ b/upnp.py @@ -2,7 +2,7 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney __version__ = '$Change$' # $Id$ @@ -10,7 +10,9 @@ __version__ = '$Change$' from twisted.web import soap from twisted.python import log -import SOAPpy +from types import * + +import soap_lite class errorCode(Exception): def __init__(self, status): @@ -20,20 +22,24 @@ class UPnPPublisher(soap.SOAPPublisher): """UPnP requires OUT parameters to be returned in a slightly different way than the SOAPPublisher class does.""" + namespace = None + def _gotResult(self, result, request, methodName): - response = SOAPpy.buildSOAP(kw=result, encoding=self.encoding) + ns = self.namespace + if ns: + meth = "{%s}%s" % (ns, methodName) + else: + meth = methodName + response = soap_lite.build_soap_call(meth, result, + is_response=True, encoding=None) self._sendResponse(request, response) def _gotError(self, failure, request, methodName): e = failure.value status = 500 - if isinstance(e, SOAPpy.faultType): - fault = e + if isinstance(e, errorCode): + status = e.status else: - if isinstance(e, errorCode): - status = e.status - else: - failure.printTraceback(file = log.logfile) - fault = SOAPpy.faultType("%s:Server" % SOAPpy.NS.ENV_T, "Method %s failed." % methodName) - response = SOAPpy.buildSOAP(fault, encoding=self.encoding) + failure.printTraceback(file = log.logfile) + response = soap_lite.build_soap_error(status) self._sendResponse(request, response, status=status) From 3f851e335f0fe9f7c19fc032ea31afa5ea832899 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 23 Nov 2007 23:56:42 -0800 Subject: [PATCH 147/179] add m2ts as a supported type.. [git-p4: depot-paths = "//depot/": change = 1106] --- pymediaserv | 1 + 1 file changed, 1 insertion(+) diff --git a/pymediaserv b/pymediaserv index ca41ed2..d38d405 100755 --- a/pymediaserv +++ b/pymediaserv @@ -123,6 +123,7 @@ medianode.contentTypes.update( { #'.ts': 'video/mp2t', '.ts': 'video/mpeg', # we may want this instead of mp2t '.m2t': 'video/mpeg', + '.m2ts': 'video/mpeg', '.mp4': 'video/mp4', #'.mp4': 'video/mpeg', '.dat': 'video/mpeg', # VCD tracks From 30ec5e78c23d93dff9fcdac8aabea1e88d506ec9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 24 Nov 2007 00:36:00 -0800 Subject: [PATCH 148/179] update the root (aka SystemUpdateId) when we update ours... The PS3 asks for this a lot, so I figure we should update it now.. [git-p4: depot-paths = "//depot/": change = 1107] --- DIDLLite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DIDLLite.py b/DIDLLite.py index ea11b40..0bb42f3 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -275,6 +275,7 @@ class Container(Object, list): def doUpdate(self): self.updateID = (self.updateID + 1) % (1l << 32) + self.cd['0'].doUpdate() def toElement(self): From d5b9157a6aae09cc8eb46e702e25e92410bc4e5d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 24 Nov 2007 00:36:29 -0800 Subject: [PATCH 149/179] PS3 asks for this a lot, be a bit quieter... [git-p4: depot-paths = "//depot/": change = 1108] --- ContentDirectory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index d68757f..6bb96c5 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -173,7 +173,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): def soap_GetSystemUpdateID(self, *args, **kwargs): """Required: Return the current value of state variable SystemUpdateID.""" - log.msg('GetSystemUpdateID()') return { 'Id': self.updateID } BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') From c018228b7d08f6465838e88ff1018575f154af15 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 24 Nov 2007 01:26:27 -0800 Subject: [PATCH 150/179] fix an error... add pcm decoding for PS3 sometime in the future... [git-p4: depot-paths = "//depot/": change = 1109] --- shoutcast.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shoutcast.py b/shoutcast.py index 1e92f92..3388408 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -139,7 +139,8 @@ class ShoutTransfer(shoutcast.ShoutcastClient): self.passback = None def gotMP3Data(self, data): - self.request.write(data) + if self.request is not None: + self.request.write(data) def gotMetaData(self, data): log.msg("meta:", `data`) @@ -212,6 +213,7 @@ class ShoutProxy(resource.Resource): i += 1 # stupid one based arrays self.urls.append(pls.get(PLSsection, 'File%d' % i)) + #log.msg('pls urls:', self.urls) self.urlpos = random.randrange(len(self.urls)) except: self.dump_exc() @@ -279,6 +281,8 @@ class ShoutStation(AudioItem): self.url = '%s/%s' % (self.cd.urlbase, self.id) self.res = Resource(self.url, 'http-get:*:%s:*' % \ self.station['MimeType'].encode('ascii')) + #self.res = Resource(self.url + '/pcm', 'http-get:*:%s:*' % \ + # 'audio/x-wav') self.bitrate = self.station['Bitrate'] * 128 # 1024k / 8bit class ShoutGenre(MusicGenre): From ca4a55615d5eebbe2bbfade43ec8ea9b7ca90640 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 24 Nov 2007 01:28:07 -0800 Subject: [PATCH 151/179] fix transcoding to mpeg2... Mpeg-2 can't store mp3 as audio, so use mp2 for audio... bump up the bit rate a bit too... Looks like the PS3 stores all the data before playing... Need to add support for caching the file to disk while it's going... Looks like a copy on the PS3 would work, just takes a while on the slow box I'm using.. [git-p4: depot-paths = "//depot/": change = 1110] --- FSStorage.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index ca4cb6c..eb13ba8 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -148,17 +148,18 @@ class DynamTransfer(protocol.ProcessProtocol): if request.method == 'HEAD': return '' + audiomp3 = [ '-acodec', 'mp3', '-ab', '192', ] + audiomp2 = [ '-acodec', 'mp2', '-ab', '256', ] optdict = { 'xvid': [ '-vcodec', 'xvid', #'-mv4', '-gmc', '-g', '240', - '-f', 'avi', ], + '-f', 'avi', ] + audiomp3, 'mpeg2': [ '-vcodec', 'mpeg2video', #'-g', '60', - '-f', 'mpeg', ], + '-f', 'mpeg', ] + audiomp2, } - audio = [ '-acodec', 'mp3', '-ab', '192', ] - args = [ 'ffmpeg', '-i', path, '-b', '8000', + args = [ 'ffmpeg', '-i', path, '-b', '4000', #'-sc_threshold', '500000', '-b_strategy', '1', '-max_b_frames', '6', - ] + optdict[vcodec] + audio + [ '-', ] + ] + optdict[vcodec] + [ '-', ] #log.msg(*[`i` for i in args]) self.proc = process.Process(reactor, ffmpeg_path, args, None, None, self) From 51567bb3490d2469b58367fad2c14ec78a452bee Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 24 Nov 2007 01:28:37 -0800 Subject: [PATCH 152/179] add a couple more ideas.. [git-p4: depot-paths = "//depot/": change = 1111] --- README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README b/README index c1a977d..34eee77 100644 --- a/README +++ b/README @@ -55,6 +55,9 @@ Ideas for future improvements: Autodetect IP address. Support sorting by other attributes. Finish support for playing DVD's. + Support custom icon like MediaTomb does. + Support a generic layer for transcoding, and supporting detection + of types for devices to only present the optimal type. v0.x: Support multiple SSDP servers on the same box. From df5763129e8f260f022cee7311abbb6aaed3291a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 19 Feb 2008 01:06:56 -0800 Subject: [PATCH 153/179] add a module to parsing my pyvr xml data... This has the shows showing up, but now I need to figure out why it hangs when browse into the shows... looking good... [git-p4: depot-paths = "//depot/": change = 1113] --- pymediaserv | 8 +- pyvr.py | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 pyvr.py diff --git a/pymediaserv b/pymediaserv index d38d405..fbdbe11 100755 --- a/pymediaserv +++ b/pymediaserv @@ -27,7 +27,13 @@ def tryloadmodule(mod): # ZipStorage w/ tar support should be last as it will gobble up empty files. # These should be sorted by how much work they do, the least work the earlier. # mpegtsmod can be really expensive. -modules = [ 'shoutcast', 'dvd', 'ZipStorage', 'mpegtsmod' ] +modules = [ + 'shoutcast', + 'pyvr', + 'dvd', + 'ZipStorage', + 'mpegtsmod', + ] modmap = {} for i in modules: modmap[i] = tryloadmodule(i) diff --git a/pyvr.py b/pyvr.py new file mode 100644 index 0000000..9b330c5 --- /dev/null +++ b/pyvr.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python +# Copyright 2008 John-Mark Gurney +'''PVR Interface''' + +__version__ = '$Change: 1109 $' +# $Id: //depot/python/pymeds/main/shoutcast.py#13 $ + +from DIDLLite import Container, Item, VideoItem, Resource +from FSStorage import registerklassfun + +import os.path +import time +import twisted.web +from twisted.internet import reactor +from twisted.python import log + +def getPage(url, contextFactory=None, *args, **kwargs): + """Download a web page as a string. + + Download a page. Return the HTTPClientFactory, which will + callback with a page (as a string) or errback with a + description of the error. + + See HTTPClientFactory to see what extra args can be passed. + """ + from twisted.web.client import _parse, HTTPClientFactory + + scheme, host, port, path = _parse(url) + factory = HTTPClientFactory(url, *args, **kwargs) + if scheme == 'https': + from twisted.internet import ssl + if contextFactory is None: + contextFactory = ssl.ClientContextFactory() + reactor.connectSSL(host, port, factory, contextFactory) + else: + reactor.connectTCP(host, port, factory) + return factory + +class PYVRShow(VideoItem): + def __init__(self, *args, **kwargs): + baseurl = kwargs['url'] + self.info = kwargs['info'] + del kwargs['info'], kwargs['url'] + + VideoItem.__init__(self, *args, **kwargs) + + url = self.info['link'] + sc = urlparse.urlparse(url) + if not sc: + # need to combine w/ base url + url = urlparse.urljoin(baseurl, url) + self.res = Resource(url, + 'http-get:*:%s:*' % self.info['mimetype']) + #self.res.size = self.chapter.size + + def doUpdate(self): + pass + +import xml.sax +import xml.sax.handler +from xml.sax.saxutils import unescape + +class RecordingXML(xml.sax.handler.ContentHandler): + def __init__(self): + self.shows = {} + self.data = None + + def characters(self, chars): + if self.data is not None: + self.data.append(chars) + + def startElement(self, name, attrs): + if name in ('title', 'subtitle', 'mimetype', 'link', 'delete'): + self.data = [] + self.curel = name + elif name == 'record': + self.currec = {} + + def endElement(self, name): + if name in ('title', 'subtitle', 'mimetype', 'link', 'delete'): + data = unescape(''.join(self.data)) + self.currec[self.curel] = data + elif name == 'record': + rec = self.currec + try: + self.shows[rec['title']].append(rec) + except KeyError: + self.shows[rec['title']] = [ rec ] + + self.data = None + +def recxmltoobj(page): + obj = RecordingXML() + xml.sax.parseString(page, obj) + + return obj.shows + +class PYVRShows(Container): + def __init__(self, *args, **kwargs): + self.pyvr = kwargs['pyvr'] + del kwargs['pyvr'] + self.show = kwargs['show'] + del kwargs['show'] + + Container.__init__(self, *args, **kwargs) + + self.pathObjmap = {} + self.shows = {} + self.lastmodified = None + + def checkUpdate(self): + self.pyvr.checkUpdate() + if self.pyvr.lastmodified != self.lastmodified: + self.doUpdate(self) + + @staticmethod + def getunique(eps, ep): + i = 1 + while True: + title = '%s Copy %d' % (ep['subtitle'], i) + if not ret.has_key(title): + return title + i += 1 + + @staticmethod + def eplisttodict(eps): + ret = {} + for i in eps: + title = i['subtitle'] + if ret.has_key(title): + print 'WARNING: dup:', `i`, `ret[title]` + title = self.getunique(ret, i) + ret[title] = i + + return ret + + def doUpdate(self): + nl = self.eplisttodict(self.pyvr.shows[self.show]) + + doupdate = False + for i in self.pathObjmap.keys(): + if i not in nl: + # delete + doupdate = True + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in nl: + if i in self.pathObjmap and self.shows[i] == nl[i]: + continue + doupdate = True + if i in self.pathObjmap: + # changed + self.cd.delItem(self.pathObjmap[i]) + self.pathObjmap[i] = self.cd.addItem(self.id, + PYVRShow, i, url=self.pyvr.url, info=nl[i]) + + self.shows = nl + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + Container.doUpdate(self) + +class PYVR(Container): + def __init__(self, *args, **kwargs): + self.url = kwargs['url'] + del kwargs['url'] + + Container.__init__(self, *args, **kwargs) + + self.pathObjmap = {} + self.isPend = False + self.lastmodified = None + self.newobjs = None + self.objs = {} + self.lastcheck = 0 + + def checkUpdate(self): + if self.isPend: + print 'already' + raise self.pend + + if time.time() - self.lastcheck < 5: + print 'escape' + return + + # Check to see if any changes have been made + self.isPend = True + self.lastcheck = time.time() + self.page = getPage(self.url, method='HEAD') + self.page.deferred.addCallback(self.doCheck) + self.pend = self.page.deferred + + print 'doing raise' + raise self.pend + + def doCheck(self, x): + print 'got check' + print `self.page.response_headers` + slm = self.page.response_headers['last-modified'] + if slm == self.lastmodified: + # Page the same, don't do anything + self.isPend = False + return + + self.page = getPage(self.url) + self.page.deferred.addCallback(self.parsePage) + self.pend = self.page.deferred + + return self.pend + + def parsePage(self, page): + print 'parsing' + slm = self.page.response_headers['last-modified'] + self.lastmodified = slm + self.isPend = False + del self.page + del self.pend + + self.newobjs = recxmltoobj(page) + self.doUpdate() + + def doUpdate(self): + if self.newobjs is None: + import traceback + traceback.print_stack(file=log.logfile) + return + + nl = self.newobjs + + doupdate = False + for i in self.pathObjmap.keys(): + if i not in nl: + # delete + doupdate = True + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + # This data is referenced when adding new shows + self.shows = nl + for i in nl: + if i in self.pathObjmap: + continue + doupdate = True + try: + self.pathObjmap[i] = self.cd.addItem(self.id, + PYVRShows, i, show=i, pyvr=self) + except: + import traceback + traceback.print_exc(file=log.logfile) + raise + + self.newobjs = None + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + Container.doUpdate(self) + +def detectpyvrfile(path, fobj): + bn = os.path.basename(path) + if bn == 'PYVR': + print 'detected' + return PYVR, { 'url': fobj.readline().strip() } + return None, None + +registerklassfun(detectpyvrfile) From f23346c54a004d4e65b9be03d6b2f6b202ed1a09 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 19 Feb 2008 01:24:19 -0800 Subject: [PATCH 154/179] this now appears to be working... import necessary modules... call doUpdate w/ no args... fix spelling of some vars... order shows by the same order returned, not by title... properly index urlparse so that we get the schema, not the tuple which is always true.. this makes calculating the resource correct.. Things should now work! [git-p4: depot-paths = "//depot/": change = 1114] --- pyvr.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pyvr.py b/pyvr.py index 9b330c5..7b486f4 100644 --- a/pyvr.py +++ b/pyvr.py @@ -10,9 +10,10 @@ from FSStorage import registerklassfun import os.path import time -import twisted.web from twisted.internet import reactor from twisted.python import log +import twisted.web +import urlparse def getPage(url, contextFactory=None, *args, **kwargs): """Download a web page as a string. @@ -45,7 +46,7 @@ class PYVRShow(VideoItem): VideoItem.__init__(self, *args, **kwargs) url = self.info['link'] - sc = urlparse.urlparse(url) + sc = urlparse.urlparse(url)[0] if not sc: # need to combine w/ base url url = urlparse.urljoin(baseurl, url) @@ -111,25 +112,26 @@ class PYVRShows(Container): def checkUpdate(self): self.pyvr.checkUpdate() if self.pyvr.lastmodified != self.lastmodified: - self.doUpdate(self) + self.doUpdate() @staticmethod def getunique(eps, ep): i = 1 while True: title = '%s Copy %d' % (ep['subtitle'], i) - if not ret.has_key(title): + if not eps.has_key(title): return title i += 1 @staticmethod def eplisttodict(eps): ret = {} - for i in eps: + for pos, i in enumerate(eps): title = i['subtitle'] if ret.has_key(title): print 'WARNING: dup:', `i`, `ret[title]` - title = self.getunique(ret, i) + title = PYVRShows.getunique(ret, i) + i['pos'] = pos ret[title] = i return ret @@ -158,10 +160,13 @@ class PYVRShows(Container): self.shows = nl # sort our children - self.sort(lambda x, y: cmp(x.title, y.title)) + #self.sort(lambda x, y: cmp(x.title, y.title)) + self.sort(lambda x, y: cmp(x.info['pos'], y.info['pos'])) if doupdate: Container.doUpdate(self) + self.lastmodified = self.pyvr.lastmodified + class PYVR(Container): def __init__(self, *args, **kwargs): self.url = kwargs['url'] @@ -178,11 +183,9 @@ class PYVR(Container): def checkUpdate(self): if self.isPend: - print 'already' raise self.pend if time.time() - self.lastcheck < 5: - print 'escape' return # Check to see if any changes have been made @@ -192,11 +195,9 @@ class PYVR(Container): self.page.deferred.addCallback(self.doCheck) self.pend = self.page.deferred - print 'doing raise' raise self.pend def doCheck(self, x): - print 'got check' print `self.page.response_headers` slm = self.page.response_headers['last-modified'] if slm == self.lastmodified: @@ -211,7 +212,6 @@ class PYVR(Container): return self.pend def parsePage(self, page): - print 'parsing' slm = self.page.response_headers['last-modified'] self.lastmodified = slm self.isPend = False @@ -261,7 +261,6 @@ class PYVR(Container): def detectpyvrfile(path, fobj): bn = os.path.basename(path) if bn == 'PYVR': - print 'detected' return PYVR, { 'url': fobj.readline().strip() } return None, None From c04ce365390ef87a23c2b2a78503fb31273bc9ca Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 19 Feb 2008 01:29:19 -0800 Subject: [PATCH 155/179] remove a debuging print... no logner needed.. [git-p4: depot-paths = "//depot/": change = 1115] --- pyvr.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyvr.py b/pyvr.py index 7b486f4..0abfeca 100644 --- a/pyvr.py +++ b/pyvr.py @@ -198,7 +198,6 @@ class PYVR(Container): raise self.pend def doCheck(self, x): - print `self.page.response_headers` slm = self.page.response_headers['last-modified'] if slm == self.lastmodified: # Page the same, don't do anything From cc68641e82e2899fa03d9b10838d775b798ffa99 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 25 Feb 2008 01:18:32 -0800 Subject: [PATCH 156/179] don't blindly call doUpdate, in Item, pass it to the Container's doUpdate.. This is really what was ment... in FSDir, call Container too, this was recursively calling itself which managed to end after (n^n) rounds I think after all files had been added... oops! This should make large dirs load faster... still need to teach it to keep the info between runs... [git-p4: depot-paths = "//depot/": change = 1125] --- DIDLLite.py | 5 +++-- FSStorage.py | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index 0bb42f3..ddc6de9 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -131,7 +131,7 @@ class Item(Object): def doUpdate(self): # Update parent container - self.cd[self.parentID].doUpdate() + Container.doUpdate(self.cd[self.parentID]) def toElement(self): @@ -275,7 +275,8 @@ class Container(Object, list): def doUpdate(self): self.updateID = (self.updateID + 1) % (1l << 32) - self.cd['0'].doUpdate() + if self.id != '0': + self.cd['0'].doUpdate() def toElement(self): diff --git a/FSStorage.py b/FSStorage.py index eb13ba8..a797122 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -13,7 +13,7 @@ import os import sets import stat -from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource +from DIDLLite import Container, StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource from twisted.web import resource, server, static from twisted.python import log from twisted.internet import abstract, interfaces, process, protocol, reactor @@ -200,8 +200,10 @@ class FSItem(FSObject, Item): Item.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) self.mimetype = mimetype + self.checkUpdate() def doUpdate(self): + #print 'FSItem doUpdate:', `self` self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = os.path.getsize(self.FSpath) self.res = [ self.res ] @@ -268,10 +270,16 @@ class FSDirectory(FSObject, StorageFolder): # mapping from path to objectID self.pathObjmap = {} + self.indoUpdate = False def doUpdate(self): # We need to rescan this dir, and see if our children has # changed any. + if self.indoUpdate: + return + #import traceback + #traceback.print_stack() + self.indoUpdate = True doupdate = False children = sets.Set(os.listdir(self.FSpath)) for i in self.pathObjmap.keys(): @@ -297,7 +305,11 @@ class FSDirectory(FSObject, StorageFolder): # Pass up to handle UpdateID if doupdate: - StorageFolder.doUpdate(self) + # Calling StorageFolder.doUpdate results in calling + # ourselves. + Container.doUpdate(self) + + self.indoUpdate = False def __repr__(self): return ('<%s.%s: path: %s, id: %s, parent: %s, title: %s, ' + \ From d8f81e41871b0638ecf15de4cc14b426ab98381a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 25 Feb 2008 01:41:36 -0800 Subject: [PATCH 157/179] make it cheaper to have the mpegtsmod loaded... We now do a quick check to make sure there are TS packets, before scanning the first 2megs in an expensive iter loop to find out that there are none... this makes things a lot faster... [git-p4: depot-paths = "//depot/": change = 1126] --- mpegtsmod.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mpegtsmod.py b/mpegtsmod.py index 3ef734b..042ba35 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -344,7 +344,27 @@ class MultiMPEGTS(FSObject, StorageFolder): if doupdate: StorageFolder.doUpdate(self) +def findtsstream(fp, pktsz=188): + d = fp.read(200*pktsz) + i = 5 + pos = 0 + while i and pos < len(d) and pos != -1: + if d[pos] == 'G': + i -= 1 + pos += pktsz + else: + i = 5 + pos = d.find('G', pos + 1) + + if i or pos == -1: + return False + + return True + def detectmpegts(path, fobj): + if not findtsstream(fobj): + return None, None + f = mpegts.TSPStream(_LimitedFile(path, size= 2*1024*1024)) tvct = mpegts.GetTVCT(f) From 36b0e65e8e50b1e2d2385b777f71bbbb1166382d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 25 Feb 2008 01:43:03 -0800 Subject: [PATCH 158/179] do like the others, and when cascading to root, do it through Container, this prevents the root Container from being rescanned all the time... Also make the root Container be able to grow beyond 2^32... [git-p4: depot-paths = "//depot/": change = 1127] --- DIDLLite.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index ddc6de9..2917e1c 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -274,9 +274,11 @@ class Container(Object, list): list.__init__(self) def doUpdate(self): - self.updateID = (self.updateID + 1) % (1l << 32) - if self.id != '0': - self.cd['0'].doUpdate() + if self.id == '0': + self.updateID = (self.updateID + 1) + else: + self.updateID = (self.updateID + 1) % (1l << 32) + Container.doUpdate(self.cd['0']) def toElement(self): From 5149869959c48ecbc7a0c7c9033b9718dc355aa9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 1 Mar 2008 01:51:00 -0800 Subject: [PATCH 159/179] make it so we don't have to fully open a zip file to know it is one.. This speeds up detection of large zip files.. [git-p4: depot-paths = "//depot/": change = 1129] --- ZipStorage.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/ZipStorage.py b/ZipStorage.py index 8e5b981..36f8d61 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -213,6 +213,23 @@ class ZipChildDir(ZipItem, StorageFolder): def __repr__(self): return '' % len(self.pathObjmap) +def tryTar(path): + # Try to see if it's a tar file + if path[-2:] == 'gz': + comp = tarfile.TAR_GZIPPED + elif path[-3:] == 'bz2': + comp = tarfile.TAR_BZ2 + else: + comp = tarfile.TAR_PLAIN + return tarfile.TarFileCompat(path, compression=comp) + +def canHandle(path): + if zipfile.is_zipfile(path): + return True + + #tar is cheaper on __init__ than zipfile + return tryTar(path) + def genZipFile(path): try: return zipfile.ZipFile(path) @@ -222,14 +239,7 @@ def genZipFile(path): pass try: - # Try to see if it's a tar file - if path[-2:] == 'gz': - comp = tarfile.TAR_GZIPPED - elif path[-3:] == 'bz2': - comp = tarfile.TAR_BZ2 - else: - comp = tarfile.TAR_PLAIN - return tarfile.TarFileCompat(path, compression=comp) + return tryTar(path) except: #import traceback #traceback.print_exc(file=log.logfile) @@ -252,6 +262,7 @@ class ZipObject(FSObject, StorageFolder): self.zip = genZipFile(self.FSpath) hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) + print 'zip len:', len(hier) doupdate = False children = sets.Set(hier.keys()) for i in self.pathObjmap.keys(): @@ -288,7 +299,7 @@ class ZipObject(FSObject, StorageFolder): def detectzipfile(path, fobj): try: - genZipFile(path) + canHandle(path) except: return None, None From dacf82263d40a6ee1e24e99bf3fb3fdf12345638 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 1 Mar 2008 02:06:52 -0800 Subject: [PATCH 160/179] add a magic resource list that prevents duplicate mime-types from being added... probably should add more matching, but this is good for now... [git-p4: depot-paths = "//depot/": change = 1130] --- DIDLLite.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/DIDLLite.py b/DIDLLite.py index 2917e1c..eba33e1 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -32,6 +32,21 @@ class Resource: return root +class ResourceList(list): + '''Special class to not overwrite mimetypes that already exist.''' + def __init__(self, *args, **kwargs): + self._mt = {} + list.__init__(self, *args, **kwargs) + + def append(self, k): + assert isinstance(k, Resource) + mt = k.protocolInfo.split(':')[2] + if self._mt.has_key(mt): + return + + list.append(self, k) + self._mt[mt] = k + class Object(object): """The root class of the entire content directory class heirachy.""" From 5ce2e924444ed8b99505a8170fa54b766f42d233 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 1 Mar 2008 02:08:19 -0800 Subject: [PATCH 161/179] prevent duplicate mime-types from being added... also, don't add the video types when the file isn't a video.. [git-p4: depot-paths = "//depot/": change = 1131] --- FSStorage.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index a797122..393467a 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -13,7 +13,7 @@ import os import sets import stat -from DIDLLite import Container, StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource +from DIDLLite import Container, StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource, ResourceList from twisted.web import resource, server, static from twisted.python import log from twisted.internet import abstract, interfaces, process, protocol, reactor @@ -204,11 +204,15 @@ class FSItem(FSObject, Item): def doUpdate(self): #print 'FSItem doUpdate:', `self` - self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) - self.res.size = os.path.getsize(self.FSpath) - self.res = [ self.res ] - self.res.append(Resource(self.url + '/mpeg2', 'http-get:*:%s:*' % 'video/mpeg')) - self.res.append(Resource(self.url + '/xvid', 'http-get:*:%s:*' % 'video/x-msvideo')) + self.res = ResourceList() + r = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) + r.size = os.path.getsize(self.FSpath) + self.res.append(r) + if self.mimetype.split('/', 1)[0] == 'video': + self.res.append(Resource(self.url + '/mpeg2', + 'http-get:*:%s:*' % 'video/mpeg')) + self.res.append(Resource(self.url + '/xvid', + 'http-get:*:%s:*' % 'video/x-msvideo')) Item.doUpdate(self) def ignoreFiles(path, fobj): @@ -258,7 +262,7 @@ def dofileadd(cd, parent, path, name): if klass is None or klass is IgnoreFile: return - #log.msg('matched:', os.path.join(path, name), `i`, `klass`) + print 'matched:', os.path.join(path, name), `i`, `klass` return cd.addItem(parent, klass, name, **kwargs) class FSDirectory(FSObject, StorageFolder): From dd7270bf140296ec58b99bc506445df386df47d7 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:08:51 -0800 Subject: [PATCH 162/179] copy this over for use to handle rar files.. [git-p4: depot-paths = "//depot/": change = 1132] --- iterrarfile.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 iterrarfile.py diff --git a/iterrarfile.py b/iterrarfile.py new file mode 100644 index 0000000..5248ca9 --- /dev/null +++ b/iterrarfile.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# Copyright 2006 John-Mark Gurney + +__version__ = '$Change$' +# $Id$ + +import tarfile +from tarfile import * + +TAR_PLAIN = tarfile.TAR_PLAIN +TAR_GZIPPED = tarfile.TAR_GZIPPED +TAR_BZ2 = 'bz2' + +__all__ = tarfile.__all__ + +class TarFileCompat(tarfile.TarFileCompat): + def __init__(self, file, mode="r", compression=TAR_PLAIN): + if compression != TAR_BZ2: + tarfile.TarFileCompat.__init__(self, file, mode, compression) + return + + self.tarfile = TarFile.bz2open(file, mode) + if mode[0:1] == "r": + members = self.tarfile.getmembers() + for i in xrange(len(members)): + m = members[i] + m.filename = m.name + m.file_size = m.size + m.date_time = time.gmtime(m.mtime)[:6] + + def readiter(self, name, blksize=16384): + f = self.tarfile.extractfile(self.tarfile.getmember(name)) + while True: + data = f.read(blksize) + if data == '': + break + yield data From 0a4949deaa56c199162acbab5e8dbf2dc28b490c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:17:46 -0800 Subject: [PATCH 163/179] add rarfile support... should probably make this more modular so that if rarfile isn't installed, it isn't an issue.. [git-p4: depot-paths = "//depot/": change = 1133] --- ZipStorage.py | 15 ++++++++++----- iterrarfile.py | 33 ++++----------------------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/ZipStorage.py b/ZipStorage.py index 36f8d61..55cf4a0 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -12,6 +12,8 @@ import iterzipfile zipfile = iterzipfile import itertarfile tarfile = itertarfile +import iterrarfile +rarfile = iterrarfile import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource @@ -227,16 +229,19 @@ def canHandle(path): if zipfile.is_zipfile(path): return True + print 'rar:', rarfile.is_rarfile(path) + if rarfile.is_rarfile(path): + return True + #tar is cheaper on __init__ than zipfile return tryTar(path) def genZipFile(path): - try: + if zipfile.is_zipfile(path): return zipfile.ZipFile(path) - except: - #import traceback - #traceback.print_exc(file=log.logfile) - pass + + if rarfile.is_rarfile(path): + return rarfile.RarFile(path) try: return tryTar(path) diff --git a/iterrarfile.py b/iterrarfile.py index 5248ca9..f06189f 100644 --- a/iterrarfile.py +++ b/iterrarfile.py @@ -4,34 +4,9 @@ __version__ = '$Change$' # $Id$ -import tarfile -from tarfile import * - -TAR_PLAIN = tarfile.TAR_PLAIN -TAR_GZIPPED = tarfile.TAR_GZIPPED -TAR_BZ2 = 'bz2' - -__all__ = tarfile.__all__ - -class TarFileCompat(tarfile.TarFileCompat): - def __init__(self, file, mode="r", compression=TAR_PLAIN): - if compression != TAR_BZ2: - tarfile.TarFileCompat.__init__(self, file, mode, compression) - return - - self.tarfile = TarFile.bz2open(file, mode) - if mode[0:1] == "r": - members = self.tarfile.getmembers() - for i in xrange(len(members)): - m = members[i] - m.filename = m.name - m.file_size = m.size - m.date_time = time.gmtime(m.mtime)[:6] +import rarfile +from rarfile import * +class RarFile(rarfile.RarFile): def readiter(self, name, blksize=16384): - f = self.tarfile.extractfile(self.tarfile.getmember(name)) - while True: - data = f.read(blksize) - if data == '': - break - yield data + yield self.read(name) From 2e8dc89de717bb20f03cf7d032d32de7fa372c89 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:21:02 -0800 Subject: [PATCH 164/179] if there is an import error on rarfile, use a dummy module that will always be false... [git-p4: depot-paths = "//depot/": change = 1134] --- ZipStorage.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ZipStorage.py b/ZipStorage.py index 55cf4a0..9a4660d 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -12,8 +12,15 @@ import iterzipfile zipfile = iterzipfile import itertarfile tarfile = itertarfile -import iterrarfile -rarfile = iterrarfile +try: + import iterrarfile + rarfile = iterrarfile +except ImportError: + class rarfile(): + pass + + rarfile = rarfile() + rarfile.is_rarfile = lambda x: False import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource From 9037697628370ae5f0d65a5ab004826e23125919 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:44:52 -0800 Subject: [PATCH 165/179] update copyright and email address.. [git-p4: depot-paths = "//depot/": change = 1135] --- ContentDirectory.py | 2 +- DIDLLite.py | 2 +- FSStorage.py | 2 +- ZipStorage.py | 2 +- iterrarfile.py | 2 +- mpegtsmod.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 6bb96c5..14ac36f 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006-2007 John-Mark Gurney +# Copyright 2006-2008 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/DIDLLite.py b/DIDLLite.py index eba33e1..55cf8e5 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -2,7 +2,7 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2008 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/FSStorage.py b/FSStorage.py index 393467a..02e3d94 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2008 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/ZipStorage.py b/ZipStorage.py index 9a4660d..e098568 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006-2008 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/iterrarfile.py b/iterrarfile.py index f06189f..16fb131 100644 --- a/iterrarfile.py +++ b/iterrarfile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2008 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/mpegtsmod.py b/mpegtsmod.py index 042ba35..7d07688 100644 --- a/mpegtsmod.py +++ b/mpegtsmod.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006-2007 John-Mark Gurney +# Copyright 2006-2008 John-Mark Gurney '''MPEG-TS Handling''' __version__ = '$Change$' From b9c09937910ff32ea65d81da4cd1dc9934a043ff Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:49:41 -0800 Subject: [PATCH 166/179] add a bunch of changes to the README.. [git-p4: depot-paths = "//depot/": change = 1136] --- README | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/README b/README index 34eee77..ac97441 100644 --- a/README +++ b/README @@ -10,11 +10,13 @@ and found this code. The code was a good framework, so I expanded upon it. Tested devices and/or programs: + Cidero UPnP A/V Controller Intel's Media Control Point and Media Renderer D-Link DSM-520 Sony PlayStation 3 -The Intel tools are good for testing and are available at: +The Intel tools are good for testing (though Windows only) and are +available at: http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm Either make a directory media and put the files there, or make a symlink @@ -26,6 +28,9 @@ The following packages are required to run the media server: Web 0.5.0) * ElementTree +Optional software packages: + * rarfile - http://grue.l-t.ee/~marko/src/rarfile/ + NOTE: SOAPpy is no longer required as I have included soap_lite from the Coherence project: https://coherence.beebits.net/ . @@ -37,7 +42,7 @@ http://resnet.uoregon.edu/~gurney_j/jmpc/pymeds.html Good Luck! -John-Mark Gurney +John-Mark Gurney Ideas for future improvements: I have received a few ECONNABORTED errors at times. The patch @@ -72,6 +77,26 @@ v0.x: Now works w/ PS3. The PS3 still has issues as it has limited codec support (D-Link is better) and does not support AC3 audio in MPEG-TS streams yet (not even downsampling to stereo PCM). + Add rar file support. This is optional, and if rarfile is not + installed, things will work, just not be able to look into rar + files. + Fix problem when adding multiple res with same mime-type and adding + transcoding mime-types to all files, not just video type files. + Speed up detection of large zip files. Previously we would + instantiate the ZipFile class, which was expensive. Use the + is_zipfile function instead. + Fix handling of Containers. Previously we would rescan the root + dir many times due to calling doUpdate when we just wanted to + update the SystemID. There was also a bug where we would do a + lot more work than necessary. This significantly speeds up + large directories. + Improve mpegtsmod so that it doesn't always scan the first 2 megs + of the file. Do a quick check of the first few KB first. + Create a new module that fetchs an XML files, parses it, and + presents the media in it. This is to integrate my Python PVR + so that I can browse the shows I have recorded. + Fix transcoding of MPEG-2, use mp2 audio instead of mp3. + Sync up the programs in mpegts. v0.3: Include some patches for twisted in the distro, in the directory From 80d1273cba6724081c60fee9d7c4697969e7b268 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 00:52:08 -0800 Subject: [PATCH 167/179] update email address... [git-p4: depot-paths = "//depot/": change = 1137] --- FileDIDL.py | 2 +- SSDP.py | 2 +- debug.py | 2 +- dvd.py | 2 +- itertarfile.py | 2 +- iterzipfile.py | 2 +- pymediaserv | 2 +- shoutcast.py | 2 +- upnp.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/FileDIDL.py b/FileDIDL.py index 67c4341..7f54049 100644 --- a/FileDIDL.py +++ b/FileDIDL.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/SSDP.py b/SSDP.py index cb532b4..2dbb1b2 100644 --- a/SSDP.py +++ b/SSDP.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006-2007 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/debug.py b/debug.py index 4c01609..6b90624 100644 --- a/debug.py +++ b/debug.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/dvd.py b/dvd.py index 677421b..ffe9e0d 100644 --- a/dvd.py +++ b/dvd.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney '''DVD Handling''' __version__ = '$Change$' diff --git a/itertarfile.py b/itertarfile.py index 5248ca9..6b0037d 100644 --- a/itertarfile.py +++ b/itertarfile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/iterzipfile.py b/iterzipfile.py index 118dce0..dff51cb 100644 --- a/iterzipfile.py +++ b/iterzipfile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/pymediaserv b/pymediaserv index fbdbe11..e0df823 100755 --- a/pymediaserv +++ b/pymediaserv @@ -3,7 +3,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney __version__ = '$Change$' # $Id$ diff --git a/shoutcast.py b/shoutcast.py index 3388408..12cf51c 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney '''Shoutcast Radio Feed''' __version__ = '$Change$' diff --git a/upnp.py b/upnp.py index 9581232..5d67f36 100644 --- a/upnp.py +++ b/upnp.py @@ -2,7 +2,7 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006-2007 John-Mark Gurney +# Copyright 2006-2007 John-Mark Gurney __version__ = '$Change$' # $Id$ From e1d8d9fbe0905c005fee332d47f167f767b81624 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Mar 2008 01:15:06 -0800 Subject: [PATCH 168/179] remove some debug prints.. [git-p4: depot-paths = "//depot/": change = 1138] --- FSStorage.py | 2 +- ZipStorage.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 02e3d94..ed17cdf 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -262,7 +262,7 @@ def dofileadd(cd, parent, path, name): if klass is None or klass is IgnoreFile: return - print 'matched:', os.path.join(path, name), `i`, `klass` + #print 'matched:', os.path.join(path, name), `i`, `klass` return cd.addItem(parent, klass, name, **kwargs) class FSDirectory(FSObject, StorageFolder): diff --git a/ZipStorage.py b/ZipStorage.py index e098568..2c7efc6 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -236,7 +236,6 @@ def canHandle(path): if zipfile.is_zipfile(path): return True - print 'rar:', rarfile.is_rarfile(path) if rarfile.is_rarfile(path): return True @@ -274,7 +273,6 @@ class ZipObject(FSObject, StorageFolder): self.zip = genZipFile(self.FSpath) hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) - print 'zip len:', len(hier) doupdate = False children = sets.Set(hier.keys()) for i in self.pathObjmap.keys(): From b60dd8989ffb7fa9b62e1fe30e849b47bc8d9fa0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 22 Mar 2008 21:41:38 -0800 Subject: [PATCH 169/179] make rarfile properly a no-op... [git-p4: depot-paths = "//depot/": change = 1144] --- ZipStorage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZipStorage.py b/ZipStorage.py index 2c7efc6..445691a 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -16,7 +16,7 @@ try: import iterrarfile rarfile = iterrarfile except ImportError: - class rarfile(): + class rarfile: pass rarfile = rarfile() From 1bd472a32dfc53a48b6802ea878eac3b3c45fe0f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 7 Apr 2008 20:31:29 -0800 Subject: [PATCH 170/179] add more generic support for attributes to resource.... add support for duration to the PYVR module.... add some more debug about trapping the 500 error, and how to recover from it properly... [git-p4: depot-paths = "//depot/": change = 1149] --- DIDLLite.py | 47 ++++++++++++++++++++++++++++++++++++----------- pyvr.py | 39 +++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index 55cf8e5..e52012c 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -9,26 +9,51 @@ __version__ = '$Change$' from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface -class Resource: +class Resource(object): """An object representing a resource.""" + validattrs = { + 'protocolinfo' 'protocolInfo', + 'importuri' 'importUri', + 'size' 'size', + 'duration' 'duration', + 'prtection' 'protection, + 'bitrate' 'bitrate', + 'bitspersample': 'bitsPerSample', + 'samplefrequency': 'sampleFrequence', + 'nraudiochannels': 'nrAudioChannels', + 'resolution' 'resolution', + 'colordepth' 'colorDepth', + 'tspec' 'tspec', + 'alloweduse' 'allowedUse', + 'validitystart': 'validityStart', + 'validityend' 'validityEnd', + 'remainingtime': 'remainingTime', + 'usageinfo' 'usageInfo', + 'rightsinfouri': 'rightsInfoURI', + 'contentinfouri': 'contentInfoURI', + 'recordquality': 'recordQuality', + } + def __init__(self, data, protocolInfo): - self.data = data + object.__init__(self) + + # Use thses so setattr can be more simple + object.__setattr__(self, 'data', data) + object.__setattr__(self, 'attrs', {}) + self.protocolInfo = protocolInfo - self.bitrate = None - self.size = None - def toElement(self): + def __setattr__(self, key, value): + key = key.tolower() + self.attrs[self.validattrs[key]] = value + def toElement(self): root = Element('res') - root.attrib['protocolInfo'] = self.protocolInfo root.text = self.data - if self.bitrate is not None: - root.attrib['bitrate'] = str(self.bitrate) - - if self.size is not None: - root.attrib['size'] = str(self.size) + for i in self.attrs: + root.attrib[i] = str(self.attrs[i]) return root diff --git a/pyvr.py b/pyvr.py index 0abfeca..cc9349c 100644 --- a/pyvr.py +++ b/pyvr.py @@ -52,7 +52,7 @@ class PYVRShow(VideoItem): url = urlparse.urljoin(baseurl, url) self.res = Resource(url, 'http-get:*:%s:*' % self.info['mimetype']) - #self.res.size = self.chapter.size + self.res.duration = self.info['duration'] def doUpdate(self): pass @@ -62,6 +62,9 @@ import xml.sax.handler from xml.sax.saxutils import unescape class RecordingXML(xml.sax.handler.ContentHandler): + dataels = ('title', 'subtitle', 'duration', 'mimetype', 'link', + 'delete', ) + def __init__(self): self.shows = {} self.data = None @@ -71,14 +74,14 @@ class RecordingXML(xml.sax.handler.ContentHandler): self.data.append(chars) def startElement(self, name, attrs): - if name in ('title', 'subtitle', 'mimetype', 'link', 'delete'): + if name in self.dataels: self.data = [] self.curel = name elif name == 'record': self.currec = {} def endElement(self, name): - if name in ('title', 'subtitle', 'mimetype', 'link', 'delete'): + if name in dataels: data = unescape(''.join(self.data)) self.currec[self.curel] = data elif name == 'record': @@ -175,33 +178,46 @@ class PYVR(Container): Container.__init__(self, *args, **kwargs) self.pathObjmap = {} - self.isPend = False + self.pend = None self.lastmodified = None self.newobjs = None self.objs = {} self.lastcheck = 0 def checkUpdate(self): - if self.isPend: + if self.pend is not None: raise self.pend if time.time() - self.lastcheck < 5: + print '<5' return # Check to see if any changes have been made - self.isPend = True - self.lastcheck = time.time() + self.runCheck() + + raise self.pend + + def runCheck(self): + print 'runCheck' self.page = getPage(self.url, method='HEAD') - self.page.deferred.addCallback(self.doCheck) + self.page.deferred.addErrback(self.errCheck).addCallback( + self.doCheck) self.pend = self.page.deferred - raise self.pend + def errCheck(self, x): + print 'errCheck:', `x` + self.runCheck() def doCheck(self, x): + print 'doCheck:', self.page.status + if self.page.status != '200': + return reactor.callLater(.01, self.runCheck) + + self.lastcheck = time.time() slm = self.page.response_headers['last-modified'] if slm == self.lastmodified: # Page the same, don't do anything - self.isPend = False + self.pend = None return self.page = getPage(self.url) @@ -213,9 +229,8 @@ class PYVR(Container): def parsePage(self, page): slm = self.page.response_headers['last-modified'] self.lastmodified = slm - self.isPend = False del self.page - del self.pend + self.pend = None self.newobjs = recxmltoobj(page) self.doUpdate() From c4eb909ecd881993eb2739e5a742778f49a96f4e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 7 Apr 2008 20:39:15 -0800 Subject: [PATCH 171/179] fix some typos... fix getattr by checking the set attributes... [git-p4: depot-paths = "//depot/": change = 1150] --- DIDLLite.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index e52012c..7aae18d 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -13,23 +13,23 @@ class Resource(object): """An object representing a resource.""" validattrs = { - 'protocolinfo' 'protocolInfo', - 'importuri' 'importUri', - 'size' 'size', - 'duration' 'duration', - 'prtection' 'protection, - 'bitrate' 'bitrate', + 'protocolinfo': 'protocolInfo', + 'importuri': 'importUri', + 'size': 'size', + 'duration': 'duration', + 'protection': 'protection', + 'bitrate': 'bitrate', 'bitspersample': 'bitsPerSample', 'samplefrequency': 'sampleFrequence', 'nraudiochannels': 'nrAudioChannels', - 'resolution' 'resolution', - 'colordepth' 'colorDepth', - 'tspec' 'tspec', - 'alloweduse' 'allowedUse', + 'resolution': 'resolution', + 'colordepth': 'colorDepth', + 'tspec': 'tspec', + 'alloweduse': 'allowedUse', 'validitystart': 'validityStart', - 'validityend' 'validityEnd', + 'validityend': 'validityEnd', 'remainingtime': 'remainingTime', - 'usageinfo' 'usageInfo', + 'usageinfo': 'usageInfo', 'rightsinfouri': 'rightsInfoURI', 'contentinfouri': 'contentInfoURI', 'recordquality': 'recordQuality', @@ -44,16 +44,23 @@ class Resource(object): self.protocolInfo = protocolInfo + def __getattr__(self, key): + try: + return self.attrs[key.lower()] + except KeyError: + raise AttributeError, key + def __setattr__(self, key, value): - key = key.tolower() - self.attrs[self.validattrs[key]] = value + key = key.lower() + assert key in self.validattrs + self.attrs[key] = value def toElement(self): root = Element('res') root.text = self.data for i in self.attrs: - root.attrib[i] = str(self.attrs[i]) + root.attrib[self.validattrs[i]] = str(self.attrs[i]) return root From 7d78dc63c1c40d87f1343674052187fe5265b1de Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 7 Apr 2008 21:06:43 -0800 Subject: [PATCH 172/179] debugging, and fix to dataels... [git-p4: depot-paths = "//depot/": change = 1151] --- pyvr.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyvr.py b/pyvr.py index cc9349c..ef3fcb0 100644 --- a/pyvr.py +++ b/pyvr.py @@ -81,7 +81,7 @@ class RecordingXML(xml.sax.handler.ContentHandler): self.currec = {} def endElement(self, name): - if name in dataels: + if name in self.dataels: data = unescape(''.join(self.data)) self.currec[self.curel] = data elif name == 'record': @@ -211,6 +211,7 @@ class PYVR(Container): def doCheck(self, x): print 'doCheck:', self.page.status if self.page.status != '200': + print 'foo' return reactor.callLater(.01, self.runCheck) self.lastcheck = time.time() From a8ba9dfe9338436c61a54fc9ceb6e1a28c8d7ab8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 28 Oct 2008 23:21:26 -0800 Subject: [PATCH 173/179] add comment about ps3 not supporting streaming... [git-p4: depot-paths = "//depot/": change = 1215] --- shoutcast.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/shoutcast.py b/shoutcast.py index 12cf51c..bb423ce 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -117,6 +117,7 @@ class ShoutTransfer(shoutcast.ShoutcastClient): request.registerProducer(self, 1) def connectionLost(self, reason): + #traceback.print_stack() log.msg('connectionLost:', `self.request`, `self.passback`) shoutcast.ShoutcastClient.connectionLost(self, reason) if self.request: @@ -193,6 +194,7 @@ class ShoutProxy(resource.Resource): url = self.urls[self.urlpos] self.urlpos = (self.urlpos + 1) % len(self.urls) scheme, host, port, path = _parse(url) + #print `url` protocol.ClientCreator(reactor, ShoutTransfer, request, self.startNextConnection).connectTCP(host, port) @@ -236,6 +238,9 @@ class ShoutProxy(resource.Resource): def render(self, request): request.setHeader('content-type', self.mt) + # XXX - PS3 doesn't support streaming, this makes it think + # that is has data, but it needs to d/l the entire thing. + #request.setHeader('content-length', 1*1024*1024) if request.method == 'HEAD': return '' @@ -343,8 +348,8 @@ class ShoutGenre(MusicGenre): doupdate = True self.pathObjmap[name] = self.cd.addItem(self.id, - ShoutStation, '%sk-%s' % (i['Bitrate'], name), - station = i) + ShoutStation, '%sk-%s' % (i['Bitrate'], name), + station = i) self.sl = stations From cde6a22b8342462600763bb3da35b797c20f0a30 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 28 Oct 2008 23:21:53 -0800 Subject: [PATCH 174/179] add dummy entries for the connectionmanager... I don't think I've seen anyone use it.. [git-p4: depot-paths = "//depot/": change = 1216] --- ConnectionManager.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ConnectionManager.py b/ConnectionManager.py index 6f0203c..6a85986 100644 --- a/ConnectionManager.py +++ b/ConnectionManager.py @@ -10,7 +10,20 @@ from twisted.web import resource, static, soap from upnp import UPnPPublisher class ConnectionManagerControl(UPnPPublisher): - pass + def soap_GetProtocolInfo(self, *args, **kwargs): + log.msg('GetProtocolInfo(%s, %s)' % (`args`, `kwargs`)) + + def soap_PrepareForConnection(self, *args, **kwargs): + log.msg('PrepareForConnection(%s, %s)' % (`args`, `kwargs`)) + + def soap_ConnectionComplete(self, *args, **kwargs): + log.msg('ConnectionComplete(%s, %s)' % (`args`, `kwargs`)) + + def soap_GetCurrentConnectionIDs(self, *args, **kwargs): + log.msg('GetCurrentConnectionIDs(%s, %s)' % (`args`, `kwargs`)) + + def soap_GetCurrentConnectionInfo(self, *args, **kwargs): + log.msg('GetProtocolInfo(%s, %s)' % (`args`, `kwargs`)) class ConnectionManagerServer(resource.Resource): def __init__(self): From 26489987376f1dc0b541217ca93cc344b7984129 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Nov 2008 00:38:57 -0800 Subject: [PATCH 175/179] support different path seps, and also skip directories if they have the isdir attr and it's true.. [git-p4: depot-paths = "//depot/": change = 1223] --- README | 4 ++++ ZipStorage.py | 48 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/README b/README index ac97441..aad1d51 100644 --- a/README +++ b/README @@ -97,6 +97,10 @@ v0.x: so that I can browse the shows I have recorded. Fix transcoding of MPEG-2, use mp2 audio instead of mp3. Sync up the programs in mpegts. + Skip directories in ZipStorage for zip and rar archives. + Support both / and \ as path separators in ZipStorage. RarFile uses + a \ while tar uses /. We count the number of each and use the most + common. v0.3: Include some patches for twisted in the distro, in the directory diff --git a/ZipStorage.py b/ZipStorage.py index 445691a..649268a 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -32,11 +32,14 @@ from twisted.web import http from twisted.web import server from twisted.web import resource -def inserthierdict(d, name, obj): +def inserthierdict(d, name, obj, sep): if not name: return - i = name.find('/') - if i == -1: + + if sep is not None: + i = name.find(sep) + + if sep is None or i == -1: d[name] = obj return @@ -44,15 +47,18 @@ def inserthierdict(d, name, obj): rname = name[i + 1:] # remaining path components try: - inserthierdict(d[dname], rname, obj) + inserthierdict(d[dname], rname, obj, sep) except KeyError: d[dname] = {} - inserthierdict(d[dname], rname, obj) + inserthierdict(d[dname], rname, obj, sep) -def buildNameHier(names, objs): +def buildNameHier(names, objs, sep): ret = {} for n, o in itertools.izip(names, objs): - inserthierdict(ret, n, o) + #Skip directories in a TarFile or RarFile + if hasattr(o, 'isdir') and o.isdir(): + continue + inserthierdict(ret, n, o, sep) return ret @@ -176,7 +182,8 @@ class ZipChildDir(ZipItem, StorageFolder): def __init__(self, *args, **kwargs): self.hier = kwargs['hier'] - del kwargs['hier'] + self.sep = kwargs['sep'] + del kwargs['hier'], kwargs['sep'] ZipItem.__init__(self, *args, **kwargs) del kwargs['zf'], kwargs['zo'], kwargs['name'] StorageFolder.__init__(self, *args, **kwargs) @@ -194,17 +201,19 @@ class ZipChildDir(ZipItem, StorageFolder): self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] + cursep = self.sep for i in children: if i in self.pathObjmap: continue # new object - pathname = os.path.join(self.name, i) + pathname = cursep.join((self.name, i)) if isinstance(self.hier[i], dict): # must be a dir self.pathObjmap[i] = self.cd.addItem(self.id, - ZipChildDir, i, zf = self.zf, zo = self, - name = pathname, hier = self.hier[i]) + ZipChildDir, i, zf=self.zf, zo=self, + name=pathname, hier=self.hier[i], + sep=cursep) else: klass, mt = FileDIDL.buildClassMT(ZipFile, i) if klass is None: @@ -257,6 +266,8 @@ def genZipFile(path): raise class ZipObject(FSObject, StorageFolder): + seps = [ '/', '\\' ] + def __init__(self, *args, **kwargs): '''If a zip argument is passed it, use that as the zip archive.''' path = kwargs['path'] @@ -271,7 +282,16 @@ class ZipObject(FSObject, StorageFolder): def doUpdate(self): # open the zipfile as necessary. self.zip = genZipFile(self.FSpath) - hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) + nl = self.zip.namelist() + cnt = 0 + cursep = None + for i in self.seps: + newsum = sum([ j.count(i) for j in nl ]) + if newsum > cnt: + cursep = i + cnt = newsum + self.sep = cursep + hier = buildNameHier(nl, self.zip.infolist(), cursep) doupdate = False children = sets.Set(hier.keys()) @@ -290,8 +310,8 @@ class ZipObject(FSObject, StorageFolder): if isinstance(hier[i], dict): # must be a dir self.pathObjmap[i] = self.cd.addItem(self.id, - ZipChildDir, i, zf = self.zip, zo = self, - name = i, hier = hier[i]) + ZipChildDir, i, zf=self.zip, zo=self, + name=i, hier=hier[i], sep=cursep) else: klass, mt = FileDIDL.buildClassMT(ZipFile, i) if klass is None: From a12b78c5d8c474a429013be3bc20c5e207b0c6ad Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Nov 2008 01:13:25 -0800 Subject: [PATCH 176/179] fix streaming of shoutcast to the DSM-520.. [git-p4: depot-paths = "//depot/": change = 1224] --- README | 2 ++ shoutcast.py | 1 + 2 files changed, 3 insertions(+) diff --git a/README b/README index aad1d51..ccf0309 100644 --- a/README +++ b/README @@ -101,6 +101,8 @@ v0.x: Support both / and \ as path separators in ZipStorage. RarFile uses a \ while tar uses /. We count the number of each and use the most common. + For ShoutCast streams, override the User-Agent, apparently some/most + stations now block the default one. v0.3: Include some patches for twisted in the distro, in the directory diff --git a/shoutcast.py b/shoutcast.py index bb423ce..762fa2f 100644 --- a/shoutcast.py +++ b/shoutcast.py @@ -110,6 +110,7 @@ class ShoutcastFeedAsync(feeds.ShoutcastFeed): threadable.synchronize(ShoutcastFeedAsync) class ShoutTransfer(shoutcast.ShoutcastClient): + userAgent = 'because you block user-agents' def __init__(self, request, passback): shoutcast.ShoutcastClient.__init__(self) self.request = request From fb51977d1fafd54eee7ce8e5cb01b54e672b18a0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Nov 2008 01:21:35 -0800 Subject: [PATCH 177/179] update about some of the recent changes.. [git-p4: depot-paths = "//depot/": change = 1225] --- README | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README b/README index ccf0309..062b75a 100644 --- a/README +++ b/README @@ -9,7 +9,7 @@ emulation. Since I know Python, I went looking for a python server and found this code. The code was a good framework, so I expanded upon it. -Tested devices and/or programs: +Tested basic functionality with the following devices and/or programs: Cidero UPnP A/V Controller Intel's Media Control Point and Media Renderer D-Link DSM-520 @@ -35,7 +35,13 @@ NOTE: SOAPpy is no longer required as I have included soap_lite from the Coherence project: https://coherence.beebits.net/ . Thanks to Coherence for soap_lite that solved the issues w/ PS3 not seeing -the media server. +the media server. The PS3 with the latest firmware (2.50 and later) now +plays a lot more media than before. It will stream ATSC streams (OTA HD) +w/ AC3 (5.1) audio, but the stream has to have PAT followed by PMT to see +the stream as valid. If it is PAT, PAT, PMT or PMT, PAT, the PS3 will +think the stream is corrupted. Also, if the stream starts out w/ 2 channel +AC3 audio, and later switches to 5.1, you will be stuck w/ 2 channel audio. +Support for WMV and Xvid in AVI seems to work well. For more information, check out the software page at: http://resnet.uoregon.edu/~gurney_j/jmpc/pymeds.html @@ -62,7 +68,8 @@ Ideas for future improvements: Finish support for playing DVD's. Support custom icon like MediaTomb does. Support a generic layer for transcoding, and supporting detection - of types for devices to only present the optimal type. + of types for devices to only present the optimal type. Less of + an issue now the PS3 video support has been expanded. v0.x: Support multiple SSDP servers on the same box. @@ -74,9 +81,8 @@ v0.x: calling tssel.py, we fixup the PAT to only contain the channel we want. This does mean we send more data than we need, but means that we can make the stream seekable. - Now works w/ PS3. The PS3 still has issues as it has limited - codec support (D-Link is better) and does not support AC3 audio - in MPEG-TS streams yet (not even downsampling to stereo PCM). + Now works w/ PS3. The PS3 as of 2.50 supports AC3 audio in + MPEG-TS streams. Add rar file support. This is optional, and if rarfile is not installed, things will work, just not be able to look into rar files. @@ -98,9 +104,6 @@ v0.x: Fix transcoding of MPEG-2, use mp2 audio instead of mp3. Sync up the programs in mpegts. Skip directories in ZipStorage for zip and rar archives. - Support both / and \ as path separators in ZipStorage. RarFile uses - a \ while tar uses /. We count the number of each and use the most - common. For ShoutCast streams, override the User-Agent, apparently some/most stations now block the default one. From 1af6f8ec52899dbc75b5644edfb3b3cc9448bc90 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 7 Nov 2008 01:26:56 -0800 Subject: [PATCH 178/179] remove debug print, and increase the rescan to 10 seconds... [git-p4: depot-paths = "//depot/": change = 1226] --- pyvr.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyvr.py b/pyvr.py index ef3fcb0..bc17645 100644 --- a/pyvr.py +++ b/pyvr.py @@ -188,8 +188,7 @@ class PYVR(Container): if self.pend is not None: raise self.pend - if time.time() - self.lastcheck < 5: - print '<5' + if time.time() - self.lastcheck < 10: return # Check to see if any changes have been made

bw=#*p*;_YKvVzoBfPwxjq{wPgk~uU`)0bV;bS% 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 z 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∾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 ST&q>en%mg4@9JFE{Qm%;aSlxY literal 0 HcmV?d00001 diff --git a/docs/UPnPAvArchtiecture0.83.pdf b/docs/UPnPAvArchtiecture0.83.pdf new file mode 100644 index 0000000000000000000000000000000000000000..262845b32a5c3cd137521fe27d507a39797b2545 GIT binary patch literal 197860 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%0D~V0IOtjEo(Mi&(=swJ z&`CHMSeY9M*qB;9%@cjXBWhr6ZsktVm0lA%K>6brB_{_HCnGaDSz8Bd1FIiDsXbF+ zrvGC`=JOQM=fMR(1o2cGorsN*t+Ba{DV>_Rjew1#`9Jr92972_awwZyn>fmvxGLIO z8`#Jz(F)pH89#An?%?PoWM<&-#G$mo&ua!|RyrkTL#L;~8_EvOCjSunEk=O2o>yyC zGdFfJbJSvFd78TV=N}Uj6T#E*{M*yjQyxY(c7Vp{|BsH}rJw6yV`L;?Wo09HI{&%` z%ts|)1JwC+FtI;r{^{x|7Y8%*bIzxGKrTQEpd1Se>tA&MfjDDyMr2Y{c<|4r+EzXQ~x^V`N5=${z+ zzc+(_toq;e&dTw>>Yd|B#)<$#dsaJu_dl^S0CwSf;`muI&+2}e=7WGTJ^KKpKE@~^HkT9^q*w=OZCqh{ZaZUKOp7l`cHbl zu7Bw4r*?i_|HAon&j={{bUf+x>HLqLpUV6^p7{Hb4&dR(Z$B;Smj(Tz_5X7IVV?hU zK{h6~zYOE|!pi?N+y4ju@a(ewvxi`0_+Kpr;8Xv!l>g=+{$%Ty`}om*{%Ijkch6FM zzWTGovn@Q^$bWCU^glH9EB}+#{HPhAv0vqWrTsoX)A-Te0d$|vzcl!4oxg1EM@|1= z{L#h%?ff~6v2!r|8K7AIbAU?Jw9t0AL3~N#>#42HNzx_#zXdC{ zzk}89^%VZa7$uAW5z^eromQOgpExBTFC;7`L#^a)ZD{)xe*XzWfLKKT6ST1bAbrZm>4kj)DT+eR%nH&l>iTCYzk70MWxZAnNyub8qU>AQo zi+m*;x}F}XHD8;>BHK}q?d@mI08#glzaaeXTM5}diHe=>-#BOc6ABw6{ZA-Ah05^M z<`jPl^+#k@{3(=Y3DZ482CSg*l0aVekkiN$SiCue<_RU8Syg| z_jji8fg?SkJ#0cCH|4qzsXH)>EfcQ;B16oKTFf!9n9UBpZ*yovX8g)jFwr$!l6}D^GL5s|ae1>M(4N38R^9F`lp~=%2 z&?g3&IZJG*!oF=2`HPX?q5mJ*|G~߳~&oTvcc7MyX;FUzLiW7o8sJ6B)F{8e& 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 Y. Y. Goland, Microsoft + Expires April, 2000 September 6, 2000 + + General Event Notification Architecture Base: Client to Arbiter + + Status of this memo + + This document is an Internet-Draft and is in full conformance with all + provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Engineering Task + Force (IETF), its areas, and its working groups. Note that other + groups may also distribute working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet- Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + Please send comments to the SSDP mailing list. Subscription information + for the SSDP mailing list is available at + http://www.upnp.org/resources/ssdpmail.htm. + + Abstract + + This document provides for the ability to send and receive + notifications using HTTP over TCP/IP and administratively scoped + unreliable multicast UDP. Provisions are made for the use of + intermediary arbiters, called subscription arbiters, which handle + routing notifications to their intended destination. + + 1 Introduction + + This document provides for the sending of HTTP Notifications using + administratively scoped unreliable Multicast UDP. Multicast UDP is + useful in that it allows a single notification to be delivered to a + potentially large group of recipients using only a single request. + + However administrative scoped unreliable Multicast UDP suffers from a + number of problems including: how to route it, how to handle + firewalling and how to deal with multiple scopes. This document only + addresses the use of Multicast UDP within a single administrative scope + and only countenances its use for scenarios where there is no + notification proxy. + + In order to allow for notifications to be distributed beyond a single + administrative multicast scope it is necessary to provide for relaying + + Cohen et al. [Page 1] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + arbiters. These arbiters, called subscription arbiters, are able to + form, through an unspecified mechanism, relationships with other + subscription arbiters in order to distribute notifications. This allows + a client to send a single HTTP notification to its subscription arbiter + and have that notification forwarded on to one or more recipients. It + is the subscription arbiter, not the client, who is responsible for + maintaining the list of potential recipients and distributing + notifications to those recipients. + + In order for subscription arbiters to know to whom to distribute + notifications clients who wish to receive notifications, known as + subscribers, must subscribe to the subscription arbiter. + + 2 Changes + 2.1 Since V00 + [Ed. Note: Aren’t there times when the service needs to hear the + subscriptions? When the identity of the subscriber will effect the + output? Of course… Notification identifiers must be explicit in the + notification, not implicit as a function of the address.] + [Ed. Note: We need to look into adding support for sequence numbers on + events, this is needed for things like UPnP. If this doesn't end up + effecting how the arbiter works then we should put it into a separate + draft.] + [Talk about the scope header having values other than the URL of the + resource, we are using the UPnP example where you would put the USN + value into the scope. Everyone needs to pay attention to the scope + header!!!!] + [Add a note that if no Scope header is included then the default is to + treat the Request-URI as the scope.] + [What do you do if someone subscribes to something they are already + subscribed to? The question is tricky because, short of using + authentication, you don’t know who “someone” is and even then, because + multiple programs may be running, you can’t be sure if you are really + talking to the same person. My instinct would be to just give them a + second parallel subscription.] + [Think REALLY hard about allowing for multiple values in a NT header] + + 3 Definitions + + 3.1 Event + + Any occurrence that may potentially trigger a notification. + + 3.2 Subscription + + An established relationship in which a resource has indicated interest + in receiving certain notifications. + + 3.3 Subscriber + + A resource that negotiates a subscription with a subscription arbiter. + + + Cohen et al. [Page 2] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + 3.4 Implied Subscriber + + A resource that did not negotiate a subscription with a subscription + arbiter but will still be notified of events on that arbiter. + + 3.5 Notifying Resource + + A resource that issues notifications, for example, a subscription + arbiter. + + 3.6 Subscription Arbiter + + A resource that accepts subscriptions, receives notifications and + forwards those notifications to its subscribers. + + 3.7 Notification + + A message sent by a notifying resource to provide notification of an + event. + + 3.8 Notification Type + + A mechanism to classify notifications into categories. This allows + subscribers to specify exactly what class of notifications they want to + receive. It also allows notifying resources to specify what class of + notification they are sending out. + + Notification types do not necessarily identify a single event but + rather identify a group of related notifications. The notification sub- + type is used to specify a particular event. + + 3.9 Notification Sub-Type + + Identification of a particular event within a notification type. + + For example, the fictional notification of type home:doors may contain + notification sub-types such as door:open, close:door, etc. + + There is no requirement that the URI identifying the notification type + and the URI identifying the notification sub-type have a syntactic + relationship, only a semantic one. + + 3.10 Subscription ID + + A unique identifier for a subscription. Subscription Ids MUST be URIs + and MUST be unique across all subscriptions across all resources for + all time. + + 3.11 Scope + + Scopes are used in a subscription to indicate the notifying resource + the subscriber is interested in. + + Cohen et al. [Page 3] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + + 4 Notification Model + + [Ed. Note: Aren’t there times when the service needs to hear the + subscriptions? When the identity of the subscriber will effect the + output? Of course… Notification identifiers must be explicit in the + notification, not implicit as a function of the address.] + + [Ed. Note: We need to look into adding support for sequence numbers on + events, this is needed for things like UPnP. If this doesn't end up + effecting how the arbiter works then we should put it into a separate + draft.] + + The notification model for GENA is based on the following picture: + + [Subscriber] <- [1+ Subscription Arbiters] <- [Notifying Resource] + Notification Request Notification Request + -> + Subscription Request + + Subscribers send subscription requests to their subscription arbiter. + The arbiter will then forward to the subscriber any notifications it + receives which match the subscriber's subscription. + + Notifying resources send notifications to their subscription arbiter to + be passed on to subscribers. + + Subscription arbiters communicate with each other in order to pass + along notifications and subscriptions. Subscription arbiter to + subscription arbiter communication is out of scope for this + specification. + + For the purposes of this protocol all communication is between + subscribers/notifying resources and their subscription arbiter. This + does not preclude direct communication between a subscriber and a + notifying resource. Rather it means that the notifying resource is + acting as a subscription arbiter. + + This document also deals with a degenerate case where no subscription + arbiter is available but administratively scoped unreliable multicast + UDP facilities are. In that case provisions are made to allow a + notifying resource to send its notifications directly to a previously + agreed upon administratively scoped multicast UDP address where + interested resources can listen in to the notification. + + 4.1 Sending HTTP Notifications through a Subscription Arbiter + + A notifying resource finds its subscription arbiter through an + unspecified mechanism. The notifying resource will send all of its + notifications to the subscription arbiter who will then forward those + subscriptions on to subscribers. + + + Cohen et al. [Page 4] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + This document does not provide a mechanism by which the notifying + resource can retrieve information about which resources have subscribed + to receive notifications from the notifying resource. + + 4.2 Receiving HTTP Notifications through a Subscription Arbiter + + A subscribing resource finds its subscription arbiter through an + unspecified mechanism. It is the responsibility of the subscribing + resource to send subscription requests to the subscription arbiter in + order to inform the arbiter as to which notifications the subscriber + would like to receive. + + A subscription request can be thought of as a persistent search filter + on the set of notifications that the subscription arbiter is aware of. + Whenever the subscription arbiter receives a notification that matches + the search filter it will forward the notification to the subscriber. + + This document defines a very basic search filter that allows a + subscribing resource to specify a particular resource and a type of + notification the subscribing resource is interested in. Whenever a + notification of the specified type is made by the specified resource + the subscription arbiter will forward the notification to the + subscriber. + + 5 Subscription Arbiters and Forwarded Notifications + + When forwarding a notification the subscription arbiter will change the + Request-URI and the Host header value to match the subscriber who is to + be notified. Subscription arbiters MUST NOT make any other changes to + be made to the message unless the definition of the header or body + element specifically provides for such alteration and/or for security + reasons. + + 6 Stuff + In the case where a subscriber sends a subscription request to an + arbiter: Is it OK if the arbiter rejects subscription requests that + don't match certain notification type criteria? or should the arbiter + be totally unaware of any notification types at this point? + In the case where a notifying resource sends a notify request to an + arbiter: Is it OK if the arbiter rejects notification requests that + don't match certain notification type criteria? or should the arbiter + just accept the notification request and filter the available + subscriptions taking the notification type as criteria? + In the hypothetical case where the arbiter just accepted subscriptions + of certain types, could an arbiter just be dedicated to one + subscription type? If the previous statement was affirmative then the + existence of a notification type for that particular arbiter wouldn't + even make sense right? + + We need to discuss the implicit relationship between an arbiter and its + subscribers, all the unstated assumptions. + + + Cohen et al. [Page 5] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + The subscription server may not necessarily have been the one who + created a SID, it could have been the service who is using the + subscription server to do replication. In that case a subscription + request could come in with a SID on it, a ref-counted SID. But this bug + me because a SID indicates a relationship. How does one change one’s + call back for a SID? Especially if you want to send in the change + command from somewhere other than the place receiving the notification + so you can’t just check the address on the packet. Do we need tow types + of SIDs? I don’t just want to overload NT. I think NT and NTS should be + left alone to just give notification type. They shouldn’t be overloaded + to also provide functional information… functional is the wrong word. + They shouldn’t be overloaded to provide routing information. + Event type. + Event Sub-type. + Event group (if any). + Individual subscription. + + The problem is that the last two are not always both necessary. For + example, an individual subscription ID is not necessary if the events + are only sent to a multicast group. Additionally the event group ID + isn’t necessary if the event only goes to a single end point. + Maybe we need an end point identifier? We need a way to say “Stop + sending the events to this call-back, send it to this other call-back.” + THIS ISN’T GOOD ENOUGH. What if two programs are both at the same call- + back? You need ref counting. + I guess what I’m trying to avoid is implicit ref-counting, I would + rather have explicit ref-counting. That is, I would like the ref count + to be included in each request in the person of an ID that is unique to + every listener, this is independent of call-back address. + + + Make sure that if you leave off the NT then this means you want to + receive all notifications from the identified scope. + + Also make sure that we can use scope as a selector for video streams on + a video server. + + We need to add a “connect and flood” mechanism such that if you connect + to a certain TCP port you will get events. There is no + subscribe/unsubscribe. We also need to discuss this feature for + multicasting. If you cut the connection then you won’t get any more + events. + + 7 NOTIFY HTTP Method + + The NOTIFY method is used to transmit a notification. The Request-URI + of the notification method is the notifying resource's subscription + arbiter who will handle forwarding the message to interested + subscribers. + + The NOTIFY method may be sent using unreliable administrative scoped + multicast UDP as specified in [HTTPMU]. In such a case the multicast + + Cohen et al. [Page 6] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + channel is treated as the subscription arbiter. When a NOTIFY is sent + using multicast UDP as a transport there is no response. + + The NOTIFY method MUST contain a NT header and MAY contain a body, a + NTS header and SID. Subscribers MAY ignore the body in a subscription + request. Subscription arbiters MAY remove and/or alter the value of the + SID header in order to set it to the value that their subscriber is + expecting. Note that in general notifying resources will not put SID + headers on their notifications. This is generally a value that + subscription arbiters add. + + Note that notifications to implied subscribers may not necessarily have + SIDs. The client can tell the subscription arbiter to stop sending the + notification by returning a 412 (Precondition Failed). + + 7.1 Response Codes + + 200 (OK) - This is the standard response to a NOTIFY received by a + subscriber. + + 202 (Accepted) - This is the standard response to a NOTIFY received by + a subscription arbiter. + + 412 (Precondition Failed) - The client doesn't recognize the SID or the + request doesn't have a SID and the client doesn't want to receive the + notification. + + 7.2 Examples + + 7.2.1 TCP/IP + + NOTIFY /foo/bar HTTP/1.1 + Host: blah:923 + NT: ixl:pop + NTS: clock:bark + SID: uuid:kj9d4fae-7dec-11d0-a765-00a0c91e6bf6 + + HTTP/1.1 200 O.K. + + A notification of type ixl:pop sub-type clock:bark has been sent out in + response to the specified subscription. The request-URI could either + identify a particular resource who is to be notified or a subscription + arbiter who will then take responsibility for forwarding the + notification to the appropriate subscribers. + + 7.2.2 Multicast UDP + + NOTIFY * HTTP/1.1 + Host: somemulticastIPaddress:923 + NT: ixl:pop + NTS: clock:bark + + + Cohen et al. [Page 7] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + As in the previous example this is a notification of type ixl:pop sub- + type clock:bark but it has been sent out to the multicast channel as an + unsolicited notification. Hence it does not have a SID header. Also, + because it was sent out to a multicast UDP channel it also doesn’t have + a response. + + 8 SUBSCRIBE HTTP Method + + [Talk about the scope header having values other than the URL of the + resource, we are using the UPnP example where you would put the USN + value into the scope. Everyone needs to pay attention to the scope + header!!!!] + + The SUBSCRIBE method is used to provide a subscription arbiter with a + search filter to be used in determining what notifications to forward + to the subscriber. + + The Request-URI of the SUBSCRIBE method specifies the subscription + arbiter which will handle the subscription. + + A SUBSCRIBE request MUST have a NT header unless it is a re- + subscription request. The NT header specifies what sort of notification + the subscriber wishes to be notified of. + + A SUBSCRIBE request MUST have a Call-Back header unless it is a re- + subscription request. The Call-Back header specifies how the subscriber + is to be contacted in order to deliver the notification. + + A SUBSCRIBE method MUST NOT have a NTS header. The base subscription + search filter only supports filtering on the NT value of a + notification. This limitation is meant to keep the subscription + functionality at the minimum useful level. It is expected that future + specifications will provide for more flexible subscription search + filters. + + A SUBSCRIBE method MUST have a scope header unless it is a re- + subscription request. The scope header identifies the resource that the + subscriber wishes to receive notifications about. + + The Timeout request header, whose syntax is defined in section 9.8 of + [WEBDAV] MAY be used on a SUBSCRIBE request. The header is used to + request that a subscription live for the specified period of time + before having to be renewed. Subscription arbiters are free to ignore + this header. + + A subscription arbiter MUST ignore the body of a SUBSCRIBE request if + it does not understand that body. + + A successful response to the SUBSCRIBE method MUST include a Timeout + response header and a SUBID header. + + + + Cohen et al. [Page 8] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + [Add a note that if no Scope header is included then the default is to + treat the Request-URI as the scope.] + + [What do you do if someone subscribes to something they are already + subscribed to? The question is tricky because, short of using + authentication, you don’t know who “someone” is and even then, because + multiple programs may be running, you can’t be sure if you are really + talking to the same person. My instinct would be to just give them a + second parallel subscription.] + + 8.1 Re-Subscribing + + When the period of time specified in the Timeout response header passes + the subscription MAY expire. In order to keep the subscription alive + the subscriber MUST issue a SUBSCRIBE method with a SID header set to + the subscription to be re-subscribed. A re-subscribe request MUST NOT + have a NT header but it MAY have a Timeout and/or a Call-Back header. + + Note that the value in the Timeout response header will not take into + account the time needed from when the value was generated until it was + passed through the arbiter, put on the wire, sent to the subscriber, + parsed by the subscriber’s system and finally passed to the + subscriber’s program. Hence the value should be taken as an absolute + upper bound. Subscribers are encouraged to re-subscribe a good period + of time before the actual expiration of the subscription. + + 8.2 Response Codes + + 200 (OK) - The subscription request has been successfully processed and + a subscription ID assigned. + + 400 (Bad Request) - A required header is missing. + + 412 Precondition Failed - Either the subscription arbiter doesn't + support any of the call-backs, doesn't support the NT or doesn't + support the scope. This code is also used on resubscription requests to + indicate that the subscription no longer exists. + + 8.3 Examples + + 8.3.1 Subscription + + SUBSCRIBE dude HTTP/1.1 + Host: iamthedude:203 + NT: ixl:pop + Call-Back: + Scope: http://icky/pop + Timeout: Infinite + + HTTP/1.1 200 O.K. + Subscription-ID: uuid:kj9d4fae-7dec-11d0-a765-00a0c91e6bf6 + Timeout: Second-604800 + + Cohen et al. [Page 9] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + + This subscription request asks the subscription arbiter + http://iamthedude/dude:203 for a subscription on notifications of type + ixl:pop from the resource http://icky/pop. + + 8.3.2 Re-Subscription + + SUBSCRIBE dude HTTP/1.1 + Host: iamthedude:203 + Subscription-ID: uuid:kj9d4fae-7dec-11d0-a765-00a0c91e6bf6 + Timeout: Infinite + + HTTP/1.1 200 O.K. + Subscription-ID: uuid:kj9d4fae-7dec-11d0-a765-00a0c91e6bf6 + Timeout: Second-604800 + + The subscription has been successfully renewed. + + 9 UNSUBSCRIBE HTTP Method + + The UNSUBSCRIBE method is used to terminate a subscription. The + UNSUBSCRIBE method MUST include a SID header with the value of the + subscription to be un-subscribed. + + If the SID identifies a subscription that the subscription arbiter does + not recognize or knows is already expired then the arbiter MUST respond + with a 200 (OK). + + 9.1 Response Codes + + 200 (OK) - Unsubscribe succeeded. + + 412 (Precondition Failed) – The SID was not recognized. + + 9.2 Example + + UNSUBSCRIBE dude HTTP/1.1 + Host: iamtheproxy:203 + SID: uuid:kj9d4fae-7dec-11d0-a765-00a0c91e6bf6 + + HTTP/1.1 200 O.k. + + 10 New HTTP Headers + + 10.1 NT Header + + [Think REALLY hard about allowing for multiple values in a NT header] + + The NT header is used to indicate the notification type. + + NT = "NT" ":" absoluteURI ; See section 3 of [RFC2396] + + + Cohen et al. [Page 10] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + 10.2 NTS Response Header + + The NTS response header is used to indicate the notification sub-type + of a notification. + + NTS = "NTS" ":" absoluteURI + + 10.3 Call-Back Header + + The Call-Back header specifies, in order of preference, the means the + subscriber would like the subscription arbiter to use to deliver + notifications. + + Call-Back = "Call-Back" ":" *Coded-URI; See section 9.4 of [WEBDAV] + + 10.4 Timeout Response Header + + The Timeout response header has the same syntax as the Timeout request + header defined in section 9.8 of [WEBDAV]. The subscription arbiter + informs the subscriber how long the subscription arbiter will keep + their subscription active without a re-subscribe using the Timeout + response header. + + 10.5 SID Header + + The SID header contains a subscription ID. + + SID = "SID" ":" absoluteURI + + 10.6 Scope Request Header + + The scope request header indicates the resource the subscriber wishes + to receive notifications about. + + SCOPE = "Scope" ":" absoluteURI + + 11 Future Work + + This specification defines a minimally useful set of notification + functionality. It does not, however, address three critical issues that + are needed by some notification environments. It is expected that all + of these features can be provided in extension specifications to this + base specification. + + The first issue is polling. In some environments, especially those with + intermittent connectivity, it would be desirable for subscription + arbiters to be able to pool up notifications and then to deliver them + when the subscriber asks for them. + + The second issue is subscription arbiter to subscription arbiter + communication. It is likely that subscription arbiters will want to + communicate directly with each other in order to efficiently distribute + + Cohen et al. [Page 11] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + notifications and subscriptions. This requires provision for + notification routing and loop prevention. + + The third issue is support for depth functionality. In some systems one + wishes to receive a notification about a resource and any of its + children as the term is defined in [WEBDAV]. + + 12 Security Considerations + + TBD. + + [Notes: + The really horrible security concerns don't start until you build the + subscription arbiter to arbiter protocol. Otherwise the arbiter is very + close to a proxy in that it takes confidential information from a + subscriber and/or notifying resource and is expected to do the right + thing (TM) with it. Authentication and such prevents bogus + notifications and subscriptions. + + Another problem is if someone sends in a subscription request with the + call-back pointing at someone else. This could be used for a denial of + service attack. Arbiters should authenticate subscribers and probably + the call-back points as well.] + + 13 Acknowledgements + Jesus Ruiz-Scougall (Exchange) + Erik Christensen (VB) (Exchange) + Ting Cai + 14 IANA Considerations + + None. + + 15 Copyright + + The following copyright notice is copied from RFC 2026 [Bradner, 1996], + Section 10.4, and describes the applicable copyright for this document. + + Copyright (C) The Internet Society February 10, 1998. All Rights + Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it or + assist in its implementation may be prepared, copied, published and + distributed, in whole or in part, without restriction of any kind, + provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing the + copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of developing + Internet standards in which case the procedures for copyrights defined + in the Internet Standards process must be followed, or as required to + translate it into languages other than English. + + Cohen et al. [Page 12] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assignees. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL + NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR + FITNESS FOR A PARTICULAR PURPOSE. + + 16 Intellectual Property + + The following notice is copied from RFC 2026 [Bradner, 1996], Section + 10.4, and describes the position of the IETF concerning intellectual + property claims made against this document. + + The IETF takes no position regarding the validity or scope of any + intellectual property or other rights that might be claimed to pertain + to the implementation or use other technology described in this + document or the extent to which any license under such rights might or + might not be available; neither does it represent that it has made any + effort to identify any such rights. Information on the IETF's + procedures with respect to rights in standards-track and standards- + related documentation can be found in BCP-11. Copies of claims of + rights made available for publication and any assurances of licenses to + be made available, or the result of an attempt made to obtain a general + license or permission for the use of such proprietary rights by + implementers or users of this specification can be obtained from the + IETF Secretariat. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary rights + which may cover technology that may be required to practice this + standard. Please address the information to the IETF Executive + Director. + + 17 References + + [WEBDAV] + + [Bradner, 1996] S. Bradner, "The Internet Standards Process - Revision + 3." RFC 2026, BCP 9. Harvard University. October, 1996. + + [HTTPMU] + + [HTTP11] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, L. Masinter, + P. Leach and T. Berners-Lee. Hypertext Transfer Protocol – HTTP/1.1. + Internet Draft – Work in Progress. http://www.ietf.org/internet- + drafts/draft-ietf-http-v11-spec-rev-06.txt, November 18, 1998. + + [RFC2396] http://www.rfc-editor.org/rfc/rfc2396.txt + + Cohen et al. [Page 13] + + INTERNET-DRAFT GENA Base September 6, 2000 + + + + 18 Authors' Addresses + + Josh Cohen, Sonu Aggarwal, Yaron Y. Goland + Microsoft Corporation + One Microsoft Way + Redmond, WA 98052-6399 + + Email: {joshco,sonuag,yarong}@microsoft.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cohen et al. [Page 14] + \ No newline at end of file diff --git a/docs/draft-goland-fxpp-01.txt b/docs/draft-goland-fxpp-01.txt new file mode 100644 index 0000000..78f194b --- /dev/null +++ b/docs/draft-goland-fxpp-01.txt @@ -0,0 +1,348 @@ + + +UPnP Forum Technical Committee Yaron Y. Goland +Document: draft-goland-fxpp-01.txt CrossGain + Jeffrey C. Schlimmer + Microsoft Corporation + 19 June 2000 + + + Flexible XML Processing Profile (FXPP) + + +Status of this Memo + + This document is under review by the UPnP Forum Technical Committee. + It was previously submitted to the IETF as an Internet Draft and has + expired. This document is formatted in a manner consistent with the + IETF formatting guidelines to facilitate possible future + consideration by the IETF. + + This document is available on http://www.upnp.org. + + +Abstract + + This document provides an independent reference for the XML + processing profile developed by the WebDAV WG in [RFC2518]. It does + this by copying Section 14 and Appendix 4 as well as examples from + Appendix 3 of [RFC2518] and editing out any WebDAV specific parts. + + This document also defines handling of unknown XML attributes. + + This information has been broken out into its own independent + reference in order to make it easier for other standards to + reference just the WebDAV XML processing profile without having to + reference the entire WebDAV standard or require their readers to + understand which parts of the profile are WebDAV specific and which + parts are not. + +1. Introduction + + This document provides an independent reference for the XML + processing profile developed by the WebDAV WG in [RFC2518]. It does + this by copying Section 14 and Appendix 4 as well as examples from + Appendix 3 of [RFC2518] and editing out any WebDAV specific parts. + + This document also defines handling of unknown XML attributes. + + This information has been broken out into its own independent + reference in order to make it easier for other standards to + reference just the WebDAV XML processing profile without having to + reference the entire WebDAV standard or require their readers to + understand which parts of the profile are WebDAV specific and which + parts are not. + + + +Goland, Schlimmer 1 +UPnP Forum FXPP 19 June 2000 + + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in + this document are to be interpreted as described in [RFC2119]. + +2. XML Support Requirement + + All FXPP compliant systems MUST support [XML]. + +3. XML Ignore Rule + + All FXPP compliant XML processors (a) MUST ignore any unknown XML + element and all its children, and (b) MUST ignore any unknown XML + attribute and its value. This rule may be overridden on an element- + by-element or attribute-by-attribute basis, but implementers should + be aware that systems unfamiliar with the element or attribute will + follow the ignore rule. + +4. XML Mime Type Support + + A FXPP compliant system MUST be able to both accept and send + text/xml and application/xml. + +5. Ordering of XML Elements + + Unless the definition of a XML element explicitly specifies + otherwise the ordering of XML elements has no semantic significance + to FXPP compliant systems. + + Note to Implementers - A generic FXPP compliant XML processor will + not know which of the elements it is processing have meaningful + ordering. As such, such processors need to maintain the order of + the elements when presenting the parsed information so as not to + loose any meaningful data. + +6. XML Namespace Support + + All FXPP compliant systems MUST support the XML namespace extensions + as specified in [REC-XML-NAMES]. + + FXPP compliant XML processors MUST interpret a qualified name as a + URI constructed by appending the LocalPart to the namespace name + URI. + + Example + + + + Johnny Updraft + + + + + + +Goland, Schlimmer 2 +UPnP Forum FXPP 19 June 2000 + + + In this example, the qualified element name "del:glider" is + interpreted as the URL "http://www.del.jensen.org/glider". + + + + Johnny Updraft + + + + + Even though this example is syntactically different from the + previous example, it is semantically identical. Each instance of + the namespace name "bar" is replaced with + "http://www.del.jensen.org/" and then appended to the local name for + each element tag. The resulting tag names in this example are + exactly the same as for the previous example. + + + + Johnny Updraft + + + + + This example is semantically identical to the two previous ones. + Each instance of the namespace name "foo" is replaced with + "http://www.del.jensen.org/glide" which is then appended to the + local name for each element tag, the resulting tag names are + identical to those in the previous examples. + +7. XML Element Declaration Syntax + + The following format is recommended for FXPP compliant + specifications as a means to provide uniform declaration of XML + elements. + + Name: + Namespace: + Purpose: + Value: + + DTD + + The name is the name of the XML element. The Namespace is the + namespace the element belongs to. The purpose is a short + description of the use of the XML element. As DTDs are not very + good at expressing the format of characters inside of an XML element + when an XML element needs to contain formatted pcdata the optional + Value description will be used to provide a BNF for the character + data. At the end of the template is the ELEMENT DTD declaration for + the element. + +8. Notes on Empty XML Elements + +Goland, Schlimmer 3 +UPnP Forum FXPP 19 June 2000 + + + + XML supports two mechanisms for indicating that an XML element does + not have any content. The first is to declare an XML element of the + form . The second is to declare an XML element of the form + . The two XML elements are semantically identical. + + It is a violation of the XML specification to use the form + if the associated DTD declares the element to be EMPTY (e.g., + ). If such a statement is included, then the + empty element format, must be used. If the element is not + declared to be EMPTY, then either form or may be used + for empty elements. + +9. Notes on Illegal XML Processing + + XML is a flexible data format that makes it easy to submit data that + appears legal but in fact is not. The philosophy of "Be flexible in + what you accept and strict in what you send" still applies, but it + must not be applied inappropriately. XML is extremely flexible in + dealing with issues of white space, element ordering, inserting new + elements, etc. This flexibility does not require extension, + especially not in the area of the meaning of elements. + + There is no kindness in accepting illegal combinations of XML + elements. At best it will cause an unwanted result and at worst it + can cause real damage. + +9.1. Example - XML Syntax Error + + The following request body for a WebDAV PROPFIND method is illegal. + + + + + + + + The definition of the propfind element only allows for the allprop + or the propname element, not both. Thus the above is an error and + must be responded to with a 400 (Bad Request). + + Imagine, however, that a server wanted to be "kind" and decided to + pick the allprop element as the true element and respond to it. A + client running over a bandwidth limited line who intended to execute + a propname would be in for a big surprise if the server treated the + command as an allprop. + + Additionally, if a server were lenient and decided to reply to this + request, the results would vary randomly from server to server, with + some servers executing the allprop directive, and others executing + the propname directive. This reduces interoperability rather than + increasing it. + + +Goland, Schlimmer 4 +UPnP Forum FXPP 19 June 2000 + + +9.2. Example - Unknown XML Element + + The previous example was illegal because it contained two elements + that were explicitly banned from appearing together in the propfind + element. However, XML is an extensible language, so one can imagine + new elements being defined for use with propfind. Below is the + request body of a PROPFIND and, like the previous example, must be + rejected with a 400 (Bad Request) by a server that does not + understand the expired-props element. + + + + + + + To understand why a 400 (Bad Request) is returned let us look at the + request body as the server unfamiliar with expired-props sees it. + + + + + + As the server does not understand the expired-props element, + according to the WebDAV-specific XML processing rules specified in + section 14 of [RFC 2518], it must ignore it. Thus the server sees + an empty propfind, which by the definition of the propfind element + is illegal. + + Please note that had the extension been additive it would not + necessarily have resulted in a 400 (Bad Request). For example, + imagine the following request body for a PROPFIND: + + + + + *boss* + + + The previous example contains the fictitious element leave-out. Its + purpose is to prevent the return of any property whose name matches + the submitted pattern. If the previous example were submitted to a + server unfamiliar with leave-out, the only result would be that the + leave-out element would be ignored and a propname would be executed. + +10. References + + [RFC2119] S. Bradner. Key words for use in RFCs to Indicate + Requirement Levels. RFC 2119, March 1997. + + + +Goland, Schlimmer 5 +UPnP Forum FXPP 19 June 2000 + + + [RFC2068] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, and T. + Berners-Lee. Hypertext Transfer Protocol -- HTTP/1.1. RFC 2068, + January 1997. + + [RFC2158] Y. Goland, E. Whitehead, A. Faizi, S. Carter, and D. + Jensen. HTTP Extensions for Distributed Authoring WEBDAV. RFC 2518, + February 1999. + + [XML] T. Bray, J. Paoli, C. M. Sperberg-McQueen, "Extensible Markup + Language (XML)." World Wide Web Consortium Recommendation REC-xml- + 19980210. http://www.w3.org/TR/1998/REC-xml-19980210. + +11. Author's Addresses + + Yaron Y. Goland + CrossGain + 2039 152nd Avenue NE + Redmond, WA 98052 + + + Jeffrey C. Schlimmer + Microsoft Corporation + One Microsoft Way + Redmond, WA 98052 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Goland, Schlimmer 6 \ No newline at end of file diff --git a/docs/draft-goland-http-udp-04.txt b/docs/draft-goland-http-udp-04.txt new file mode 100644 index 0000000..6296a05 --- /dev/null +++ b/docs/draft-goland-http-udp-04.txt @@ -0,0 +1,928 @@ + + +UPnP Forum Technical Committee Yaron Y. Goland +Document: draft-goland-http-udp-04.txt CrossGain + Jeffrey C. Schlimmer + Microsoft + 02 October 2000 + + + Multicast and Unicast UDP HTTP Messages + + +Status of this Memo + + This document is under review by the UPnP Forum Technical Committee. + It was previously submitted to the IETF as an Internet Draft and has + expired. This document is formatted in a manner consistent with the + IETF formatting guidelines to facilitate possible future + consideration by the IETF. + + This document is available on http://www.upnp.org. + +Abstract + + This document provides rules for encapsulating HTTP messages in + multicast and unicast UDP packets to be sent within a single + administrative scope. No provisions are made for guaranteeing + delivery beyond re-broadcasting. + +1. Introduction + + This document provides rules for encapsulating HTTP messages in + multicast and unicast UDP messages. No provisions are made for + guaranteeing delivery beyond re-broadcasting. + + This technology is motivated by applications such as SSDP where it + is expected that messages which are primarily transmitted over TCP + HTTP need to be transmitted over Multicast or Unicast UDP, because + of the unique requirements of extremely lightweight servers. + + This document will not specify a mechanism suitable for replacing + HTTP over TCP. Rather this document will define a limited mechanism + only suitable for extreme circumstances where the use of TCP is + impossible. Thus this mechanism will not have the robustness of + functionality and congestion control provided by TCP. It is expected + that in practice the mechanisms specified here in will only be used + as a means to get to TCP based HTTP communications. + +2. Changes + +2.1. Since 00 + + Divided each section of the spec into three parts, problem + definition, proposed solution and design rationale. When the spec is + ready for standardization the problem definition and design + rationale sections will be removed. Design rationale is presented in + +Goland, Schlimmer 1 +UPnP Forum UDP HTTP 24 Aug 2000 + + + question/answer form because I have found that to be very effective + in addressing design issues. + + Clarified that a HTTPU/HTTPMU URI without an abs_path translates to + "*" in the request-URI. + + Added the S header to allow request and responses to be associated. + Note that while clients aren't required to send out S headers, + servers are required to return them. + + Got rid of MM. The lower bound is always 0. + + The introduction of the S header makes proxying and caching possible + so the sections on those topics have been expanded, but they should + be considered experimental at best. + +2.2. Since 02 + + Added requirement for HTTP/1.1 as the version identifier in the + request line. (See section on HTTP Version in Request Line.) + + Removed requirement that requests without an S header MUST NOT be + responded to. (See section on Unicast UDP HTTP Messages.) + + Clarified that a server should respond to each request it receives + but not duplicate those responses. (See section on Retrying + Requests.) + + Clarified caching when responding to repeated requests. (See section + on Caching.) + + Expanded that if a server has > 1 response per HTTPMU request, it + should spread them out. (See section on MX header.) + + Tied behavior of duplicate responses with the same S header value to + the semantics of the method (was discard duplicates). (See section + on S header.) + + Outlined initial security considerations. (See section on Security.) + +2.3. Since 03 + Clarified the "no abs_path" requirement for HTTPU/HTTPMU request- + URIs. + + Clarified use of "*" as a request-URI. + + Removed requirement for HTTPU/HTTPMU servers to support "chunked" + transfer-coding. + +3. Terminology + + Since this document describes a set of extensions to the HTTP/1.1 + protocol, the augmented BNF used herein to describe protocol + +Goland, Schlimmer 2 +UPnP Forum UDP HTTP 24 Aug 2000 + + + elements is exactly the same as described in section 2.1 of + [RFC2616]. Since this augmented BNF uses the basic production rules + provided in section 2.2 of [RFC2616], these rules apply to this + document as well. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC2119]. + +4. HTTPU URL + +4.1. Problem Definition + + A mechanism is needed to allow for communications that are to be + sent over Unicast UDP HTTP to be identified in the URI namespace. + +4.2. Proposed Solution + + The HTTPU URL specifies that the HTTP request be sent over unicast + UDP according to the rules laid out in this document. + + HTTPU_URL = "HTTPU:" "//" host [ ":" port ] [ abs path [ "?" query]] + + The BNF productions host, port and abs path are defined in + [RFC2616]. + + The syntax of the HTTPU URL is to be processed identically to the + HTTP URL with the exception of the transport. + + One MUST NOT assume that if a HTTP, HTTPU or HTTPMU URL are + identical in all ways save the protocol that they necessarily point + to the same resource. + +4.3. Design Rationale + +4.3.1. Why would we ever need a HTTPU/HTTPMU URL? + + Imagine one wants to tell a system to send responses over HTTPU. How + would one express this? If one uses a HTTP URL there is no way for + the system to understand that you really meant HTTPU. + +5. HTTPMU URL + +5.1. Problem Definition + + A mechanism is needed to allow for communications that are to be + sent over Multicast UDP HTTP to be identified in the URI namespace. + +5.2. Proposed Solution + + The HTTPMU URL specifies that the HTTP request that HTTP request is + to be sent over multicast UDP according to the rules laid out in + this document. + +Goland, Schlimmer 3 +UPnP Forum UDP HTTP 24 Aug 2000 + + + + HTTPMU_URL = "HTTPMU:" "//" host [ ":" port ] [ abs path [ "?" + query]] + + The BNF productions host, port and abs path are defined in + [RFC2616]. + + The syntax of the HTTPMU URL is to be processed identically to the + HTTP URL with the exception of the transport. + + One MUST NOT assume that if a HTTP, HTTPU or HTTPMU URL are + identical in all ways save the protocol that they necessarily point + to the same resource. + + If a HTTPMU URL does not have an abs path element then when the HTTP + multicast UDP request is made the request-URI MUST be "*". + + For example, HTTPU://www.foo.com would translate into a request-URI + of "*". A request-URI of HTTPU://www.foo.com/ would still translate + to the absoluteURI "HTTPU://www.foo.com/". + +5.3. Design Rationale + +5.3.1. In the HTTPMU URL a request such as http://www.foo.com is + translated to a "*" in the request-URI rather than a "/", why + isn't the same the case for HTTPU? + + A HTTPU request is a point-to-point request. There is one sender and + one receiver. Thus the semantics of the URL are identical to HTTP + with the exception of the transport. + + Generally, a HTTPMU client will want to send its request to many + receivers at once, where each receiver represents a different set of + resources. A client can specify this in the HTTPMU request itself by + using the request-URI "*". Unfortunately, there is no present way to + construct an HTTP URL that will have this request-URI. As such, a + mechanism had to be added. + +5.3.2. Why would an HTTPMU client want to use a request-URI of "*" + anyway? + + In TCP HTTP, the client will often specify a single resource on + which the request should operate. For example, a GET of the URL + http://foo.org/baz.gif should retrieve the resource at that single, + well-defined location. + + One big reason for a client to send a request over multicast UDP, + though, is the ability to send a request to many receivers at once, + even when the number of receivers is not known. + + Specifying an absoluteURI in the request, though, would defeat this; + all receivers without that exact resource would be forced to reject + the request. + +Goland, Schlimmer 4 +UPnP Forum UDP HTTP 24 Aug 2000 + + + + By specifying a request-URI of "*" client signifies that the request + "does not apply to a particular resource, but to the server itself, + and is only allowed when the method used does not necessarily apply + to a resource." [RFC 2616] + +5.3.3. So when would an HTTPMU client want to use a request-URI other + than "*"? + + This may be useful when a client knows the URI for the resource, but + not the server on which the resource lives. If the client knows + both, though, it is expected that TCP HTTP or HTTPU would be used. + + Servers MUST NOT assume that an HTTPMU request containing an + absoluteURI necessarily refers to the same resource as a HTTPU + request with the same absoluteURI. For example, servers that support + both HTTPMU and HTTPU may reject a request for a particular resource + when received through HTTPMU, but accept it when received through + HTTPU. +6. HTTP Version in Request Line + +6.1. Problem Definition + + A message format identifier is needed for the HTTPU and HTTPMU + request lines. + +6.2. Proposed Solution + + Request lines for HTTPU and HTTPMU requests MUST use HTTP/1.1 as the + version. + + Request-Line = Method SP Request-URI SP HTTP/1.1 CRLF + + The BNF production Method is defined in [RFC2616]. + +6.3. Design Rationale + +6.3.1. Why not define separate HTTPU and HTTPMU versions? + + While HTTP/1.1 does hint at underlying features (like pipelining), + it principally specifies a message format. HTTPU and HTTPMU use the + same message format as defined by HTTP/1.1. Reusing this message + format identifier enables syntactic parsing / generating of HTTPU + and HTTPMU request by existing HTTP message mungers. + +6.3.2. If the version in the request line is the same as an HTTP + request, once a request was stored, how could one distinguish an + HTTPU (or HTTPMU) request from an HTTP request? + + TBD + +7. Unicast UDP HTTP Messages + + +Goland, Schlimmer 5 +UPnP Forum UDP HTTP 24 Aug 2000 + + +7.1. Problem Definition + + A mechanism is needed to send HTTP messages over the unicast UDP + transport. + +7.2. Proposed Solution + + HTTP messages sent over unicast UDP function identically to HTTP + messages sent over TCP as defined in [RFC2616] except as specified + below. + + For brevity's sake HTTP messages sent over unicast UDP will be + referred to as HTTPU messages. + + HTTPU messages MUST fit entirely in a single UDP message. If a HTTPU + message can not be fit into a single UDP message then it MUST NOT be + sent using unicast UDP. Incomplete HTTPU messages SHOULD be ignored. + + The request-URI of a HTTPU message MUST always be fully qualified. + + A single unicast UDP message MUST only contain a single HTTPU + message. As such, an HTTPU server MAY reject messages with "chunked" + transfer-coding. + When responding to a HTTPU request with an S header the rules for + the proper handling of S headers, as specified below MUST be + followed. + +7.3. Design Rationale + + See also the subsection on the S header below for the design + rationale of the S header. + +7.3.1. Why can't a single HTTP message be sent over multiple UDP + messages? + + The ability to send unlimited size messages across the Internet is + one of the key features of TCP. The goal of this paper is not to + reinvent TCP but rather to provide a very simple emergency back up + HTTP system that can leverage UDP where TCP cannot be used. As such + features to allow a single HTTP message to span multiple UDP + messages is not provided. + +7.3.2. Why are request-URIs sent over HTTPU required to be fully + qualified? + + A relative URI in a HTTP message is assumed to be relative to a HTTP + URL. However this would clearly be inappropriate for a HTTPU or + HTTPMU message. The easiest solution would be to simply state that a + relative URI is relative to the type of message it was sent in. But + one of the goals of this draft is to allow current HTTP message + processors to be able to munch on HTTPU/HTTPMU messages and this + would cause a change to those processors. + + +Goland, Schlimmer 6 +UPnP Forum UDP HTTP 24 Aug 2000 + + + The cost of this simplification is that you repeat the host + information, once in the URI and once in the host header. + But again, taking out the host header would make a lot of existing + HTTP message munchers very unhappy. + +7.3.3. Why is the requirement for ignoring incomplete HTTPU messages a + SHOULD instead of a MUST? + + Some systems use a lot of redundant data or have good mechanisms for + handling partial data. As such they could actually do something + intelligent with a partial message. A SHOULD allows them to do this + while still making it clear that in the majority case partial + HTTPU/HTTPMU messages are going to get thrown out. + +7.3.4. Why aren't multiple HTTP messages allowed into a single UDP + message if they will fit? + + It was easier to ban it, and it didn't seem to buy us much. It was + especially worrying because it would start to convince people that + they could actually order their UDP requests in a pipelinesque + manner. It was easier to just keep things simple and ban it. + +7.3.5. Why aren't we allowed to leave off content-lengths if only a + single HTTPU message is allowed in a UDP message? + + In general we try to only change from RFC 2616 when we are forced + to. Although including a content-length is annoying it makes it easy + to use HTTP/1.1 message parsing/generating systems with this spec. + +7.3.6. Why might a HTTPU message choose to not have an S header? + + Leaving off the S header would be useful for throwaway events. In + systems with a high event rate it is usually easier to just throw + away an event rather than re-sending it. As such there is no real + benefit to correlating unnecessary responses with requests. + +7.3.7. Why isn't the MX header used on HTTPU messages? + + As HTTPU messages are point-to-point there will be exactly one + response. MX is only useful in cases, such as HTTPMU requests, where + there can be many potential responses from numerous different + clients. MX helps to prevent the client from getting creamed with + responses. + +7.3.8. Can I send 1xx responses over HTTPU? + + Yes. Error handling is identical to RFC 2616. + +8. Multicast UDP HTTP Requests + +8.1. Problem Definition + + + +Goland, Schlimmer 7 +UPnP Forum UDP HTTP 24 Aug 2000 + + + A mechanism is needed to send HTTP messages over the multicast UDP + transport. + +8.2. Proposed Solution + + HTTP messages sent over multicast UDP MUST obey all the requirements + for HTTPU messages in addition to the requirements provided below. + + For brevity's sake HTTP messages sent over multicast UDP will be + referred to as HTTPMU messages. + + Resources that support receiving multicast UDP HTTP requests MUST + honor the MX header if included in the request. + + If a resource has a single response, it MUST generate a random + number between 0 and MX that represents the number of seconds the + resource MUST wait before sending a response. If a resource has + multiple responses per request, it SHOULD send these resources + spread over the interval [0..MX]. This prevents all responses from + being sent at once. + + HTTP clients SHOULD keep listening for responses for a reasonable + delta of time after MX. That delta will be based on the type of + network the request is being sent over. This means that if a server + cannot respond to a request before MX then there is little point in + sending the response, as the client will most likely not be + listening for it. + + When used with a multicast UDP HTTP request, the "*" request-URI + means "to everyone who is listening to this IP address and port." + + A HTTPMU request without a MX header MUST NOT be responded to. + +8.3. Design Rationale + +8.3.1. Why is there a "delta" after the MX time when the client should + still be listening? + + So let's say the MX value is 5 seconds. The HTTP resource generates + a number between 0 and 5 and gets 5. After 5 seconds of waiting the + HTTP resource will send its response. + + Now for some math: + + 0.5 seconds - Time it took the client's request to reach + the HTTP resource. + 5 seconds - Time the HTTP resource waited after + receiving the message to respond, based on + the MX value. + 0.5 seconds - Time for the response to get back to the + client. + Total time elapsed - 6 seconds + + +Goland, Schlimmer 8 +UPnP Forum UDP HTTP 24 Aug 2000 + + + If the client only waits 5 seconds, the MX value, then they would + have stopped listening for this response by the time it arrived, + hence the need for the delta. + +8.3.2. What should the "delta" after MX expires be? + + Unfortunately this is an impossible question to answer. How fast is + your network? How far is the message going? Is there any congestion? + In general delta values will be set based on a combination of + heuristics and application necessity. That is, if you are displaying + information to a user any data that comes in after 20 or 30 seconds + is probably too late. + +8.3.3. When would a HTTPMU request not be responded to? + + When a HTTP resource is making a general announcement, such as "I am + here", it generally isn't useful to have everyone respond confirming + they received the message. This is especially the case given that + the HTTP resource probably doesn't know who should have received the + announcement so the absence of a HTTP client in the responses + wouldn't be meaningful. + + Whether a particular request requires a response is dependant on the + application, and is beyond the scope of this specification. + +8.3.4. Why do we require the MX header on HTTPMU requests that are to + be responded to? + + This is to prevent overloading the HTTP client. If all the HTTP + resources responded simultaneously the client would probably loose + most of the responses as its UDP buffer overflowed. + +9. Retrying Requests + +9.1. Problem Definition + + UDP is an unreliable transport with no failure indicators; as such + some mechanism is needed to reasonably increase the chance that a + HTTPU/HTTPMU message will be delivered. + +9.2. Proposed Solution + + UDP is an inherently unreliable transport and subject to routers + dropping packets without notice. Applications requiring delivery + guarantees SHOULD NOT use HTTPU or HTTPMU. + + In order to increase the probability that a HTTPU or HTTPMU message + is delivered the message MAY be repeated several times. If a + multicast resource would send a response(s) to any copy of the + request, it SHOULD send its response(s) to each copy of the request + it receives. It MUST NOT repeat its response(s) per copy of the + reuqest. + + +Goland, Schlimmer 9 +UPnP Forum UDP HTTP 24 Aug 2000 + + + In order to prevent the network from being flooded a message SHOULD + NOT be repeated more than MAX_RETRIES time. A random period of time + between 0 and MAX_RETRY_INTERVAL SHOULD be selected between each + retry to determine how long to wait before issuing the retry. + +9.3. Design Rationale + +9.3.1. Why is the requirement "applications requiring delivery + guarantees should not use HTTPU or HTTPMU" only a SHOULD and not + a MUST? + + Because there might come a day when it makes sense to use HTTPU or + HTTPMU for guaranteed delivery and there is no reason to completely + ban the possibility. + +9.3.2. Why is the requirement that a request not be repeated more than + MAX_RETRIES times a SHOULD and not a MUST? + + Local knowledge may make the limit unnecessary. For example, if one + knew that the message was being delivered using a super reliable + network then repeats are not necessary. Similarly if one knew that + the network the requests were going through were particularly + unreliable and assuming one had properly accounted for the effects + of additional messages on that congestion, one might have a good + reason to send more than MAX_RETRIES. + +9.3.3. Why SHOULD multicast resources respond to each copy of a request + it receives? + + Because the earlier responses might have been lost. + +9.3.4. Why MUST multicast resources not repeat its response(s) to each + copy of a request it receives? + + This strategy provides the lowest network loading for any desired + level of reliability, or equivalently, the highest reliability for + any specified level of network loading. + +10. Caching + +10.1. Problem Definition + + Caching is a feature that has demonstrated its usefulness in HTTP, + provisions need to be made to ensure that HTTPU/HTTPMU messages can + be cached using a consistent algorithm. + +10.2. Proposed Solution + + [Ed. Note: Never having tried to actually build a HTTPU/HTTPMU + generic cache we suspect there are some very serious gotchas here + that we just haven't found yet. This section should definitely be + treated as "under development."] + + +Goland, Schlimmer 10 +UPnP Forum UDP HTTP 24 Aug 2000 + + + Caching rules for HTTPU/HTTPMU responses are no different than + normal HTTP responses. HTTPU/HTTPMU responses are matched to their + requests through the S header value. + + When responding to a multicast request, a resource MAY cache its + response(s) and retransmit from the cache in response to duplicate + requests. + +10.3. Design Rationale + +10.3.1. Wouldn't it be useful to be able to cache HTTPU/HTTPMU requests + if they don't have responses? + + Yes, it probably would, especially if we are talking about a client- + side cache. It is probably worth investigating the use of cache + control headers on requests for this very purpose. + +11. Proxying UDP HTTP Requests + +11.1. Problem Definition + + For security or caching reasons it is sometimes necessary to place a + proxy in a message path. Provisions need to be made to ensure that + HTTPU/HTTPMU messages can be proxied. + +11.2. Proposed Solution + + [Ed. Note: This section should be considered experimental. No one + has really had to design much less implement a HTTPU/HTTPMU proxy + yet.] + + All transport independent rules for proxying, such as length of time + to cache a response, hop-by-hop header rules, etc. are the same for + HTTPU/HTTPMU as they are for HTTP messages. + + [Ed. Note: I'm not sure how far to go into the "transport + independent rules". The RFC 2616 doesn't really call them out very + well but I also don't want to have to re-write RFC 2616 spec inside + this spec.] + + The transport dependent rules, however, are different. For example, + using TCP any pipelined messages are guaranteed to be delivered in + order. There are no ordering guarantees of any form for HTTPU/HTTPMU + proxies. + + In general a proxy is required to forward a HTTPU/HTTPMU message + exactly once. It SHOULD NOT repeat the message. Rather the client is + expected to repeat the message and, as the proxy receives the + repeats, they will be forwarded. + + Note that it is acceptable, if not encouraged, for proxies to + analyze network conditions and determine the likelihood, on both + incoming and outgoing connections, of UDP messages being dropped. If + +Goland, Schlimmer 11 +UPnP Forum UDP HTTP 24 Aug 2000 + + + the likelihood is too high then it would be expected for the proxy, + taking into consideration the possibility of making congestion even + worse, to repeat requests and responses on its own. In a sense the + proxy could be thought of as a signal regenerator. This is why the + prohibition against repeating messages is a SHOULD NOT rather than a + MUST NOT. + + HTTPMU messages are sent with the assumption that the message will + only be seen by the multicast address they were sent to. Thus when a + proxy forwards the request it is expected to only do so to the + appropriate multicast channel. Note, however, that proxies may act + as multicast bridges. + + Also note that proxied HTTPMU messages with a HTTPMU URL without an + absolute path are to be treated as if they were sent to the + specified multicast address with the request-URI "*". + + If a HTTPMU request is sent with a host that does not resolve to a + multicast address then the request MUST be rejected with a 400 Bad + Request error. + + There is no requirement that a HTTPU proxy support HTTPMU or vice + versa. + +11.3. Design Rationale + +11.3.1. Why would anyone proxy HTTPMU requests? + + Proxying HTTPMU requests can be a neat way to create virtual + multicast channels. Just hook a bunch of proxies together with + unicast connections and tell the proxies' users that they are all on + the same multicast scope. + +12. HTTP Headers + +12.1. AL (Alternate Location) General Header + +12.1.1. Problem Definition + + There are many instances in which a system needs to provide location + information using multiple URIs. The LOCATION header only allows a + single URI. Therefore a mechanism is needed to allow multiple + location URIs to be returned. + +12.1.2. Proposed Solution + + AL = "AL" ":" 1*("<" AbsoluteURI ">") ; AbsoluteURI is defined in + section 3.2.1 of [RFC2616] + + The AL header is an extension of the LOCATION header whose semantics + are the same as the LOCATION header. That is, the AL header allows + one to return multiple locations where as the LOCATION header allows + one to return only one. The contents of an AL header are ordered. If + +Goland, Schlimmer 12 +UPnP Forum UDP HTTP 24 Aug 2000 + + + both a LOCATION header and an AL header are included in the same + message then the URI in the LOCATION header is to be treated as if + it were the first entry in the AL header. The AL header MAY be used + by itself but implementers should be aware that existing systems + will ignore the header. + +12.1.3. Design Rationale + +12.1.3.1. Why not just fix the BNF for the LOCATION header? + + This is tempting but the goal of maintaining compatibility with RFC + 2616's message format overrides the usefulness of this solution. + +12.2. MX Request Header + +12.2.1. Problem Definition + + A mechanism is needed to ensure that responses to HTTPMU requests do + not come at a rate greater than the requestor can handle. + +12.2.2. Proposed Solution + + MX = "MX" ":" Integer + Integer = First_digit *More_digits + First_digit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" + More_digits = "0" | First_digit + + The value of the MX header indicates the maximum number of seconds + that a multicast UDP HTTP resource MUST wait before it sends a + response stimulated by a multicast request. + + HTTP resources MAY treat any MX header value greater than MX_MAX as + being equal to MX_MAX. + +12.2.3. Design Rationale + +12.2.3.1. Why is MX in seconds? + + In practice wait periods shorter than a second proved useless and + longer proved too coarse. Of course as faster networks get deployed + finer-grain times would be useful, but we need a compromise + measurement that will meet everyone's needs. Seconds seem to do that + quite well. + +12.2.3.2. Couldn't MX still overload the requestor if there are too + many responders? + + Absolutely. If there are a 100,000 clients that want to respond even + pushing them over 30 seconds on a 10 Mbps link is still going to + blow both the client and the network away. However the only way to + prevent these sorts of situations is to know the current available + network bandwidth and the total number of likely responders ahead of + + +Goland, Schlimmer 13 +UPnP Forum UDP HTTP 24 Aug 2000 + + + time. Both generally prove between difficult to impossible to figure + out. So we are left with heuristics and the MX header. + +12.3. S (Sequence) General Header + +12.3.1. Problem Definition + + A mechanism is needed to associate HTTPU/HTTPMU requests with + responses, as UDP does not have any connection semantics. + +12.3.2. Proposed Solution + + S = "S" ":" AbsoluteURI + + The S header is a URI that is unique across the entire URI namespace + for all time. When an S header is sent on a HTTPU/HTTPMU request it + MUST be returned, with the same value, on the response. + + If a client receives multiple responses with the same S header then + the client MAY assume that all the responses are in response to the + same request. If the messages differ from each other then the client + MUST behave based on the specification of the request method. + +12.3.3. Design Rationale + +12.3.3.1. Why do we need the S header? + + Without an S header the only way to match requests with responses is + to ensure that there is enough information in the response to know + what request it was intended to answer. Even in that case it is + still possible to confuse which request a response goes to if it + does not have the equivalent of an S header. + +12.3.3.2. Why aren't S headers mandatory on all requests with a + response? + + Some systems don't need them. + +12.3.3.3. Why aren't S headers guaranteed to be sequential so you could + do ordering? + + Because HTTPU/HTTPMU is not interested in ordering. If one wants + ordering one should use TCP. + +12.3.3.4. Do S headers allow detecting and removing duplicates? + + Yes, for methods (like GET) that define a single responses to a + request. No, for methods (like SEARCH) that define multiple + responses to a request. + +13. Interaction of HTTP, HTTPU and HTTPMU Messages + +13.1. Problem Definition + +Goland, Schlimmer 14 +UPnP Forum UDP HTTP 24 Aug 2000 + + + + [Ed. Note: Concerns include HTTPU request redirected to HTTP? > 1 + HTTPU responses to 1 HTTPMU request?] + +13.2. Proposed Solution + + TBD + +13.3. Design Rationale + + TBD + +14. Security Considerations + + All the normal HTTP security considerations apply. + +14.1. Cookies + + There is no danger that the S header will be used as a cookie since + the client generates it, and the server returns it. (A cookie is + generated by a server and returned by the client.) +14.2. Spoofing + + Servers and multicast resources could fake S headers, but this is + not a major threat if some form of authentication over UDP is used. + (Defining authentication over UDP is beyond the scope of this + document, but briefly, one could assume the challenge and send the + authentication response as part of the HTTPU/MU request.) + +14.3. Lost Requests + + TBD + +14.4. Oversized Requests + + TBD + +15. Acknowledgements + + Thanks to John Stracke for his excellent comments. Dale Worley + devised the single-response-per-each-copy-of-request mechanism + outlined in the section on Retrying Requests. Chris Rude clarified + request URI rules. + +16. Constants + + MAX_RETRIES - 3 + + MAX_RETRY_INTERVAL - 10 seconds + + MAX_MX - 120 seconds + +17. Reference + +Goland, Schlimmer 15 +UPnP Forum UDP HTTP 24 Aug 2000 + + + + [RFC2119] S. Bradner. Key words for use in RFCs to Indicate + Requirement Levels. RFC 2119, March 1997. + + [RFC2616] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, L. + Masinter, P. Leach and T. Berners-Lee. Hypertext Transfer Protocol - + HTTP/1.1. RFC 2616, November 1998. + +18. Authors' Address + + Yaron Y. Goland + CrossGain + 2039 152nd Avenue NE + Redmond, WA 98052 + + + Jeffrey C. Schlimmer + Microsoft Corporation + One Microsoft Way + Redmond, WA 98052 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Goland, Schlimmer 16 \ No newline at end of file diff --git a/docs/draft-leach-uuids-guids-00.txt b/docs/draft-leach-uuids-guids-00.txt new file mode 100644 index 0000000..854285a --- /dev/null +++ b/docs/draft-leach-uuids-guids-00.txt @@ -0,0 +1,1040 @@ + +Network Working Group Paul J. Leach, Microsoft +INTERNET-DRAFT Rich Salz, Open Group + +Category: Informational +Expires August 24, 1997 February 24, 1997 + + + + UUIDs and GUIDs + +STATUS OF THIS MEMO + + This document is an Internet-Draft. Internet-Drafts are working + documents of the Internet Engineering Task Force (IETF), its areas, + and its working groups. Note that other groups may also distribute + working documents as Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress". + + To learn the current status of any Internet-Draft, please check the + "1id-abstracts.txt" listing contained in the Internet-Drafts Shadow + Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe), + munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or + ftp.isi.edu (US West Coast). + + Distribution of this document is unlimited. Please send comments to + the authors or the CIFS mailing list at . + Discussions of the mailing list are archived at + . + + +ABSTRACT + + This specification defines the format of UUIDs (Universally Unique + IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID + is 128 bits long, and if generated according to the one of the + mechanisms in this document, is either guaranteed to be different + from all other UUIDs/GUIDs generated until 3400 A.D. or extremely + likely to be different (depending on the mechanism chosen). UUIDs + were originally used in the Network Computing System (NCS) [1] and + later in the Open Software Foundation's (OSF) Distributed Computing + Environment [2]. + + This specification is derived from the latter specification with the + kind permission of the OSF. + + +Table of Contents + +1. Introduction......................................................2 + + +[Page 1] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + +2. Motivation........................................................2 + +3. Specification.....................................................3 + + 3.1 Format ..........................................................3 + + 3.2 Algorithms for Creating a UUID ..................................5 + + 3.2.1 Clock Sequence...............................................5 + + 3.2.2 System Reboot................................................6 + + 3.2.3 Clock Adjustment.............................................7 + + 3.2.4 Clock Overrun................................................7 + + 3.2.5 UUID Generation..............................................7 + + 3.3 String Representation of UUIDs ..................................8 + + 3.4 Comparing UUIDs .................................................9 + + 3.5 Byte order of UUIDs .............................................9 + +4. Node IDs when no IEEE 802 network card is available...............9 + +5. Obtaining IEEE 802 addresses.....................................11 + +6. Security Considerations..........................................12 + +7. Acknowledgements.................................................12 + +8. References.......................................................12 + +9. Authors' addresses...............................................12 + + + + +1. Introduction + + This specification defines the format of UUIDs (Universally Unique + IDentifiers), also known as GUIDs (Globally Unique IDentifiers). A + UUID is 128 bits long, and if generated according to the one of the + mechanisms in this document, is either guaranteed to be different + from all other UUIDs/GUIDs generated until 3400 A.D. or extremely + likely to be different (depending on the mechanism chosen). + + +2. Motivation + + One of the main reasons for using UUIDs is that no centralized + authority is required to administer them (beyond the one that + allocates IEEE 802.1 node identifiers). As a result, generation on + + Leach, Salz expires July 1997 [Page 2] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + demand can be completely automated, and they can be used for a wide + variety of purposes. The UUID generation algorithm described here + supports very high allocation rates: 10 million per second per + machine if you need it, so that they could even be used as + transaction IDs. + + UUIDs are fixed-size (128-bits) which is reasonably small relative to + other alternatives. This fixed, relatively small size lends itself + well to sorting, ordering, and hashing of all sorts, storing in + databases, simple allocation, and ease of programming in general. + + +3. Specification + + A UUID is an identifier that is unique across both space and time, + with respect to the space of all UUIDs. To be precise, the UUID + consists of a finite bit space. Thus the time value used for + constructing a UUID is limited and will roll over in the future + (approximately at A.D. 3400, based on the specified algorithm). A + UUID can be used for multiple purposes, from tagging objects with an + extremely short lifetime, to reliably identifying very persistent + objects across a network. + + The generation of UUIDs does not require that a registration + authority be contacted for each identifier. Instead, it requires a + unique value over space for each UUID generator. This spatially + unique value is specified as an IEEE 802 address, which is usually + already available to network-connected systems. This 48-bit address + can be assigned based on an address block obtained through the IEEE + registration authority. This section of the UUID specification + assumes the availability of an IEEE 802 address to a system desiring + to generate a UUID, but if one is not available section 4 specifies a + way to generate a probabilistically unique one that can not conflict + with any properly assigned IEEE 802 address. + + +3.1 Format + + The following table gives the format of a UUID. The UUID consists of + a record of 16 octets. The fields are in order of significance for + comparison purposes, with "time_low" the most significant, and "node" + the least significant. + + Field Data Octet Note + Type # + + time_low unsigned 0-3 The low field of the + 32 bit timestamp. + integer + + time_mid unsigned 4-5 The middle field of the + 16 bit timestamp. + integer + + + Leach, Salz expires July 1997 [Page 3] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + time_hi_and_version unsigned 6-7 The high field of the + 16 bit timestamp multiplexed + integer with the version number. + + clock_seq_hi_and_reserved unsigned The high field of the + 8 bit clock sequence 8 + integer multiplexed with the + variant. + + clock_seq_low unsigned 9 The low field of the + 8 bit clock sequence. + integer + + node unsigned The spatially unique + 48 bit node identifier. 10-15 + integer + + + + To minimize confusion about bit assignments within octets, the UUID + record definition is defined only in terms of fields that are + integral numbers of octets. The version number is in the most + significant 4 bits of the time stamp (time_hi), and the variant field + is in the most significant 3 bits of the clock sequence + (clock_seq_high). + + The timestamp is a 60 bit value. For UUID version 1, this is + represented by Coordinated Universal Time (UTC) as a count of 100- + nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of + Gregorian reform to the Christian calendar). + + The following table lists currently defined versions of the UUID. + + Msb0 Msb1 Msb2 Msb3 Version Description + + 0 0 0 1 1 The version specified + in this document. + + 0 0 1 0 2 Reserved for DCE + Security version, with + embedded POSIX UIDs. + + The variant field determines the layout of the UUID. The structure of + UUIDs is fixed across different versions within a variant, but not + across variants; hence, other UUID variants may not interoperate with + the UUID variant specified in this document. Interoperability of + UUIDs is defined as the applicability of operations such as string + conversion, comparison, and lexical ordering across different + systems. The variant field consists of a variable number of the msbs + of the clock_seq_hi_and_reserved field. + + The following table lists the contents of the variant field. + + + + Leach, Salz expires July 1997 [Page 4] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + Msb0 Msb1 Msb2 Description + + 0 - - Reserved, NCS backward compatibility. + + 1 0 - The variant specified in this document. + + 1 1 0 Reserved, Microsoft Corporation GUID. + + 1 1 1 Reserved for future definition. + + The clock sequence is required to detect potential losses of + monotonicity of the clock. Thus, this value marks discontinuities and + prevents duplicates. An algorithm for generating this value is + outlined in the _Clock Sequence_ section below. + + The clock sequence is encoded in the 6 least significant bits of the + clock_seq_hi_and_reserved field and in the clock_seq_low field. + + The node field consists of the IEEE address, usually the host + address. For systems with multiple IEEE 802 nodes, any available node + address can be used. The lowest addressed octet (octet number 10) + contains the global/local bit and the unicast/multicast bit, and is + the first octet of the address transmitted on an 802.3 LAN. + + Depending on the network data representation, the multi-octet + unsigned integer fields are subject to byte swapping when + communicated between different endian machines. + + The nil UUID is special form of UUID that is specified to have all + 128 bits set to 0 (zero). + + +3.2 Algorithms for Creating a UUID + + Various aspects of the algorithm for creating a UUID are discussed in + the following sections. UUID generation requires a guarantee of + uniqueness within the node ID for a given variant and version. + Interoperability is provided by complying with the specified data + structure. To prevent possible UUID collisions, which could be caused + by different implementations on the same node, compliance with the + algorithm specified here is required. + + +3.2.1 Clock Sequence + The clock sequence value must be changed whenever: + + - the UUID generator detects that the local value of UTC has gone + backward. + + - the UUID generator has lost its state of the last value of UTC + used, indicating that time may have gone backward; this is typically + the case on reboot. + + + + Leach, Salz expires July 1997 [Page 5] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + While a node is operational, the UUID service always saves the last + UTC used to create a UUID. Each time a new UUID is created, the + current UTC is compared to the saved value and if either the current + value is less (the non-monotonic clock case) or the saved value was + lost, then the clock sequence is incremented modulo 16,384, thus + avoiding production of duplicate UUIDs. + + The clock sequence must be initialized to a random number to minimize + the correlation across systems. This provides maximum protection + against node identifiers that may move or switch from system to + system rapidly. The initial value MUST NOT be correlated to the node + identifier. + + The rule of initializing the clock sequence to a random value is + waived if, and only if all of the following are true: + + - The clock sequence value is stored in non-volatile storage. + + - The system is manufactured such that the IEEE address ROM is + designed to be inseparable from the system by either the user or + field service, so that it cannot be moved to another system. + + - The manufacturing process guarantees that only new IEEE address + ROMs are used. + + - Any field service, remanufacturing or rebuilding process that could + change the value of the clock sequence must reinitialise it to a + random value. + + In other words, the system constraints prevent duplicates caused by + possible migration of the IEEE address, while the operational system + itself can protect against non-monotonic clocks, except in the case + of field service intervention. At manufacturing time, such a system + may initialise the clock sequence to any convenient value. + + +3.2.2 System Reboot + There are two possibilities when rebooting a system: + + - the UUID generator state - the last UTC, adjustment, and clock + sequence - of the UUID service has been restored from non-volatile + store + + - the state of the last UTC or adjustment has been lost. + + If the state variables have been restored, the UUID generator just + continues as normal. Alternatively, if the state variables cannot be + restored, they are reinitialised, and the clock sequence is changed. + + If the clock sequence is stored in non-volatile store, it is + incremented; otherwise, it is reinitialised to a new random value. + + + + + Leach, Salz expires July 1997 [Page 6] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + +3.2.3 Clock Adjustment + UUIDs may be created at a rate greater than the system clock + resolution. Therefore, the system must also maintain an adjustment + value to be added to the lower-order bits of the time. Logically, + each time the system clock ticks, the adjustment value is cleared. + Every time a UUID is generated, the current adjustment value is read + and incremented atomically, then added to the UTC time field of the + UUID. + + +3.2.4 Clock Overrun + The 100 nanosecond granularity of time should prove sufficient even + for bursts of UUID creation in high-performance multiprocessors. If a + system overruns the clock adjustment by requesting too many UUIDs + within a single system clock tick, the UUID service may raise an + exception, handled in a system or process-dependent manner either by: + + - terminating the requester + + - reissuing the request until it succeeds + + - stalling the UUID generator until the system clock catches up. + + If the processors overrun the UUID generation frequently, additional + node identifiers and clocks may need to be added. + + +3.2.5 UUID Generation + UUIDs are generated according to the following algorithm: + + - Determine the values for the UTC-based timestamp and clock sequence + to be used in the UUID, as described above. + + - For the purposes of this algorithm, consider the timestamp to be a + 60-bit unsigned integer and the clock sequence to be a 14-bit + unsigned integer. Sequentially number the bits in a field, starting + from 0 (zero) for the least significant bit. + + - Set the time_low field equal to the least significant 32-bits (bits + numbered 0 to 31 inclusive) of the time stamp in the same order of + significance. + + - Set the time_mid field equal to the bits numbered 32 to 47 + inclusive of the time stamp in the same order of significance. + + - Set the 12 least significant bits (bits numbered 0 to 11 inclusive) + of the time_hi_and_version field equal to the bits numbered 48 to 59 + inclusive of the time stamp in the same order of significance. + + - Set the 4 most significant bits (bits numbered 12 to 15 inclusive) + of the time_hi_and_version field to the 4-bit version number + corresponding to the UUID version being created, as shown in the + table above. + + + Leach, Salz expires July 1997 [Page 7] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + - Set the clock_seq_low field to the 8 least significant bits (bits + numbered 0 to 7 inclusive) of the clock sequence in the same order of + significance. + + - Set the 6 least significant bits (bits numbered 0 to 5 inclusive) + of the clock_seq_hi_and_reserved field to the 6 most significant bits + (bits numbered 8 to 13 inclusive) of the clock sequence in the same + order of significance. + + - Set the 2 most significant bits (bits numbered 6 and 7) of the + clock_seq_hi_and_reserved to 0 and 1, respectively. + + - Set the node field to the 48-bit IEEE address in the same order of + significance as the address. + + +3.3 String Representation of UUIDs + + For use in human readable text, a UUID string representation is + specified as a sequence of fields, some of which are separated by + single dashes. + + Each field is treated as an integer and has its value printed as a + zero-filled hexadecimal digit string with the most significant digit + first. The hexadecimal values a to f inclusive are output as lower + case characters, and are case insensitive on input. The sequence is + the same as the UUID constructed type. + + The formal definition of the UUID string representation is provided + by the following extended BNF: + + UUID = "-" "-" + "-" + + "-" + time_low = 4* + time_mid = 2* + time_high_and_version = 2* + clock_seq_and_reserved = + clock_seq_low = + node = 6* + hexDigit = + "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" + | "a" | "b" | "c" | "d" | "e" | "f" + | "A" | "B" | "C" | "D" | "E" | "F" + + The following is an example of the string representation of a UUID: + + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + + + + + + Leach, Salz expires July 1997 [Page 8] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + +3.4 Comparing UUIDs + + Consider each field of the UUID to be an unsigned integer as shown in + the table in section 3.1. Then, to compare a pair of UUIDs, + arithmetically compare the corresponding fields from each UUID in + order of significance and according to their data type. Two UUIDs are + equal if and only if all the corresponding fields are equal. The + first of two UUIDs follows the second if the most significant field + in which the UUIDs differ is greater for the first UUID. The first of + a pair of UUIDs precedes the second if the most significant field in + which the UUIDs differ is greater for the second UUID. + + +3.5 Byte order of UUIDs + + UUIDs may be transmitted in many different forms, some of which may + be dependent on the presentation or application protocol where the + UUID may be used. In such cases, the order, sizes and byte orders of + the UUIDs fields on the wire will depend on the relevant presentation + or application protocol. However, it is strongly RECOMMENDED that + the order of the fields conform with ordering set out in section 3.1 + above. Furthermore, the payload size of each field in the application + or presentation protocol MUST be large enough that no information + lost in the process of encoding them for transmission. + + In the absence of explicit application or presentation protocol + specification to the contrary, a UUID is encoded as a 128-bit object, + as follows: the fields are encoded as 16 octets, with the sizes and + order of the fields defined in section 3.1, and with each field + encoded with the Most Significant Byte first (also known as network + byte order). + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_high | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_mid | time_hi_and_version | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |clk_seq_hi_res | clk_seq_low | node (0-1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | node (2-5) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + +4. Node IDs when no IEEE 802 network card is available + + If a system wants to generate UUIDs but has no IEE 802 compliant + network card or other source of IEEE 802 addresses, then this section + describes how to generate one. + + The ideal solution is to obtain a 47 bit cryptographic quality random + number, and use it as the low 47 bits of the node ID, with the most + + Leach, Salz expires July 1997 [Page 9] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + significant bit of the first octet of the node ID set to 1. This bit + is the unicast/multicast bit, which will never be set in IEEE 802 + addresses obtained from network cards; hence, there can never be a + conflict between UUIDs generated by machines with and without network + cards. + + If a system does not have a primitive to generate cryptographic + quality random numbers, then in most systems there are usually a + fairly large number of sources of randomness available from which one + can be generated. Such sources are system specific, but often + include: + + - the percent of memory in use + + - the size of main memory in bytes + + - the amount of free main memory in bytes + + - the size of the paging or swap file in bytes + + - free bytes of paging or swap file + + - the total size of user virtual address space in bytes + + - the total available user address space bytes + + - the size of boot disk drive in bytes + + - the free disk space on boot drive in bytes + + - the current time + + - the amount of time since the system booted + + - the individual sizes of files in various system directories + + - the creation, last read, and modification times of files in various + system directories + + - the utilization factors of various system resources (heap, etc.) + + - current mouse cursor position + + - current caret position + + - current number of running processes, threads + + - handles or IDs of the desktop window and the active window + + - the value of stack pointer of the caller + + - the process and thread ID of caller + + + + Leach, Salz expires July 1997 [Page 10] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + - various processor architecture specific performance counters + (instructions executed, cache misses, TLB misses) + + (Note that it precisely the above kinds of sources of randomness that + are used to seed cryptographic quality random number generators on + systems without special hardware for their construction.) + + In addition, items such as the computer's name and the name of the + operating system, while not strictly speaking random, will help + differentiate the results from those obtained by other systems. + + The exact algorithm to generate a node ID using these data is system + specific, because both the data available and the functions to obtain + them are often very system specific. However, assuming that one can + concatenate all the values from the randomness sources into a buffer, + and that a cryptographic hash function such as MD5 [3] is available, + the following code will compute a node ID: + + #include + #define HASHLEN 16 + + void GenNodeID( + unsigned char * pDataBuf, // concatenated "randomness values" + long cData, // size of randomness values + unsigned char NodeID[6] // node ID + ) + { + int i, j, k; + unsigned char Hash[HASHLEN]; + MD_CTX context; + + MDInit (&context); + MDUpdate (&context, pDataBuf, cData); + MDFinal (Hash, &context); + + for (j = 0; j<6; j++) NodeId[j]=0; + for (i = 0,j = 0; i < HASHLEN; i++) { + NodeID[j++] ^= Hash[i]; + if (j == 6) j = 0; + }; + NodeID[0] |= 0x80; // set the multicast bit + }; + + Other hash functions, such as SHA-1 [4], can also be used (in which + case HASHLEN will be 20). The only requirement is that the result be + suitably random _ in the sense that the outputs from a set uniformly + distributed inputs are themselves uniformly distributed, and that a + single bit change in the input can be expected to cause half of the + output bits to change. + + +5. Obtaining IEEE 802 addresses + + The following URL + + Leach, Salz expires July 1997 [Page 11] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + + + + http://stdsbbs.ieee.org/products/oui/forms/index.html + + contains information on how to obtain an IEEE 802 address block. Cost + is $1000 US. + + +6. Security Considerations + + It should not be assumed that UUIDs are hard to guess; they should + not be used as capabilities. + + +7. Acknowledgements + + This document draws heavily on the OSF DCE specification for UUIDs. + Ted Ts'o provided helpful comments, especially on the byte ordering + section which we mostly plagiarized from a proposed wording he + supplied (all errors in that section are our responsibility, + however). + + +8. References + + [1] Lisa Zahn, et. al., Network Computing Architecture, Prentice + Hall, Englewood Cliffs, NJ, 1990 + + [2] DCE: Remote Procedure Call, Open Group CAE Specification C309 + ISBN 1-85912-041-5 28cm. 674p. pbk. 1,655g. 8/94 + + [3] R. Rivest, RFC 1321, "The MD5 Message-Digest Algorithm", + 04/16/1992. + + [4] SHA Spec - TBD + + +9. Authors' addresses + + Paul J. Leach + Microsoft + 1 Microsoft Way + Redmond, WA, 98052, U.S.A. + Email: + + paulle@microsoft.com + + Rich Salz + The Open Group + 11 Cambridge Center + Cambridge, MA 02142, U.S.A. + Email r.salz@opengroup.org + + + + +Appendix A _ UUID Reference Implementation + + /* + ** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. + + Leach, Salz expires July 1997 [Page 12] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + ** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & + ** Digital Equipment Corporation, Maynard, Mass. + ** To anyone who acknowledges that this file is provided "AS IS" + ** without any express or implied warranty: permission to use, copy, + ** modify, and distribute this file for any purpose is hereby + ** granted without fee, provided that the above copyright notices and + ** this notice appears in all source code copies, and that none of + ** the names of Open Software Foundation, Inc., Hewlett-Packard + ** Company, or Digital Equipment Corporation be used in advertising + ** or publicity pertaining to distribution of the software without + ** specific, written prior permission. Neither Open Software + ** Foundation, Inc., Hewlett-Packard Company, nor Digital Equipment + ** Corporation makes any representations about the suitability of + ** this software for any purpose. + */ + #include + #include + + typedef unsigned long unsigned32; + typedef unsigned short unsigned16; + typedef unsigned char unsigned8; + typedef unsigned char byte; + + #define CLOCK_SEQ_LAST 0x3FFF + #define RAND_MASK CLOCK_SEQ_LAST + + typedef struct _uuid_t { + unsigned32 time_low; + unsigned16 time_mid; + unsigned16 time_hi_and_version; + unsigned8 clock_seq_hi_and_reserved; + unsigned8 clock_seq_low; + byte node[6]; + } uuid_t; + + typedef struct _unsigned64_t { + unsigned32 lo; + unsigned32 hi; + } unsigned64_t; + + /* + ** Add two unsigned 64-bit long integers. + */ + #define ADD_64b_2_64b(A, B, sum) \ + { \ + if (!(((A)->lo & 0x80000000UL) ^ ((B)->lo & 0x80000000UL))) { + \ + if (((A)->lo&0x80000000UL)) { \ + (sum)->lo = (A)->lo + (B)->lo; \ + (sum)->hi = (A)->hi + (B)->hi + 1; \ + } \ + else { \ + (sum)->lo = (A)->lo + (B)->lo; \ + (sum)->hi = (A)->hi + (B)->hi; \ + + Leach, Salz expires July 1997 [Page 13] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + } \ + } \ + else { \ + (sum)->lo = (A)->lo + (B)->lo; \ + (sum)->hi = (A)->hi + (B)->hi; \ + if (!((sum)->lo&0x80000000UL)) (sum)->hi++; \ + } \ + } + + /* + ** Add a 16-bit unsigned integer to a 64-bit unsigned integer. + */ + #define ADD_16b_2_64b(A, B, sum) \ + { \ + (sum)->hi = (B)->hi; \ + if ((B)->lo & 0x80000000UL) { \ + (sum)->lo = (*A) + (B)->lo; \ + if (!((sum)->lo & 0x80000000UL)) (sum)->hi++; \ + } \ + else \ + (sum)->lo = (*A) + (B)->lo; \ + } + + /* + ** Global variables. + */ + static unsigned64_t time_last; + static unsigned16 clock_seq; + + static void + mult32(unsigned32 u, unsigned32 v, unsigned64_t *result) + { + /* Following the notation in Knuth, Vol. 2. */ + unsigned32 uuid1, uuid2, v1, v2, temp; + + uuid1 = u >> 16; + uuid2 = u & 0xFFFF; + v1 = v >> 16; + v2 = v & 0xFFFF; + temp = uuid2 * v2; + result->lo = temp & 0xFFFF; + temp = uuid1 * v2 + (temp >> 16); + result->hi = temp >> 16; + temp = uuid2 * v1 + (temp & 0xFFFF); + result->lo += (temp & 0xFFFF) << 16; + result->hi += uuid1 * v1 + (temp >> 16); + } + + static void + get_system_time(unsigned64_t *uuid_time) + { + struct timeval tp; + unsigned64_t utc, usecs, os_basetime_diff; + + + Leach, Salz expires July 1997 [Page 14] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + gettimeofday(&tp, (struct timezone *)0); + mult32((long)tp.tv_sec, 10000000, &utc); + mult32((long)tp.tv_usec, 10, &usecs); + ADD_64b_2_64b(&usecs, &utc, &utc); + + /* Offset between UUID formatted times and Unix formatted times. + * UUID UTC base time is October 15, 1582. + * Unix base time is January 1, 1970. */ + os_basetime_diff.lo = 0x13814000; + os_basetime_diff.hi = 0x01B21DD2; + ADD_64b_2_64b(&utc, &os_basetime_diff, uuid_time); + } + + /* + ** See "The Multiple Prime Random Number Generator" by Alexander + ** Hass pp. 368-381, ACM Transactions on Mathematical Software, + ** 12/87. + */ + static unsigned32 rand_m; + static unsigned32 rand_ia; + static unsigned32 rand_ib; + static unsigned32 rand_irand; + + static void + true_random_init(void) + { + unsigned64_t t; + unsigned16 seed; + + /* Generating our 'seed' value Start with the current time, but, + * since the resolution of clocks is system hardware dependent and + * most likely coarser than our resolution (10 usec) we 'mixup' the + * bits by xor'ing all the bits together. This will have the effect + * of involving all of the bits in the determination of the seed + * value while remaining system independent. Then for good measure + * to ensure a unique seed when there are multiple processes + * creating UUIDs on a system, we add in the PID. + */ + rand_m = 971; + rand_ia = 11113; + rand_ib = 104322; + rand_irand = 4181; + get_system_time(&t); + seed = t.lo & 0xFFFF; + seed ^= (t.lo >> 16) & 0xFFFF; + seed ^= t.hi & 0xFFFF; + seed ^= (t.hi >> 16) & 0xFFFF; + rand_irand += seed + getpid(); + } + + static unsigned16 + true_random(void) + { + if ((rand_m += 7) >= 9973) + + Leach, Salz expires July 1997 [Page 15] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + rand_m -= 9871; + if ((rand_ia += 1907) >= 99991) + rand_ia -= 89989; + if ((rand_ib += 73939) >= 224729) + rand_ib -= 96233; + rand_irand = (rand_irand * rand_m) + rand_ia + rand_ib; + return (rand_irand >> 16) ^ (rand_irand & RAND_MASK); + } + + /* + ** Startup initialization routine for the UUID module. + */ + void + uuid_init(void) + { + true_random_init(); + get_system_time(&time_last); + #ifdef NONVOLATILE_CLOCK + clock_seq = read_clock(); + #else + clock_seq = true_random(); + #endif + } + + static int + time_cmp(unsigned64_t *time1, unsigned64_t *time2) + { + if (time1->hi < time2->hi) return -1; + if (time1->hi > time2->hi) return 1; + if (time1->lo < time2->lo) return -1; + if (time1->lo > time2->lo) return 1; + return 0; + } + + static void new_clock_seq(void) + { + clock_seq = (clock_seq + 1) % (CLOCK_SEQ_LAST + 1); + if (clock_seq == 0) clock_seq = 1; + #ifdef NONVOLATILE_CLOCK + write_clock(clock_seq); + #endif + } + + void uuid_create(uuid_t *uuid) + { + static unsigned64_t time_now; + static unsigned16 time_adjust; + byte eaddr[6]; + int got_no_time = 0; + + get_ieee_node_identifier(&eaddr); /* TO BE PROVIDED */ + + do { + get_system_time(&time_now); + + Leach, Salz expires July 1997 [Page 16] + + + Internet-Draft UUIDs and GUIDs (DRAFT) 02/24/97 + + + switch (time_cmp(&time_now, &time_last)) { + case -1: + /* Time went backwards. */ + new_clock_seq(); + time_adjust = 0; + break; + case 1: + time_adjust = 0; + break; + default: + if (time_adjust == 0x7FFF) + /* We're going too fast for our clock; spin. */ + got_no_time = 1; + else + time_adjust++; + break; + } + } while (got_no_time); + + time_last.lo = time_now.lo; + time_last.hi = time_now.hi; + + if (time_adjust != 0) { + ADD_16b_2_64b(&time_adjust, &time_now, &time_now); + } + + /* Construct a uuid with the information we've gathered + * plus a few constants. */ + uuid->time_low = time_now.lo; + uuid->time_mid = time_now.hi & 0x0000FFFF; + uuid->time_hi_and_version = (time_now.hi & 0x0FFF0000) >> 16; + uuid->time_hi_and_version |= (1 << 12); + uuid->clock_seq_low = clock_seq & 0xFF; + uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8; + uuid->clock_seq_hi_and_reserved |= 0x80; + memcpy(uuid->node, &eaddr, sizeof uuid->node); + } + + + + + + + + + + + + + + + + + + + Leach, Salz expires July 1997 [Page 17] diff --git a/docs/draft_cai_ssdp_v1_03.txt b/docs/draft_cai_ssdp_v1_03.txt new file mode 100644 index 0000000..f58b491 --- /dev/null +++ b/docs/draft_cai_ssdp_v1_03.txt @@ -0,0 +1,1044 @@ +Internet Engineering Task Force Yaron Y. Goland +INTERNET DRAFT Ting Cai + Paul Leach + Ye Gu + Microsoft Corporation + Shivaun Albright + Hewlett-Packard Company + October 28, 1999 + Expires April 2000 + + + + Simple Service Discovery Protocol/1.0 + Operating without an Arbiter + + + + +Status of this Memo + + This document is an Internet-Draft and is in full conformance with + all provisions of Section 10 of RFC2026. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six + months and may be updated, replaced, or obsoleted by other documents + at any time. It is inappropriate to use Internet- Drafts as + reference material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + Please send comments to the SSDP mailing list. Subscription + information for the SSDP mailing list is available at + http://www.upnp.org/resources/ssdpmail.htm. + +Abstract + + The Simple Service Discovery Protocol (SSDP) provides a mechanism + where by network clients, with little or no static configuration, + can discover network services. SSDP accomplishes this by providing + for multicast discovery support as well as server based notification + and discovery routing. + +Table of Contents + + Status of this Memo................................................1 + Abstract...........................................................1 + + +Goland et al. [Page 1] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + Table of Contents..................................................1 + 1. Changes Since 02.............................................3 + 2. Introduction.................................................3 + 2.1. Problem Statement.........................................3 + 2.2. Proposed Solution.........................................4 + 2.2.1. Message Flow on the SSDP Multicast Channel...........4 + 2.2.2. SSDP Discovery Information Caching Model.............4 + 2.3. Design Rationale..........................................5 + 2.3.1. Message Flow on the SSDP Multicast Channel...........5 + 2.3.2. SSDP Discovery Information Caching Model.............7 + 3. Terminology..................................................8 + 4. SSDP Discovery Requests......................................8 + 4.1. Problem Statement.........................................8 + 4.2. Proposed Solution.........................................8 + 4.3. Design Rationale.........................................10 + 4.3.1. Why is the ST header so limited? Why doesn't it support + at least and/or/not? Why not name/value pair searching?.....10 + 4.3.2. If we are using the SEARCH method why aren't you using + the DASL search syntax?.....................................10 + 4.3.3. Why can we only specify one search type in the ST + header of a ssdp:discover request?..........................10 + 4.3.4. Why do we only provide support for multicast UDP, not + TCP, ssdp:discover requests?................................10 + 4.3.5. Why do we require that responses without caching + information not be cached at all?...........................11 + 5. SSDP Presence Announcements.................................11 + 5.1. Problem Statement........................................11 + 5.2. Proposed Solution........................................11 + 5.2.1. ssdp:alive..........................................11 + 5.2.2. ssdp:byebye.........................................12 + 5.3. Design Rationale.........................................13 + 5.3.1. Why are we using GENA NOTIFY requests?..............13 + 5.3.2. Why is there no response to the ssdp:alive/ssdp:byebye + requests sent to the SSDP multicast channel/port?...........13 + 5.3.3. Could NTS values other than ssdp:alive/ssdp:byebye be + sent to the SSDP multicast channel/port?....................13 + 5.3.4. Why do we include the NT header on ssdp:byebye + requests?...................................................13 + 5.3.5. Shouldn't the NT and NTS values be switched?........13 + 6. SSDP Auto-Shut-Off Algorithm................................13 + 6.1. Problem Statement........................................13 + 6.2. Proposed Solution........................................13 + 6.3. Design Rationale.........................................14 + 6.3.1. Why do we need an auto-shut-off algorithm?..........14 + 6.3.2. Why not just require everyone to support directories + and thus get around the scaling issue?......................15 + 7. ssdp:all....................................................15 + 7.1. Problem Statement........................................15 + 7.2. Proposed Solution........................................15 + 7.3. Design Rationale.........................................16 + 7.3.1. Why would anyone want to enumerate all services?....16 + 8. SSDP Reserved Multicast Channel.............................16 + + +Goland et al. [Page 2] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + 8.1. Problem Statement........................................16 + 8.2. Proposed Solution........................................16 + 8.3. Design Rationale.........................................16 + 8.3.1. Why didn't SSDP just get a static local administrative + scope address rather than a relative address?...............16 + 8.3.2. Why does SSDP need to use a port other than 80?.....16 + 9. HTTP Headers................................................17 + 9.1. USN Header...............................................17 + 9.2. ST Header................................................17 + 10. Security Considerations.....................................17 + 11. IANA Considerations.........................................17 + 12. Appendix - Constants........................................17 + 13. Acknowledgements............................................17 + 14. References..................................................17 + 15. Author's Addresses..........................................18 + +1. Changes Since 02 + + The entire specification has been extensively re-written. As such + the reader is advised to re-read the entire specification rather + than to just look for particular changes. + + Removed the arbiter and related functionality. + + Spec used to contain both ssdp:discover and ssdp:discovery, settled + on ssdp:discover. + + Changed SSDP multicast message examples to use the reserved relative + multicast address "5" provided by IANA. In the local administrative + scope, the only scope currently used by SSDP, this address + translates to 239.255.255.250. + + An application has been made for a reserved port for SSDP but no + response from IANA has been received. + +2. Introduction + + [Ed. Note: In my experience, one of the best ways to enable a + specification to be quickly and successfully developed is to provide + a problem statement, a proposed solution and a design rationale. I + came across this three-part design structure when Larry Masinter + proposed it to the WebDAV WG. To that end, I have divided this spec + in a similar manner. Once the specification is sufficiently mature, + the problem statement and design rationale sections will be placed + in a separate document and the proposed solutions will be presented + for standardization.] + + This document assumes the reader is very familiar with [RFC2616], + [HTTPUDP], [GENA], [MAN] and [RFC2365]. + +2.1. Problem Statement + + + +Goland et al. [Page 3] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + A mechanism is needed to allow HTTP clients and HTTP resources to + discover each other in local area networks. That is, a HTTP client + may need a particular service that may be provided by one or more + HTTP resources. The client needs a mechanism to find out which HTTP + resources provide the service the client desires. + + For the purposes of this specification the previously mentioned HTTP + client will be referred to as a SSDP client. The previous mentioned + HTTP resource will be referred to as a SSDP service. + + In the simplest case this discovery mechanism needs to work without + any configuration, management or administration. For example, if a + user sets up a home network or a small company sets up a local area + network they must not be required to configure SSDP before SSDP can + be used to help them discover SSDP services in the form of Printers, + Scanners, Fax Machines, etc. + + It is a non-goal for SSDP to provide for multicast scope bridging or + for advanced query facilities. + +2.2. Proposed Solution + +2.2.1. Message Flow on the SSDP Multicast Channel + + The following is an overview of the messages used to implement SSDP. + + SSDP clients discover SSDP services using the reserved local + administrative scope multicast address 239.255.255.250 over the SSDP + port [NOT YET ALLOCATED BY IANA]. + + For brevity's sake the SSDP reserved local administrative scope + multicast address and port will be referred to as the SSDP multicast + channel/Port. + + Discovery occurs when a SSDP client multicasts a HTTP UDP discovery + request to the SSDP multicast channel/Port. SSDP services listen to + the SSDP multicast channel/Port in order to hear such discovery + requests. If a SSDP service hears a HTTP UDP discovery request that + matches the service it offers then it will respond using a unicast + HTTP UDP response. + + SSDP services may send HTTP UDP notification announcements to the + SSDP multicast channel/port to announce their presence. + + Hence two types of SSDP requests will be sent across the SSDP + multicast channel/port. The first are discovery requests, a SSDP + client looking for SSDP services. The second are presence + announcements, a SSDP service announcing its presence. + +2.2.2. SSDP Discovery Information Caching Model + + + + +Goland et al. [Page 4] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + The following provides an overview of the data provided in a SSDP + system. + + Services are identified by a unique pairing of a service type URI + and a Unique Service Name (USN) URI. + + Service types identify a type of service, such as a refrigerator, + clock/radio, what have you. The exact meaning of a service type is + outside the scope of this specification. For the purposes of this + specification, a service type is an opaque identifier that + identifies a particular type of service. + + A USN is a URI that uniquely identifies a particular instance of a + service. USNs are used to differentiate between two services with + the same service type. + + In addition to providing both a service type and a USN, discovery + results and presence announcements also provide expiration and + location information. + + Location information identifies how one should contact a particular + service. One or more location URIs may be included in a discovery + response or a presence announcement. + + Expiration information identifies how long a SSDP client should keep + information about the service in its cache. Once the entry has + expired it is to be removed from the SSDP client's cache. + + Thus a SSDP client service cache might look like: + + USN URI | Service Type URI | Expiration | Location + -----------------|------------------|------------|------------------ + upnp:uuid:k91... | upnp:clockradio | 3 days | http://foo.com/cr + -----------------|------------------|------------|------------------ + uuid:x7z... | ms:wince | 1 week | http://msce/win + -----------------|------------------|------------|------------------ + + In the previous example both USN URIs are actually UUIDs such as + upnp:uuid:k91d4fae-7dec-11d0-a765-00a0c91c6bf6. + + If an announcement or discovery response is received that has a USN + that matches an entry already in the cache then the information in + the cache is to be completely replaced with the information in the + announcement or discovery response. + +2.3. Design Rationale + + [Ed. Note: In my own experience one of the most powerful ways to + explain design rationale is in a question/answer form. Therefore I + have used that format here.] + +2.3.1. Message Flow on the SSDP Multicast Channel + + +Goland et al. [Page 5] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + + Please see section 8.3 for more design rationale behind our use of + multicasting. + +2.3.1.1. Why use multicast for communication? + + We needed a solution for communication that would work even if there + was no one around to configure things. The easiest solution would + have been to build a discovery server, but who would set the server + up? Who would maintain it? We needed a solution that could work even + if no one had any idea what discovery was. By using multicasting we + have the equivalent of a "party channel." Everyone can just grab the + channel and scream out what they need and everyone else will hear. + This means no configuration worries. Of course it brings up other + problems which are addressed throughout this specification. + +2.3.1.2. Why use a local administrative scope multicast address? + + Multicasting comes in many scopes, from link local all the way to + "the entire Internet." Our goal is to provide for discovery for + local area networks not for the entire Internet. LANs often are + bridged/routed so a link local multicast scope was too restrictive. + The next level up was a local administrative scope. The idea being + that your administrator decides how many machines should be grouped + together and considered a "unit". This seemed the ideal scope to use + for a local discovery protocol. + +2.3.1.3. Why does SSDP support both service discovery requests as well +as service presence announcements? + + Some discovery protocols only support discovery requests, that is, + the client must send out a request in order to find out who is + around. The downside to such solutions is that they tend to be very + expensive on the wire. For example, we want to display to our user + all the VCRs in her house. So we send out a discovery request. + However our user has just purchased a new VCR and, after starting + our program, plugged it in. The only way we would find out about the + new VCR and be able to display it on our user's screen is by + constantly sending out discovery requests. Now imagine every client + in the network having to send out a torrent of discovery requests + for service they care about in order to make sure they don't miss a + new service coming on-line. + + Other systems use the opposite extreme, they only support + announcements. Therefore, when our user opens the VCR display window + we would just sit and listen for announcements. In such systems all + the services have to send out a constant stream of announcements in + order to make sure that no one misses them. Users aren't the most + patient people in the world so each service will probably need to + announce itself at least every few seconds. This constant stream of + traffic does horrible things to network efficient, especially for + shared connections like Ethernets. + + +Goland et al. [Page 6] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + + SSDP decided to adopt a hybrid approach and do both discovery and + announcements. This can be incredibly efficient. When a service + first comes on-line it will send out an announcement so that + everyone knows it is there. At that point it shouldn't ever need to + send out another announcement unless it is going off-line, has + changed state or its cache entry is about to expire. Any clients who + come on-line after the service came on-line will discover the + desired service by sending out a discovery request. The client + should never need to repeat the discovery request because any + services that subsequently come on-line will announce themselves. + The end result is that no one needs to send out steady streams of + messages. The entire system is event driven, only when things change + will messages need to be sent out. The cost, however, is that the + protocol is more complex. We felt this was a price worth paying as + it meant that SSDP could be used successfully in fairly large + networks. + +2.3.1.4. Doesn't the caching information turn SSDP back into a +"announcement driven" protocol? + + Discovery protocols that only support announcements generally have + to require services to send announcements every few seconds. + Otherwise users screens will take too long to update with + information about which services are available. + + SSDP, on the other hand, allows the service to inform clients how + long they should assume the service is around. Thus a service can + set a service interval to seconds, minutes, days, weeks, months or + even years. + + Clients do not have to wait around for cache update messages because + they can perform discovery. + +2.3.2. SSDP Discovery Information Caching Model + +2.3.2.1. Why do we need USNs, isn't the location good enough? + + When a service announces itself it usually includes a location + identifying where it may be found. However that location can and + will change over time. For example, a user may decide to change the + DNS name assigned to that device. Were we to depend on locations, + not USNs, when the service's location was changed we would think we + were seeing a brand new service. This would be very disruptive to + the user's experience. Imagine, for example, that the user has set + up a PC program that programs their VCR based on schedules pulled + off the Internet. If the user decides to change the VCR's name from + the factory default to something friendly then a location based + system would loose track of the VCR it is supposed to be programming + because the name has changed. By using unique Ids instead we are + able to track the VCR regardless of the name change. So the user can + + + +Goland et al. [Page 7] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + change the VCR's name at will and the VCR programming application + will still be able to program the correct VCR. + +2.3.2.2. Why are USNs URIs and why are they required to be unique +across the entire URI namespace for all time? + + In general making a name universally unique turns out to usually be + a very good idea. Mechanisms such as UUIDs allow universally unique + names to be cheaply created in a decentralized manner. In this case + making USNs globally unique is very useful because services may be + constantly moved around, if they are to be successfully tracked they + need an identifier that isn't going to change and isn't going to get + confused with any other service. + + URIs were chosen because they have become the de facto managed + namespace for use on the Internet. Anytime someone wants to name + something it is easy to just use a URI. + +3. Terminology + + SSDP Client - A HTTP client that makes use of a service. + + SSDP Service - A HTTP resource that provides a service used by SSDP + clients. + + + Service Type - A URI that identifies the type or function of a + particular service. + + Unique Service Name (USN) - A URI that is guaranteed to be unique + across the entire URI namespace for all time. It is used to uniquely + identify a particular service in order to allow services with + identical service type URIs to to be differentiated. + + In addition, the key words "MUST", "MUST NOT", "REQUIRED", "SHALL", + "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + RFC 2119 [RFC2119]. + +4. SSDP Discovery Requests + +4.1. Problem Statement + + A mechanism is needed for SSDP clients to find desired SSDP + services. + +4.2. Proposed Solution + + The SEARCH method, introduced by [DASL], is extended using the [MAN] + mechanism to provide for SSDP discovery. + + The SSDP SEARCH extension is identified by the URI ssdp:discover. + + +Goland et al. [Page 8] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + + For brevity's sake a HTTP SEARCH method enhanced with the + ssdp:discover functionality will be referred to as a ssdp:discover + request. + + ssdp:discover requests MUST contain a ST header. ssdp:discover + requests MAY contain a body but the body MAY be ignored if not + understood by the HTTP service. + + The ST header contains a single URI. SSDP clients may use the ST + header to specify the service type they want to discover. + + This specification only specifies the use of ssdp:discover requests + over HTTP Multicast UDP although it is expected that future + specifications will expand the definition to handle ssdp:discover + requests sent over HTTP TCP. + + ssdp:discover requests sent to the SSDP multicast channel/port MUST + have a request-URI of "*". Note that future specifications may allow + for other request-URIs to be used so implementations based on this + specification MUST be ready to ignore ssdp:discover requests on the + SSDP multicast channel/port with a request-URI other than "*". + + Only SSDP services that have a service type that matches the value + in the ST header MAY respond to a ssdp:discover request on the SSDP + multicast channel/port. + + Responses to ssdp:discover requests sent over the SSDP multicast + channel/port are to be sent to the IP address/port the ssdp:discover + request came from. + + A response to a ssdp:discover request SHOULD include the service's + location expressed through the Location and/or AL header. A + successful response to a ssdp:discover request MUST also include the + ST and USN headers. + + Response to ssdp:discover requests SHOULD contain a cache-control: + max-age or Expires header. If both are present then they are to be + processed in the order specified by HTTP/1.1, that is, the cache- + control header takes precedence of the Expires header. If neither + the cache-control nor the Expires header is provided on the response + to a ssdp:discover request then the information contained in that + response MUST NOT be cached by SSDP clients. + +4.2.1.1. Example + + M-SEARCH * HTTP/1.1 + S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6 + Host: 239.255.255.250:reservedSSDPport + Man: "ssdp:discover" + ST: ge:fridge + MX: 3 + + +Goland et al. [Page 9] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + + HTTP/1.1 200 OK + S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6 + Ext: + Cache-Control: no-cache="Ext", max-age = 5000 + ST: ge:fridge + USN: uuid:abcdefgh-7dec-11d0-a765-00a0c91e6bf6 + AL: + +4.3. Design Rationale + +4.3.1. Why is the ST header so limited? Why doesn't it support at +least and/or/not? Why not name/value pair searching? + + Deciding the "appropriate" level of search capability is a hopeless + task. So we decided to pare things back to the absolute minimum, a + single opaque token, and see what happens. The result so far has + been a very nice, simple, easy to implement, easy to use discovery + system. There are lots of great features it doesn't provide but most + of them, such as advanced queries and scoping, require a search + engine and a directory. This level of capability is beyond many + simple devices, exactly the sort of folks we are targeting with + SSDP. Besides, search functionality seems to be an all or nothing + type of situation. Either you need a brain dead simple search + mechanism or you need a full fledged near SQL class search system. + Instead of making SSDP the worst of both worlds we decided to just + focus on the dirt simple search problem and leave the more advanced + stuff to the directory folk. + +4.3.2. If we are using the SEARCH method why aren't you using the +DASL search syntax? + + We couldn't come up with a good reason to force our toaster ovens to + learn XML. The features the full-fledged DASL search syntax provides + are truly awesome and thus way beyond our simple scenarios. We fully + expect that DASL will be the preferred solution for advanced search + scenarios, but that isn't what this draft is about. + +4.3.3. Why can we only specify one search type in the ST header of a +ssdp:discover request? + + We wanted to start as simple as possible and be forced, kicking and + screaming, into adding additional complexity. The simplest solution + was to only allow a single value in the ST header. We were also + concerned that if we allowed multiple values into the ST headers + somebody would try to throw in and/or/not functionality. Given the + minimal byte savings of allowing multiple values into the ST header + it seems better to just leave the protocol simpler. + +4.3.4. Why do we only provide support for multicast UDP, not TCP, +ssdp:discover requests? + + + +Goland et al. [Page 10] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + We only define what we need to make the discovery protocol work and + we don't need TCP to make the discovery protocol work. Besides to + make TCP discovery really work you need to be able to handle + compound responses which means you need a compound response format + which is probably XML and that is more than we wanted to handle. + Eventually we expect that you will be able to go up to the SSDP port + on a server using a HTTP TCP request and discover what service, if + any, lives there. But that will be described in a future + specification. + +4.3.5. Why do we require that responses without caching information +not be cached at all? + + Because that was a lot easier thing to do then trying to explain the + various heuristics one could use to deal with services who don't + provide caching information. + +5. SSDP Presence Announcements + +5.1. Problem Statement + + A mechanism is needed for SSDP services to be able to let interested + SSDP clients know of their presence. + + A mechanism is needed to allow SSDP services to update expiration + information in cache entries regarding them. + + A mechanism is needed to allow SSDP services to notify interested + SSDP clients when their location changes. + + A mechanism is needed to allow SSDP services to inform interested + SSDP clients that they are going to de-activate themselves. + +5.2. Proposed Solution + +5.2.1. ssdp:alive + + SSDP services may declare their presence on the network by sending a + [GENA] NOTIFY method using the NTS value ssdp:alive to the SSDP + multicast channel/port. + + For brevity's sake HTTP NOTIFY methods with the NTS value ssdp:alive + will be referred to as ssdp:alive requests. + + When a ssdp:alive request is received whose USN matches the USN of + an entry already in the SSDP client's cache then all information + regarding that USN is to be replaced with the information on the + ssdp:alive request. Hence ssdp:alive requests can be used to update + location information and prevent cache entries from expiring. + + + + + +Goland et al. [Page 11] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + The value of NT on a ssdp:alive request MUST be set to the service's + service type. ssdp:alive requests MUST contain a USN header set to + the SSDP service's USN. + + ssdp:alive requests SHOULD contain a Location and/or AL header. If + there is no DNS support available on the local network then at least + one location SHOULD be provided using an IP address of the SSDP + service. + + ssdp:alive requests SHOULD contain a cache-control: max-age or + Expires header. If both are present then they are to be processed in + the order specified by HTTP/1.1, that is, the cache-control header + takes precedence of the Expires header. If neither the cache-control + nor the Expires header is provided the information in the ssdp:alive + request MUST NOT be cached by SSDP clients. + + There is no response to a ssdp:alive sent to the SSDP multicast + channel/port. + +5.2.1.1. Example + + NOTIFY * HTTP/1.1 + Host: 239.255.255.250:reservedSSDPport + NT: blenderassociation:blender + NTS: ssdp:alive + USN: someunique:idscheme3 + AL: + Cache-Control: max-age = 7393 + +5.2.2. ssdp:byebye + + SSDP services may declare their intention to cease operating by + sending a [GENA] NOTIFY method using the NTS value ssdp:byebye to + the SSDP multicast channel/port. + + For brevity's sake HTTP NOTIFY methods with the NTS value + ssdp:byebye will be referred to as ssdp:byebye requests. + + The value of NT on a ssdp:byebye request MUST be set to the + service's service type. ssdp:byebye requests MUST contain a USN + header set to the SSDP service's USN. + + There is no response to a ssdp:byebye sent to the SSDP multicast + channel/port. + + When a ssdp:byebye request is received all cached information + regarding that USN SHOULD be removed. + +5.2.2.1. Example + + NOTIFY * HTTP/1.1 + Host: 239.255.255.250:reservedSSDPport + + +Goland et al. [Page 12] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + NT: someunique:idscheme3 + NTS: ssdp:byebye + USN: someunique:idscheme3 + +5.3. Design Rationale + +5.3.1. Why are we using GENA NOTIFY requests? + + We needed to use some notification format and GENA seemed as good as + any. Moving forward, GENA gives us a framework to do notification + subscriptions which will be necessary if SSDP services are to be + able to provide status updates across the wilds of the Internet + without depending on the largely non-existent Internet multicast + infrastructure. + + +5.3.2. Why is there no response to the ssdp:alive/ssdp:byebye +requests sent to the SSDP multicast channel/port? + + What response would be sent? There isn't much of a point of having + the SSDP clients send response saying "we received your + notification" since there may be a lot of them. + +5.3.3. Could NTS values other than ssdp:alive/ssdp:byebye be sent to +the SSDP multicast channel/port? + + Yes. + +5.3.4. Why do we include the NT header on ssdp:byebye requests? + + Technically it isn't necessary since the only useful information is + the USN. But we want to stick with the GENA format that requires a + NT header. In truth the requirement of including the NT header is a + consequence of the next issue. + +5.3.5. Shouldn't the NT and NTS values be switched? + + Yes, they should. Commands such as ssdp:alive and ssdp:byebye should + be NT values and the service type, where necessary, should be the + NTS. The current mix-up is a consequence of a previous design where + the NT header was used in a manner much like we use the USN today. + This really needs to change. + +6. SSDP Auto-Shut-Off Algorithm + +6.1. Problem Statement + + A mechanism is needed to ensure that SSDP does not cause such a high + level of traffic that it overwhelms the network it is running on. + +6.2. Proposed Solution + + + +Goland et al. [Page 13] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + [Ed. Note: We have a proposed solution but it is still a bit rough, + so we will be publishing to the SSDP mailing list for further + discussion before including it in the draft.] + +6.3. Design Rationale + +6.3.1. Why do we need an auto-shut-off algorithm? + + The general algorithm for figuring out how much bandwidth SSDP uses + over a fixed period of time based on the number of ssdp:discover + requests is : + + DR = Total number of SSDP clients making ssdp:discover requests over + the time period in question. + RS = Total number of services that will respond to the ssdp:discover + requests over the time period in question. + AM = Average size of the ssdp:discover requests/responses. + TP = Time period in question. + + ((DR*3 + DR*9*RS)*AM)/TP + + The 3 is the number of times the ssdp:discover request will be + repeated. + The 9 is the number of times the unicast responses to the + ssdp:discover requests will be sent out assuming the worst case in + which all 3 original requests are received. + + So let's look at a real world worst-case scenario. Some companies, + in order to enable multicast based services such as voice or video + streaming to be easily configured set their local administrative + multicast scope to encompass their entire company. This means one + gets networks with 100,000 machines in a single administrative + multicast scope. Now imagine that there is a power outage and all + the machines are coming back up at the same time. Further imagine + that they all want to refresh their printer location caches so they + all send out ssdp:discover requests. Let us finally imagine that + there are roughly 5000 printers in this network. To simplify the + math we will assume that the ssdp:discover requests are evenly + distributed over the 30 seconds. + + DR = 100,000 requesting clients + RS = 5000 services + AM = 512 bytes + TP = 30 seconds + + ((100000*3+100000*9*5000)*512)/30 = 76805120000 bytes/s = + 585976.5625 Megabits per second + + This is what one would call an awful number. + + + + + +Goland et al. [Page 14] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + In a more reasonably sized network SSDP is able to handle this worst + case scenario much better. For example, let's look at a network with + 1000 clients and 50 printers. + + DR = 1000 requesting clients + RS = 50 services + AM = 512 bytes + TP = 30 seconds + + ((1000*3+1000*9*50)*512)/30 = 7731200 bytes/s = 59 Mbps + + Now this looks like an awful amount but remember that that this is + the total data rate needed for 30 seconds. This means that the total + amount of information SSDP needs to send out to survive a reboot is + 59*30 = 1770 Mb. Therefore a 10 Mbps network, assuming an effective + data rate 5 Mbps under constant load that means it will take 1770/5 + = 354 seconds = 6 minutes for the network to settle down. + + That isn't bad considering that this is an absolute worst case in a + network with 1000 clients and 50 services all of whom want to talk + to each other at the exact same instant. + + In either case, there are obvious worst-case scenarios and we need + to avoid network storms, therefore we need a way for SSDP to de- + activate before it causes a network storms. + +6.3.2. Why not just require everyone to support directories and thus +get around the scaling issue? + + Many manufacturers stick every protocol they can think of in their + clients and services. So if your network administrator happened to + buy some clients and servers that supported SSDP but didn't know + they supported SSDP then you can imagine the problems. Therefore + even if we required directory support there are still many cases + where SSDP clients and services may inadvertently end up in a + network without anyone knowing it and cause problems. + +7. ssdp:all + +7.1. Problem Statement + + A mechanism is needed to enable a client to enumerate all the + services available on a particular SSDP multicast channel/port. + +7.2. Proposed Solution + + All SSDP services MUST respond to SEARCH requests over the SSDP + multicast channel/port with the ST value of ssdp:all by responding + as if the ST value had been their service type. + + For brevity's sake a SEARCH request with a ST of ssdp:all will be + referred to as a ssdp:all request. + + +Goland et al. [Page 15] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + +7.3. Design Rationale + +7.3.1. Why would anyone want to enumerate all services? + + This feature is mostly for network analysis tools. It also will + prove very useful in the feature when directories become SSDP aware. + They will be able to discover all services, record information about + them and make that information available outside the local + administrative multicast scope. + +8. SSDP Reserved Multicast Channel + +8.1. Problem Statement + + SSDP needs a local administrative multicast channel that will be + guaranteed to only be used by SSDP compliant clients and services. + +8.2. Proposed Solution + + IANA has reserved the relative multicast address "5" for the + exclusive use of SSDP. In the local administrative scope used by + this version of SSDP the relative address translates to + 239.255.255.250. + + An application has been put in for a SSDP reserved port but IANA has + not yet responded. + +8.3. Design Rationale + +8.3.1. Why didn't SSDP just get a static local administrative scope +address rather than a relative address? + + We got a relative address because we expect that SSDP may be used to + discover basic system services such as directories. In that case if + you can't find a directory in your local scope you may want to try a + wider multicast scope. This is exactly the sort of functionality + enabled by MALLOC (http://www.ietf.org/html.charters/malloc- + charter.html). MALLOC allows one to enumerate all the multicast + scopes that are supported on the network. The SSDP client can then + try progressively larger scopes to find the service they are seeing. + However this progressively wider discovery only works if SSDP uses a + relative address. + +8.3.2. Why does SSDP need to use a port other than 80? + + There is a bug in the Berkley Sockets design that was inherited by + WinSock as well. The bug is as follows: One can not grab a + particular port on a particular multicast address without owning the + same port on the local unicast address. + + + + +Goland et al. [Page 16] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + The result is that if we used port 80 on the SSDP multicast scope + then we would require that the SSDP software also grab port 80 for + the local machine. This would mean that SSDP could only be + implemented on machines which either didn't have HTTP servers or + whose HTTP servers had been enhanced to support SSDP. + + We felt this was a unnecessary restriction. Therefore we are + choosing to use a port other than 80 on the SSDP multicast channel. + +9. HTTP Headers + +9.1. USN Header + + USN = "USN" ":" AbsoluteURI; defined in section 3.2.1 of [RFC2616] + +9.2. ST Header + + ST = "ST" ":" AbsoluteURI + +10. Security Considerations + + TBD. + +11. IANA Considerations + + To ensure correct interoperation based on this specification, IANA + must reserve the URI namespace starting with "ssdp:" for use by this + specification, its revisions, and related SSDP specifications. + + IANA has reserved the relative multicast address "5" for exclusive + use by SSDP. An application has been made for a registered port. + +12. Appendix - Constants + + MAX_UNIQUE - 50 - Maximum number of unique IP address/port pairs + that may be sent over UDP before tripping the auto-shut-off + algorithm. + + MAX_COUNT - 30 seconds - When the "go quiet" process is begun a + message is sent out that is delayed a random interval between 0 to + MAX_COUNT seconds. + +13. Acknowledgements + + This document is the result of enormous effort by a large number of + people including but not limited to: + Alan Boshier, Babak Jahromi, Brandon Watson, Craig White, Dave + Thaler, Holly Knight, Michel Guittet, Mike Zintel, Munil Shah, Paul + Moore, Peter Ford, Pradeep Bahl, and Todd Fisher. + +14. References + + + +Goland et al. [Page 17] +INTERNET-DRAFT SSDP/V1 October 28, 1999 + + + [HTTPUDP] Y. Y. Goland. Multicast and Unicast UDP HTTP Requests. + Internet Draft - a work in progress, draft-goland-http-udp-00.txt. + + [GENA] J. Cohen, S. Aggarwal, Y. Y. Goland. General Event + Notification Architecture Base: Client to Arbiter. Internet Draft - + a work in progress, draft-cohen-gena-client-00.txt. + + [MAN] H. Nielsen, P. Leach, S. Lawrence. Mandatory Extensions in + HTTP. Internet Draft - a work in progress, draft-frystyk-http- + extensions-03.txt. + + [RFC2119] S. Bradner. Key words for use in RFCs to Indicate + Requirement Levels. RFC 2119, March 1997. + + [RFC2365] D. Meyer. Administratively Scoped IP Multicast. RFC + 2365, July 1998. + + [RFC2396] T. Berners-Lee, R. Fielding and L. Masinter. Uniform + Resource Identifiers (URI): Generic Syntax. RFC 2396, August 1998. + + [RFC2518] Y. Goland, E. Whitehead, A. Faizi, S. Carter, and D. + Jensen. HTTP Extensions for Distributed Authoring – WEBDAV. RFC + 2518, February 1999. + + [RFC2616] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, L. + Masinter, P. Leach and T. Berners-Lee. Hypertext Transfer Protocol - + HTTP/1.1. RFC 2616, November 1998. + + [DASL] S. Reddy, D. Lowry, S. Reddy, R. Henderson, J. Davis, A. + Babich. DAV Searching & Locating. a work in progress - draft-ietf- + dasl-protocol-00.txt. + +15. Author's Addresses + + Yaron Y. Goland, Ting Cai, Paul Leach, Ye Gu + Microsoft Corporation + One Microsoft Way + Redmond, WA 98052 + + Email: {yarong, tingcai, paulle, yegu}@microsoft.com + + Shivaun Albright + Hewlett-Packard Company + Roseville, CA + + Email: SHIVAUN_ALBRIGHT@HP-Roseville-om2.om.hp.com + + This document will expire in April 2000. + + + + + +Goland et al. [Page 18] + diff --git a/docs/xml data files/device/MediaRenderer1.xml b/docs/xml data files/device/MediaRenderer1.xml new file mode 100644 index 0000000..9362e07 --- /dev/null +++ b/docs/xml data files/device/MediaRenderer1.xml @@ -0,0 +1,17 @@ + + + + urn:schemas-upnp-org:service:RenderingControl:1 + RenderingControl + + + urn:schemas-upnp-org:service:ConnectionManager:1 + ConnectionManager + + + + urn:schemas-upnp-org:service:AVTransport:1 + AVTransport + + + diff --git a/docs/xml data files/device/MediaServer1.xml b/docs/xml data files/device/MediaServer1.xml new file mode 100644 index 0000000..87f82a9 --- /dev/null +++ b/docs/xml data files/device/MediaServer1.xml @@ -0,0 +1,17 @@ + + + + + urn:schemas-upnp-org:service:AVTransport:1 + AVTransport + + + urn:schemas-upnp-org:service:ContentDirectory:1 + ContentDirectory + + + urn:schemas-upnp-org:service:ConnectionManager:1 + ConnectionManager + + + diff --git a/docs/xml data files/service/AVTransport1.xml b/docs/xml data files/service/AVTransport1.xml new file mode 100644 index 0000000..e6a0a49 --- /dev/null +++ b/docs/xml data files/service/AVTransport1.xml @@ -0,0 +1,477 @@ + + + + TransportState + no + string + + STOPPED + PLAYING + + + + TransportStatus + no + string + + OK + ERROR_OCCURRED + + + + PlaybackStorageMedium + no + string + + + RecordStorageMedium + no + string + + + PossiblePlaybackStorageMedia + no + string + + + PossibleRecordStorageMedia + no + string + + + CurrentPlayMode + no + string + + NORMAL + + NORMAL + + + TransportPlaySpeed + no + string + + 1 + + + + no + RecordMediumWriteStatus + string + + + CurrentRecordQualityMode + no + string + + + PossibleRecordQualityModes + no + string + + + NumberOfTracks + no + ui4 + + 0 + + + + CurrentTrack + no + ui4 + + 0 + 1 + + + + CurrentTrackDuration + no + string + + + CurrentMediaDuration + no + string + + + CurrentTrackMetaData + no + string + + + CurrentTrackURI + no + string + + + AVTransportURI + no + string + + + AVTransportURIMetaData + no + string + + + NextAVTransportURI + no + string + + + NextAVTransportURIMetaData + no + string + + + RelativeTimePosition + no + string + + + AbsoluteTimePosition + no + string + + + RelativeCounterPosition + no + i4 + + + AbsoluteCounterPosition + no + i4 + + + + CurrentTransportActions + no + string + + + LastChange + yes + string + + + A_ARG_TYPE_SeekMode + no + string + + TRACK_NR + + + + A_ARG_TYPE_SeekTarget + no + string + + + A_ARG_TYPE_InstanceID + no + ui4 + + + + + SetAVTransportURI + + + InstanceID + in A_ARG_TYPE_InstanceID + + + CurrentURI + in AVTransportURI + + + CurrentURIMetaData + in AVTransportURIMetaData + + + + + SetNextAVTransportURI + + + InstanceID + in A_ARG_TYPE_InstanceID + + + NextURI + in NextAVTransportURI + + + NextURIMetaData + in NextAVTransportURIMetaData + + + + + GetMediaInfo + + + InstanceID + in A_ARG_TYPE_InstanceID + + + NrTracks + out NumberOfTracks + + + MediaDuration + out CurrentMediaDuration + + + CurrentURI + out AVTransportURI + + + CurrentURIMetaData + out AVTransportURIMetaData + + + NextURI + out NextAVTransportURI + + + NextURIMetaData + out NextAVTransportURIMetaData + + + PlayMedium + out PlaybackStorageMedium + + + RecordMedium + out RecordStorageMedium + + + WriteStatus + out RecordMediumWriteStatus + + + + + GetTransportInfo + + + InstanceID + in A_ARG_TYPE_InstanceID + + + CurrentTransportState + out TransportState + + + CurrentTransportStatus + out TransportStatus + + + CurrentSpeed + out TransportPlaySpeed + + + + + GetPositionInfo + + + InstanceID + in A_ARG_TYPE_InstanceID + + + Track + out CurrentTrack + + + TrackDuration + out CurrentTrackDuration + + + TrackMetaData + out CurrentTrackMetaData + + + TrackURI + out CurrentTrackURI + + + RelTime + out RelativeTimePosition + + + AbsTime + out AbsoluteTimePosition + + + RelCount + out RelativeCounterPosition + + + AbsCount + out AbsoluteCounterPosition + + + + + GetDeviceCapabilities + + + InstanceID + in A_ARG_TYPE_InstanceID + + + PlayMedia + out PossiblePlaybackStorageMedia + + + RecMedia + out PossibleRecordStorageMedia + + + RecQualityModes + out PossibleRecordQualityModes + + + + + GetTransportSettings + + + InstanceID + in A_ARG_TYPE_InstanceID + + + PlayMode + out CurrentPlayMode + + + RecQualityMode + out CurrentRecordQualityMode + + + + + Stop + + + InstanceID + in A_ARG_TYPE_InstanceID + + + + + Play + + + InstanceID + in A_ARG_TYPE_InstanceID + + + Speed + in TransportPlaySpeed + + + + + Pause + + + InstanceID + in A_ARG_TYPE_InstanceID + + + + + Record + + + InstanceID + in A_ARG_TYPE_InstanceID + + + + + Seek + + + InstanceID + in A_ARG_TYPE_InstanceID + + + Unit + in A_ARG_TYPE_SeekMode + + + Target + in A_ARG_TYPE_SeekTarget + + + + + Next + + + InstanceID + in A_ARG_TYPE_InstanceID + + + + + Previous + + + InstanceID + in A_ARG_TYPE_InstanceID + + + + + SetPlayMode + + + InstanceID + in A_ARG_TYPE_InstanceID + + + NewPlayMode + in CurrentPlayMode + + + + + SetRecordQualityMode + + + InstanceID + in A_ARG_TYPE_InstanceID + + + NewRecordQualityMode + in CurrentRecordQualityMode + + + + + + GetCurrentTransportActions + + + InstanceID + in A_ARG_TYPE_InstanceID + + + Actions + out CurrentTransportActions + + + + + + diff --git a/docs/xml data files/service/ConnectionManager1.xml b/docs/xml data files/service/ConnectionManager1.xml new file mode 100644 index 0000000..72d2114 --- /dev/null +++ b/docs/xml data files/service/ConnectionManager1.xml @@ -0,0 +1,170 @@ + + + + SourceProtocolInfo + yes + string + + + SinkProtocolInfo + yes + string + + + CurrentConnectionIDs + yes + string + + + A_ARG_TYPE_ConnectionStatus + no + string + + OK + ContentFormatMismatch + InsufficientBandwidth + UnreliableChannel + Unknown + + + + A_ARG_TYPE_ConnectionManager + no + string + + + A_ARG_TYPE_Direction + no + string + + Input + Output + + + + A_ARG_TYPE_ProtocolInfo + no + string + + + A_ARG_TYPE_ConnectionID + no + i4 + + + A_ARG_TYPE_AVTransportID + no + i4 + + + A_ARG_TYPE_RcsID + no + i4 + + + + + GetProtocolInfo + + + Source + out SourceProtocolInfo + + + Sink + out SinkProtocolInfo + + + + + + PrepareForConnection + + + RemoteProtocolInfo + in A_ARG_TYPE_ProtocolInfo + + + PeerConnectionManager + in A_ARG_TYPE_ConnectionManager + + + PeerConnectionID + in A_ARG_TYPE_ConnectionID + + + Direction + in A_ARG_TYPE_Direction + + + ConnectionID + out A_ARG_TYPE_ConnectionID + + + AVTransportID + out A_ARG_TYPE_AVTransportID + + + RcsID + out A_ARG_TYPE_RcsID + + + + + + ConnectionComplete + + + ConnectionID + in A_ARG_TYPE_ConnectionID + + + + + GetCurrentConnectionIDs + + + ConnectionIDs + out CurrentConnectionIDs + + + + + GetCurrentConnectionInfo + + + ConnectionID + in A_ARG_TYPE_ConnectionID + + + RcsID + out A_ARG_TYPE_RcsID + + + AVTransportID + out A_ARG_TYPE_AVTransportID + + + ProtocolInfo + out A_ARG_TYPE_ProtocolInfo + + + PeerConnectionManager + out A_ARG_TYPE_ConnectionManager + + + PeerConnectionID + out A_ARG_TYPE_ConnectionID + + + Direction + out A_ARG_TYPE_Direction + + + Status + out A_ARG_TYPE_ConnectionStatus + + + + + diff --git a/docs/xml data files/service/ContentDirectory1.xml b/docs/xml data files/service/ContentDirectory1.xml new file mode 100644 index 0000000..9ad8157 --- /dev/null +++ b/docs/xml data files/service/ContentDirectory1.xml @@ -0,0 +1,405 @@ + + + + TransferIDs +yes + string + + + A_ARG_TYPE_ObjectID no + string + + + A_ARG_TYPE_Result no + string + + + A_ARG_TYPE_SearchCriteria no + string + + + A_ARG_TYPE_BrowseFlag no + string + + BrowseMetadata + BrowseDirectChildren + + + + A_ARG_TYPE_Filter +no + string + + + A_ARG_TYPE_SortCriteria no + string + + + A_ARG_TYPE_Index no + ui4 + + + A_ARG_TYPE_Count no + ui4 + + + A_ARG_TYPE_UpdateID no + ui4 + + + A_ARG_TYPE_TransferID no + ui4 + + + A_ARG_TYPE_TransferStatus no + string + + COMPLETED + ERROR + IN_PROGRESS + STOPPED + + + + A_ARG_TYPE_TransferLength no + string + + + A_ARG_TYPE_TransferTotal no + string + + + A_ARG_TYPE_TagValueList no + string + + + A_ARG_TYPE_URI +no + uri + + + SearchCapabilities +no + string + + + SortCapabilities +no + string + + + SystemUpdateID +yes + ui4 + + + ContainerUpdateIDs +yes + string + + + + + GetSearchCapabilities + + + SearchCaps + out + SearchCapabilities + + + + + GetSortCapabilities + + + SortCaps + out + SortCapabilities + + + + + GetSystemUpdateID + + + Id + out + SystemUpdateID + + + + + Browse + + + ObjectID + in + A_ARG_TYPE_ObjectID + + + BrowseFlag + in + A_ARG_TYPE_BrowseFlag + + + Filter + in + A_ARG_TYPE_Filter + + + StartingIndex + in + A_ARG_TYPE_Index + + + RequestedCount + in + A_ARG_TYPE_Count + + + SortCriteria + in + A_ARG_TYPE_SortCriteria + + + Result + out + A_ARG_TYPE_Result + + + NumberReturned + out + A_ARG_TYPE_Count + + + TotalMatches + out + A_ARG_TYPE_Count + + + UpdateID + out + A_ARG_TYPE_UpdateID + + + + + Search + + + ContainerID + in + A_ARG_TYPE_ObjectID + + + SearchCriteria + in + A_ARG_TYPE_SearchCriteria + + + Filter + in + A_ARG_TYPE_Filter + + + StartingIndex + in + A_ARG_TYPE_Index + + + RequestedCount + in + A_ARG_TYPE_Count + + + SortCriteria + in + A_ARG_TYPE_SortCriteria + + + Result + out + A_ARG_TYPE_Result + + + NumberReturned + out + A_ARG_TYPE_Count + + + TotalMatches + out + A_ARG_TYPE_Count + + + UpdateID + out + A_ARG_TYPE_UpdateID + + + + + CreateObject + + + ContainerID + in + A_ARG_TYPE_ObjectID + + + Elements + in + A_ARG_TYPE_Result + + + ObjectID + out + A_ARG_TYPE_ObjectID + + + Result + out + A_ARG_TYPE_Result + + + + + DestroyObject + + + ObjectID + in + A_ARG_TYPE_ObjectID + + + + + UpdateObject + + + ObjectID + in + A_ARG_TYPE_ObjectID + + + CurrentTagValue + in + A_ARG_TYPE_TagValueList + + + NewTagValue + in + A_ARG_TYPE_TagValueList + + + + + ImportResource + + + SourceURI + in + A_ARG_TYPE_URI + + + DestinationURI + in + A_ARG_TYPE_URI + + + TransferID + out + A_ARG_TYPE_TransferID + + + + + ExportResource + + + SourceURI + in + A_ARG_TYPE_URI + + + DestinationURI + in + A_ARG_TYPE_URI + + + TransferID + out + A_ARG_TYPE_TransferID + + + + + StopTransferResource + + + TransferID + in + A_ARG_TYPE_TransferID + + + + + GetTransferProgress + + + TransferID + in + A_ARG_TYPE_TransferID + + + TransferStatus + out + A_ARG_TYPE_TransferStatus + + + TransferLength + out + A_ARG_TYPE_TransferLength + + + TransferTotal + out + A_ARG_TYPE_TransferTotal + + + + + DeleteResource + + + ResourceURI + in + A_ARG_TYPE_URI + + + + + CreateReference + + + ContainerID + in + A_ARG_TYPE_ObjectID + + + ObjectID + in + A_ARG_TYPE_ObjectID + + + NewID + out + A_ARG_TYPE_ObjectID + + + + + + + diff --git a/docs/xml data files/service/RenderingControl1.xml b/docs/xml data files/service/RenderingControl1.xml new file mode 100644 index 0000000..b2c66ce --- /dev/null +++ b/docs/xml data files/service/RenderingControl1.xml @@ -0,0 +1,718 @@ + + + + PresetNameList no + string + + + LastChange yes + string + + + Brightness no + ui2 + + 0 + 1 + + + + Contrast no + ui2 + + 0 + 1 + + + + Sharpness no + ui2 + + 0 + 1 + + + + RedVideoGain no + ui2 + + + GreenVideoGain no + ui2 + + 0 + 1 + + + + BlueVideoGain no + ui2 + + 0 + 1 + + + + RedVideoBlackLevel no + ui2 + + 0 + 1 + + + + GreenVideoBlackLevel no + ui2 + + 0 + 1 + + + + BlueVideoBlackLevel no + ui2 + + 0 + 1 + + + + ColorTemperature no + ui2 + + 0 + 1 + + + + HorizontalKeystone no + i2 + + 1 + + + + VerticalKeystone no + i2 + + 1 + + + + Mute no + boolean + + + Volume no + ui2 + + 0 + 1 + + + + VolumeDB no + i2 + + + Loudness no + boolean + + + A_ARG_TYPE_Channel no + string + + Master + + + + A_ARG_TYPE_InstanceID no + ui4 + + + A_ARG_TYPE_PresetName no + string + + FactoryDefaults + + + + + + ListPresets + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentPresetNameList + out + PresetNameList + + + + + SelectPreset + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + PresetName + in + A_ARG_TYPE_PresetName + + + + + GetBrightness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentBrightness + out + Brightness + + + + + SetBrightness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredBrightness + in + Brightness + + + + + GetContrast + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentContrast + out + Contrast + + + + + SetContrast + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredContrast + in + Contrast + + + + + GetSharpness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentSharpness + out + Sharpness + + + + + SetSharpness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredSharpness + in + Sharpness + + + + + GetRedVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentRedVideoGain + out + RedVideoGain + + + + + SetRedVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredRedVideoGain + in + RedVideoGain + + + + + GetGreenVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentGreenVideoGain + out + GreenVideoGain + + + + + SetGreenVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredGreenVideoGain + in + GreenVideoGain + + + + + GetBlueVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentBlueVideoGain + out + BlueVideoGain + + + + + SetBlueVideoGain + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredBlueVideoGain + in + BlueVideoGain + + + + + GetRedVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentRedVideoBlackLevel + out + RedVideoBlackLevel + + + + + SetRedVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredRedVideoBlackLevel + in + RedVideoBlackLevel + + + + + GetGreenVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentGreenVideoBlackLevel + out + GreenVideoBlackLevel + + + + + SetGreenVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredGreenVideoBlackLevel + in + GreenVideoBlackLevel + + + + + GetBlueVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentBlueVideoBlackLevel + out + BlueVideoBlackLevel + + + + + SetBlueVideoBlackLevel + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredBlueVideoBlackLevel + in + BlueVideoBlackLevel + + + + + GetColorTemperature + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentColorTemperature + out + ColorTemperature + + + + + SetColorTemperature + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredColorTemperature + in + ColorTemperature + + + + + GetHorizontalKeystone + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentHorizontalKeystone + out + HorizontalKeystone + + + + + SetHorizontalKeystone + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredHorizontalKeystone + in + HorizontalKeystone + + + + + GetVerticalKeystone + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentVerticalKeystone + out + VerticalKeystone + + + + + SetVerticalKeystone + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + DesiredVerticalKeystone + in + VerticalKeystone + + + + + GetMute + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentMute + out + Mute + + + + + SetMute + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredMute + in + Mute + + + + + GetVolume + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentVolume + out + Volume + + + + + SetVolume + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredVolume + in + Volume + + + + + GetVolumeDB + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentVolume + out + VolumeDB + + + + + SetVolumeDB + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredVolume + in + VolumeDB + + + + + GetVolumeDBRange + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + MinValue + out + VolumeDB + + + MaxValue + out + VolumeDB + + + + + GetLoudness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentLoudness + out + Loudness + + + + + SetLoudness + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredLoudness + in + Loudness + + + + + + diff --git a/docs/xml data files/service/test cases/syntax/AVTransport1.SyntaxTests.xml b/docs/xml data files/service/test cases/syntax/AVTransport1.SyntaxTests.xml new file mode 100644 index 0000000..2f146b4 --- /dev/null +++ b/docs/xml data files/service/test cases/syntax/AVTransport1.SyntaxTests.xml @@ -0,0 +1,168 @@ + + AVTransport + 1 + + + 1 + Valid Action And Valid InArgs + SetAVTransportURI + + 0 + any-string + any-string + + ACTION_AND_INARGS_ARE_VALID + + + 2 + Valid Action And Valid InArgs + SetNextAVTransportURI + + 0 + any-string + any-string + + ACTION_AND_INARGS_ARE_VALID + + + 3 + Valid Action And Valid InArgs + GetMediaInfo + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 4 + Valid Action And Valid InArgs + GetTransportInfo + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 5 + Valid Action And Valid InArgs + GetPositionInfo + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 6 + Valid Action And Valid InArgs + GetDeviceCapabilities + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 7 + Valid Action And Valid InArgs + GetTransportSettings + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 8 + Valid Action And Valid InArgs + Stop + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 9 + Valid Action And Valid InArgs + Play + + 0 + 1 + + ACTION_AND_INARGS_ARE_VALID + + + 10 + Valid Action And Valid InArgs + Pause + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 11 + Valid Action And Valid InArgs + Record + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 12 + Valid Action And Valid InArgs + Seek + + 0 + TRACK_NR + 1 + + ACTION_AND_INARGS_ARE_VALID + + + 13 + Valid Action And Valid InArgs + Next + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 14 + Valid Action And Valid InArgs + Previous + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 15 + Valid Action And Valid InArgs + SetPlayMode + + 0 + NORMAL + + ACTION_AND_INARGS_ARE_VALID + + + 16 + Valid Action And Valid InArgs + SetRecordQualityMode + + 0 + any-string + + ACTION_AND_INARGS_ARE_VALID + + + 17 + Valid Action And Valid InArgs + GetCurrentTransportActions + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + \ No newline at end of file diff --git a/docs/xml data files/service/test cases/syntax/ConnectionManager1.SyntaxTests.xml b/docs/xml data files/service/test cases/syntax/ConnectionManager1.SyntaxTests.xml new file mode 100644 index 0000000..9bab408 --- /dev/null +++ b/docs/xml data files/service/test cases/syntax/ConnectionManager1.SyntaxTests.xml @@ -0,0 +1,48 @@ + + ConnectionManager + 1 + + + 1 + Valid Action And Valid InArgs + GetProtocolInfo + ACTION_AND_INARGS_ARE_VALID + + + 2 + Valid Action And Valid InArgs + PrepareForConnection + + any-string + any-string + -1 + Input + + ACTION_AND_INARGS_ARE_VALID + + + 3 + Valid Action And Valid InArgs + ConnectionComplete + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 4 + Valid Action And Valid InArgs + GetCurrentConnectionIDs + ACTION_AND_INARGS_ARE_VALID + + + 5 + Valid Action And Valid InArgs + GetCurrentConnectionInfo + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + \ No newline at end of file diff --git a/docs/xml data files/service/test cases/syntax/ContentDirectory1.SyntaxTests.xml b/docs/xml data files/service/test cases/syntax/ContentDirectory1.SyntaxTests.xml new file mode 100644 index 0000000..b2b52bc --- /dev/null +++ b/docs/xml data files/service/test cases/syntax/ContentDirectory1.SyntaxTests.xml @@ -0,0 +1,146 @@ + + ContentDirectory + 1 + + + 1 + Valid Action And Valid InArgs + GetSearchCapabilities + ACTION_AND_INARGS_ARE_VALID + + + 2 + Valid Action And Valid InArgs + GetSortCapabilities + ACTION_AND_INARGS_ARE_VALID + + + 3 + Valid Action And Valid InArgs + GetSystemUpdateID + ACTION_AND_INARGS_ARE_VALID + + + 4 + Valid Action And Valid InArgs + Browse + + 0 + BrowseMetadata + dc:title + 0 + 0 + + + ACTION_AND_INARGS_ARE_VALID + + + 5 + Valid Action And Valid InArgs + Search + + 0 + dc:title contains "Rock" + dc:title + 0 + 0 + + + ACTION_AND_INARGS_ARE_VALID + + + 6 + Valid Action And Valid InArgs + CreateObject + + 0 + + <DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"> + <item id="" parentID="0" restricted="false"> + <dc:title>Test Object - CDS Syntax Text Case #6</dc:title> + <upnp:class>object.item</upnp:class> + </item> + </DIDL-Lite> + + + ACTION_AND_INARGS_ARE_VALID + + + 7 + Valid Action And Valid InArgs + DestroyObject + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 8 + Valid Action And Valid InArgs + UpdateObject + + 0 + any-string + any-string + + ACTION_AND_INARGS_ARE_VALID + + + 9 + Valid Action And Valid InArgs + ImportResource + + http://host/path/file + http://host/path/file + + ACTION_AND_INARGS_ARE_VALID + + + 10 + Valid Action And Valid InArgs + ExportResource + + http://host/path/file + http://host/path/file + + ACTION_AND_INARGS_ARE_VALID + + + 11 + Valid Action And Valid InArgs + StopTransferResource + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 12 + Valid Action And Valid InArgs + GetTransferProgress + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 13 + Valid Action And Valid InArgs + DeleteResource + + http://host/path/file + + ACTION_AND_INARGS_ARE_VALID + + + 14 + Valid Action And Valid InArgs + CreateReference + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + diff --git a/docs/xml data files/service/test cases/syntax/RenderingControl1.SyntaxTests.xml b/docs/xml data files/service/test cases/syntax/RenderingControl1.SyntaxTests.xml new file mode 100644 index 0000000..531005e --- /dev/null +++ b/docs/xml data files/service/test cases/syntax/RenderingControl1.SyntaxTests.xml @@ -0,0 +1,347 @@ + + RenderingControl + 1 + + + 1 + Valid Action And Valid InArgs + ListPresets + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 2 + Valid Action And Valid InArgs + SelectPreset + + 0 + FactoryDefaults + + ACTION_AND_INARGS_ARE_VALID + + + 3 + Valid Action And Valid InArgs + GetBrightness + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 4 + Valid Action And Valid InArgs + SetBrightness + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 5 + Valid Action And Valid InArgs + GetContrast + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 6 + Valid Action And Valid InArgs + SetContrast + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 7 + Valid Action And Valid InArgs + GetRedVideoGain + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 8 + Valid Action And Valid InArgs + SetRedVideoGain + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 9 + Valid Action And Valid InArgs + GetGreenVideoGain + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 10 + Valid Action And Valid InArgs + SetGreenVideoGain + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 11 + Valid Action And Valid InArgs + GetBlueVideoGain + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 12 + Valid Action And Valid InArgs + SetBlueVideoGain + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 13 + Valid Action And Valid InArgs + GetRedVideoBlackLevel + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 14 + Valid Action And Valid InArgs + SetRedVideoBlackLevel + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 15 + Valid Action And Valid InArgs + GetGreenVideoBlackLevel + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 16 + Valid Action And Valid InArgs + SetGreenVideoBlackLevel + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 17 + Valid Action And Valid InArgs + GetBlueVideoBlackLevel + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 18 + Valid Action And Valid InArgs + SetBlueVideoBlackLevel + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 19 + Valid Action And Valid InArgs + GetColorTemperature + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 20 + Valid Action And Valid InArgs + SetColorTemperature + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 21 + Valid Action And Valid InArgs + GetHorizontalKeystone + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 22 + Valid Action And Valid InArgs + SetHorizontalKeystone + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 23 + Valid Action And Valid InArgs + GetVerticalKeystone + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 24 + Valid Action And Valid InArgs + SetVerticalKeystone + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 25 + Valid Action And Valid InArgs + GetSharpness + + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 26 + Valid Action And Valid InArgs + SetSharpness + + 0 + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 27 + Valid Action And Valid InArgs + GetMute + + 0 + Master + + ACTION_AND_INARGS_ARE_VALID + + + 28 + Valid Action And Valid InArgs + SetMute + + 0 + Master + 1 + + ACTION_AND_INARGS_ARE_VALID + + + 29 + Valid Action And Valid InArgs + GetVolume + + 0 + Master + + ACTION_AND_INARGS_ARE_VALID + + + 30 + Valid Action And Valid InArgs + SetVolume + + 0 + Master + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 31 + Valid Action And Valid InArgs + GetVolumeDB + + 0 + Master + + ACTION_AND_INARGS_ARE_VALID + + + 32 + Valid Action And Valid InArgs + SetVolumeDB + + 0 + Master + 0 + + ACTION_AND_INARGS_ARE_VALID + + + 33 + Valid Action And Valid InArgs + GetVolumeDBRange + + 0 + Master + + ACTION_AND_INARGS_ARE_VALID + + + 34 + Valid Action And Valid InArgs + GetLoudness + + 0 + Master + + ACTION_AND_INARGS_ARE_VALID + + + 35 + Valid Action And Valid InArgs + SetLoudness + + 0 + Master + 1 + + ACTION_AND_INARGS_ARE_VALID + + + From 66f422d8356e317b7127d77166d3428de1046ead Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 16:00:17 -0800 Subject: [PATCH 009/179] add a few video mime-types.. [git-p4: depot-paths = "//depot/": change = 725] --- pymediaserv | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pymediaserv b/pymediaserv index 2889c32..4e06dc0 100755 --- a/pymediaserv +++ b/pymediaserv @@ -69,7 +69,14 @@ root.putChild('root-device.xml', RootDevice()) from MediaServer import MediaServer -root.putChild('media', static.File('media')) +medianode = static.File('media') +medianode.contentTypes.update( { + '.wmv': 'video/x-ms-wmv', + '.ts': 'video/mp2t', + #'.ts': 'video/mpeg', # we may want this instead of mp2t + '.mp4': 'video/mp4', +}) +root.putChild('media', medianode) site = server.Site(root) reactor.listenTCP(listenPort, site) From 47c90c74bebaffb3ef1da5d9e62ed7641ddf2a57 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 16:00:32 -0800 Subject: [PATCH 010/179] add support for sending out byebye notifications... [git-p4: depot-paths = "//depot/": change = 726] --- SSDP.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/SSDP.py b/SSDP.py index 23490e9..62e1c55 100644 --- a/SSDP.py +++ b/SSDP.py @@ -35,6 +35,14 @@ class SSDPServer(DatagramProtocol): elements = {} known = {} + def doStop(self): + '''Make sure we send out the byebye notifications.''' + + self.transport.write('foobar', (SSDP_ADDR, SSDP_PORT)) + for st in self.known: + self.doByebye(st) + DatagramProtocol.doStop(self) + def datagramReceived(self, data, (host, port)): """Handle a received multicast datagram.""" @@ -104,6 +112,22 @@ class SSDPServer(DatagramProtocol): self.known[st]['CACHE-CONTROL'] = 'max-age=1800' self.doNotify(st) + def doByebye(self, st): + """Do byebye""" + + log.msg('Sending byebye notification for %s' % st) + + resp = [ 'NOTIFY * HTTP/1.1', + 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), + 'NTS: ssdp:byebye', + ] + stcpy = dict(self.known[st].iteritems()) + stcpy['NT'] = stcpy['ST'] + del stcpy['ST'] + resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) + resp.extend(('', '')) + self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) + def doNotify(self, st): """Do notification""" From 4936729b239011dee8818d7463df8a288e6c2b1d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 17:18:07 -0800 Subject: [PATCH 011/179] properly assert Tim's copyright... (c) has no meaning, only it spelled out or the copyright symbol is valid.. [git-p4: depot-paths = "//depot/": change = 727] --- ConnectionManager.py | 2 +- ContentDirectory.py | 2 +- DIDLLite.py | 2 +- MediaServer.py | 2 +- SSDP.py | 2 +- browse-zms.py | 2 +- cdsclient | 2 +- pymediaserv | 2 +- upnp.py | 2 +- xmlpretty | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ConnectionManager.py b/ConnectionManager.py index 1c191d9..d1896ba 100644 --- a/ConnectionManager.py +++ b/ConnectionManager.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter # Connection Manager service diff --git a/ContentDirectory.py b/ContentDirectory.py index 3e13a43..9163d1e 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter # # This module implements the Content Directory Service (CDS) service diff --git a/DIDLLite.py b/DIDLLite.py index 2884b23..1fd98ee 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface diff --git a/MediaServer.py b/MediaServer.py index 63724d0..57396c4 100644 --- a/MediaServer.py +++ b/MediaServer.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter from twisted.web import static diff --git a/SSDP.py b/SSDP.py index 62e1c55..f228228 100644 --- a/SSDP.py +++ b/SSDP.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter # # Implementation of SSDP server under Twisted Python. diff --git a/browse-zms.py b/browse-zms.py index 743e090..a22b87e 100755 --- a/browse-zms.py +++ b/browse-zms.py @@ -6,7 +6,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter from twisted.internet import reactor, error from twisted.internet.protocol import Protocol, ClientFactory diff --git a/cdsclient b/cdsclient index 06e3119..0cd5d5f 100755 --- a/cdsclient +++ b/cdsclient @@ -6,7 +6,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter from twisted.web import client from twisted.internet import reactor diff --git a/pymediaserv b/pymediaserv index 4e06dc0..c34531d 100755 --- a/pymediaserv +++ b/pymediaserv @@ -3,7 +3,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter import random import socket diff --git a/upnp.py b/upnp.py index 12254f4..b3b85b9 100644 --- a/upnp.py +++ b/upnp.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter from twisted.web import soap diff --git a/xmlpretty b/xmlpretty index 800b52a..64057ce 100755 --- a/xmlpretty +++ b/xmlpretty @@ -1,6 +1,6 @@ #!/usr/bin/python -# (c) 2005, Tim Potter +# Copyright 2005, Tim Potter # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php From d17a40c84af3cf694bdda1989e248526d975b252 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 9 Feb 2006 20:12:42 -0800 Subject: [PATCH 012/179] mark functions as required... and comment out in the xml, the Search function until we support it... [git-p4: depot-paths = "//depot/": change = 728] --- ContentDirectory.py | 21 +++++++++++++++------ content-directory-scpd.xml | 8 +++++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 9163d1e..5826c91 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -35,25 +35,28 @@ class ContentDirectoryControl(UPnPPublisher): # Required actions def soap_GetSearchCapabilities(self, *args, **kwargs): - """Return the searching capabilities supported by the device.""" + """Required: Return the searching capabilities supported by the device.""" log.msg('GetSearchCapabilities()') + return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} def soap_GetSortCapabilities(self, *args, **kwargs): - """Return the CSV list of meta-data tags that can be used in + """Required: Return the CSV list of meta-data tags that can be used in sortCriteria.""" log.msg('GetSortCapabilities()') + return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} def soap_GetSystemUpdateID(self, *args, **kwargs): - """Return the current value of state variable SystemUpdateID.""" + """Required: Return the current value of state variable SystemUpdateID.""" log.msg('GetSystemUpdateID()') + return { 'SystemUpdateIdResponse': { 'Id': 5 }} BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') def soap_Browse(self, *args): - """Incrementally browse the native heirachy of the Content + """Required: Incrementally browse the native heirachy of the Content Directory objects exposed by the Content Directory Service.""" (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, @@ -68,7 +71,13 @@ class ContentDirectoryControl(UPnPPublisher): try: - if ObjectID == '0\\Music\\': + if ObjectID == '0': + c = Container('media', '0', 'All media') + c.childCount = 5 + c.searchable = 0 + didl.addItem(c) + + elif ObjectID == '0\\Music\\': c = Container('0\\Music\\Spotty\\', '0\\Music\\', 'Spotty') c.childCount = 6 @@ -81,7 +90,7 @@ class ContentDirectoryControl(UPnPPublisher): didl.addItem(c) - if ObjectID == '0\\Music\\Spotty\\': + elif ObjectID == '0\\Music\\Spotty\\': m = MusicTrack('0\\Music\\media\\foo.mp3', '0\\Music\\', 'foo.mp3') diff --git a/content-directory-scpd.xml b/content-directory-scpd.xml index a46795f..fd533e2 100644 --- a/content-directory-scpd.xml +++ b/content-directory-scpd.xml @@ -1 +1,7 @@ -10BrowseObjectIDinA_ARG_TYPE_ObjectIDBrowseFlaginA_ARG_TYPE_BrowseFlagFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSortCapabilitiesSortCapsoutSortCapabilitiesGetSystemUpdateIDIdoutSystemUpdateIDSearchContainerIDinA_ARG_TYPE_ObjectIDSearchCriteriainA_ARG_TYPE_SearchCriteriaFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateIDGetSearchCapabilitiesSearchCapsoutSearchCapabilitiesA_ARG_TYPE_BrowseFlagstringBrowseMetadataBrowseDirectChildrenA_ARG_TYPE_SearchCriteriastringSystemUpdateIDui4A_ARG_TYPE_Countui4A_ARG_TYPE_SortCriteriastringSortCapabilitiesstringA_ARG_TYPE_Indexui4A_ARG_TYPE_ObjectIDstringA_ARG_TYPE_UpdateIDui4A_ARG_TYPE_ResultstringSearchCapabilitiesstringA_ARG_TYPE_Filterstring +10 +BrowseObjectIDinA_ARG_TYPE_ObjectIDBrowseFlaginA_ARG_TYPE_BrowseFlagFilterinA_ARG_TYPE_FilterStartingIndexinA_ARG_TYPE_IndexRequestedCountinA_ARG_TYPE_CountSortCriteriainA_ARG_TYPE_SortCriteriaResultoutA_ARG_TYPE_ResultNumberReturnedoutA_ARG_TYPE_CountTotalMatchesoutA_ARG_TYPE_CountUpdateIDoutA_ARG_TYPE_UpdateID +GetSortCapabilitiesSortCapsoutSortCapabilities +GetSystemUpdateIDIdoutSystemUpdateID + +GetSearchCapabilitiesSearchCapsoutSearchCapabilities +A_ARG_TYPE_BrowseFlagstringBrowseMetadataBrowseDirectChildrenA_ARG_TYPE_SearchCriteriastringSystemUpdateIDui4A_ARG_TYPE_Countui4A_ARG_TYPE_SortCriteriastringSortCapabilitiesstringA_ARG_TYPE_Indexui4A_ARG_TYPE_ObjectIDstringA_ARG_TYPE_UpdateIDui4A_ARG_TYPE_ResultstringSearchCapabilitiesstringA_ARG_TYPE_Filterstring From 83d5e908030b9c2683710b4e2b7b0ba675f39c99 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 00:34:27 -0800 Subject: [PATCH 013/179] wh00t! get this working! I now have the ability to replicate a hierarchy, and have the class do most of the work.. I will probably need to figure out a better way to get at the hierarchy than what I have now, but it works... need to implement stuff like systemid, and containerid... but I managed to stream an mp3 file to Intel's media renderer! [git-p4: depot-paths = "//depot/": change = 729] --- ContentDirectory.py | 82 ++++++++++++++++++++++++++------------------- pymediaserv | 36 +++++++++++++++++++- 2 files changed, 82 insertions(+), 36 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 5826c91..b02ea50 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -29,9 +29,42 @@ from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack import traceback from urllib import quote -class ContentDirectoryControl(UPnPPublisher): +class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" + def getnextID(self): + ret = str(self.nextID) + self.nextID += 1 + return ret + + def addContainer(self, parent, title, **kwargs): + ret = self.addItem(parent, Container, title, **kwargs) + self.children[ret] = [] + return ret + + def addItem(self, parent, klass, *args, **kwargs): + assert isinstance(self[parent], Container) + nid = self.getnextID() + i = klass(nid, parent, *args, **kwargs) + self.children[parent].append(i) + self[i.id] = i + return i.id + + def getchildren(self, item): + assert isinstance(self[item], Container) + return self.children[item][:] + + def __init__(self, title, *args): + super(ContentDirectoryControl, self).__init__(*args) + fakeparent = '-1' + self.nextID = 0 + self.children = { fakeparent: []} + self[fakeparent] = Container(None, '-1', 'fake') + root = self.addContainer(fakeparent, title) + assert root == '0' + del self[fakeparent] + del self.children[fakeparent] + # Required actions def soap_GetSearchCapabilities(self, *args, **kwargs): @@ -61,6 +94,8 @@ class ContentDirectoryControl(UPnPPublisher): (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, SortCriteria) = args + StartingIndex = int(StartingIndex) + RequestedCount = int(RequestedCount) log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % @@ -68,40 +103,16 @@ class ContentDirectoryControl(UPnPPublisher): `RequestedCount`, `SortCriteria`)) didl = DIDLElement() + result = {} try: - - if ObjectID == '0': - c = Container('media', '0', 'All media') - c.childCount = 5 - c.searchable = 0 - didl.addItem(c) - - elif ObjectID == '0\\Music\\': - - c = Container('0\\Music\\Spotty\\', '0\\Music\\', 'Spotty') - c.childCount = 6 - c.searchable = 0 - didl.addItem(c) - - c = Container('0\\Music\\Foot\\', '0\\Music\\', 'Foot') - c.childCount = 1 - c.searchable = 0 - didl.addItem(c) - - - elif ObjectID == '0\\Music\\Spotty\\': - - m = MusicTrack('0\\Music\\media\\foo.mp3', '0\\Music\\', 'foo.mp3') - - m.res = Resource('http://192.168.1.105:8080/media/foo.mp3', 'http-get:*:audio/mpeg:*') - m.res.size = 1234 - m.res.bitrate = 256 - m.genre = 'Others' - m.artist = 'Others' - m.album = 'Others' - - didl.addItem(m) + if BrowseFlag == 'BrowseDirectChildren': + ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] + log.msg(ch) + log.msg(dict.__repr__(self)) + filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) + else: + didl.addItem(self[ObjectID]) result = {'BrowseResponse': {'Result': didl.toString() , 'NumberReturned': didl.numItems(), @@ -205,7 +216,8 @@ class ContentDirectoryControl(UPnPPublisher): (`ContainerID`, `ObjectID`)) class ContentDirectoryServer(resource.Resource): - def __init__(self): + def __init__(self, title): resource.Resource.__init__(self) self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) - self.putChild('control', ContentDirectoryControl()) + self.control = ContentDirectoryControl(title) + self.putChild('control', self.control) diff --git a/pymediaserv b/pymediaserv index c34531d..7212625 100755 --- a/pymediaserv +++ b/pymediaserv @@ -5,10 +5,14 @@ # Copyright 2005, Tim Potter +from DIDLLite import TextItem, AudioItem, VideoItem, Resource +import os +import os.path import random import socket import string import sys +import traceback from twisted.python import log from twisted.internet import reactor @@ -61,10 +65,13 @@ class RootDevice(static.Data): static.Data.__init__(self, d, 'text/xml') root = WebServer() -root.putChild('ContentDirectory', ContentDirectoryServer()) +cds = ContentDirectoryServer('My Media Server') +root.putChild('ContentDirectory', cds) +cds = cds.control root.putChild('ConnectionManager', ConnectionManagerServer()) root.putChild('root-device.xml', RootDevice()) + # Area of server to serve media files from from MediaServer import MediaServer @@ -78,6 +85,33 @@ medianode.contentTypes.update( { }) root.putChild('media', medianode) +# Set up media files +allmedia = cds.addContainer('0', 'All Media') +log.msg('allmedia: %s' % repr(allmedia)) +for i in os.listdir('media'): + fpath = os.path.join('media', i) + try: + if not os.path.isfile(fpath): + log.msg('skipping: %s' % fpath) + continue + fn, ext = os.path.splitext(i) + mt = medianode.contentTypes[ext] + ty = mt.split('/')[0] + if ty == 'video': + klass = VideoItem + elif ty == 'audio': + klass = AudioItem + elif ty == 'text': + klass = TextItem + else: + raise KeyError, 'no item for mt: %s' % mt + + item = cds.addItem(allmedia, klass, fn) + cds[item].res = Resource('%smedia/%s' % (urlbase, i), 'http-get:*:%s:*' % mt) + cds[item].res.size = os.path.getsize(fpath) + except KeyError: + traceback.print_exc(file=log.logfile) + site = server.Site(root) reactor.listenTCP(listenPort, site) From 2745f4e9a005cffa98377872b10a2fda97d3d4f6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 00:46:38 -0800 Subject: [PATCH 014/179] skip .ts's for now.. and map mp4 and ts to video/mpeg.. [git-p4: depot-paths = "//depot/": change = 730] --- pymediaserv | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pymediaserv b/pymediaserv index 7212625..ceeeef5 100755 --- a/pymediaserv +++ b/pymediaserv @@ -79,9 +79,10 @@ from MediaServer import MediaServer medianode = static.File('media') medianode.contentTypes.update( { '.wmv': 'video/x-ms-wmv', - '.ts': 'video/mp2t', - #'.ts': 'video/mpeg', # we may want this instead of mp2t - '.mp4': 'video/mp4', + #'.ts': 'video/mp2t', + '.ts': 'video/mpeg', # we may want this instead of mp2t + #'.mp4': 'video/mp4', + '.mp4': 'video/mpeg', }) root.putChild('media', medianode) @@ -95,6 +96,8 @@ for i in os.listdir('media'): log.msg('skipping: %s' % fpath) continue fn, ext = os.path.splitext(i) + if ext == '.ts': + continue mt = medianode.contentTypes[ext] ty = mt.split('/')[0] if ty == 'video': From 9f465bb73fb2f34188f051a20f30a60f0b809548 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 00:51:44 -0800 Subject: [PATCH 015/179] remove some unnecessary debugging statements now that it's working.. [git-p4: depot-paths = "//depot/": change = 731] --- ContentDirectory.py | 2 -- SSDP.py | 1 - pymediaserv | 5 +---- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index b02ea50..e31e055 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -108,8 +108,6 @@ class ContentDirectoryControl(UPnPPublisher, dict): try: if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - log.msg(ch) - log.msg(dict.__repr__(self)) filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) else: didl.addItem(self[ObjectID]) diff --git a/SSDP.py b/SSDP.py index f228228..cdf98a6 100644 --- a/SSDP.py +++ b/SSDP.py @@ -48,7 +48,6 @@ class SSDPServer(DatagramProtocol): # Break up message in to command and headers - log.msg('respond to: %s:%d' % (host, port)) header, payload = data.split('\r\n\r\n') lines = header.split('\r\n') cmd = string.split(lines[0], ' ') diff --git a/pymediaserv b/pymediaserv index ceeeef5..b94e4d7 100755 --- a/pymediaserv +++ b/pymediaserv @@ -12,7 +12,6 @@ import random import socket import string import sys -import traceback from twisted.python import log from twisted.internet import reactor @@ -88,12 +87,10 @@ root.putChild('media', medianode) # Set up media files allmedia = cds.addContainer('0', 'All Media') -log.msg('allmedia: %s' % repr(allmedia)) for i in os.listdir('media'): fpath = os.path.join('media', i) try: if not os.path.isfile(fpath): - log.msg('skipping: %s' % fpath) continue fn, ext = os.path.splitext(i) if ext == '.ts': @@ -113,7 +110,7 @@ for i in os.listdir('media'): cds[item].res = Resource('%smedia/%s' % (urlbase, i), 'http-get:*:%s:*' % mt) cds[item].res.size = os.path.getsize(fpath) except KeyError: - traceback.print_exc(file=log.logfile) + pass site = server.Site(root) reactor.listenTCP(listenPort, site) From 7b3457f2899052423ba81bb536801cc589cf69be Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 01:01:40 -0800 Subject: [PATCH 016/179] add my copyright to the files that I've significantly touch.. [git-p4: depot-paths = "//depot/": change = 732] --- ContentDirectory.py | 2 +- SSDP.py | 2 +- pymediaserv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index e31e055..ffa4fc3 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php - # Copyright 2005, Tim Potter +# Copyright 2006 John-Mark Gurney # # This module implements the Content Directory Service (CDS) service diff --git a/SSDP.py b/SSDP.py index cdf98a6..8e5443b 100644 --- a/SSDP.py +++ b/SSDP.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php - # Copyright 2005, Tim Potter +# Copyright 2006 John-Mark Gurney # # Implementation of SSDP server under Twisted Python. diff --git a/pymediaserv b/pymediaserv index b94e4d7..e3a4a33 100755 --- a/pymediaserv +++ b/pymediaserv @@ -2,8 +2,8 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php - # Copyright 2005, Tim Potter +# Copyright 2006 John-Mark Gurney from DIDLLite import TextItem, AudioItem, VideoItem, Resource import os From 5b80aeb26dc425aaddcd5182126c969e5cc04cbb Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 01:03:19 -0800 Subject: [PATCH 017/179] add comment about using the email module to parse the SSDP requests.. [git-p4: depot-paths = "//depot/": change = 733] --- SSDP.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SSDP.py b/SSDP.py index 8e5443b..83f9f88 100644 --- a/SSDP.py +++ b/SSDP.py @@ -47,6 +47,8 @@ class SSDPServer(DatagramProtocol): """Handle a received multicast datagram.""" # Break up message in to command and headers + # TODO: use the email module after trimming off the request line.. + # This gets us much better header support. header, payload = data.split('\r\n\r\n') lines = header.split('\r\n') From cfeac9c3cb69a4e579df116953a5861729375521 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 01:28:02 -0800 Subject: [PATCH 018/179] add my email address to my copyright lines.. update the README with some basic info.. [git-p4: depot-paths = "//depot/": change = 736] --- ContentDirectory.py | 2 +- README | 38 +++++++++++++++++++++++++++++++++----- SSDP.py | 2 +- pymediaserv | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index ffa4fc3..c8d3099 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney # # This module implements the Content Directory Service (CDS) service diff --git a/README b/README index 9a3e8d4..9ed07b1 100644 --- a/README +++ b/README @@ -1,8 +1,36 @@ -This code has been abandoned, but released in the hope that it might -be useful for someone. It is licensed under the MIT license at: - +This code was abandoned by Tim Potter. +It is licensed under the MIT license at: http://opensource.org/licenses/mit-license.php +As I should be getting my D-Link DSM-520 today, I need a UPnP Media +Server that I could use to stream data with. I tried one, but it had +issues running under FreeBSD's Linux emulation, so I found this code +that was was a good framework. + +After a few days, I have the code working sucessfully with Intel's +Media Control Point, and Intel's Media Renderer. I have streamed both +mp3's and wmv's to the renderer. They are good tools for testing and +available at: +http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm + +I have added a number of new features: + Don't bind the UDP socket to the multicast address, so replies + go out on our local IP. + Send out notify requests when we register the services with SSDP. + Send out byebye notifications when we are shutting down. + Randomize the UUID for the server (this should be part of the + saved state). + Randomize the port, or optionally set it on the command line. + Teach ContentDirectory.py the basics on handling Containers and + generic browse support. You can addItem and addContainer, which + each return either respective ObjectID. + We already support partial chunking of responses, but we don't yet + support filtering or sorting. + +Either make a directory media and put the files there, or make a symlink +named media to your media files. Either will work. Run it as: + ./pymediaserv [ ] + +Good Luck! -Tim Potter -2006-01-19 +John-Mark Gurney diff --git a/SSDP.py b/SSDP.py index 83f9f88..6f378f3 100644 --- a/SSDP.py +++ b/SSDP.py @@ -1,7 +1,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney # # Implementation of SSDP server under Twisted Python. diff --git a/pymediaserv b/pymediaserv index e3a4a33..4407164 100755 --- a/pymediaserv +++ b/pymediaserv @@ -3,7 +3,7 @@ # Licensed under the MIT license # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter -# Copyright 2006 John-Mark Gurney +# Copyright 2006 John-Mark Gurney from DIDLLite import TextItem, AudioItem, VideoItem, Resource import os From 427ec4403cec5134d55c0894363ebd9c3f676e0e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 11:42:16 -0800 Subject: [PATCH 019/179] support using a different container classes, through klass = StorageFolder, or other class... [git-p4: depot-paths = "//depot/": change = 738] --- ContentDirectory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index c8d3099..d94633e 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -37,8 +37,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): self.nextID += 1 return ret - def addContainer(self, parent, title, **kwargs): - ret = self.addItem(parent, Container, title, **kwargs) + def addContainer(self, parent, title, klass = Container, **kwargs): + ret = self.addItem(parent, klass, title, **kwargs) self.children[ret] = [] return ret From 1c322e38327db2d5cf99cfb0cbfc2199a54691d9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 11:42:57 -0800 Subject: [PATCH 020/179] expand the Storage* stuff to include the required attributes.. [git-p4: depot-paths = "//depot/": change = 739] --- DIDLLite.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/DIDLLite.py b/DIDLLite.py index 1fd98ee..10cd383 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -267,12 +267,57 @@ class MovieGenre(Genre): class StorageSystem(Container): klass = Container.klass + '.storageSystem' + total = -1 + used = -1 + free = -1 + maxpartition = -1 + medium = 'UNKNOWN' + + def toElement(self): + + root = Container.toElement(self) + + SubElement(root, 'upnp:storageTotal').text = str(self.total) + SubElement(root, 'upnp:storageUsed').text = str(self.used) + SubElement(root, 'upnp:storageFree').text = str(self.free) + SubElement(root, 'upnp:storageMaxPartition').text = str(self.maxpartition) + SubElement(root, 'upnp:storageMedium').text = self.medium + + return root + class StorageVolume(Container): klass = Container.klass + '.storageVolume' + total = -1 + used = -1 + free = -1 + medium = 'UNKNOWN' + + def toElement(self): + + root = Container.toElement(self) + + SubElement(root, 'upnp:storageTotal').text = str(self.total) + SubElement(root, 'upnp:storageUsed').text = str(self.used) + SubElement(root, 'upnp:storageFree').text = str(self.free) + SubElement(root, 'upnp:storageMedium').text = self.medium + + return root + class StorageFolder(Container): klass = Container.klass + '.storageFolder' + used = -1 + + def toElement(self): + + root = Container.toElement(self) + + if self.used is not None: + SubElement(root, 'upnp:storageUsed').text = str(self.used) + + return root + class DIDLElement(_ElementInterface): def __init__(self): _ElementInterface.__init__(self, 'DIDL-Lite', {}) From d2eda096299a22702cda86eb14870f62f7e4dc86 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 10 Feb 2006 11:43:34 -0800 Subject: [PATCH 021/179] make the add a file into a function that will be called recursively for the directories.. [git-p4: depot-paths = "//depot/": change = 740] --- pymediaserv | 58 +++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/pymediaserv b/pymediaserv index 4407164..4fcbb51 100755 --- a/pymediaserv +++ b/pymediaserv @@ -5,7 +5,7 @@ # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -from DIDLLite import TextItem, AudioItem, VideoItem, Resource +from DIDLLite import TextItem, AudioItem, VideoItem, Resource, StorageFolder import os import os.path import random @@ -86,31 +86,37 @@ medianode.contentTypes.update( { root.putChild('media', medianode) # Set up media files -allmedia = cds.addContainer('0', 'All Media') -for i in os.listdir('media'): - fpath = os.path.join('media', i) - try: - if not os.path.isfile(fpath): - continue - fn, ext = os.path.splitext(i) - if ext == '.ts': - continue - mt = medianode.contentTypes[ext] - ty = mt.split('/')[0] - if ty == 'video': - klass = VideoItem - elif ty == 'audio': - klass = AudioItem - elif ty == 'text': - klass = TextItem - else: - raise KeyError, 'no item for mt: %s' % mt - - item = cds.addItem(allmedia, klass, fn) - cds[item].res = Resource('%smedia/%s' % (urlbase, i), 'http-get:*:%s:*' % mt) - cds[item].res.size = os.path.getsize(fpath) - except KeyError: - pass +def addFSPath(parent, title, dpath): + folder = cds.addContainer(parent, title, klass = StorageFolder) + log.msg('title: %s, dpath: %s' % (title, dpath)) + for i in os.listdir(dpath): + fpath = os.path.join(dpath, i) + try: + fn, ext = os.path.splitext(i) + if os.path.isdir(fpath): + addFSPath(folder, fn, fpath) + if not os.path.isfile(fpath): + continue + if ext == '.ts': + continue + mt = medianode.contentTypes[ext] + ty = mt.split('/')[0] + if ty == 'video': + klass = VideoItem + elif ty == 'audio': + klass = AudioItem + elif ty == 'text': + klass = TextItem + else: + raise KeyError, 'no item for mt: %s' % mt + + item = cds.addItem(folder, klass, fn) + cds[item].res = Resource('%smedia/%s' % (urlbase, i), 'http-get:*:%s:*' % mt) + cds[item].res.size = os.path.getsize(fpath) + except KeyError: + pass + +addFSPath('0', 'All Media', 'media') site = server.Site(root) reactor.listenTCP(listenPort, site) From 6953e632536a8dedb79d3979ee5f157aa79acd8e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 11 Feb 2006 09:47:27 -0800 Subject: [PATCH 022/179] properly handle subdirs now... add support for images... lowercase the extension... [git-p4: depot-paths = "//depot/": change = 741] --- pymediaserv | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pymediaserv b/pymediaserv index 4fcbb51..86fe752 100755 --- a/pymediaserv +++ b/pymediaserv @@ -5,7 +5,7 @@ # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney -from DIDLLite import TextItem, AudioItem, VideoItem, Resource, StorageFolder +from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder import os import os.path import random @@ -93,6 +93,7 @@ def addFSPath(parent, title, dpath): fpath = os.path.join(dpath, i) try: fn, ext = os.path.splitext(i) + ext = ext.lower() if os.path.isdir(fpath): addFSPath(folder, fn, fpath) if not os.path.isfile(fpath): @@ -107,11 +108,13 @@ def addFSPath(parent, title, dpath): klass = AudioItem elif ty == 'text': klass = TextItem + elif ty == 'image': + klass = ImageItem else: raise KeyError, 'no item for mt: %s' % mt item = cds.addItem(folder, klass, fn) - cds[item].res = Resource('%smedia/%s' % (urlbase, i), 'http-get:*:%s:*' % mt) + cds[item].res = Resource('%s%s' % (urlbase, fpath), 'http-get:*:%s:*' % mt) cds[item].res.size = os.path.getsize(fpath) except KeyError: pass From abd0a83eb0fecca87eec58c57eb1f8abcf50eed6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 11 Feb 2006 14:43:15 -0800 Subject: [PATCH 023/179] include the ts's... the D-link attempts to play them, but not very well.. [git-p4: depot-paths = "//depot/": change = 742] --- pymediaserv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymediaserv b/pymediaserv index 86fe752..6c7d477 100755 --- a/pymediaserv +++ b/pymediaserv @@ -98,8 +98,8 @@ def addFSPath(parent, title, dpath): addFSPath(folder, fn, fpath) if not os.path.isfile(fpath): continue - if ext == '.ts': - continue + #if ext == '.ts': + # continue mt = medianode.contentTypes[ext] ty = mt.split('/')[0] if ty == 'video': From f8aae82bcda910ee7cc8c35c73623876bf054b63 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 13 Feb 2006 18:44:32 -0800 Subject: [PATCH 024/179] add ogm extention mime-type.. [git-p4: depot-paths = "//depot/": change = 744] --- pymediaserv | 1 + 1 file changed, 1 insertion(+) diff --git a/pymediaserv b/pymediaserv index 6c7d477..8625bca 100755 --- a/pymediaserv +++ b/pymediaserv @@ -82,6 +82,7 @@ medianode.contentTypes.update( { '.ts': 'video/mpeg', # we may want this instead of mp2t #'.mp4': 'video/mp4', '.mp4': 'video/mpeg', + '.ogm': 'application/ogg', }) root.putChild('media', medianode) From 38e086bbe853ebdad8bdd4123550a65c0adc42f6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 15 Feb 2006 09:14:44 -0800 Subject: [PATCH 025/179] add vob as an video/mpeg sort listings add extension to title, it useful for understanding capabilities.. [git-p4: depot-paths = "//depot/": change = 745] --- pymediaserv | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pymediaserv b/pymediaserv index 8625bca..dfd269d 100755 --- a/pymediaserv +++ b/pymediaserv @@ -83,14 +83,16 @@ medianode.contentTypes.update( { #'.mp4': 'video/mp4', '.mp4': 'video/mpeg', '.ogm': 'application/ogg', + '.vob': 'video/mpeg', }) root.putChild('media', medianode) # Set up media files def addFSPath(parent, title, dpath): folder = cds.addContainer(parent, title, klass = StorageFolder) - log.msg('title: %s, dpath: %s' % (title, dpath)) - for i in os.listdir(dpath): + dlist = os.listdir(dpath) + dlist.sort() + for i in dlist: fpath = os.path.join(dpath, i) try: fn, ext = os.path.splitext(i) @@ -114,7 +116,7 @@ def addFSPath(parent, title, dpath): else: raise KeyError, 'no item for mt: %s' % mt - item = cds.addItem(folder, klass, fn) + item = cds.addItem(folder, klass, i) cds[item].res = Resource('%s%s' % (urlbase, fpath), 'http-get:*:%s:*' % mt) cds[item].res.size = os.path.getsize(fpath) except KeyError: From d03f618ec02b0a9a23dc633d6baca1c860e78ea1 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 20 Feb 2006 09:35:24 -0800 Subject: [PATCH 026/179] detect presence of.. [git-p4: depot-paths = "//depot/": change = 746] --- SSDP.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SSDP.py b/SSDP.py index 6f378f3..10251ca 100644 --- a/SSDP.py +++ b/SSDP.py @@ -159,7 +159,7 @@ class SSDPServer(DatagramProtocol): self.elements[headers['nt']]['USN'] = headers['usn'] self.elements[headers['nt']]['host'] = (host, port) - log.msg('Detected presence for %s' % headers['nt']) + log.msg('Detected presence of %s' % headers['nt']) elif headers['nts'] == 'ssdp:byebye': From 0645e4c2ef204865d8f186babe7ae3bad5214359 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 20 Feb 2006 09:40:59 -0800 Subject: [PATCH 027/179] use full filename for folder's title... change how addFSPath works and instead of creating the container to put it all in, we put it in the container specified, and create sub-containers before recursing.. [git-p4: depot-paths = "//depot/": change = 747] --- pymediaserv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pymediaserv b/pymediaserv index dfd269d..2f91b87 100755 --- a/pymediaserv +++ b/pymediaserv @@ -88,8 +88,7 @@ medianode.contentTypes.update( { root.putChild('media', medianode) # Set up media files -def addFSPath(parent, title, dpath): - folder = cds.addContainer(parent, title, klass = StorageFolder) +def addFSPath(parent, dpath): dlist = os.listdir(dpath) dlist.sort() for i in dlist: @@ -98,7 +97,8 @@ def addFSPath(parent, title, dpath): fn, ext = os.path.splitext(i) ext = ext.lower() if os.path.isdir(fpath): - addFSPath(folder, fn, fpath) + folder = cds.addContainer(parent, i, klass = StorageFolder) + addFSPath(folder, fpath) if not os.path.isfile(fpath): continue #if ext == '.ts': @@ -116,13 +116,13 @@ def addFSPath(parent, title, dpath): else: raise KeyError, 'no item for mt: %s' % mt - item = cds.addItem(folder, klass, i) + item = cds.addItem(parent, klass, i) cds[item].res = Resource('%s%s' % (urlbase, fpath), 'http-get:*:%s:*' % mt) cds[item].res.size = os.path.getsize(fpath) except KeyError: pass -addFSPath('0', 'All Media', 'media') +addFSPath('0', 'media') site = server.Site(root) reactor.listenTCP(listenPort, site) From cfdd0fc173c0782c748f22379215218ec0851088 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 21 Apr 2006 23:27:01 -0800 Subject: [PATCH 028/179] add audio file support.. [git-p4: depot-paths = "//depot/": change = 758] --- pymediaserv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymediaserv b/pymediaserv index 2f91b87..206832a 100755 --- a/pymediaserv +++ b/pymediaserv @@ -84,6 +84,8 @@ medianode.contentTypes.update( { '.mp4': 'video/mpeg', '.ogm': 'application/ogg', '.vob': 'video/mpeg', + '.mp3': 'audio/mpeg', + '.ogg': 'audio/x-ogg', }) root.putChild('media', medianode) From 2a315530215013d0591e4ceb7416b4e3dc6ba27c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 21 Apr 2006 23:33:33 -0800 Subject: [PATCH 029/179] provide arg so we don't use a global... [git-p4: depot-paths = "//depot/": change = 759] --- pymediaserv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymediaserv b/pymediaserv index 206832a..760d84e 100755 --- a/pymediaserv +++ b/pymediaserv @@ -90,7 +90,7 @@ medianode.contentTypes.update( { root.putChild('media', medianode) # Set up media files -def addFSPath(parent, dpath): +def addFSPath(cds, parent, dpath): dlist = os.listdir(dpath) dlist.sort() for i in dlist: @@ -124,7 +124,7 @@ def addFSPath(parent, dpath): except KeyError: pass -addFSPath('0', 'media') +addFSPath(cds, '0', 'media') site = server.Site(root) reactor.listenTCP(listenPort, site) From 2dff3004268ab7cd09c14e8015cab261a8074b94 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 21 Apr 2006 23:34:02 -0800 Subject: [PATCH 030/179] fix tabs... add support for updating the system id.. [git-p4: depot-paths = "//depot/": change = 760] --- ContentDirectory.py | 78 +++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index d94633e..1f61acc 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -33,37 +33,44 @@ class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" def getnextID(self): - ret = str(self.nextID) - self.nextID += 1 - return ret + ret = str(self.nextID) + self.nextID += 1 + return ret def addContainer(self, parent, title, klass = Container, **kwargs): - ret = self.addItem(parent, klass, title, **kwargs) - self.children[ret] = [] - return ret + ret = self.addItem(parent, klass, title, **kwargs) + self.children[ret] = [] + return ret def addItem(self, parent, klass, *args, **kwargs): - assert isinstance(self[parent], Container) - nid = self.getnextID() - i = klass(nid, parent, *args, **kwargs) - self.children[parent].append(i) - self[i.id] = i - return i.id + assert isinstance(self[parent], Container) + nid = self.getnextID() + i = klass(nid, parent, *args, **kwargs) + self.children[parent].append(i) + self[i.id] = i + return i.id def getchildren(self, item): - assert isinstance(self[item], Container) - return self.children[item][:] + assert isinstance(self[item], Container) + return self.children[item][:] def __init__(self, title, *args): - super(ContentDirectoryControl, self).__init__(*args) - fakeparent = '-1' - self.nextID = 0 - self.children = { fakeparent: []} - self[fakeparent] = Container(None, '-1', 'fake') - root = self.addContainer(fakeparent, title) - assert root == '0' - del self[fakeparent] - del self.children[fakeparent] + super(ContentDirectoryControl, self).__init__(*args) + fakeparent = '-1' + self.nextID = 0 + self.children = { fakeparent: []} + self.needupdate = False + self.updateId = 0 + self[fakeparent] = Container(None, '-1', 'fake') + root = self.addContainer(fakeparent, title) + assert root == '0' + del self[fakeparent] + del self.children[fakeparent] + + def doupdate(self): + if self.needupdate: + self.needupdate += 1 + self.needupdate = False # Required actions @@ -71,20 +78,21 @@ class ContentDirectoryControl(UPnPPublisher, dict): """Required: Return the searching capabilities supported by the device.""" log.msg('GetSearchCapabilities()') - return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} + return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} def soap_GetSortCapabilities(self, *args, **kwargs): """Required: Return the CSV list of meta-data tags that can be used in sortCriteria.""" log.msg('GetSortCapabilities()') - return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} + return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} def soap_GetSystemUpdateID(self, *args, **kwargs): """Required: Return the current value of state variable SystemUpdateID.""" log.msg('GetSystemUpdateID()') - return { 'SystemUpdateIdResponse': { 'Id': 5 }} + self.needupdate = True + return { 'SystemUpdateIdResponse': { 'Id': self.updateId }} BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') @@ -94,8 +102,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, SortCriteria) = args - StartingIndex = int(StartingIndex) - RequestedCount = int(RequestedCount) + StartingIndex = int(StartingIndex) + RequestedCount = int(RequestedCount) log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % @@ -103,14 +111,14 @@ class ContentDirectoryControl(UPnPPublisher, dict): `RequestedCount`, `SortCriteria`)) didl = DIDLElement() - result = {} + result = {} try: - if BrowseFlag == 'BrowseDirectChildren': - ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) - else: - didl.addItem(self[ObjectID]) + if BrowseFlag == 'BrowseDirectChildren': + ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] + filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) + else: + didl.addItem(self[ObjectID]) result = {'BrowseResponse': {'Result': didl.toString() , 'NumberReturned': didl.numItems(), @@ -217,5 +225,5 @@ class ContentDirectoryServer(resource.Resource): def __init__(self, title): resource.Resource.__init__(self) self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) - self.control = ContentDirectoryControl(title) + self.control = ContentDirectoryControl(title) self.putChild('control', self.control) From d9d2d8b879104d6543aa94f1ace9897957f27d52 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Fri, 21 Apr 2006 23:36:01 -0800 Subject: [PATCH 031/179] go to tabs.. [git-p4: depot-paths = "//depot/": change = 761] --- pymediaserv | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/pymediaserv b/pymediaserv index 760d84e..2d779fc 100755 --- a/pymediaserv +++ b/pymediaserv @@ -50,18 +50,18 @@ from ContentDirectory import ContentDirectoryServer from ConnectionManager import ConnectionManagerServer class WebServer(resource.Resource): - def __init__(self): - resource.Resource.__init__(self) + def __init__(self): + resource.Resource.__init__(self) class RootDevice(static.Data): - def __init__(self): - r = { - 'hostname': socket.gethostname(), - 'uuid': uuid, - 'urlbase': urlbase, - } - d = file('root-device.xml').read() % r - static.Data.__init__(self, d, 'text/xml') + def __init__(self): + r = { + 'hostname': socket.gethostname(), + 'uuid': uuid, + 'urlbase': urlbase, + } + d = file('root-device.xml').read() % r + static.Data.__init__(self, d, 'text/xml') root = WebServer() cds = ContentDirectoryServer('My Media Server') @@ -122,7 +122,7 @@ def addFSPath(cds, parent, dpath): cds[item].res = Resource('%s%s' % (urlbase, fpath), 'http-get:*:%s:*' % mt) cds[item].res.size = os.path.getsize(fpath) except KeyError: - pass + pass addFSPath(cds, '0', 'media') @@ -131,24 +131,24 @@ reactor.listenTCP(listenPort, site) # we need to do this after the children are there, since we send notifies s.register('%s::upnp:rootdevice' % uuid, - 'upnp:rootdevice', - urlbase + 'root-device.xml') + 'upnp:rootdevice', + urlbase + 'root-device.xml') s.register(uuid, - uuid, - urlbase + 'root-device.xml') + uuid, + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid, - 'urn:schemas-upnp-org:device:MediaServer:1', - urlbase + 'root-device.xml') + 'urn:schemas-upnp-org:device:MediaServer:1', + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid, - 'urn:schemas-upnp-org:device:ConnectionManager:1', - urlbase + 'root-device.xml') + 'urn:schemas-upnp-org:device:ConnectionManager:1', + urlbase + 'root-device.xml') s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid, - 'urn:schemas-upnp-org:device:ContentDirectory:1', - urlbase + 'root-device.xml') + 'urn:schemas-upnp-org:device:ContentDirectory:1', + urlbase + 'root-device.xml') # Main loop From 528bb66be9727627769053514aa2e6a0797fcc94 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 24 Apr 2006 14:16:50 -0800 Subject: [PATCH 032/179] add support for deleteing Items... make Containers contain their own list of children... add the containing ContentDirectory to the Items so that they can add children to themselves... [git-p4: depot-paths = "//depot/": change = 762] --- ContentDirectory.py | 12 ++++++++++-- DIDLLite.py | 12 +++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 1f61acc..b0ccdc0 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -39,17 +39,25 @@ class ContentDirectoryControl(UPnPPublisher, dict): def addContainer(self, parent, title, klass = Container, **kwargs): ret = self.addItem(parent, klass, title, **kwargs) - self.children[ret] = [] + self.children[ret] = self[ret] return ret def addItem(self, parent, klass, *args, **kwargs): assert isinstance(self[parent], Container) nid = self.getnextID() - i = klass(nid, parent, *args, **kwargs) + i = klass(self, nid, parent, *args, **kwargs) self.children[parent].append(i) self[i.id] = i return i.id + def delItem(self, id): + if isinstance(self[id], Container): + for i in self.children[id]: + self.delItem(i) + assert len(self.children[id]) == 0 + del self.children[id] + del self[id] + def getchildren(self, item): assert isinstance(self[item], Container) return self.children[item][:] diff --git a/DIDLLite.py b/DIDLLite.py index 10cd383..1b3b3a8 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -36,9 +36,10 @@ class Object: res = None writeStatus = None - def __init__(self, id, parentID, title, restricted = False, + def __init__(self, cd, id, parentID, title, restricted = False, creator = None): + self.cd = cd self.id = id self.parentID = parentID self.title = title @@ -203,19 +204,20 @@ class PlaylistItem(Item): class TextItem(Item): klass = Item.klass + '.textItem' -class Container(Object): +class Container(Object, list): """An object that can contain other objects.""" klass = Object.klass + '.container' elementName = 'container' - childCount = 0 + childCount = property(lambda x: len(x)) createClass = None searchClass = None searchable = None - def __init__(self, id, parentID, title, restricted = 0, creator = None): - Object.__init__(self, id, parentID, title, restricted, creator) + def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): + Object.__init__(self, cd, id, parentID, title, restricted, creator) + list.__init__(self) def toElement(self): From 312d124260d978b16279967c1bed1406b29de23f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 24 Apr 2006 14:47:35 -0800 Subject: [PATCH 033/179] switch to using tabs instead of spaces... [git-p4: depot-paths = "//depot/": change = 763] --- ConnectionManager.py | 10 +- ContentDirectory.py | 304 +++++++++++++++--------------- DIDLLite.py | 426 +++++++++++++++++++++---------------------- SSDP.py | 308 +++++++++++++++---------------- browse-zms.py | 18 +- cdsclient | 56 +++--- upnp.py | 12 +- xmlpretty | 2 +- 8 files changed, 561 insertions(+), 575 deletions(-) diff --git a/ConnectionManager.py b/ConnectionManager.py index d1896ba..6f0203c 100644 --- a/ConnectionManager.py +++ b/ConnectionManager.py @@ -10,10 +10,10 @@ from twisted.web import resource, static, soap from upnp import UPnPPublisher class ConnectionManagerControl(UPnPPublisher): - pass + pass class ConnectionManagerServer(resource.Resource): - def __init__(self): - resource.Resource.__init__(self) - self.putChild('scpd.xml', static.File('connection-manager-scpd.xml')) - self.putChild('control', ConnectionManagerControl()) + def __init__(self): + resource.Resource.__init__(self) + self.putChild('scpd.xml', static.File('connection-manager-scpd.xml')) + self.putChild('control', ConnectionManagerControl()) diff --git a/ContentDirectory.py b/ContentDirectory.py index b0ccdc0..82494dd 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -14,9 +14,9 @@ # twisted swallows the tracebacks. At the moment I'm going: # # try: -# .... +# .... # except: -# traceback.print_exc(file = log.logfile) +# traceback.print_exc(file = log.logfile) # from twisted.python import log @@ -30,208 +30,208 @@ import traceback from urllib import quote class ContentDirectoryControl(UPnPPublisher, dict): - """This class implements the CDS actions over SOAP.""" - - def getnextID(self): - ret = str(self.nextID) - self.nextID += 1 - return ret - - def addContainer(self, parent, title, klass = Container, **kwargs): - ret = self.addItem(parent, klass, title, **kwargs) - self.children[ret] = self[ret] - return ret - - def addItem(self, parent, klass, *args, **kwargs): - assert isinstance(self[parent], Container) - nid = self.getnextID() - i = klass(self, nid, parent, *args, **kwargs) - self.children[parent].append(i) - self[i.id] = i - return i.id - - def delItem(self, id): + """This class implements the CDS actions over SOAP.""" + + def getnextID(self): + ret = str(self.nextID) + self.nextID += 1 + return ret + + def addContainer(self, parent, title, klass = Container, **kwargs): + ret = self.addItem(parent, klass, title, **kwargs) + self.children[ret] = self[ret] + return ret + + def addItem(self, parent, klass, *args, **kwargs): + assert isinstance(self[parent], Container) + nid = self.getnextID() + i = klass(self, nid, parent, *args, **kwargs) + self.children[parent].append(i) + self[i.id] = i + return i.id + + def delItem(self, id): if isinstance(self[id], Container): for i in self.children[id]: self.delItem(i) assert len(self.children[id]) == 0 del self.children[id] - del self[id] + del self[id] - def getchildren(self, item): - assert isinstance(self[item], Container) - return self.children[item][:] + def getchildren(self, item): + assert isinstance(self[item], Container) + return self.children[item][:] - def __init__(self, title, *args): - super(ContentDirectoryControl, self).__init__(*args) - fakeparent = '-1' - self.nextID = 0 - self.children = { fakeparent: []} - self.needupdate = False - self.updateId = 0 - self[fakeparent] = Container(None, '-1', 'fake') - root = self.addContainer(fakeparent, title) - assert root == '0' - del self[fakeparent] - del self.children[fakeparent] + def __init__(self, title, *args): + super(ContentDirectoryControl, self).__init__(*args) + fakeparent = '-1' + self.nextID = 0 + self.children = { fakeparent: []} + self.needupdate = False + self.updateId = 0 + self[fakeparent] = Container(None, '-1', 'fake') + root = self.addContainer(fakeparent, title) + assert root == '0' + del self[fakeparent] + del self.children[fakeparent] - def doupdate(self): - if self.needupdate: - self.needupdate += 1 - self.needupdate = False + def doupdate(self): + if self.needupdate: + self.needupdate += 1 + self.needupdate = False - # Required actions + # Required actions - def soap_GetSearchCapabilities(self, *args, **kwargs): - """Required: Return the searching capabilities supported by the device.""" + def soap_GetSearchCapabilities(self, *args, **kwargs): + """Required: Return the searching capabilities supported by the device.""" - log.msg('GetSearchCapabilities()') - return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} + log.msg('GetSearchCapabilities()') + return { 'SearchCapabilitiesResponse': { 'SearchCaps': '' }} - def soap_GetSortCapabilities(self, *args, **kwargs): - """Required: Return the CSV list of meta-data tags that can be used in - sortCriteria.""" + def soap_GetSortCapabilities(self, *args, **kwargs): + """Required: Return the CSV list of meta-data tags that can be used in + sortCriteria.""" - log.msg('GetSortCapabilities()') - return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} - - def soap_GetSystemUpdateID(self, *args, **kwargs): - """Required: Return the current value of state variable SystemUpdateID.""" + log.msg('GetSortCapabilities()') + return { 'SortCapabilitiesResponse': { 'SortCaps': '' }} - log.msg('GetSystemUpdateID()') - self.needupdate = True - return { 'SystemUpdateIdResponse': { 'Id': self.updateId }} + def soap_GetSystemUpdateID(self, *args, **kwargs): + """Required: Return the current value of state variable SystemUpdateID.""" - BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') + log.msg('GetSystemUpdateID()') + self.needupdate = True + return { 'SystemUpdateIdResponse': { 'Id': self.updateId }} - def soap_Browse(self, *args): - """Required: Incrementally browse the native heirachy of the Content - Directory objects exposed by the Content Directory Service.""" + BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') - (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, - SortCriteria) = args - StartingIndex = int(StartingIndex) - RequestedCount = int(RequestedCount) + def soap_Browse(self, *args): + """Required: Incrementally browse the native heirachy of the Content + Directory objects exposed by the Content Directory Service.""" - log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' - 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % - (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, - `RequestedCount`, `SortCriteria`)) + (ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount, + SortCriteria) = args + StartingIndex = int(StartingIndex) + RequestedCount = int(RequestedCount) - didl = DIDLElement() - result = {} + log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, ' + 'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' % + (`ObjectID`, `BrowseFlag`, `Filter`, `StartingIndex`, + `RequestedCount`, `SortCriteria`)) - try: - if BrowseFlag == 'BrowseDirectChildren': - ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) - else: - didl.addItem(self[ObjectID]) + didl = DIDLElement() + result = {} - result = {'BrowseResponse': {'Result': didl.toString() , - 'NumberReturned': didl.numItems(), - 'TotalMatches': didl.numItems(), - 'UpdateID': 0}} + try: + if BrowseFlag == 'BrowseDirectChildren': + ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] + filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) + else: + didl.addItem(self[ObjectID]) - except: - traceback.print_exc(file=log.logfile) + result = {'BrowseResponse': {'Result': didl.toString() , + 'NumberReturned': didl.numItems(), + 'TotalMatches': didl.numItems(), + 'UpdateID': 0}} - log.msg('Returning: %s' % result) + except: + traceback.print_exc(file=log.logfile) - return result + log.msg('Returning: %s' % result) - # Optional actions + return result - def soap_Search(self, *args, **kwargs): - """Search for objects that match some search criteria.""" + # Optional actions - (ContainerID, SearchCriteria, Filter, StartingIndex, - RequestedCount, SortCriteria) = args + def soap_Search(self, *args, **kwargs): + """Search for objects that match some search criteria.""" - log.msg('Search(ContainerID=%s, SearchCriteria=%s, Filter=%s, ' \ - 'StartingIndex=%s, RequestedCount=%s, SortCriteria=%s)' % - (`ContainerID`, `SearchCriteria`, `Filter`, - `StartingIndex`, `RequestedCount`, `SortCriteria`)) - - def soap_CreateObject(self, *args, **kwargs): - """Create a new object.""" + (ContainerID, SearchCriteria, Filter, StartingIndex, + RequestedCount, SortCriteria) = args - (ContainerID, Elements) = args + log.msg('Search(ContainerID=%s, SearchCriteria=%s, Filter=%s, ' \ + 'StartingIndex=%s, RequestedCount=%s, SortCriteria=%s)' % + (`ContainerID`, `SearchCriteria`, `Filter`, + `StartingIndex`, `RequestedCount`, `SortCriteria`)) - log.msg('CreateObject(ContainerID=%s, Elements=%s)' % - (`ContainerID`, `Elements`)) + def soap_CreateObject(self, *args, **kwargs): + """Create a new object.""" - def soap_DestroyObject(self, *args, **kwargs): - """Destroy the specified object.""" + (ContainerID, Elements) = args - (ObjectID) = args + log.msg('CreateObject(ContainerID=%s, Elements=%s)' % + (`ContainerID`, `Elements`)) - log.msg('DestroyObject(ObjectID=%s)' % `ObjectID`) + def soap_DestroyObject(self, *args, **kwargs): + """Destroy the specified object.""" - def soap_UpdateObject(self, *args, **kwargs): - """Modify, delete or insert object metadata.""" + (ObjectID) = args - (ObjectID, CurrentTagValue, NewTagValue) = args + log.msg('DestroyObject(ObjectID=%s)' % `ObjectID`) - log.msg('UpdateObject(ObjectID=%s, CurrentTagValue=%s, ' \ - 'NewTagValue=%s)' % (`ObjectID`, `CurrentTagValue`, - `NewTagValue`)) + def soap_UpdateObject(self, *args, **kwargs): + """Modify, delete or insert object metadata.""" - def soap_ImportResource(self, *args, **kwargs): - """Transfer a file from a remote source to a local - destination in the Content Directory Service.""" + (ObjectID, CurrentTagValue, NewTagValue) = args - (SourceURI, DestinationURI) = args + log.msg('UpdateObject(ObjectID=%s, CurrentTagValue=%s, ' \ + 'NewTagValue=%s)' % (`ObjectID`, `CurrentTagValue`, + `NewTagValue`)) - log.msg('ImportResource(SourceURI=%s, DestinationURI=%s)' % - (`SourceURI`, `DestinationURI`)) + def soap_ImportResource(self, *args, **kwargs): + """Transfer a file from a remote source to a local + destination in the Content Directory Service.""" - def soap_ExportResource(self, *args, **kwargs): - """Transfer a file from a local source to a remote - destination.""" + (SourceURI, DestinationURI) = args - (SourceURI, DestinationURI) = args + log.msg('ImportResource(SourceURI=%s, DestinationURI=%s)' % + (`SourceURI`, `DestinationURI`)) - log.msg('ExportResource(SourceURI=%s, DestinationURI=%s)' % - (`SourceURI`, `DestinationURI`)) + def soap_ExportResource(self, *args, **kwargs): + """Transfer a file from a local source to a remote + destination.""" - def soap_StopTransferResource(self, *args, **kwargs): - """Stop a file transfer initiated by ImportResource or - ExportResource.""" + (SourceURI, DestinationURI) = args - (TransferID) = args + log.msg('ExportResource(SourceURI=%s, DestinationURI=%s)' % + (`SourceURI`, `DestinationURI`)) - log.msg('StopTransferResource(TransferID=%s)' % TransferID) + def soap_StopTransferResource(self, *args, **kwargs): + """Stop a file transfer initiated by ImportResource or + ExportResource.""" - def soap_GetTransferProgress(self, *args, **kwargs): - """Query the progress of a file transfer initiated by - an ImportResource or ExportResource action.""" + (TransferID) = args - (TransferID, TransferStatus, TransferLength, TransferTotal) = args + log.msg('StopTransferResource(TransferID=%s)' % TransferID) - log.msg('GetTransferProgress(TransferID=%s, TransferStatus=%s, ' \ - 'TransferLength=%s, TransferTotal=%s)' % - (`TransferId`, `TransferStatus`, `TransferLength`, - `TransferTotal`)) - - def soap_DeleteResource(self, *args, **kwargs): - """Delete a specified resource.""" + def soap_GetTransferProgress(self, *args, **kwargs): + """Query the progress of a file transfer initiated by + an ImportResource or ExportResource action.""" - (ResourceURI) = args + (TransferID, TransferStatus, TransferLength, TransferTotal) = args - log.msg('DeleteResource(ResourceURI=%s)' % `ResourceURI`) + log.msg('GetTransferProgress(TransferID=%s, TransferStatus=%s, ' \ + 'TransferLength=%s, TransferTotal=%s)' % + (`TransferId`, `TransferStatus`, `TransferLength`, + `TransferTotal`)) - def soap_CreateReference(self, *args, **kwargs): - """Create a reference to an existing object.""" + def soap_DeleteResource(self, *args, **kwargs): + """Delete a specified resource.""" - (ContainerID, ObjectID) = args + (ResourceURI) = args - log.msg('CreateReference(ContainerID=%s, ObjectID=%s)' % - (`ContainerID`, `ObjectID`)) + log.msg('DeleteResource(ResourceURI=%s)' % `ResourceURI`) + + def soap_CreateReference(self, *args, **kwargs): + """Create a reference to an existing object.""" + + (ContainerID, ObjectID) = args + + log.msg('CreateReference(ContainerID=%s, ObjectID=%s)' % + (`ContainerID`, `ObjectID`)) class ContentDirectoryServer(resource.Resource): - def __init__(self, title): - resource.Resource.__init__(self) - self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) - self.control = ContentDirectoryControl(title) - self.putChild('control', self.control) + def __init__(self, title): + resource.Resource.__init__(self) + self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) + self.control = ContentDirectoryControl(title) + self.putChild('control', self.control) diff --git a/DIDLLite.py b/DIDLLite.py index 1b3b3a8..9ce17e4 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -6,346 +6,346 @@ from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface class Resource: - """An object representing a resource.""" + """An object representing a resource.""" - def __init__(self, data, protocolInfo): - self.data = data - self.protocolInfo = protocolInfo - self.bitrate = None - self.size = None - - def toElement(self): + def __init__(self, data, protocolInfo): + self.data = data + self.protocolInfo = protocolInfo + self.bitrate = None + self.size = None - root = Element('res') - root.attrib['protocolInfo'] = self.protocolInfo - root.text = self.data + def toElement(self): - if self.bitrate is not None: - root.attrib['bitrate'] = str(self.bitrate) + root = Element('res') + root.attrib['protocolInfo'] = self.protocolInfo + root.text = self.data - if self.size is not None: - root.attrib['size'] = str(self.size) + if self.bitrate is not None: + root.attrib['bitrate'] = str(self.bitrate) - return root + if self.size is not None: + root.attrib['size'] = str(self.size) + + return root class Object: - """The root class of the entire content directory class heirachy.""" + """The root class of the entire content directory class heirachy.""" + + klass = 'object' + creator = None + res = None + writeStatus = None - klass = 'object' - creator = None - res = None - writeStatus = None + def __init__(self, cd, id, parentID, title, restricted = False, + creator = None): - def __init__(self, cd, id, parentID, title, restricted = False, - creator = None): + self.cd = cd + self.id = id + self.parentID = parentID + self.title = title + self.creator = creator - self.cd = cd - self.id = id - self.parentID = parentID - self.title = title - self.creator = creator - - if restricted: - self.restricted = '1' - else: - self.restricted = '0' + if restricted: + self.restricted = '1' + else: + self.restricted = '0' - def toElement(self): + def toElement(self): - root = Element(self.elementName) + root = Element(self.elementName) - root.attrib['id'] = self.id - root.attrib['parentID'] = self.parentID - SubElement(root, 'dc:title').text = self.title - SubElement(root, 'upnp:class').text = self.klass + root.attrib['id'] = self.id + root.attrib['parentID'] = self.parentID + SubElement(root, 'dc:title').text = self.title + SubElement(root, 'upnp:class').text = self.klass - root.attrib['restricted'] = self.restricted + root.attrib['restricted'] = self.restricted - if self.creator is not None: - SubElement(root, 'dc:creator').text = self.creator + if self.creator is not None: + SubElement(root, 'dc:creator').text = self.creator - if self.res is not None: - root.append(self.res.toElement()) + if self.res is not None: + root.append(self.res.toElement()) - if self.writeStatus is not None: - SubElement(root, 'upnp:writeStatus').text = self.writeStatus + if self.writeStatus is not None: + SubElement(root, 'upnp:writeStatus').text = self.writeStatus - return root - - def toString(self): - return tostring(self.toElement()) + return root + + def toString(self): + return tostring(self.toElement()) class Item(Object): - """A class used to represent atomic (non-container) content - objects.""" + """A class used to represent atomic (non-container) content + objects.""" - klass = Object.klass + '.item' - elementName = 'item' - refID = None + klass = Object.klass + '.item' + elementName = 'item' + refID = None - def toElement(self): + def toElement(self): - root = Object.toElement(self) + root = Object.toElement(self) - if self.refID is not None: - SubElement(root, 'refID').text = self.refID + if self.refID is not None: + SubElement(root, 'refID').text = self.refID - return root + return root class ImageItem(Item): - klass = Item.klass + '.imageItem' + klass = Item.klass + '.imageItem' class Photo(ImageItem): - klass = ImageItem.klass + '.photo' + klass = ImageItem.klass + '.photo' class AudioItem(Item): - """A piece of content that when rendered generates some audio.""" + """A piece of content that when rendered generates some audio.""" + + klass = Item.klass + '.audioItem' - klass = Item.klass + '.audioItem' + genre = None + description = None + longDescription = None + publisher = None + language = None + relation = None + rights = None - genre = None - description = None - longDescription = None - publisher = None - language = None - relation = None - rights = None + def toElement(self): - def toElement(self): + root = Item.toElement(self) - root = Item.toElement(self) - - if self.genre is not None: - SubElement(root, 'upnp:genre').text = self.genre + if self.genre is not None: + SubElement(root, 'upnp:genre').text = self.genre - if self.description is not None: - SubElement(root, 'dc:description').text = self.description + if self.description is not None: + SubElement(root, 'dc:description').text = self.description - if self.longDescription is not None: - SubElement(root, 'upnp:longDescription').text = \ - self.longDescription + if self.longDescription is not None: + SubElement(root, 'upnp:longDescription').text = \ + self.longDescription - if self.publisher is not None: - SubElement(root, 'dc:publisher').text = self.publisher + if self.publisher is not None: + SubElement(root, 'dc:publisher').text = self.publisher - if self.language is not None: - SubElement(root, 'dc:language').text = self.language + if self.language is not None: + SubElement(root, 'dc:language').text = self.language - if self.relation is not None: - SubElement(root, 'dc:relation').text = self.relation + if self.relation is not None: + SubElement(root, 'dc:relation').text = self.relation - if self.rights is not None: - SubElement(root, 'dc:rights').text = self.rights + if self.rights is not None: + SubElement(root, 'dc:rights').text = self.rights - return root + return root class MusicTrack(AudioItem): - """A discrete piece of audio that should be interpreted as music.""" + """A discrete piece of audio that should be interpreted as music.""" - klass = AudioItem.klass + '.musicTrack' + klass = AudioItem.klass + '.musicTrack' - artist = None - album = None - originalTrackNumber = None - playlist = None - storageMedium = None - contributor = None - date = None + artist = None + album = None + originalTrackNumber = None + playlist = None + storageMedium = None + contributor = None + date = None - def toElement(self): + def toElement(self): - root = AudioItem.toElement(self) + root = AudioItem.toElement(self) - if self.artist is not None: - SubElement(root, 'upnp:artist').text = self.artist + if self.artist is not None: + SubElement(root, 'upnp:artist').text = self.artist - if self.album is not None: - SubElement(root, 'upnp:album').text = self.album + if self.album is not None: + SubElement(root, 'upnp:album').text = self.album - if self.originalTrackNumber is not None: - SubElement(root, 'upnp:originalTrackNumber').text = \ - self.originalTrackNumber + if self.originalTrackNumber is not None: + SubElement(root, 'upnp:originalTrackNumber').text = \ + self.originalTrackNumber - if self.playlist is not None: - SubElement(root, 'upnp:playlist').text = self.playlist + if self.playlist is not None: + SubElement(root, 'upnp:playlist').text = self.playlist - if self.storageMedium is not None: - SubElement(root, 'upnp:storageMedium').text = self.storageMedium + if self.storageMedium is not None: + SubElement(root, 'upnp:storageMedium').text = self.storageMedium - if self.contributor is not None: - SubElement(root, 'dc:contributor').text = self.contributor + if self.contributor is not None: + SubElement(root, 'dc:contributor').text = self.contributor - if self.date is not None: - SubElement(root, 'dc:date').text = self.date + if self.date is not None: + SubElement(root, 'dc:date').text = self.date - return root + return root class AudioBroadcast(AudioItem): - klass = AudioItem.klass + '.audioBroadcast' + klass = AudioItem.klass + '.audioBroadcast' class AudioBook(AudioItem): - klass = AudioItem.klass + '.audioBook' + klass = AudioItem.klass + '.audioBook' class VideoItem(Item): - klass = Item.klass + '.videoItem' + klass = Item.klass + '.videoItem' class Movie(VideoItem): - klass = VideoItem.klass + '.movie' + klass = VideoItem.klass + '.movie' class VideoBroadcast(VideoItem): - klass = VideoItem.klass + '.videoBroadcast' + klass = VideoItem.klass + '.videoBroadcast' class MusicVideoClip(VideoItem): - klass = VideoItem.klass + '.musicVideoClip' + klass = VideoItem.klass + '.musicVideoClip' class PlaylistItem(Item): - klass = Item.klass + '.playlistItem' + klass = Item.klass + '.playlistItem' class TextItem(Item): - klass = Item.klass + '.textItem' + klass = Item.klass + '.textItem' class Container(Object, list): - """An object that can contain other objects.""" + """An object that can contain other objects.""" - klass = Object.klass + '.container' + klass = Object.klass + '.container' - elementName = 'container' - childCount = property(lambda x: len(x)) - createClass = None - searchClass = None - searchable = None + elementName = 'container' + childCount = property(lambda x: len(x)) + createClass = None + searchClass = None + searchable = None - def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): - Object.__init__(self, cd, id, parentID, title, restricted, creator) + def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): + Object.__init__(self, cd, id, parentID, title, restricted, creator) list.__init__(self) - def toElement(self): + def toElement(self): - root = Object.toElement(self) + root = Object.toElement(self) - root.attrib['childCount'] = str(self.childCount) + root.attrib['childCount'] = str(self.childCount) - if self.createClass is not None: - SubElement(root, 'upnp:createclass').text = self.createClass - - if self.searchClass is not None: - if not isinstance(self.searchClass, (list, tuple)): - self.searchClass = ['searchClass'] - for i in searchClass: - SubElement(root, 'upnp:searchclass').text = i + if self.createClass is not None: + SubElement(root, 'upnp:createclass').text = self.createClass - if self.searchable is not None: - root.attrib['searchable'] = str(self.searchable) + if self.searchClass is not None: + if not isinstance(self.searchClass, (list, tuple)): + self.searchClass = ['searchClass'] + for i in searchClass: + SubElement(root, 'upnp:searchclass').text = i - return root + if self.searchable is not None: + root.attrib['searchable'] = str(self.searchable) + + return root class Person(Container): - klass = Container.klass + '.person' + klass = Container.klass + '.person' class MusicArtist(Person): - klass = Person.klass + '.musicArtist' + klass = Person.klass + '.musicArtist' class PlaylistContainer(Container): - klass = Container.klass + '.playlistContainer' + klass = Container.klass + '.playlistContainer' class Album(Container): - klass = Container.klass + '.album' + klass = Container.klass + '.album' class MusicAlbum(Album): - klass = Album.klass + '.musicAlbum' + klass = Album.klass + '.musicAlbum' class PhotoAlbum(Album): - klass = Album.klass + '.photoAlbum' + klass = Album.klass + '.photoAlbum' class Genre(Container): - klass = Container.klass + '.genre' + klass = Container.klass + '.genre' class MusicGenre(Genre): - klass = Genre.klass + '.musicGenre' + klass = Genre.klass + '.musicGenre' class MovieGenre(Genre): - klass = Genre.klass + '.movieGenre' + klass = Genre.klass + '.movieGenre' class StorageSystem(Container): - klass = Container.klass + '.storageSystem' + klass = Container.klass + '.storageSystem' + + total = -1 + used = -1 + free = -1 + maxpartition = -1 + medium = 'UNKNOWN' - total = -1 - used = -1 - free = -1 - maxpartition = -1 - medium = 'UNKNOWN' + def toElement(self): - def toElement(self): + root = Container.toElement(self) - root = Container.toElement(self) - - SubElement(root, 'upnp:storageTotal').text = str(self.total) - SubElement(root, 'upnp:storageUsed').text = str(self.used) - SubElement(root, 'upnp:storageFree').text = str(self.free) - SubElement(root, 'upnp:storageMaxPartition').text = str(self.maxpartition) - SubElement(root, 'upnp:storageMedium').text = self.medium + SubElement(root, 'upnp:storageTotal').text = str(self.total) + SubElement(root, 'upnp:storageUsed').text = str(self.used) + SubElement(root, 'upnp:storageFree').text = str(self.free) + SubElement(root, 'upnp:storageMaxPartition').text = str(self.maxpartition) + SubElement(root, 'upnp:storageMedium').text = self.medium - return root + return root class StorageVolume(Container): - klass = Container.klass + '.storageVolume' + klass = Container.klass + '.storageVolume' - total = -1 - used = -1 - free = -1 - medium = 'UNKNOWN' + total = -1 + used = -1 + free = -1 + medium = 'UNKNOWN' - def toElement(self): + def toElement(self): - root = Container.toElement(self) - - SubElement(root, 'upnp:storageTotal').text = str(self.total) - SubElement(root, 'upnp:storageUsed').text = str(self.used) - SubElement(root, 'upnp:storageFree').text = str(self.free) - SubElement(root, 'upnp:storageMedium').text = self.medium + root = Container.toElement(self) - return root + SubElement(root, 'upnp:storageTotal').text = str(self.total) + SubElement(root, 'upnp:storageUsed').text = str(self.used) + SubElement(root, 'upnp:storageFree').text = str(self.free) + SubElement(root, 'upnp:storageMedium').text = self.medium + + return root class StorageFolder(Container): - klass = Container.klass + '.storageFolder' + klass = Container.klass + '.storageFolder' + + used = -1 - used = -1 + def toElement(self): - def toElement(self): + root = Container.toElement(self) - root = Container.toElement(self) - - if self.used is not None: - SubElement(root, 'upnp:storageUsed').text = str(self.used) + if self.used is not None: + SubElement(root, 'upnp:storageUsed').text = str(self.used) - return root + return root class DIDLElement(_ElementInterface): - def __init__(self): - _ElementInterface.__init__(self, 'DIDL-Lite', {}) - self.attrib['xmlns'] = 'urn:schemas-upnp-org:metadata-1-0/DIDL-Lite' - self.attrib['xmlns:dc'] = 'http://purl.org/dc/elements/1.1/' - self.attrib['xmlns:upnp'] = 'urn:schemas-upnp-org:metadata-1-0/upnp' + def __init__(self): + _ElementInterface.__init__(self, 'DIDL-Lite', {}) + self.attrib['xmlns'] = 'urn:schemas-upnp-org:metadata-1-0/DIDL-Lite' + self.attrib['xmlns:dc'] = 'http://purl.org/dc/elements/1.1/' + self.attrib['xmlns:upnp'] = 'urn:schemas-upnp-org:metadata-1-0/upnp' - def addContainer(self, id, parentID, title, restricted = False): - e = Container(id, parentID, title, restricted, creator = '') - self.append(e.toElement()) + def addContainer(self, id, parentID, title, restricted = False): + e = Container(id, parentID, title, restricted, creator = '') + self.append(e.toElement()) - def addItem(self, item): - self.append(item.toElement()) + def addItem(self, item): + self.append(item.toElement()) - def numItems(self): - return len(self) + def numItems(self): + return len(self) - def toString(self): - return tostring(self) + def toString(self): + return tostring(self) if __name__ == '__main__': - root = DIDLElement() - root.addContainer('0\Movie\\', '0\\', 'Movie') - root.addContainer('0\Music\\', '0\\', 'Music') - root.addContainer('0\Photo\\', '0\\', 'Photo') - root.addContainer('0\OnlineMedia\\', '0\\', 'OnlineMedia') + root = DIDLElement() + root.addContainer('0\Movie\\', '0\\', 'Movie') + root.addContainer('0\Music\\', '0\\', 'Music') + root.addContainer('0\Photo\\', '0\\', 'Photo') + root.addContainer('0\OnlineMedia\\', '0\\', 'OnlineMedia') - print tostring(root) + print tostring(root) diff --git a/SSDP.py b/SSDP.py index 10251ca..2d691aa 100644 --- a/SSDP.py +++ b/SSDP.py @@ -26,167 +26,155 @@ SSDP_ADDR = '239.255.255.250' # class to handle services etc. class SSDPServer(DatagramProtocol): - """A class implementing a SSDP server. The notifyReceived and - searchReceived methods are called when the appropriate type of - datagram is received by the server.""" + """A class implementing a SSDP server. The notifyReceived and + searchReceived methods are called when the appropriate type of + datagram is received by the server.""" - # not used yet - stdheaders = [ ('Server', 'Twisted, UPnP/1.0, python-upnp'), ] - elements = {} - known = {} + # not used yet + stdheaders = [ ('Server', 'Twisted, UPnP/1.0, python-upnp'), ] + elements = {} + known = {} - def doStop(self): + def doStop(self): '''Make sure we send out the byebye notifications.''' - self.transport.write('foobar', (SSDP_ADDR, SSDP_PORT)) - for st in self.known: - self.doByebye(st) - DatagramProtocol.doStop(self) - - def datagramReceived(self, data, (host, port)): - """Handle a received multicast datagram.""" - - # Break up message in to command and headers - # TODO: use the email module after trimming off the request line.. - # This gets us much better header support. - - header, payload = data.split('\r\n\r\n') - lines = header.split('\r\n') - cmd = string.split(lines[0], ' ') - lines = map(lambda x: x.replace(': ', ':', 1), lines[1:]) - lines = filter(lambda x: len(x) > 0, lines) - - headers = [string.split(x, ':', 1) for x in lines] - headers = dict(map(lambda x: (x[0].lower(), x[1]), headers)) - - if cmd[0] == 'M-SEARCH' and cmd[1] == '*': - # SSDP discovery - self.discoveryRequest(headers, (host, port)) - elif cmd[0] == 'NOTIFY' and cmd[1] == '*': - # SSDP presence - self.notifyReceived(headers, (host, port)) - else: - log.msg('Unknown SSDP command %s %s' % cmd) - - def discoveryRequest(self, headers, (host, port)): - """Process a discovery request. The response must be sent to - the address specified by (host, port).""" - - log.msg('Discovery request for %s' % headers['st']) - - # Do we know about this service? - - if headers['st'] == 'ssdp:all': - for i in self.known: - hcopy = dict(headers.iteritems()) - hcopy['st'] = i - self.discoveryRequest(hcopy, (host, post)) - return - if not self.known.has_key(headers['st']): - return - - # Generate a response - - response = [] - response.append('HTTP/1.1 200 OK') - - for k, v in self.known[headers['st']].items(): - response.append('%s: %s' % (k, v)) - - response.extend(('', '')) - delay = random.randint(0, int(headers['mx'])) - reactor.callLater(delay, self.transport.write, - '\r\n'.join(response), (host, port)) - - def register(self, usn, st, location): - """Register a service or device that this SSDP server will - respond to.""" - - log.msg('Registering %s' % st) - - self.known[st] = {} - self.known[st]['USN'] = usn - self.known[st]['LOCATION'] = location - self.known[st]['ST'] = st - self.known[st]['EXT'] = '' - self.known[st]['SERVER'] = 'Twisted, UPnP/1.0, python-upnp' - self.known[st]['CACHE-CONTROL'] = 'max-age=1800' - self.doNotify(st) - - def doByebye(self, st): - """Do byebye""" - - log.msg('Sending byebye notification for %s' % st) - - resp = [ 'NOTIFY * HTTP/1.1', - 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), - 'NTS: ssdp:byebye', - ] - stcpy = dict(self.known[st].iteritems()) - stcpy['NT'] = stcpy['ST'] - del stcpy['ST'] - resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) - resp.extend(('', '')) - self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) - - def doNotify(self, st): - """Do notification""" - - log.msg('Sending alive notification for %s' % st) - - resp = [ 'NOTIFY * HTTP/1.1', - 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), - 'NTS: ssdp:alive', - ] - stcpy = dict(self.known[st].iteritems()) - stcpy['NT'] = stcpy['ST'] - del stcpy['ST'] - resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) - resp.extend(('', '')) - self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) - - def notifyReceived(self, headers, (host, port)): - """Process a presence announcement. We just remember the - details of the SSDP service announced.""" - - if headers['nts'] == 'ssdp:alive': - - if not self.elements.has_key(headers['nt']): - - # Register device/service - - self.elements[headers['nt']] = {} - self.elements[headers['nt']]['USN'] = headers['usn'] - self.elements[headers['nt']]['host'] = (host, port) - - log.msg('Detected presence of %s' % headers['nt']) - - elif headers['nts'] == 'ssdp:byebye': - - if self.elements.has_key(headers['nt']): - - # Unregister device/service - - del(self.elements[headers['nt']]) - - log.msg('Detected absence for %s' % headers['nt']) - - else: - log.msg('Unknown subtype %s for notification type %s' % - (headers['nts'], headers['nt'])) - - def findService(self, name): - """Return information about a service registered over SSDP.""" - - # TODO: Implement me. - - # TODO: Send out a discovery request if we haven't registered - # a presence announcement. - - def findDevice(self, name): - """Return information about a device registered over SSDP.""" - - # TODO: Implement me. - - # TODO: Send out a discovery request if we haven't registered - # a presence announcement. + self.transport.write('foobar', (SSDP_ADDR, SSDP_PORT)) + for st in self.known: + self.doByebye(st) + DatagramProtocol.doStop(self) + + def datagramReceived(self, data, (host, port)): + """Handle a received multicast datagram.""" + + # Break up message in to command and headers + # TODO: use the email module after trimming off the request line.. + # This gets us much better header support. + + header, payload = data.split('\r\n\r\n') + lines = header.split('\r\n') + cmd = string.split(lines[0], ' ') + lines = map(lambda x: x.replace(': ', ':', 1), lines[1:]) + lines = filter(lambda x: len(x) > 0, lines) + + headers = [string.split(x, ':', 1) for x in lines] + headers = dict(map(lambda x: (x[0].lower(), x[1]), headers)) + + if cmd[0] == 'M-SEARCH' and cmd[1] == '*': + # SSDP discovery + self.discoveryRequest(headers, (host, port)) + elif cmd[0] == 'NOTIFY' and cmd[1] == '*': + # SSDP presence + self.notifyReceived(headers, (host, port)) + else: + log.msg('Unknown SSDP command %s %s' % cmd) + + def discoveryRequest(self, headers, (host, port)): + """Process a discovery request. The response must be sent to + the address specified by (host, port).""" + + log.msg('Discovery request for %s' % headers['st']) + + # Do we know about this service? + if headers['st'] == 'ssdp:all': + for i in self.known: + hcopy = dict(headers.iteritems()) + hcopy['st'] = i + self.discoveryRequest(hcopy, (host, post)) + return + if not self.known.has_key(headers['st']): + return + + # Generate a response + response = [] + response.append('HTTP/1.1 200 OK') + + for k, v in self.known[headers['st']].items(): + response.append('%s: %s' % (k, v)) + + response.extend(('', '')) + delay = random.randint(0, int(headers['mx'])) + reactor.callLater(delay, self.transport.write, + '\r\n'.join(response), (host, port)) + + def register(self, usn, st, location): + """Register a service or device that this SSDP server will + respond to.""" + + log.msg('Registering %s' % st) + + self.known[st] = {} + self.known[st]['USN'] = usn + self.known[st]['LOCATION'] = location + self.known[st]['ST'] = st + self.known[st]['EXT'] = '' + self.known[st]['SERVER'] = 'Twisted, UPnP/1.0, python-upnp' + self.known[st]['CACHE-CONTROL'] = 'max-age=1800' + self.doNotify(st) + + def doByebye(self, st): + """Do byebye""" + + log.msg('Sending byebye notification for %s' % st) + + resp = [ 'NOTIFY * HTTP/1.1', + 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), + 'NTS: ssdp:byebye', + ] + stcpy = dict(self.known[st].iteritems()) + stcpy['NT'] = stcpy['ST'] + del stcpy['ST'] + resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) + resp.extend(('', '')) + self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) + + def doNotify(self, st): + """Do notification""" + + log.msg('Sending alive notification for %s' % st) + + resp = [ 'NOTIFY * HTTP/1.1', + 'Host: %s:%d' % (SSDP_ADDR, SSDP_PORT), + 'NTS: ssdp:alive', + ] + stcpy = dict(self.known[st].iteritems()) + stcpy['NT'] = stcpy['ST'] + del stcpy['ST'] + resp.extend(map(lambda x: ': '.join(x), stcpy.iteritems())) + resp.extend(('', '')) + self.transport.write('\r\n'.join(resp), (SSDP_ADDR, SSDP_PORT)) + + def notifyReceived(self, headers, (host, port)): + """Process a presence announcement. We just remember the + details of the SSDP service announced.""" + + if headers['nts'] == 'ssdp:alive': + if not self.elements.has_key(headers['nt']): + # Register device/service + self.elements[headers['nt']] = {} + self.elements[headers['nt']]['USN'] = headers['usn'] + self.elements[headers['nt']]['host'] = (host, port) + log.msg('Detected presence of %s' % headers['nt']) + elif headers['nts'] == 'ssdp:byebye': + if self.elements.has_key(headers['nt']): + # Unregister device/service + del(self.elements[headers['nt']]) + log.msg('Detected absence for %s' % headers['nt']) + else: + log.msg('Unknown subtype %s for notification type %s' % + (headers['nts'], headers['nt'])) + + def findService(self, name): + """Return information about a service registered over SSDP.""" + + # TODO: Implement me. + + # TODO: Send out a discovery request if we haven't registered + # a presence announcement. + + def findDevice(self, name): + """Return information about a device registered over SSDP.""" + + # TODO: Implement me. + + # TODO: Send out a discovery request if we haven't registered + # a presence announcement. diff --git a/browse-zms.py b/browse-zms.py index a22b87e..2df398e 100755 --- a/browse-zms.py +++ b/browse-zms.py @@ -12,8 +12,8 @@ from twisted.internet import reactor, error from twisted.internet.protocol import Protocol, ClientFactory class Send(Protocol): - def connectionMade(self): - self.transport.write('''POST /ContentDirectory/control HTTP/1.1\r + def connectionMade(self): + self.transport.write('''POST /ContentDirectory/control HTTP/1.1\r Host: 192.168.126.1:80\r User-Agent: POSIX, UPnP/1.0, Intel MicroStack/1.0.1423\r SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"\r @@ -35,16 +35,16 @@ Content-Length: 511\r \r \r\n''') - def dataReceived(self, data): - print(data) + def dataReceived(self, data): + print(data) - def connectionLost(self, reason): - if reason.type != error.ConnectionDone: - print str(reason) - reactor.stop() + def connectionLost(self, reason): + if reason.type != error.ConnectionDone: + print str(reason) + reactor.stop() class SendFactory(ClientFactory): - protocol = Send + protocol = Send host = '192.168.126.128' port = 5643 diff --git a/cdsclient b/cdsclient index 0cd5d5f..ca97f5d 100755 --- a/cdsclient +++ b/cdsclient @@ -15,38 +15,38 @@ from twisted.python import usage import sys, string, SOAPpy class UPnPSOAPProxy: - """A proxy for making UPnP SOAP calls.""" + """A proxy for making UPnP SOAP calls.""" - def __init__(self, url): - self.url = url + def __init__(self, url): + self.url = url - def _cbGotResult(self, result): - return SOAPpy.parseSOAPRPC(result) + def _cbGotResult(self, result): + return SOAPpy.parseSOAPRPC(result) - def callRemote(self, method, *args, **kwargs): + def callRemote(self, method, *args, **kwargs): - payload = SOAPpy.buildSOAP(args = args, kw = kwargs, method = method) - payload = string.replace(payload, '\n', '\r\n') - - action = \ - '"urn:schemas-upnp-org:service:ContentDirectory:1#%s"' % method - - page = client.getPage(self.url, postdata = payload, method = 'POST', - headers = {'Content-Type': 'text/xml', - 'SOAPACTION': action}) + payload = SOAPpy.buildSOAP(args = args, kw = kwargs, method = method) + payload = string.replace(payload, '\n', '\r\n') + + action = \ + '"urn:schemas-upnp-org:service:ContentDirectory:1#%s"' % method + + page = client.getPage(self.url, postdata = payload, + method = 'POST', headers = {'Content-Type': 'text/xml', + 'SOAPACTION': action}) - return page.addCallback(self._cbGotResult) + return page.addCallback(self._cbGotResult) class Options(usage.Options): - pass + pass def printResult(value): - print value - reactor.stop() + print value + reactor.stop() def printError(error): - print 'error', error - reactor.stop() + print 'error', error + reactor.stop() #proxy = UPnPSOAPProxy('http://192.168.126.128:5643/ContentDirectory/control') proxy = UPnPSOAPProxy('http://127.0.0.1:8080/ContentDirectory/control') @@ -56,12 +56,12 @@ proxy = UPnPSOAPProxy('http://127.0.0.1:8080/ContentDirectory/control') #proxy.callRemote('GetSortCapabilities').addCallbacks(printResult, printError) proxy.callRemote('Browse', - ObjectID = '0\\Music\\Genres\\Others\\chimes.wav', -# BrowseFlag = 'BrowseDirectChildren', - BrowseFlag = 'BrowseMetadata', - Filter = '*', - StartingIndex = 0, - RequestedCount = 700, - SortCriteria = None).addCallbacks(printResult, printError) + ObjectID = '0\\Music\\Genres\\Others\\chimes.wav', + #BrowseFlag = 'BrowseDirectChildren', + BrowseFlag = 'BrowseMetadata', + Filter = '*', + StartingIndex = 0, + RequestedCount = 700, + SortCriteria = None).addCallbacks(printResult, printError) reactor.run() diff --git a/upnp.py b/upnp.py index b3b85b9..33fd01c 100644 --- a/upnp.py +++ b/upnp.py @@ -8,11 +8,9 @@ from twisted.web import soap import SOAPpy class UPnPPublisher(soap.SOAPPublisher): - """UPnP requires OUT parameters to be returned in a slightly - different way than the SOAPPublisher class does.""" - - def _gotResult(self, result, request, methodName): - response = SOAPpy.buildSOAP(kw=result, - encoding=self.encoding) - self._sendResponse(request, response) + """UPnP requires OUT parameters to be returned in a slightly + different way than the SOAPPublisher class does.""" + def _gotResult(self, result, request, methodName): + response = SOAPpy.buildSOAP(kw=result, encoding=self.encoding) + self._sendResponse(request, response) diff --git a/xmlpretty b/xmlpretty index 64057ce..d6dd820 100755 --- a/xmlpretty +++ b/xmlpretty @@ -12,7 +12,7 @@ from xml.dom import minidom str = "" for s in sys.stdin.readlines(): - str = str + s[:-1] # Eat trailing \n + str = str + s[:-1] # Eat trailing \n doc = minidom.parseString(str) print doc.toprettyxml(indent = " ") From cd44190167aac733992b997a0bc626be9c06c9ee Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 24 Apr 2006 16:41:16 -0800 Subject: [PATCH 034/179] fix problems with the space to tab conversion.. fix addFSPath... [git-p4: depot-paths = "//depot/": change = 764] --- ContentDirectory.py | 12 ++++++------ DIDLLite.py | 2 +- SSDP.py | 2 +- pymediaserv | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 82494dd..511f883 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -51,11 +51,11 @@ class ContentDirectoryControl(UPnPPublisher, dict): return i.id def delItem(self, id): - if isinstance(self[id], Container): - for i in self.children[id]: - self.delItem(i) - assert len(self.children[id]) == 0 - del self.children[id] + if isinstance(self[id], Container): + for i in self.children[id]: + self.delItem(i) + assert len(self.children[id]) == 0 + del self.children[id] del self[id] def getchildren(self, item): @@ -69,7 +69,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): self.children = { fakeparent: []} self.needupdate = False self.updateId = 0 - self[fakeparent] = Container(None, '-1', 'fake') + self[fakeparent] = Container(None, None, '-1', 'fake') root = self.addContainer(fakeparent, title) assert root == '0' del self[fakeparent] diff --git a/DIDLLite.py b/DIDLLite.py index 9ce17e4..795eea9 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -217,7 +217,7 @@ class Container(Object, list): def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): Object.__init__(self, cd, id, parentID, title, restricted, creator) - list.__init__(self) + list.__init__(self) def toElement(self): diff --git a/SSDP.py b/SSDP.py index 2d691aa..0a30e72 100644 --- a/SSDP.py +++ b/SSDP.py @@ -36,7 +36,7 @@ class SSDPServer(DatagramProtocol): known = {} def doStop(self): - '''Make sure we send out the byebye notifications.''' + '''Make sure we send out the byebye notifications.''' self.transport.write('foobar', (SSDP_ADDR, SSDP_PORT)) for st in self.known: diff --git a/pymediaserv b/pymediaserv index 2d779fc..0accf1c 100755 --- a/pymediaserv +++ b/pymediaserv @@ -100,7 +100,7 @@ def addFSPath(cds, parent, dpath): ext = ext.lower() if os.path.isdir(fpath): folder = cds.addContainer(parent, i, klass = StorageFolder) - addFSPath(folder, fpath) + addFSPath(cds, folder, fpath) if not os.path.isfile(fpath): continue #if ext == '.ts': From dc2cd57ffddf8b7c444dec09dae7cb56b22e74d9 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 00:02:17 -0800 Subject: [PATCH 035/179] support returning other error codes as per UPnP spec.. [git-p4: depot-paths = "//depot/": change = 765] --- upnp.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/upnp.py b/upnp.py index 33fd01c..473fa06 100644 --- a/upnp.py +++ b/upnp.py @@ -7,6 +7,10 @@ from twisted.web import soap import SOAPpy +class errorCode(Exception): + def __init__(self, status): + self.status = status + class UPnPPublisher(soap.SOAPPublisher): """UPnP requires OUT parameters to be returned in a slightly different way than the SOAPPublisher class does.""" @@ -14,3 +18,15 @@ class UPnPPublisher(soap.SOAPPublisher): def _gotResult(self, result, request, methodName): response = SOAPpy.buildSOAP(kw=result, encoding=self.encoding) self._sendResponse(request, response) + + def _gotError(self, failure, request, methodName): + e = failure.value + status = 500 + if isinstance(e, SOAPpy.faultType): + fault = e + else: + if isinstance(e, errorCode): + status = e.status + fault = SOAPpy.faultType("%s:Server" % SOAPpy.NS.ENV_T, "Method %s failed." % methodName) + response = SOAPpy.buildSOAP(fault, encoding=self.encoding) + self._sendResponse(request, response, status=status) From 1d01658bb73eff193855de34db81445346769cb7 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 00:03:52 -0800 Subject: [PATCH 036/179] add support for dynamicly changing file systems.. we will now notice when directories and files change size, and update the proper information.. hmm.. just realized we may still need to checkUpdate on all the children we return, and that's better than always checkUpdate'ing on add... [git-p4: depot-paths = "//depot/": change = 766] --- ContentDirectory.py | 12 +++- FSStorage.py | 155 ++++++++++++++++++++++++++++++++++++++++++++ pymediaserv | 4 +- 3 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 FSStorage.py diff --git a/ContentDirectory.py b/ContentDirectory.py index 511f883..9c60b90 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -23,7 +23,7 @@ from twisted.python import log from twisted.web import resource, static from elementtree.ElementTree import Element, SubElement, tostring -from upnp import UPnPPublisher +from upnp import UPnPPublisher, errorCode from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack import traceback @@ -56,6 +56,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): self.delItem(i) assert len(self.children[id]) == 0 del self.children[id] + # Remove from parent + self.children[self[id].parentID].remove(self[id]) del self[id] def getchildren(self, item): @@ -121,6 +123,14 @@ class ContentDirectoryControl(UPnPPublisher, dict): didl = DIDLElement() result = {} + # check to see if object needs to be updated + if ObjectID in self and hasattr(self[ObjectID], 'checkUpdate'): + self[ObjectID].checkUpdate() + + # return error code if we don't exist + if ObjectID not in self: + raise errorCode(701) + try: if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] diff --git a/FSStorage.py b/FSStorage.py new file mode 100644 index 0000000..24de529 --- /dev/null +++ b/FSStorage.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +import errno +import os +import sets +import stat +from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource +from twisted.web import static +from twisted.python import log + +mimedict = static.loadMimeTypes() + +def statcmp(a, b, cmpattrs = [ 'st_ino', 'st_dev', 'st_size', 'st_mtime', ]): + if a is None or b is None: + return False + + for i in cmpattrs: + if getattr(a, i) != getattr(b, i): + return False + return True + +class FSObject(object): + def __init__(self, path): + self.FSpath = path + self.pstat = None + + def checkUpdate(self): + # need to handle no such file or directory + # push it up? but still need to handle disappearing + try: + nstat = os.stat(self.FSpath) + if statcmp(self.pstat, nstat): + return + + self.pstat = nstat + self.doUpdate() + except OSError, x: + log.msg('OSError: %s' % x) + if x.errno in (errno.ENOENT, errno.ENOTDIR, errno.EPERM, ): + # We can't access it anymore, delete it + self.cd.delItem(self.id) + else: + raise x + except: + import traceback + print traceback.print_exc() + + def doUpdate(self): + raise NotImplementedError + +class FSItem(FSObject, Item): + def __init__(self, *args, **kwargs): + FSObject.__init__(self, kwargs['path']) + del kwargs['path'] + urlbase = kwargs['urlbase'] + del kwargs['urlbase'] + mimetype = kwargs['mimetype'] + del kwargs['mimetype'] + Item.__init__(self, *args, **kwargs) + self.url = '%s%s' % (urlbase, self.FSpath) + self.mimetype = mimetype + + def doUpdate(self): + self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) + self.res.size = os.path.getsize(fpath) + +class FSVideoItem(FSItem, VideoItem): + pass + +class FSAudioItem(FSItem, AudioItem): + pass + +class FSTextItem(FSItem, TextItem): + pass + +class FSImageItem(FSItem, ImageItem): + pass + +mimetoklass = { + 'application/ogg': FSAudioItem, + 'video': FSVideoItem, + 'audio': FSAudioItem, + 'text': FSTextItem, + 'image': FSImageItem, +} + +def dofileadd(cd, parent, urlbase, path, name): + fn, ext = os.path.splitext(name) + ext = ext.lower() + try: + mt = mimedict[ext] + except KeyError: + log.msg('no mime-type for: %s' % name) + return + + ty = mt.split('/')[0] + if mimetoklass.has_key(mt): + klass = mimetoklass[mt] + elif mimetoklass.has_key(ty): + klass = mimetoklass[ty] + else: + raise KeyError, 'no item for mt: %s' % mt + + return cd.addItem(parent, klass, name, urlbase = urlbase, + path = os.path.join(path, name), mimetype = mt) + +class FSDirectory(StorageFolder, FSObject): + def __init__(self, *args, **kwargs): + path = kwargs['path'] + del kwargs['path'] + urlbase = kwargs['urlbase'] + del kwargs['urlbase'] + StorageFolder.__init__(self, *args, **kwargs) + FSObject.__init__(self, path) + + # mapping from path to objectID + self.pathObjmap = {} + self.urlbase = urlbase + + def doUpdate(self): + # We need to rescan this dir, and see if our children has + # changed any. + log.msg('doUpdate: %s, path: %s' % (self.title, self.FSpath)) + children = sets.Set(os.listdir(self.FSpath)) + for i in self.pathObjmap: + if i not in children: + # delete + self.cd.delItem(self.pathObjmap[i]) + + log.msg('doUpdate: %s, children: %s' % (self.title, children)) + for i in children: + fname = os.path.join(self.FSpath, i) + if i in self.pathObjmap: + continue + + # new object + if os.path.isdir(fname): + # new dir + nf = self.cd.addContainer(self.id, i, klass = FSDirectory, path = fname, urlbase = self.urlbase) + elif os.path.isfile(fname): + # new file + nf = dofileadd(self.cd, self.id, self.urlbase, self.FSpath, i) + else: + nf = None + log.msg('skipping: %s' % fname) + + if nf is not None: + self.pathObjmap[i] = nf + log.msg('i: %s, nf: %s' % (i, nf)) + self.cd[nf].checkUpdate() + + # sort our children + log.msg('doUpdate: %s, sorting: %s' % (self.title, list.__str__(self))) + self.sort(lambda x, y: cmp(x.title, y.title)) + log.msg('sorted') diff --git a/pymediaserv b/pymediaserv index 0accf1c..d01419d 100755 --- a/pymediaserv +++ b/pymediaserv @@ -6,6 +6,7 @@ # Copyright 2006 John-Mark Gurney from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder +from FSStorage import FSDirectory import os import os.path import random @@ -84,8 +85,6 @@ medianode.contentTypes.update( { '.mp4': 'video/mpeg', '.ogm': 'application/ogg', '.vob': 'video/mpeg', - '.mp3': 'audio/mpeg', - '.ogg': 'audio/x-ogg', }) root.putChild('media', medianode) @@ -124,6 +123,7 @@ def addFSPath(cds, parent, dpath): except KeyError: pass +cds.addContainer('0', 'media', klass = FSDirectory, path = 'media', urlbase = urlbase) addFSPath(cds, '0', 'media') site = server.Site(root) From c24e8050172a1884aef170455ac75977bb7ab4e8 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 00:19:54 -0800 Subject: [PATCH 037/179] make all Objects have the checkUpdate routine, and just return self if it isn't there... This lets us update all children before sending them down the pipe... set the size properly... make FSDirectory have proper order for inheritance, so the Item checkUpdate doesn't get called instead of the FSObject's [git-p4: depot-paths = "//depot/": change = 767] --- ContentDirectory.py | 5 ++--- DIDLLite.py | 3 +++ FSStorage.py | 12 +++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 9c60b90..6131b64 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -124,8 +124,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): result = {} # check to see if object needs to be updated - if ObjectID in self and hasattr(self[ObjectID], 'checkUpdate'): - self[ObjectID].checkUpdate() + self[ObjectID].checkUpdate() # return error code if we don't exist if ObjectID not in self: @@ -134,7 +133,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): try: if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch) + filter(lambda x, s = self, d = didl: d.addItem(s[x.id].checkUpdate()) and None, ch) else: didl.addItem(self[ObjectID]) diff --git a/DIDLLite.py b/DIDLLite.py index 795eea9..cd33ba5 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -50,6 +50,9 @@ class Object: else: self.restricted = '0' + def checkUpdate(self): + return self + def toElement(self): root = Element(self.elementName) diff --git a/FSStorage.py b/FSStorage.py index 24de529..d4c5e20 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -30,7 +30,7 @@ class FSObject(object): try: nstat = os.stat(self.FSpath) if statcmp(self.pstat, nstat): - return + return self self.pstat = nstat self.doUpdate() @@ -41,9 +41,8 @@ class FSObject(object): self.cd.delItem(self.id) else: raise x - except: - import traceback - print traceback.print_exc() + + return self def doUpdate(self): raise NotImplementedError @@ -62,7 +61,7 @@ class FSItem(FSObject, Item): def doUpdate(self): self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) - self.res.size = os.path.getsize(fpath) + self.res.size = os.path.getsize(self.FSpath) class FSVideoItem(FSItem, VideoItem): pass @@ -104,7 +103,7 @@ def dofileadd(cd, parent, urlbase, path, name): return cd.addItem(parent, klass, name, urlbase = urlbase, path = os.path.join(path, name), mimetype = mt) -class FSDirectory(StorageFolder, FSObject): +class FSDirectory(FSObject, StorageFolder): def __init__(self, *args, **kwargs): path = kwargs['path'] del kwargs['path'] @@ -147,7 +146,6 @@ class FSDirectory(StorageFolder, FSObject): if nf is not None: self.pathObjmap[i] = nf log.msg('i: %s, nf: %s' % (i, nf)) - self.cd[nf].checkUpdate() # sort our children log.msg('doUpdate: %s, sorting: %s' % (self.title, list.__str__(self))) From 6b48c04a1959213506ac48f1efeb2c0a098a078c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 09:36:37 -0800 Subject: [PATCH 038/179] properly handle UpdateID's... and have Item's automaticly propagate changes up to parent... [git-p4: depot-paths = "//depot/": change = 768] --- ContentDirectory.py | 12 ++---------- DIDLLite.py | 8 ++++++++ FSStorage.py | 3 +++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 6131b64..dbcef3b 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -69,19 +69,12 @@ class ContentDirectoryControl(UPnPPublisher, dict): fakeparent = '-1' self.nextID = 0 self.children = { fakeparent: []} - self.needupdate = False - self.updateId = 0 self[fakeparent] = Container(None, None, '-1', 'fake') root = self.addContainer(fakeparent, title) assert root == '0' del self[fakeparent] del self.children[fakeparent] - def doupdate(self): - if self.needupdate: - self.needupdate += 1 - self.needupdate = False - # Required actions def soap_GetSearchCapabilities(self, *args, **kwargs): @@ -101,8 +94,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): """Required: Return the current value of state variable SystemUpdateID.""" log.msg('GetSystemUpdateID()') - self.needupdate = True - return { 'SystemUpdateIdResponse': { 'Id': self.updateId }} + return { 'SystemUpdateIdResponse': { 'Id': self['0'].updateID }} BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') @@ -140,7 +132,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): result = {'BrowseResponse': {'Result': didl.toString() , 'NumberReturned': didl.numItems(), 'TotalMatches': didl.numItems(), - 'UpdateID': 0}} + 'UpdateID': self[ObjectID].updateID }} except: traceback.print_exc(file=log.logfile) diff --git a/DIDLLite.py b/DIDLLite.py index cd33ba5..314dacf 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -86,6 +86,10 @@ class Item(Object): elementName = 'item' refID = None + def doUpdate(self): + # Update parent container + self.cd[self.parentID].doUpdate() + def toElement(self): root = Object.toElement(self) @@ -217,11 +221,15 @@ class Container(Object, list): createClass = None searchClass = None searchable = None + updateID = 0 def __init__(self, cd, id, parentID, title, restricted = 0, creator = None): Object.__init__(self, cd, id, parentID, title, restricted, creator) list.__init__(self) + def doUpdate(self): + self.updateID = (self.updateID + 1) % (1l << 32) + def toElement(self): root = Object.toElement(self) diff --git a/FSStorage.py b/FSStorage.py index d4c5e20..3083576 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -62,6 +62,7 @@ class FSItem(FSObject, Item): def doUpdate(self): self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = os.path.getsize(self.FSpath) + Item.doUpdate(self) class FSVideoItem(FSItem, VideoItem): pass @@ -151,3 +152,5 @@ class FSDirectory(FSObject, StorageFolder): log.msg('doUpdate: %s, sorting: %s' % (self.title, list.__str__(self))) self.sort(lambda x, y: cmp(x.title, y.title)) log.msg('sorted') + + StorageFolder.doUpdate(self) From a21cb937260594d542f09efb6b4be6f72425c6d0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 09:38:43 -0800 Subject: [PATCH 039/179] remove a few debug statements.. comment a bit better... [git-p4: depot-paths = "//depot/": change = 769] --- FSStorage.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 3083576..e322959 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -35,7 +35,7 @@ class FSObject(object): self.pstat = nstat self.doUpdate() except OSError, x: - log.msg('OSError: %s' % x) + log.msg('os.stat, OSError: %s' % x) if x.errno in (errno.ENOENT, errno.ENOTDIR, errno.EPERM, ): # We can't access it anymore, delete it self.cd.delItem(self.id) @@ -120,14 +120,12 @@ class FSDirectory(FSObject, StorageFolder): def doUpdate(self): # We need to rescan this dir, and see if our children has # changed any. - log.msg('doUpdate: %s, path: %s' % (self.title, self.FSpath)) children = sets.Set(os.listdir(self.FSpath)) for i in self.pathObjmap: if i not in children: # delete self.cd.delItem(self.pathObjmap[i]) - log.msg('doUpdate: %s, children: %s' % (self.title, children)) for i in children: fname = os.path.join(self.FSpath, i) if i in self.pathObjmap: @@ -146,11 +144,9 @@ class FSDirectory(FSObject, StorageFolder): if nf is not None: self.pathObjmap[i] = nf - log.msg('i: %s, nf: %s' % (i, nf)) # sort our children - log.msg('doUpdate: %s, sorting: %s' % (self.title, list.__str__(self))) self.sort(lambda x, y: cmp(x.title, y.title)) - log.msg('sorted') + # Pass up to handle UpdateID StorageFolder.doUpdate(self) From 837b72994d1f8a53925e360dec2120942e84d81d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 17:41:30 -0800 Subject: [PATCH 040/179] don't do it the old way anymore... [git-p4: depot-paths = "//depot/": change = 770] --- pymediaserv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymediaserv b/pymediaserv index d01419d..d6c45cc 100755 --- a/pymediaserv +++ b/pymediaserv @@ -124,7 +124,7 @@ def addFSPath(cds, parent, dpath): pass cds.addContainer('0', 'media', klass = FSDirectory, path = 'media', urlbase = urlbase) -addFSPath(cds, '0', 'media') +#addFSPath(cds, '0', 'media') site = server.Site(root) reactor.listenTCP(listenPort, site) From e5c3c3d795e4efaf34b489fbb703f0e1f9065301 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 17:41:51 -0800 Subject: [PATCH 041/179] if we don't find anything, print a warning and continue, don't stop.. [git-p4: depot-paths = "//depot/": change = 771] --- FSStorage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FSStorage.py b/FSStorage.py index e322959..12e7499 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -99,7 +99,8 @@ def dofileadd(cd, parent, urlbase, path, name): elif mimetoklass.has_key(ty): klass = mimetoklass[ty] else: - raise KeyError, 'no item for mt: %s' % mt + log.msg('no item for mt: %s' % mt) + return return cd.addItem(parent, klass, name, urlbase = urlbase, path = os.path.join(path, name), mimetype = mt) From 0493255689f24c78dde88a353328e885e576eee3 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 18:19:11 -0800 Subject: [PATCH 042/179] remove from mapping, and use .keys() since we modify the dictionary.. [git-p4: depot-paths = "//depot/": change = 772] --- FSStorage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FSStorage.py b/FSStorage.py index 12e7499..545e7cd 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -122,10 +122,11 @@ class FSDirectory(FSObject, StorageFolder): # We need to rescan this dir, and see if our children has # changed any. children = sets.Set(os.listdir(self.FSpath)) - for i in self.pathObjmap: + for i in self.pathObjmap.keys(): if i not in children: # delete self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] for i in children: fname = os.path.join(self.FSpath, i) From 0a68a35f301be771ac0e1c256b91a80318441fa0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 18:19:51 -0800 Subject: [PATCH 043/179] kill the old way of doing things.. [git-p4: depot-paths = "//depot/": change = 773] --- pymediaserv | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/pymediaserv b/pymediaserv index d6c45cc..380c3ed 100755 --- a/pymediaserv +++ b/pymediaserv @@ -88,43 +88,7 @@ medianode.contentTypes.update( { }) root.putChild('media', medianode) -# Set up media files -def addFSPath(cds, parent, dpath): - dlist = os.listdir(dpath) - dlist.sort() - for i in dlist: - fpath = os.path.join(dpath, i) - try: - fn, ext = os.path.splitext(i) - ext = ext.lower() - if os.path.isdir(fpath): - folder = cds.addContainer(parent, i, klass = StorageFolder) - addFSPath(cds, folder, fpath) - if not os.path.isfile(fpath): - continue - #if ext == '.ts': - # continue - mt = medianode.contentTypes[ext] - ty = mt.split('/')[0] - if ty == 'video': - klass = VideoItem - elif ty == 'audio': - klass = AudioItem - elif ty == 'text': - klass = TextItem - elif ty == 'image': - klass = ImageItem - else: - raise KeyError, 'no item for mt: %s' % mt - - item = cds.addItem(parent, klass, i) - cds[item].res = Resource('%s%s' % (urlbase, fpath), 'http-get:*:%s:*' % mt) - cds[item].res.size = os.path.getsize(fpath) - except KeyError: - pass - cds.addContainer('0', 'media', klass = FSDirectory, path = 'media', urlbase = urlbase) -#addFSPath(cds, '0', 'media') site = server.Site(root) reactor.listenTCP(listenPort, site) From a5fbdb43cc72e911bc2f304aad9a52c9d5b3a2b2 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 25 Apr 2006 18:23:13 -0800 Subject: [PATCH 044/179] drop debugging from ContentDirectory... print traceback if it isn't the exception to return a special errorcode.. [git-p4: depot-paths = "//depot/": change = 774] --- ContentDirectory.py | 28 ++++++++++++---------------- upnp.py | 3 +++ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index dbcef3b..3773ddf 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -122,22 +122,18 @@ class ContentDirectoryControl(UPnPPublisher, dict): if ObjectID not in self: raise errorCode(701) - try: - if BrowseFlag == 'BrowseDirectChildren': - ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, s = self, d = didl: d.addItem(s[x.id].checkUpdate()) and None, ch) - else: - didl.addItem(self[ObjectID]) - - result = {'BrowseResponse': {'Result': didl.toString() , - 'NumberReturned': didl.numItems(), - 'TotalMatches': didl.numItems(), - 'UpdateID': self[ObjectID].updateID }} - - except: - traceback.print_exc(file=log.logfile) - - log.msg('Returning: %s' % result) + if BrowseFlag == 'BrowseDirectChildren': + ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] + filter(lambda x, s = self, d = didl: d.addItem(s[x.id].checkUpdate()) and None, ch) + else: + didl.addItem(self[ObjectID]) + + result = {'BrowseResponse': {'Result': didl.toString() , + 'NumberReturned': didl.numItems(), + 'TotalMatches': didl.numItems(), + 'UpdateID': self[ObjectID].updateID }} + + #log.msg('Returning: %s' % result) return result diff --git a/upnp.py b/upnp.py index 473fa06..617c5c1 100644 --- a/upnp.py +++ b/upnp.py @@ -4,6 +4,7 @@ # Copyright 2005, Tim Potter from twisted.web import soap +from twisted.python import log import SOAPpy @@ -27,6 +28,8 @@ class UPnPPublisher(soap.SOAPPublisher): else: if isinstance(e, errorCode): status = e.status + else: + failure.printTraceback(file = log.logfile) fault = SOAPpy.faultType("%s:Server" % SOAPpy.NS.ENV_T, "Method %s failed." % methodName) response = SOAPpy.buildSOAP(fault, encoding=self.encoding) self._sendResponse(request, response, status=status) From adab67e8a22ec0a304b98ccdaa42e30500020fc7 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 6 May 2006 12:01:01 -0800 Subject: [PATCH 045/179] support custom root container make the media folder the root container so we don't have a single media node at the top.. [git-p4: depot-paths = "//depot/": change = 777] --- ContentDirectory.py | 8 ++++---- pymediaserv | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 3773ddf..835402d 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -64,13 +64,13 @@ class ContentDirectoryControl(UPnPPublisher, dict): assert isinstance(self[item], Container) return self.children[item][:] - def __init__(self, title, *args): + def __init__(self, title, *args, **kwargs): super(ContentDirectoryControl, self).__init__(*args) fakeparent = '-1' self.nextID = 0 self.children = { fakeparent: []} self[fakeparent] = Container(None, None, '-1', 'fake') - root = self.addContainer(fakeparent, title) + root = self.addContainer(fakeparent, title, **kwargs) assert root == '0' del self[fakeparent] del self.children[fakeparent] @@ -227,8 +227,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): (`ContainerID`, `ObjectID`)) class ContentDirectoryServer(resource.Resource): - def __init__(self, title): + def __init__(self, title, *args, **kwargs): resource.Resource.__init__(self) self.putChild('scpd.xml', static.File('content-directory-scpd.xml')) - self.control = ContentDirectoryControl(title) + self.control = ContentDirectoryControl(title, *args, **kwargs) self.putChild('control', self.control) diff --git a/pymediaserv b/pymediaserv index 380c3ed..97a02cc 100755 --- a/pymediaserv +++ b/pymediaserv @@ -65,7 +65,7 @@ class RootDevice(static.Data): static.Data.__init__(self, d, 'text/xml') root = WebServer() -cds = ContentDirectoryServer('My Media Server') +cds = ContentDirectoryServer('My Media Server', klass = FSDirectory, path = 'media', urlbase = urlbase) # This sets up the root to be the media dir so we don't have to enumerate the directory root.putChild('ContentDirectory', cds) cds = cds.control root.putChild('ConnectionManager', ConnectionManagerServer()) @@ -88,8 +88,6 @@ medianode.contentTypes.update( { }) root.putChild('media', medianode) -cds.addContainer('0', 'media', klass = FSDirectory, path = 'media', urlbase = urlbase) - site = server.Site(root) reactor.listenTCP(listenPort, site) From e5bac11ee191fd4a2d04c7a31c96aaf657682c3e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 6 May 2006 12:23:26 -0800 Subject: [PATCH 046/179] add mime-type for m4a files, though the D-Link can't play them.. so comment it out.. [git-p4: depot-paths = "//depot/": change = 778] --- pymediaserv | 1 + 1 file changed, 1 insertion(+) diff --git a/pymediaserv b/pymediaserv index 97a02cc..c3c275c 100755 --- a/pymediaserv +++ b/pymediaserv @@ -85,6 +85,7 @@ medianode.contentTypes.update( { '.mp4': 'video/mpeg', '.ogm': 'application/ogg', '.vob': 'video/mpeg', + #'.m4a': 'audio/mp4', # D-Link can't seem to play AAC files. }) root.putChild('media', medianode) From 7da3afdac42770a5b99bc31c706f8e7f9aabacf0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 6 May 2006 13:03:23 -0800 Subject: [PATCH 047/179] update README for the next release... [git-p4: depot-paths = "//depot/": change = 779] --- README | 61 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/README b/README index 9ed07b1..2f48ed2 100644 --- a/README +++ b/README @@ -2,18 +2,51 @@ This code was abandoned by Tim Potter. It is licensed under the MIT license at: http://opensource.org/licenses/mit-license.php -As I should be getting my D-Link DSM-520 today, I need a UPnP Media -Server that I could use to stream data with. I tried one, but it had -issues running under FreeBSD's Linux emulation, so I found this code -that was was a good framework. - -After a few days, I have the code working sucessfully with Intel's -Media Control Point, and Intel's Media Renderer. I have streamed both -mp3's and wmv's to the renderer. They are good tools for testing and -available at: +I got a D-Link DSM-520 but I needed a UPnP Media Server to stream data +with. I tried one, but it had issues running under FreeBSD's Linux +emulation. Since I know Python, I went looking for a python server +and found this code. The code was a good framework, so I expanded upon +it. + +Tested devices and/or programs: + Intel's Media Control Point and Media Renderer + D-Link DSM-520 + +The Intel tools are good for testing and are available at: http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm -I have added a number of new features: +Either make a directory media and put the files there, or make a symlink +named media to your media files. Either will work. Run it as: + ./pymediaserv [ ] + +Good Luck! + +John-Mark Gurney + +Ideas for future improvements: + Understand ZIP files, so you can view images and listen to mp3s + in the zip file. (ZipFile is there.) + Possibly switch how the HTTP media server behaves, and instead + of using static.File, have each object present a Contents + function or something similar, to make understanding ZIP files + easier. + Autodetect IP address. + +v0.2: + No longer require restarting to see new files/dirs in hierarchy. + Add FSStorage which is a set of classes for handling filesystem + objects, also handles updateID's. + Make the root container customizable, so you don't end up with + a single entry (like media) at the root. This lets us use a + FSDirectory as the root and get auto-enumeration + Support returning custom error codes, so that we can return 701 + No such object among others. + Support deleting items, so we can remove them when no longer on + the file system. + Make Containers a subclass of list. This lets use populate + childCount properly. + +v0.1: Don't bind the UDP socket to the multicast address, so replies go out on our local IP. Send out notify requests when we register the services with SSDP. @@ -26,11 +59,3 @@ I have added a number of new features: each return either respective ObjectID. We already support partial chunking of responses, but we don't yet support filtering or sorting. - -Either make a directory media and put the files there, or make a symlink -named media to your media files. Either will work. Run it as: - ./pymediaserv [ ] - -Good Luck! - -John-Mark Gurney From f991045979dc56a2288c6441cab16bda1863d5a2 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 6 May 2006 13:16:37 -0800 Subject: [PATCH 048/179] add a few items that was done in v0.2... add todo item for sorting.. [git-p4: depot-paths = "//depot/": change = 780] --- README | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README b/README index 2f48ed2..ccbdd49 100644 --- a/README +++ b/README @@ -31,6 +31,7 @@ Ideas for future improvements: function or something similar, to make understanding ZIP files easier. Autodetect IP address. + Support sorting by other attributes. v0.2: No longer require restarting to see new files/dirs in hierarchy. @@ -45,6 +46,10 @@ v0.2: the file system. Make Containers a subclass of list. This lets use populate childCount properly. + Add required attributes to Storage* classes. + Support custom container classes to addContainer. + Add a few more custom mime-types. + Sort listings by name for now. v0.1: Don't bind the UDP socket to the multicast address, so replies From 93eaac1228919e09bd08ac3de3993f97054fef76 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 11:06:41 -0800 Subject: [PATCH 049/179] refactor some code to try to prevent the IndexError that sometimes happens when removing files.. This hasn't been confirmed to work, but I believe this will fix it... [git-p4: depot-paths = "//depot/": change = 800] --- ContentDirectory.py | 2 +- FSStorage.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 835402d..697afaa 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -124,7 +124,7 @@ class ContentDirectoryControl(UPnPPublisher, dict): if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, s = self, d = didl: d.addItem(s[x.id].checkUpdate()) and None, ch) + filter(lambda x, d = didl: d.addItem(x) and None, filter(lambda x, s = self: s[x.id].checkUpdate(), ch)) else: didl.addItem(self[ObjectID]) diff --git a/FSStorage.py b/FSStorage.py index 545e7cd..419157f 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -39,6 +39,7 @@ class FSObject(object): if x.errno in (errno.ENOENT, errno.ENOTDIR, errno.EPERM, ): # We can't access it anymore, delete it self.cd.delItem(self.id) + return None else: raise x From aa33852879882a029e6d59aeebf8f852207fec7c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 13:06:46 -0800 Subject: [PATCH 050/179] if an Object has a content attribute, install it into the webserver so that data can be accessed.. This will give the ability for custom objects to add their data instead of depending upon the FS... the url may need to be set after object creation, instead of having it in Object, as we don't generate the name, the cd does... slight layering violation, but it works.. [git-p4: depot-paths = "//depot/": change = 801] --- ContentDirectory.py | 8 ++++++++ DIDLLite.py | 6 +++++- FSStorage.py | 16 ++++++---------- pymediaserv | 5 ++++- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 697afaa..925f17d 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -32,6 +32,8 @@ from urllib import quote class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" + urlbase = property(lambda x: x._urlbase) + def getnextID(self): ret = str(self.nextID) self.nextID += 1 @@ -43,9 +45,12 @@ class ContentDirectoryControl(UPnPPublisher, dict): return ret def addItem(self, parent, klass, *args, **kwargs): + '''Takes an optional arg, content, which is a twisted.web.resource.Resource that this item provides.''' assert isinstance(self[parent], Container) nid = self.getnextID() i = klass(self, nid, parent, *args, **kwargs) + if hasattr(i, 'content'): + self.webbase.putChild(nid, i.content) self.children[parent].append(i) self[i.id] = i return i.id @@ -66,6 +71,9 @@ class ContentDirectoryControl(UPnPPublisher, dict): def __init__(self, title, *args, **kwargs): super(ContentDirectoryControl, self).__init__(*args) + self.webbase = kwargs['webbase'] + self._urlbase = kwargs['urlbase'] + del kwargs['webbase'], kwargs['urlbase'] fakeparent = '-1' self.nextID = 0 self.children = { fakeparent: []} diff --git a/DIDLLite.py b/DIDLLite.py index 314dacf..2be120c 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -35,9 +35,10 @@ class Object: creator = None res = None writeStatus = None + content = property(lambda x: x._content) def __init__(self, cd, id, parentID, title, restricted = False, - creator = None): + creator = None, **kwargs): self.cd = cd self.id = id @@ -50,6 +51,9 @@ class Object: else: self.restricted = '0' + if kwargs.has_key('content'): + self._content = kwargs['content'] + def checkUpdate(self): return self diff --git a/FSStorage.py b/FSStorage.py index 419157f..207e668 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -52,12 +52,11 @@ class FSItem(FSObject, Item): def __init__(self, *args, **kwargs): FSObject.__init__(self, kwargs['path']) del kwargs['path'] - urlbase = kwargs['urlbase'] - del kwargs['urlbase'] mimetype = kwargs['mimetype'] del kwargs['mimetype'] + kwargs['content'] = static.File(self.FSpath) Item.__init__(self, *args, **kwargs) - self.url = '%s%s' % (urlbase, self.FSpath) + self.url = '%s/%s' % (self.cd.urlbase, self.id) self.mimetype = mimetype def doUpdate(self): @@ -85,7 +84,7 @@ mimetoklass = { 'image': FSImageItem, } -def dofileadd(cd, parent, urlbase, path, name): +def dofileadd(cd, parent, path, name): fn, ext = os.path.splitext(name) ext = ext.lower() try: @@ -103,21 +102,18 @@ def dofileadd(cd, parent, urlbase, path, name): log.msg('no item for mt: %s' % mt) return - return cd.addItem(parent, klass, name, urlbase = urlbase, + return cd.addItem(parent, klass, name, path = os.path.join(path, name), mimetype = mt) class FSDirectory(FSObject, StorageFolder): def __init__(self, *args, **kwargs): path = kwargs['path'] del kwargs['path'] - urlbase = kwargs['urlbase'] - del kwargs['urlbase'] StorageFolder.__init__(self, *args, **kwargs) FSObject.__init__(self, path) # mapping from path to objectID self.pathObjmap = {} - self.urlbase = urlbase def doUpdate(self): # We need to rescan this dir, and see if our children has @@ -137,10 +133,10 @@ class FSDirectory(FSObject, StorageFolder): # new object if os.path.isdir(fname): # new dir - nf = self.cd.addContainer(self.id, i, klass = FSDirectory, path = fname, urlbase = self.urlbase) + nf = self.cd.addContainer(self.id, i, klass = FSDirectory, path = fname) elif os.path.isfile(fname): # new file - nf = dofileadd(self.cd, self.id, self.urlbase, self.FSpath, i) + nf = dofileadd(self.cd, self.id, self.FSpath, i) else: nf = None log.msg('skipping: %s' % fname) diff --git a/pymediaserv b/pymediaserv index c3c275c..14fe97c 100755 --- a/pymediaserv +++ b/pymediaserv @@ -65,11 +65,13 @@ class RootDevice(static.Data): static.Data.__init__(self, d, 'text/xml') root = WebServer() -cds = ContentDirectoryServer('My Media Server', klass = FSDirectory, path = 'media', urlbase = urlbase) # This sets up the root to be the media dir so we don't have to enumerate the directory +content = resource.Resource() +cds = ContentDirectoryServer('My Media Server', klass = FSDirectory, path = 'media', urlbase = os.path.join(urlbase, 'content'), webbase = content) # This sets up the root to be the media dir so we don't have to enumerate the directory root.putChild('ContentDirectory', cds) cds = cds.control root.putChild('ConnectionManager', ConnectionManagerServer()) root.putChild('root-device.xml', RootDevice()) +root.putChild('content', content) # Area of server to serve media files from @@ -83,6 +85,7 @@ medianode.contentTypes.update( { '.ts': 'video/mpeg', # we may want this instead of mp2t #'.mp4': 'video/mp4', '.mp4': 'video/mpeg', + '.dat': 'video/mpeg', # VCD tracks '.ogm': 'application/ogg', '.vob': 'video/mpeg', #'.m4a': 'audio/mp4', # D-Link can't seem to play AAC files. From 6d6a4424ce0c61f175223ac143b8b517ee0e94ce Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 20:10:27 -0800 Subject: [PATCH 051/179] add a function to register a function to be called to detect if the filesystem object has a better class to handle it than the default mimetype one... This means we can handle items in a zip archive or an iso image.. [git-p4: depot-paths = "//depot/": change = 802] --- FSStorage.py | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 207e668..fbf5037 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import errno +import itertools import os import sets import stat @@ -8,8 +9,18 @@ from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageI from twisted.web import static from twisted.python import log +__all__ = [ 'registerklassfun', 'FSObject', 'FSItem', 'FSVideoItem', + 'FSAudioItem', 'FSTextItem', 'FSImageItem', 'mimetoklass', + 'FSDirectory', + ] + mimedict = static.loadMimeTypes() +klassfuns = [] + +def registerklassfun(fun): + klassfuns.append(fun) + def statcmp(a, b, cmpattrs = [ 'st_ino', 'st_dev', 'st_size', 'st_mtime', ]): if a is None or b is None: return False @@ -84,14 +95,14 @@ mimetoklass = { 'image': FSImageItem, } -def dofileadd(cd, parent, path, name): - fn, ext = os.path.splitext(name) +def defFS(path): + fn, ext = os.path.splitext(path) ext = ext.lower() try: mt = mimedict[ext] except KeyError: - log.msg('no mime-type for: %s' % name) - return + log.msg('no mime-type for: %s' % path) + return None, None ty = mt.split('/')[0] if mimetoklass.has_key(mt): @@ -100,10 +111,26 @@ def dofileadd(cd, parent, path, name): klass = mimetoklass[ty] else: log.msg('no item for mt: %s' % mt) + return None, None + + return klass, { 'path': path, 'mimetype': mt } + +def dofileadd(cd, parent, path, name): + klass = None + for i in itertools.chain(klassfuns, ( defFS, )): + try: + klass, kwargs = i(os.path.join(path, name)) + if klass is not None: + break + except: + import traceback + traceback.print_exc() + + if klass is None: return - return cd.addItem(parent, klass, name, - path = os.path.join(path, name), mimetype = mt) + log.msg('matched:', os.path.join(path, name), `i`) + return cd.addItem(parent, klass, name, **kwargs) class FSDirectory(FSObject, StorageFolder): def __init__(self, *args, **kwargs): From 40887b4646db6654a5275855354192cf3068b59a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 20:59:39 -0800 Subject: [PATCH 052/179] detect when addItem is passed a Container class and treat it as such.. this makes a new addObject that addContainer and addItem both call.. addObject is internal use only... push down the isdir and isfile stuff into defFS function... This means that we now have a chance to install custom directory handlers ala DVD VIDEO_TS handler! whoot! [git-p4: depot-paths = "//depot/": change = 803] --- ContentDirectory.py | 16 +++++++++++----- FSStorage.py | 23 ++++++++++++----------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 925f17d..53ac2f9 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -39,16 +39,22 @@ class ContentDirectoryControl(UPnPPublisher, dict): self.nextID += 1 return ret - def addContainer(self, parent, title, klass = Container, **kwargs): - ret = self.addItem(parent, klass, title, **kwargs) + def addContainer(self, parent, title, klass = Container, *args, **kwargs): + ret = self.addObject(parent, klass, title, *args, **kwargs) self.children[ret] = self[ret] return ret - def addItem(self, parent, klass, *args, **kwargs): - '''Takes an optional arg, content, which is a twisted.web.resource.Resource that this item provides.''' + def addItem(self, parent, klass, title, *args, **kwargs): + if issubclass(klass, Container): + return self.addContainer(parent, title, klass, *args, **kwargs) + else: + return self.addObject(parent, klass, title, *args, **kwargs) + + def addObject(self, parent, klass, title, *args, **kwargs): + '''If the generated object (by klass) has an attribute content, it is installed into the web server.''' assert isinstance(self[parent], Container) nid = self.getnextID() - i = klass(self, nid, parent, *args, **kwargs) + i = klass(self, nid, parent, title, *args, **kwargs) if hasattr(i, 'content'): self.webbase.putChild(nid, i.content) self.children[parent].append(i) diff --git a/FSStorage.py b/FSStorage.py index fbf5037..e381ba3 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -96,6 +96,16 @@ mimetoklass = { } def defFS(path): + if os.path.isdir(path): + # new dir + return FSDirectory, { 'path': path } + elif os.path.isfile(path): + # new file - fall through to below + pass + else: + log.msg('skipping (not dir or reg): %s' % path) + return None, None + fn, ext = os.path.splitext(path) ext = ext.lower() try: @@ -129,7 +139,7 @@ def dofileadd(cd, parent, path, name): if klass is None: return - log.msg('matched:', os.path.join(path, name), `i`) + log.msg('matched:', os.path.join(path, name), `i`, `klass`) return cd.addItem(parent, klass, name, **kwargs) class FSDirectory(FSObject, StorageFolder): @@ -153,20 +163,11 @@ class FSDirectory(FSObject, StorageFolder): del self.pathObjmap[i] for i in children: - fname = os.path.join(self.FSpath, i) if i in self.pathObjmap: continue # new object - if os.path.isdir(fname): - # new dir - nf = self.cd.addContainer(self.id, i, klass = FSDirectory, path = fname) - elif os.path.isfile(fname): - # new file - nf = dofileadd(self.cd, self.id, self.FSpath, i) - else: - nf = None - log.msg('skipping: %s' % fname) + nf = dofileadd(self.cd, self.id, self.FSpath, i) if nf is not None: self.pathObjmap[i] = nf From 712d484bbccc7695babebb707a20dbd9752b8ac0 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 21:58:30 -0800 Subject: [PATCH 053/179] add $Id$'s so that people can tell which files have changed between releases easier... [git-p4: depot-paths = "//depot/": change = 804] --- ContentDirectory.py | 3 +++ DIDLLite.py | 4 ++++ FSStorage.py | 4 ++++ SSDP.py | 3 +++ pymediaserv | 3 +++ upnp.py | 4 ++++ 6 files changed, 21 insertions(+) diff --git a/ContentDirectory.py b/ContentDirectory.py index 53ac2f9..ec6346f 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -2,6 +2,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney +# +# $Id$ +# # # This module implements the Content Directory Service (CDS) service diff --git a/DIDLLite.py b/DIDLLite.py index 2be120c..d88ee0f 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -2,6 +2,10 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter +# Copyright 2006 John-Mark Gurney +# +# $Id$ +# from elementtree.ElementTree import Element, SubElement, tostring, _ElementInterface diff --git a/FSStorage.py b/FSStorage.py index e381ba3..db2621a 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -1,4 +1,8 @@ #!/usr/bin/env python +# Copyright 2006 John-Mark Gurney +# +# $Id$ +# import errno import itertools diff --git a/SSDP.py b/SSDP.py index 0a30e72..1bdff67 100644 --- a/SSDP.py +++ b/SSDP.py @@ -2,6 +2,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney +# +# $Id$ +# # # Implementation of SSDP server under Twisted Python. diff --git a/pymediaserv b/pymediaserv index 14fe97c..9619356 100755 --- a/pymediaserv +++ b/pymediaserv @@ -4,6 +4,9 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter # Copyright 2006 John-Mark Gurney +# +# $Id$ +# from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder from FSStorage import FSDirectory diff --git a/upnp.py b/upnp.py index 617c5c1..dc4e025 100644 --- a/upnp.py +++ b/upnp.py @@ -2,6 +2,10 @@ # http://opensource.org/licenses/mit-license.php # Copyright 2005, Tim Potter +# Copyright 2006 John-Mark Gurney +# +# $Id$ +# from twisted.web import soap from twisted.python import log From 82c8d874338998556e15dbe98822515fa4a70a9f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jul 2006 22:08:18 -0800 Subject: [PATCH 054/179] maybe this will fix the deleting is broken problem... why the assert wasn't being hit I have no clue, but some samples says that this was broken wrt removing all the elements of the array... [git-p4: depot-paths = "//depot/": change = 805] --- ContentDirectory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index ec6346f..912f3cc 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -66,8 +66,8 @@ class ContentDirectoryControl(UPnPPublisher, dict): def delItem(self, id): if isinstance(self[id], Container): - for i in self.children[id]: - self.delItem(i) + while self.children[id]: + self.delItem(self.children[id][0]) assert len(self.children[id]) == 0 del self.children[id] # Remove from parent From 4ee59a77d25038915b7243a84c56dceebec1a1a3 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 3 Jul 2006 03:56:02 -0800 Subject: [PATCH 055/179] rephrase Tim's abandonment of the code, and that I've put in a significant amount of work on it now... [git-p4: depot-paths = "//depot/": change = 807] --- README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index ccbdd49..f860b72 100644 --- a/README +++ b/README @@ -1,4 +1,5 @@ -This code was abandoned by Tim Potter. +This code is based upon code by Tim Potter. + It is licensed under the MIT license at: http://opensource.org/licenses/mit-license.php From b69eda3b3188ccecf7e78688f72f474846f7d549 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Mon, 3 Jul 2006 03:59:32 -0800 Subject: [PATCH 056/179] make the name/mimetype handling more generic so that other modules can use it... we now dynamicly build new classes from the base DIDLLite classes as necessary... Add the startings of the ability to read zip files w/o expanding them... this still needs some glue to work w/ the new world order.. it'll be a bit of work before I have zip in a zip working.. :) [git-p4: depot-paths = "//depot/": change = 808] --- FSStorage.py | 51 ++++++++----------------------- FileDIDL.py | 71 +++++++++++++++++++++++++++++++++++++++++++ ZipStorage.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 38 deletions(-) create mode 100644 FileDIDL.py create mode 100644 ZipStorage.py diff --git a/FSStorage.py b/FSStorage.py index db2621a..1d33613 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -4,6 +4,7 @@ # $Id$ # +import FileDIDL import errno import itertools import os @@ -79,27 +80,7 @@ class FSItem(FSObject, Item): self.res.size = os.path.getsize(self.FSpath) Item.doUpdate(self) -class FSVideoItem(FSItem, VideoItem): - pass - -class FSAudioItem(FSItem, AudioItem): - pass - -class FSTextItem(FSItem, TextItem): - pass - -class FSImageItem(FSItem, ImageItem): - pass - -mimetoklass = { - 'application/ogg': FSAudioItem, - 'video': FSVideoItem, - 'audio': FSAudioItem, - 'text': FSTextItem, - 'image': FSImageItem, -} - -def defFS(path): +def defFS(path, fobj): if os.path.isdir(path): # new dir return FSDirectory, { 'path': path } @@ -110,30 +91,24 @@ def defFS(path): log.msg('skipping (not dir or reg): %s' % path) return None, None - fn, ext = os.path.splitext(path) - ext = ext.lower() - try: - mt = mimedict[ext] - except KeyError: - log.msg('no mime-type for: %s' % path) - return None, None - - ty = mt.split('/')[0] - if mimetoklass.has_key(mt): - klass = mimetoklass[mt] - elif mimetoklass.has_key(ty): - klass = mimetoklass[ty] - else: - log.msg('no item for mt: %s' % mt) - return None, None + klass, mt = FileDIDL.buildClassMT(FSItem, path) return klass, { 'path': path, 'mimetype': mt } def dofileadd(cd, parent, path, name): klass = None + try: + fobj = open(path) + except: + fobj = None for i in itertools.chain(klassfuns, ( defFS, )): try: - klass, kwargs = i(os.path.join(path, name)) + try: + fobj.seek(0) # incase the call expects a clean file + except: + pass + + klass, kwargs = i(os.path.join(path, name), fobj) if klass is not None: break except: diff --git a/FileDIDL.py b/FileDIDL.py new file mode 100644 index 0000000..6a9e3f0 --- /dev/null +++ b/FileDIDL.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# Copyright 2006 John-Mark Gurney +# +# $Id$ +# + +# +# Convert file information into a DIDL class. Dynamicly generate a new class +# from a base class and the DIDL class to be determined. +# + +__all__ = [ 'mimetoclass', 'buildClassMT', 'getClassMT', ] + +import os.path +import weakref +from DIDLLite import VideoItem, AudioItem, TextItem, ImageItem +from twisted.python import log +from twisted.web import static + +mimedict = static.loadMimeTypes() +classdict = weakref.WeakValueDictionary() + +mimetoclass = { + 'application/ogg': AudioItem, + 'video': VideoItem, + 'audio': AudioItem, + 'text': TextItem, + 'image': ImageItem, +} + +def getClassMT(name, mimetype = None, fp = None): + '''Return a tuple of the DIDLLite class and mimetype responsible for the named/mimetyped/fpd file.''' + if mimetype is None: + fn, ext = os.path.splitext(name) + ext = ext.lower() + try: + mimetype = mimedict[ext] + except KeyError: + log.msg('no mime-type for: %s' % name) + return None, None + + ty = mimetype.split('/')[0] + if mimetoclass.has_key(mimetype): + klass = mimetoclass[mimetype] + elif mimetoclass.has_key(ty): + klass = mimetoclass[ty] + else: + # XXX - We could fall file -i on it + log.msg('no item for mimetype: %s' % mimetype) + return None, None + + return klass, mimetype + +def buildClassMT(baseklass, name, *args, **kwargs): + klass, mt = getClassMT(name, *args, **kwargs) + + if klass is None: + return None, None + + try: + return classdict[(baseklass, klass)], mt + except KeyError: + pass + + class ret(baseklass, klass): + pass + ret.__name__ = '+'.join(map(lambda x: '%s.%s' % (x.__module__, x.__name__), (baseklass, klass))) + + classdict[(baseklass, klass)] = ret + + return ret, mt diff --git a/ZipStorage.py b/ZipStorage.py new file mode 100644 index 0000000..cb26fb4 --- /dev/null +++ b/ZipStorage.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# Copyright 2006 John-Mark Gurney +# +# $Id$ +# + +import os.path +import zipfile + +from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource +from FSStorage import FSObject, registerklassfun + +def isatpath(f, p): + if f[:len(p)] != p: + # First part of path doesn't match, it's not + return False + + slash = f[len(p):].find('/') + if slash != -1 and slash != len(f) - len(p) + 1: + # Another path component, skip it, as long as it's not the char + return False + + # otherwise, it is at this level + endtrim = len(f) + if slash: + endtrip -= 1 + + return f[len(p):endtrim] + +class ZipChildDir(StorageFolder): + '''This is to represent a child dir of the zip file.''' + +class ZipFile(FSObject, StorageFolder): + def __init__(self, *args, **kwargs): + '''If a zip argument is passed it, use that as the zip archive.''' + path = kwargs['path'] + del kwargs['path'] + + StorageFolder.__init__(self, *args, **kwargs) + FSObject.__init__(self, path) + + # mapping from path to objectID + self.pathObjmap = {} + + def getdirents(path): + '''Returns the list of entires for the path, '' is the root path.''' + lst = self.zip.namelist() + if path: + path += '/' + + return filter(lambda x, p = path: isatpath(x, p), lst) + + def doUpdate(self): + # open the zipfile as necessary. + self.zip = zipfile.ZipFile(self.FSpath) + + allzipfiles = sets.Set(self.zip.namelist()) + children = sets.Set(getdirents('')) + for i in self.pathObjmap.keys(): + if i not in children: + # delete + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in children: + if i in self.pathObjmap: + continue + + # new object + if i not in allzipfiles: + # must be a dir + else: + ZipChild(self, i) + +def detectzipfile(path, fobj): + try: + z = zipfile.ZipFile(fobj) + except: + return None, None + + return ZipFile, {} + +registerklassfun(detectzipfile) From ad85fe4c23262084f7a475c2a8c037361c04c47d Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 00:26:25 -0800 Subject: [PATCH 057/179] make DIDLLite's a real object so we can use them in weakref's... make looking into zip files work! we don't support subdirs yet, but I am able to play an avi and mp3 files at the root... import the ZipStorage module into pymediaserv, we'll probably want a modules dir, and a config file on what ones to import.. [git-p4: depot-paths = "//depot/": change = 809] --- DIDLLite.py | 2 +- FSStorage.py | 11 +-- ZipStorage.py | 188 ++++++++++++++++++++++++++++++++++++++++++-------- pymediaserv | 3 + 4 files changed, 170 insertions(+), 34 deletions(-) diff --git a/DIDLLite.py b/DIDLLite.py index d88ee0f..41f5338 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -32,7 +32,7 @@ class Resource: return root -class Object: +class Object(object): """The root class of the entire content directory class heirachy.""" klass = 'object' diff --git a/FSStorage.py b/FSStorage.py index 1d33613..0cece5e 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -10,6 +10,7 @@ import itertools import os import sets import stat + from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource from twisted.web import static from twisted.python import log @@ -97,8 +98,9 @@ def defFS(path, fobj): def dofileadd(cd, parent, path, name): klass = None + fsname = os.path.join(path, name) try: - fobj = open(path) + fobj = open(fsname) except: fobj = None for i in itertools.chain(klassfuns, ( defFS, )): @@ -108,12 +110,13 @@ def dofileadd(cd, parent, path, name): except: pass - klass, kwargs = i(os.path.join(path, name), fobj) + klass, kwargs = i(fsname, fobj) if klass is not None: break except: - import traceback - traceback.print_exc() + #import traceback + #traceback.print_exc(file=log.logfile) + pass if klass is None: return diff --git a/ZipStorage.py b/ZipStorage.py index cb26fb4..70c5f2a 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -4,33 +4,165 @@ # $Id$ # +import itertools import os.path +import sets +import time import zipfile +import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource from FSStorage import FSObject, registerklassfun -def isatpath(f, p): - if f[:len(p)] != p: - # First part of path doesn't match, it's not - return False - - slash = f[len(p):].find('/') - if slash != -1 and slash != len(f) - len(p) + 1: - # Another path component, skip it, as long as it's not the char - return False +from twisted.python import threadable, log +from twisted.spread import pb +from twisted.web import http +from twisted.web import server +from twisted.web import resource + +def inserthierdict(d, name, obj): + if not name: + return + i = name.find('/') + if i == -1: + d[name] = obj + return + + dname = name[:i] + rname = name[i + 1:] + # remaining path components + try: + inserthierdict(d[dname], rname, obj) + except KeyError: + d[dname] = {} + inserthierdict(d[dname], rname, obj) + +def buildNameHier(names, objs): + ret = {} + for n, o in itertools.izip(names, objs): + inserthierdict(ret, n, o) + + return ret + +class ZipFileTransfer(pb.Viewable): + def __init__(self, zf, name, request): + self.zf = zf + self.size = zf.getinfo(name).file_size + self.iter = zf.readiter(name) + self.request = request + self.written = 0 + request.registerProducer(self, 0) + + def resumeProducing(self): + if not self.request: + return + # get data and write to request. + try: + data = self.iter.next() + if data: + self.written += len(data) + # this .write will spin the reactor, calling + # .doWrite and then .resumeProducing again, so + # be prepared for a re-entrant call + self.request.write(data) + except StopIteration: + if self.request: + self.request.unregisterProducer() + self.request.finish() + self.request = None + + def pauseProducing(self): + pass + + def stopProducing(self): + # close zipfile + self.request = None + + # Remotely relay producer interface. + + def view_resumeProducing(self, issuer): + self.resumeProducing() + + def view_pauseProducing(self, issuer): + self.pauseProducing() + + def view_stopProducing(self, issuer): + self.stopProducing() + + synchronized = ['resumeProducing', 'stopProducing'] + +threadable.synchronize(ZipFileTransfer) + +class ZipResource(resource.Resource): + # processors = {} + + isLeaf = True + + def __init__(self, zf, name, mt): + resource.Resource.__init__(self) + self.zf = zf + self.zi = zf.getinfo(name) + self.name = name + self.mt = mt + + def getFileSize(self): + return self.zi.file_size + + def render(self, request): + request.setHeader('content-type', self.mt) + + # We could possibly send the deflate data directly! + if None and self.encoding: + request.setHeader('content-encoding', self.encoding) + + if request.setLastModified(time.mktime(list(self.zi.date_time) + + [ 0, 0, -1])) is http.CACHED: + return '' + + request.setHeader('content-length', str(self.getFileSize())) + if request.method == 'HEAD': + return '' + + # return data + ZipFileTransfer(self.zf, self.name, request) + # and make sure the connection doesn't get closed + return server.NOT_DONE_YET + +class ZipItem(Item): + '''An item in the zip file''' - # otherwise, it is at this level - endtrim = len(f) - if slash: - endtrip -= 1 + def __init__(self, *args, **kwargs): + self.zo = kwargs['zo'] + del kwargs['zo'] + self.zf = kwargs['zf'] + del kwargs['zf'] + self.name = kwargs['name'] + del kwargs['name'] + self.zi = self.zf.getinfo(self.name) + self.mimetype = kwargs['mimetype'] + del kwargs['mimetype'] + kwargs['content'] = ZipResource(self.zf, self.name, + self.mimetype) + Item.__init__(self, *args, **kwargs) + self.url = '%s/%s' % (self.cd.urlbase, self.id) + + def checkUpdate(self): + self.doUpdate() + return self.zo.checkUpdate() - return f[len(p):endtrim] + def doUpdate(self): + log.msg('doUpdate:', `self`, self.name) + self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) + self.res.size = self.zi.file_size + Item.doUpdate(self) -class ZipChildDir(StorageFolder): +class ZipChildDir(ZipItem, StorageFolder): '''This is to represent a child dir of the zip file.''' -class ZipFile(FSObject, StorageFolder): + def __init__(self): + raise NotImplementedError + +class ZipObject(FSObject, StorageFolder): def __init__(self, *args, **kwargs): '''If a zip argument is passed it, use that as the zip archive.''' path = kwargs['path'] @@ -42,20 +174,12 @@ class ZipFile(FSObject, StorageFolder): # mapping from path to objectID self.pathObjmap = {} - def getdirents(path): - '''Returns the list of entires for the path, '' is the root path.''' - lst = self.zip.namelist() - if path: - path += '/' - - return filter(lambda x, p = path: isatpath(x, p), lst) - def doUpdate(self): # open the zipfile as necessary. self.zip = zipfile.ZipFile(self.FSpath) + hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) - allzipfiles = sets.Set(self.zip.namelist()) - children = sets.Set(getdirents('')) + children = sets.Set(hier.keys()) for i in self.pathObjmap.keys(): if i not in children: # delete @@ -67,17 +191,23 @@ class ZipFile(FSObject, StorageFolder): continue # new object - if i not in allzipfiles: + if isinstance(hier[i], dict): # must be a dir + self.pathObjmap[i] = self.cd.addItem(self.id, + ZipChildDir, i, self, i) else: - ZipChild(self, i) + klass, mt = FileDIDL.buildClassMT(ZipItem, i) + self.pathObjmap[i] = self.cd.addItem(self.id, + klass, i, zf = self.zip, zo = self, + name = i, mimetype = mt) def detectzipfile(path, fobj): try: z = zipfile.ZipFile(fobj) + log.msg(`z`) except: return None, None - return ZipFile, {} + return ZipObject, { 'path': path } registerklassfun(detectzipfile) diff --git a/pymediaserv b/pymediaserv index 9619356..e20ab9a 100755 --- a/pymediaserv +++ b/pymediaserv @@ -8,6 +8,9 @@ # $Id$ # +# Modules to import, maybe config file or something? +import ZipStorage + from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder from FSStorage import FSDirectory import os From f427fe16fa578975e7a18e5011afdfa3f198165e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 11:42:10 -0800 Subject: [PATCH 058/179] add m2t as an extension for video/mpeg (an MPEG-2 TS) [git-p4: depot-paths = "//depot/": change = 810] --- pymediaserv | 1 + 1 file changed, 1 insertion(+) diff --git a/pymediaserv b/pymediaserv index e20ab9a..76edea8 100755 --- a/pymediaserv +++ b/pymediaserv @@ -89,6 +89,7 @@ medianode.contentTypes.update( { '.wmv': 'video/x-ms-wmv', #'.ts': 'video/mp2t', '.ts': 'video/mpeg', # we may want this instead of mp2t + '.m2t': 'video/mpeg', #'.mp4': 'video/mp4', '.mp4': 'video/mpeg', '.dat': 'video/mpeg', # VCD tracks From e6dcd82dc6ba86c00da9c401a6c80f317941fa44 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 11:44:49 -0800 Subject: [PATCH 059/179] add new wrapper for iterzipfile instead of mod'ing the python modules directly... make use of this.. [git-p4: depot-paths = "//depot/": change = 811] --- ZipStorage.py | 3 +- iterzipfile.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 iterzipfile.py diff --git a/ZipStorage.py b/ZipStorage.py index 70c5f2a..4fdaf92 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -8,7 +8,8 @@ import itertools import os.path import sets import time -import zipfile +import iterzipfile +zipfile = iterzipfile import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource diff --git a/iterzipfile.py b/iterzipfile.py new file mode 100644 index 0000000..fd7557c --- /dev/null +++ b/iterzipfile.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +import binascii +import os +import zipfile +from zipfile import * +try: + import zlib # We may need its compression method +except ImportError: + zlib = None + +__all__ = zipfile.__all__ + +def dupfile(fp): + if not hasattr(fp, 'fileno'): + raise ValueError, 'must be operating on real file' + newfp = os.fdopen(os.dup(fp.fileno())) + return newfp + +class ZipFile(ZipFile): + def readiter(self, name, blksize=16384): + """Return file bytes (as a string) for name.""" + + if self.mode not in ("r", "a"): + raise RuntimeError, 'read() requires mode "r" or "a"' + if not self.fp: + raise RuntimeError, "Attempt to read ZIP archive " \ + "that was already closed" + zinfo = self.getinfo(name) + fp = dupfile(self.fp) + fp.seek(zinfo.file_offset, 0) + if zinfo.compress_type == ZIP_STORED: + assert zinfo.file_size == zinfo.compress_size + i = 0 + while i < zinfo.file_size: + yield fp.read(min(blksize, zinfo.file_size - i)) + elif zinfo.compress_type == ZIP_DEFLATED: + if not zlib: + raise RuntimeError, "De-compression requires " \ + "the (missing) zlib module" + # zlib compress/decompress code by Jeremy Hylton of CNRI + uncomp = 0 + comp = 0 + dc = zlib.decompressobj(-15) + crc = None + doflush = False + while uncomp < zinfo.file_size: + if not dc.unconsumed_tail: + compread = min(blksize, + zinfo.compress_size - comp) + bytes = fp.read(compread) + comp += compread + if compread == 0: + doflush = True + else: + bytes = dc.unconsumed_tail + if doflush: + # need to feed in unused pad byte so + # that zlib won't choke + bytes = dc.decompress('Z') + dc.flush() + else: + bytes = dc.decompress(bytes, blksize) + yield bytes + uncomp += len(bytes) + if crc is None: + crc = binascii.crc32(bytes) + else: + crc = binascii.crc32(bytes, crc) + if crc != zinfo.CRC: + raise BadZipfile, "Bad CRC-32 for file %s" % \ + name + else: + raise BadZipfile, "Unsupported compression method " \ + "%d for file %s" % (zinfo.compress_type, name) From 42b53141022a3e4b31e0b0e3e8104ee969c19f1f Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 11:52:06 -0800 Subject: [PATCH 060/179] drop or comment out some debugging sort the ZipFile's children... hmmm. for a generic way, i could do a sort children doUpdate class that all it does it sorts the children when called... [git-p4: depot-paths = "//depot/": change = 812] --- FSStorage.py | 2 +- ZipStorage.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index 0cece5e..ad86a62 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -121,7 +121,7 @@ def dofileadd(cd, parent, path, name): if klass is None: return - log.msg('matched:', os.path.join(path, name), `i`, `klass`) + #log.msg('matched:', os.path.join(path, name), `i`, `klass`) return cd.addItem(parent, klass, name, **kwargs) class FSDirectory(FSObject, StorageFolder): diff --git a/ZipStorage.py b/ZipStorage.py index 4fdaf92..c68a6a0 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -152,7 +152,6 @@ class ZipItem(Item): return self.zo.checkUpdate() def doUpdate(self): - log.msg('doUpdate:', `self`, self.name) self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = self.zi.file_size Item.doUpdate(self) @@ -202,10 +201,12 @@ class ZipObject(FSObject, StorageFolder): klass, i, zf = self.zip, zo = self, name = i, mimetype = mt) + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + def detectzipfile(path, fobj): try: z = zipfile.ZipFile(fobj) - log.msg(`z`) except: return None, None From ac10c390dc74beb5237812a1d582b2d5bbfbad84 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 13:10:44 -0800 Subject: [PATCH 061/179] handle deleting an item multiple times, log when we do so I can try to track it down.. hmm.. maybe need to throw in a back trace.. [git-p4: depot-paths = "//depot/": change = 813] --- ContentDirectory.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ContentDirectory.py b/ContentDirectory.py index 912f3cc..3ade39c 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -65,6 +65,10 @@ class ContentDirectoryControl(UPnPPublisher, dict): return i.id def delItem(self, id): + if not self.has_key(id): + log.msg('already removed:', id) + return + log.msg('removing:', id) if isinstance(self[id], Container): while self.children[id]: self.delItem(self.children[id][0]) From 8eb1aba1b783be51313151d68a99326fa7d51b21 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 13:43:30 -0800 Subject: [PATCH 062/179] properly generate TotalMatches... don't delete empty but existing items from being returned, this could of also hid dirs... the DSM-520 depends upon the existance of the last item (that isn't displayed) to decide if there are more items in the listing... [git-p4: depot-paths = "//depot/": change = 814] --- ContentDirectory.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ContentDirectory.py b/ContentDirectory.py index 3ade39c..3a30c9d 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -145,13 +145,20 @@ class ContentDirectoryControl(UPnPPublisher, dict): if BrowseFlag == 'BrowseDirectChildren': ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount] - filter(lambda x, d = didl: d.addItem(x) and None, filter(lambda x, s = self: s[x.id].checkUpdate(), ch)) + # filter out the ones that don't exist anymore, we need + # to check against None, since some dirs might be empty + # (of valid content) but exist. + ochup = filter(lambda x, s = self: + s[x.id].checkUpdate() is not None, ch) + filter(lambda x, d = didl: d.addItem(x) and None, ochup) + total = len(self.getchildren(ObjectID)) else: didl.addItem(self[ObjectID]) + total = 1 result = {'BrowseResponse': {'Result': didl.toString() , 'NumberReturned': didl.numItems(), - 'TotalMatches': didl.numItems(), + 'TotalMatches': total, 'UpdateID': self[ObjectID].updateID }} #log.msg('Returning: %s' % result) From 7226652debe6b57461486ae26cdb9c2b22bdeca6 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 15:30:38 -0800 Subject: [PATCH 063/179] drop sending foobar, not sure where this was coming from.. [git-p4: depot-paths = "//depot/": change = 815] --- SSDP.py | 1 - 1 file changed, 1 deletion(-) diff --git a/SSDP.py b/SSDP.py index 1bdff67..eb3a71c 100644 --- a/SSDP.py +++ b/SSDP.py @@ -41,7 +41,6 @@ class SSDPServer(DatagramProtocol): def doStop(self): '''Make sure we send out the byebye notifications.''' - self.transport.write('foobar', (SSDP_ADDR, SSDP_PORT)) for st in self.known: self.doByebye(st) DatagramProtocol.doStop(self) From 5c6bf70efb0ae342609829fc075440364749d822 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 15:38:07 -0800 Subject: [PATCH 064/179] remove web content when we delete the Item... This shouldn't stop any transfers in progress, just stop new ones, and this will mean that objects can finally die if/when they are deleted.. [git-p4: depot-paths = "//depot/": change = 816] --- ContentDirectory.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ContentDirectory.py b/ContentDirectory.py index 3a30c9d..91e1e4c 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -76,6 +76,9 @@ class ContentDirectoryControl(UPnPPublisher, dict): del self.children[id] # Remove from parent self.children[self[id].parentID].remove(self[id]) + # Remove content + if hasattr(self[id], 'content'): + self.webbase.delEntity(id) del self[id] def getchildren(self, item): From bc52915c6425ba6471df421a18e8238d633c0572 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 22:08:33 -0800 Subject: [PATCH 065/179] make zip files w/ subdirs work.. also support tar files, and ones that are bzip2'd... add a repr... [git-p4: depot-paths = "//depot/": change = 817] --- ZipStorage.py | 101 +++++++++++++++++++++++++++++++++++++++++------- itertarfile.py | 33 ++++++++++++++++ iterzipfile.pyc | Bin 0 -> 2554 bytes 3 files changed, 121 insertions(+), 13 deletions(-) create mode 100644 itertarfile.py create mode 100644 iterzipfile.pyc diff --git a/ZipStorage.py b/ZipStorage.py index c68a6a0..a17768a 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -10,6 +10,8 @@ import sets import time import iterzipfile zipfile = iterzipfile +import itertarfile +tarfile = itertarfile import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource @@ -129,8 +131,8 @@ class ZipResource(resource.Resource): # and make sure the connection doesn't get closed return server.NOT_DONE_YET -class ZipItem(Item): - '''An item in the zip file''' +class ZipItem: + '''Basic zip stuff initalization''' def __init__(self, *args, **kwargs): self.zo = kwargs['zo'] @@ -139,18 +141,22 @@ class ZipItem(Item): del kwargs['zf'] self.name = kwargs['name'] del kwargs['name'] - self.zi = self.zf.getinfo(self.name) + + def checkUpdate(self): + self.doUpdate() + return self.zo.checkUpdate() + +class ZipFile(ZipItem, Item): + def __init__(self, *args, **kwargs): self.mimetype = kwargs['mimetype'] del kwargs['mimetype'] + ZipItem.__init__(self, *args, **kwargs) + self.zi = self.zf.getinfo(self.name) kwargs['content'] = ZipResource(self.zf, self.name, self.mimetype) Item.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) - def checkUpdate(self): - self.doUpdate() - return self.zo.checkUpdate() - def doUpdate(self): self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = self.zi.file_size @@ -159,8 +165,71 @@ class ZipItem(Item): class ZipChildDir(ZipItem, StorageFolder): '''This is to represent a child dir of the zip file.''' - def __init__(self): - raise NotImplementedError + def __init__(self, *args, **kwargs): + self.hier = kwargs['hier'] + del kwargs['hier'] + ZipItem.__init__(self, *args, **kwargs) + del kwargs['zf'], kwargs['zo'], kwargs['name'] + StorageFolder.__init__(self, *args, **kwargs) + + # mapping from path to objectID + self.pathObjmap = {} + + def doUpdate(self): + children = sets.Set(self.hier.keys()) + for i in self.pathObjmap.keys(): + if i not in children: + # delete + self.cd.delItem(self.pathObjmap[i]) + del self.pathObjmap[i] + + for i in children: + if i in self.pathObjmap: + continue + + # new object + pathname = os.path.join(self.name, i) + if isinstance(self.hier[i], dict): + # must be a dir + self.pathObjmap[i] = self.cd.addItem(self.id, + ZipChildDir, i, zf = self.zf, zo = self, + name = pathname, hier = self.hier[i]) + else: + klass, mt = FileDIDL.buildClassMT(ZipFile, i) + if klass is None: + continue + self.pathObjmap[i] = self.cd.addItem(self.id, + klass, i, zf = self.zf, zo = self, + name = pathname, mimetype = mt) + + # sort our children + self.sort(lambda x, y: cmp(x.title, y.title)) + + def __repr__(self): + return '' % len(self.pathObjmap) + +def genZipFile(path): + try: + return zipfile.ZipFile(path) + except: + import traceback + traceback.print_exc(file=log.logfile) + pass + + log.msg('trying tar now:', `path`) + try: + # Try to see if it's a tar file + if path[-2:] == 'gz': + comp = tarfile.TAR_GZIPPED + elif path[-3:] == 'bz2': + comp = tarfile.TAR_BZ2 + else: + comp = tarfile.TAR_PLAIN + return tarfile.TarFileCompat(path, compression=comp) + except: + import traceback + traceback.print_exc(file=log.logfile) + raise class ZipObject(FSObject, StorageFolder): def __init__(self, *args, **kwargs): @@ -176,7 +245,7 @@ class ZipObject(FSObject, StorageFolder): def doUpdate(self): # open the zipfile as necessary. - self.zip = zipfile.ZipFile(self.FSpath) + self.zip = genZipFile(self.FSpath) hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) children = sets.Set(hier.keys()) @@ -194,9 +263,12 @@ class ZipObject(FSObject, StorageFolder): if isinstance(hier[i], dict): # must be a dir self.pathObjmap[i] = self.cd.addItem(self.id, - ZipChildDir, i, self, i) + ZipChildDir, i, zf = self.zip, zo = self, + name = i, hier = hier[i]) else: - klass, mt = FileDIDL.buildClassMT(ZipItem, i) + klass, mt = FileDIDL.buildClassMT(ZipFile, i) + if klass is None: + continue self.pathObjmap[i] = self.cd.addItem(self.id, klass, i, zf = self.zip, zo = self, name = i, mimetype = mt) @@ -204,9 +276,12 @@ class ZipObject(FSObject, StorageFolder): # sort our children self.sort(lambda x, y: cmp(x.title, y.title)) + def __repr__(self): + return '' % len(self.path) + def detectzipfile(path, fobj): try: - z = zipfile.ZipFile(fobj) + genZipFile(path) except: return None, None diff --git a/itertarfile.py b/itertarfile.py new file mode 100644 index 0000000..906c97c --- /dev/null +++ b/itertarfile.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import tarfile +from tarfile import * + +TAR_PLAIN = tarfile.TAR_PLAIN +TAR_GZIPPED = tarfile.TAR_GZIPPED +TAR_BZ2 = 'bz2' + +__all__ = tarfile.__all__ + +class TarFileCompat(tarfile.TarFileCompat): + def __init__(self, file, mode="r", compression=TAR_PLAIN): + if compression != TAR_BZ2: + tarfile.TarFileCompat.__init__(self, file, mode, compression) + return + + self.tarfile = TarFile.bz2open(file, mode) + if mode[0:1] == "r": + members = self.tarfile.getmembers() + for i in xrange(len(members)): + m = members[i] + m.filename = m.name + m.file_size = m.size + m.date_time = time.gmtime(m.mtime)[:6] + + def readiter(self, name, blksize=16384): + f = self.tarfile.extractfile(self.tarfile.getmember(name)) + while True: + data = f.read(blksize) + if data == '': + break + yield data diff --git a/iterzipfile.pyc b/iterzipfile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28e5008d58ffb9f6f89068078cd6ba714db0917f GIT binary patch literal 2554 zcmZ`)&2k$>5boKP^=rirPGSNiY)le1R3%j;ha5PNA176zC_~xCCc3EB+EG06YInUe zBC$)lBs>8xz?};Z!F%uu6udzAx>vFkD#)JRnV$anx_hSQtAEG z>`RcC=!mFOP84;Na6IaG6e~LNX!oQoET1|)?WdQiqAN6LQr0GgpI%~q>XG_Udt|EA zsZ#9G&#+me*e6}5K5SN)^M>eor_R=PLI$xFDu%)2iyl)C!^e1xVK+e>(HPJaz42(7 zJvzYh=(R_w!onw0A*M?#2Iuhb2EvLaipGj|#1&iIvQ^N&NpzaotC$W))&&PT$Z}mo z&ZIAbEDZ`BB>@YCb%@v+$YEq7=L*Zv`nhf5vlk^J{iGg-q-@5aV=lYH~(#CqEGku*XZ@wG52ZdDT`|m27rQ{uG-%=JStz zJi@RSK#)JKDE?6rRM(^Jolx>&=mAlWr)>-d!xro|)H#(irM^dln$(&z@6R&NBL2K0 zl|_DqGtVVxk*kR@UzR?NQK>qOTVxs(FL6y3FPh|9H1H^UUapr#q|L0nhAN+<*C;j= zCUtuCyBe1!mT5qgU4sg&u97=XV^0*JUZ)RX92oYFel}aSOM7na|cOkZtWoMJjhJI5=_I24Q4_D6p=; z9lRCvvm!{Np}r$sp%5C`Poass8HcxUMUO|OfZi~Rb+A!v1kl)sHtapfJakSEa~HUb zuW}r8o_!xgMeor3qyu*tx!@%`OL*@j=p~uev4I-dFF`i-?Ory_VcQz%1ye`vPzT}A zfXe_+6LY}6M~OCnzkT~w5O(Y(7hjkx5DOKTjORNx*YN20|cv6IawPrrS*3pX4!=U5u(C}l{(lL>>2^$ccqFpy>% z_e5eVOSSmu6+MamX_Q!9Hqfk}jO?LZfj-+rHHJFwy2vEbP)mz|$Vro9DHeB&QJIFh zPmw5%aqq-)A_fjj8rhyPvJLx3+Fj@eUcSgwj9vimHrQ$c}BIb4vgcNy~@ZPjk+gnj9 zYE7-Gk5pCpw5o1mURQ0uiuDRc$!+1giggoO=e&lh`B%ITR0X`YTJzTNz39s;B!P6h zoPlmvGS%&tcMHo!Fmu@di=7iNeGB>Jlaovmsy9 z@&xl~lyk+>-ENd504Av}pJbU&y@t#e#!QeSI6E0<2Yb;m&!_6|m@P5Rqkdnpxb9zb VS>>f~DE_M{pL4ESUc+lt{{_!K9dZBw literal 0 HcmV?d00001 From 67d7c6a2e06fbf0f3a39fc1f2f11014a7d7ea24c Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 22:09:11 -0800 Subject: [PATCH 066/179] add a repr so when printing we know it's not just a dict (and when it gets large, we don't end up w/ a very large print).. [git-p4: depot-paths = "//depot/": change = 818] --- ContentDirectory.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ContentDirectory.py b/ContentDirectory.py index 91e1e4c..91a47cb 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -257,6 +257,9 @@ class ContentDirectoryControl(UPnPPublisher, dict): log.msg('CreateReference(ContainerID=%s, ObjectID=%s)' % (`ContainerID`, `ObjectID`)) + def __repr__(self): + return '' % (len(self), `self.urlbase`, self.nextID) + class ContentDirectoryServer(resource.Resource): def __init__(self, title, *args, **kwargs): resource.Resource.__init__(self) From ba1c83ca9ea3ea4d0d1bf4e7683959fe6dc38985 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Tue, 4 Jul 2006 22:09:26 -0800 Subject: [PATCH 067/179] update the README w/ some things I've done... [git-p4: depot-paths = "//depot/": change = 819] --- README | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README b/README index f860b72..0417103 100644 --- a/README +++ b/README @@ -25,15 +25,21 @@ Good Luck! John-Mark Gurney Ideas for future improvements: - Understand ZIP files, so you can view images and listen to mp3s - in the zip file. (ZipFile is there.) - Possibly switch how the HTTP media server behaves, and instead - of using static.File, have each object present a Contents - function or something similar, to make understanding ZIP files - easier. Autodetect IP address. Support sorting by other attributes. +v0.x: + Empty dirs w/ no content would disappear, and cause a short + response to BrowseDirectChildren. The DSM-520 askes for one + more than displayed, and uses the existant of the extra item + as indication if there are more items. + Understands zip and tar files now. It will dynamicly extract + items, so you can zip up your jpegs and view them w/o having + to unzip them. tar files can be gzip'd or bzip2'd. + Each item now has an optinal content attribute, which if set is + installed in the web server. + Don't send 'foobar' when exiting, stops a traceback on another + instance of PyMedS. v0.2: No longer require restarting to see new files/dirs in hierarchy. Add FSStorage which is a set of classes for handling filesystem From 2b24cbcdebae4aa38ed7f232a99859406307369b Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 5 Jul 2006 07:29:44 -0800 Subject: [PATCH 068/179] comment out some debugging.. [git-p4: depot-paths = "//depot/": change = 820] --- ZipStorage.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ZipStorage.py b/ZipStorage.py index a17768a..c6779f1 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -212,8 +212,8 @@ def genZipFile(path): try: return zipfile.ZipFile(path) except: - import traceback - traceback.print_exc(file=log.logfile) + #import traceback + #traceback.print_exc(file=log.logfile) pass log.msg('trying tar now:', `path`) @@ -227,8 +227,8 @@ def genZipFile(path): comp = tarfile.TAR_PLAIN return tarfile.TarFileCompat(path, compression=comp) except: - import traceback - traceback.print_exc(file=log.logfile) + #import traceback + #traceback.print_exc(file=log.logfile) raise class ZipObject(FSObject, StorageFolder): From 9869ce749413eafc0f20db4610b80f248a422d67 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 5 Jul 2006 23:02:33 -0800 Subject: [PATCH 069/179] add some repr's so the base class won't confuse me when printing.. this makes things a bit clearer, and prevents large output.. [git-p4: depot-paths = "//depot/": change = 821] --- DIDLLite.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/DIDLLite.py b/DIDLLite.py index 41f5338..b029f55 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -58,6 +58,12 @@ class Object(object): if kwargs.has_key('content'): self._content = kwargs['content'] + def __repr__(self): + cls = self.__class__ + return '<%s.%s: id: %s, parent: %s, title: %s>' % \ + (cls.__module__, cls.__name__, self.id, self.parentID, + self.title) + def checkUpdate(self): return self @@ -258,6 +264,12 @@ class Container(Object, list): return root + def __repr__(self): + cls = self.__class__ + return '<%s.%s: id: %s, parent: %s, title: %s, cnt: %d>' % \ + (cls.__module__, cls.__name__, self.id, self.parentID, + self.title, len(self)) + class Person(Container): klass = Container.klass + '.person' From 0118d07ee4f7574d43f046dd69ba39e77376afce Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 5 Jul 2006 23:04:11 -0800 Subject: [PATCH 070/179] don't push up the doUpdate unless we did something... [git-p4: depot-paths = "//depot/": change = 822] --- FSStorage.py | 7 ++++++- ZipStorage.py | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/FSStorage.py b/FSStorage.py index ad86a62..8f28de8 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -110,6 +110,7 @@ def dofileadd(cd, parent, path, name): except: pass + #log.msg('testing:', `i`, `fsname`, `fobj`) klass, kwargs = i(fsname, fobj) if klass is not None: break @@ -137,9 +138,11 @@ class FSDirectory(FSObject, StorageFolder): def doUpdate(self): # We need to rescan this dir, and see if our children has # changed any. + doupdate = False children = sets.Set(os.listdir(self.FSpath)) for i in self.pathObjmap.keys(): if i not in children: + doupdate = True # delete self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] @@ -152,10 +155,12 @@ class FSDirectory(FSObject, StorageFolder): nf = dofileadd(self.cd, self.id, self.FSpath, i) if nf is not None: + doupdate = True self.pathObjmap[i] = nf # sort our children self.sort(lambda x, y: cmp(x.title, y.title)) # Pass up to handle UpdateID - StorageFolder.doUpdate(self) + if doupdate: + StorageFolder.doUpdate(self) diff --git a/ZipStorage.py b/ZipStorage.py index c6779f1..536b897 100644 --- a/ZipStorage.py +++ b/ZipStorage.py @@ -17,7 +17,7 @@ import FileDIDL from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource from FSStorage import FSObject, registerklassfun -from twisted.python import threadable, log +from twisted.python import log, threadable from twisted.spread import pb from twisted.web import http from twisted.web import server @@ -156,11 +156,11 @@ class ZipFile(ZipItem, Item): self.mimetype) Item.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) - - def doUpdate(self): self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = self.zi.file_size - Item.doUpdate(self) + + def doUpdate(self): + pass class ZipChildDir(ZipItem, StorageFolder): '''This is to represent a child dir of the zip file.''' @@ -176,10 +176,12 @@ class ZipChildDir(ZipItem, StorageFolder): self.pathObjmap = {} def doUpdate(self): + doupdate = False children = sets.Set(self.hier.keys()) for i in self.pathObjmap.keys(): if i not in children: # delete + doupdate = True self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] @@ -201,9 +203,12 @@ class ZipChildDir(ZipItem, StorageFolder): self.pathObjmap[i] = self.cd.addItem(self.id, klass, i, zf = self.zf, zo = self, name = pathname, mimetype = mt) + doupdate = True # sort our children self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + StorageFolder.doUpdate(self) def __repr__(self): return '' % len(self.pathObjmap) @@ -216,7 +221,6 @@ def genZipFile(path): #traceback.print_exc(file=log.logfile) pass - log.msg('trying tar now:', `path`) try: # Try to see if it's a tar file if path[-2:] == 'gz': @@ -248,9 +252,11 @@ class ZipObject(FSObject, StorageFolder): self.zip = genZipFile(self.FSpath) hier = buildNameHier(self.zip.namelist(), self.zip.infolist()) + doupdate = False children = sets.Set(hier.keys()) for i in self.pathObjmap.keys(): if i not in children: + doupdate = True # delete self.cd.delItem(self.pathObjmap[i]) del self.pathObjmap[i] @@ -272,12 +278,16 @@ class ZipObject(FSObject, StorageFolder): self.pathObjmap[i] = self.cd.addItem(self.id, klass, i, zf = self.zip, zo = self, name = i, mimetype = mt) + doupdate = True # sort our children self.sort(lambda x, y: cmp(x.title, y.title)) + if doupdate: + StorageFolder.doUpdate(self) + def __repr__(self): - return '' % len(self.path) + return '' % self.FSpath def detectzipfile(path, fobj): try: From 410eb9f33029fd2a99d01348b80cbb6ff1aab65e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 5 Jul 2006 23:06:29 -0800 Subject: [PATCH 071/179] add support for poor many's async... I don't want to tangle out how to handle making Browse async, so I'll just restart the call if a subfunction raises a Deferred object... This should work amazingly well... we may end up wrapping just the check/doUpdate calls... [git-p4: depot-paths = "//depot/": change = 823] --- ContentDirectory.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/ContentDirectory.py b/ContentDirectory.py index 91a47cb..836a6ab 100644 --- a/ContentDirectory.py +++ b/ContentDirectory.py @@ -29,9 +29,54 @@ from elementtree.ElementTree import Element, SubElement, tostring from upnp import UPnPPublisher, errorCode from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack +from twisted.internet import defer +from twisted.python import failure + import traceback from urllib import quote +class doRecall(defer.Deferred): + '''A class that will upon any callback from the Deferred object passed + in, recall fun(*args, **kwargs), just as if a maybeDeferred has been + processed. + + The idea is to let something deeper called by something sync "abort" + the call until it's ready, and then reattempt. This isn't the best + method as we throw away work, but it can be easier to implement. + + Example: + def wrapper(five): + try: + return doacall(five) + except defer.Deferred, x: + return doRecallgen(x, wrapper, five) + + If doacall works, everything is fine, but if a Deferred object is + raised, we put it in a doRecall class and return the deferred object + generated by doRecall.''' + + def __init__(self, argdef, fun, *args, **kwargs): + self.fun = fun + self.args = args + self.kwargs = kwargs + self.defer = defer.Deferred() + + argdef.addCallback(self._done) + + def _done(self, *args, **kwargs): + ret = self.fun(*self.args, **self.kwargs) + if isinstance(ret, failure.Failure): + self.defer.errback(ret) + elif isinstance(ret, defer.Deferred): + # We are fruther delayed, continue. + ret.addCallback(self._done) + else: + self.defer.callback(ret) + +def doRecallgen(defer, fun, *args, **kwargs): + i = doRecall(defer, fun, *args, **kwargs) + return i.defer + class ContentDirectoryControl(UPnPPublisher, dict): """This class implements the CDS actions over SOAP.""" @@ -123,6 +168,12 @@ class ContentDirectoryControl(UPnPPublisher, dict): BrowseFlags = ('BrowseMetaData', 'BrowseDirectChildren') def soap_Browse(self, *args): + try: + return self.thereal_soap_Browse(*args) + except defer.Deferred, x: + return doRecallgen(x, self.soap_Browse, *args) + + def thereal_soap_Browse(self, *args): """Required: Incrementally browse the native heirachy of the Content Directory objects exposed by the Content Directory Service.""" @@ -151,8 +202,14 @@ class ContentDirectoryControl(UPnPPublisher, dict): # filter out the ones that don't exist anymore, we need # to check against None, since some dirs might be empty # (of valid content) but exist. + # XXX - technically if list changed, we need to get + # some new ones by looping till we have a complete + # list. ochup = filter(lambda x, s = self: s[x.id].checkUpdate() is not None, ch) + # XXX - are we suppose to be calling addContainer + # for Containers instead of always addItem? + #log.msg('ochup:', `ochup`) filter(lambda x, d = didl: d.addItem(x) and None, ochup) total = len(self.getchildren(ObjectID)) else: From 83df8d46a75f05de80491a5adbb477b8f2599a5e Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Thu, 6 Jul 2006 13:43:13 -0800 Subject: [PATCH 072/179] add shoutcast support... man, it's amazing what a little thing like leaving the mime-type as unicode can do to your sanity! :( it's finally streaming! w00t! [git-p4: depot-paths = "//depot/": change = 824] --- pymediaserv | 3 +- shoutcast.py | 374 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 shoutcast.py diff --git a/pymediaserv b/pymediaserv index 76edea8..1cb3e18 100755 --- a/pymediaserv +++ b/pymediaserv @@ -9,7 +9,8 @@ # # Modules to import, maybe config file or something? -import ZipStorage +import shoutcast +import ZipStorage # w/ tarfile support, it will gobble up empty files! from DIDLLite import TextItem, AudioItem, VideoItem, ImageItem, Resource, StorageFolder from FSStorage import FSDirectory diff --git a/shoutcast.py b/shoutcast.py new file mode 100644 index 0000000..0011645 --- /dev/null +++ b/shoutcast.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python + +'''Shoutcast Radio Feed''' + +import ConfigParser +import StringIO +import os.path +import random + +import traceback + +from py_shoutcast import * + +from DIDLLite import Container, MusicGenre, Item, AudioItem, Resource +from FSStorage import registerklassfun + +from twisted.protocols import shoutcast +from twisted.python import log, threadable +from twisted.internet import defer, protocol, reactor +from twisted.web import error, http, resource, server +from twisted.web.client import getPage, _parse + +PLSsection = 'playlist' + +def cmpStation(a, b, keys = ( 'MimeType', 'Name', 'PLS_URL', 'Bitrate' )): + if filter(lambda k, x = a, y = b: x[k] != y[k], keys): + return False + return True + +class GenreFeedAsync(feeds.GenreFeed): + genre_url = 'http://www.shoutcast.com/sbin/newxml.phtml' + + def __init__(self, *args, **kwargs): + self.havegenre = False + self.fetchinggenre = None + feeds.GenreFeed.__init__(self, *args, **kwargs) + + def gotGenre(self, page): + self.genre = page + self.havegenre = True + + # Wake everyone up + self.fetchinggenre.callback(None) + + def errGenre(self, failure): + raise NotImplementedError, failure + + def fetch_genres(self): + if self.havegenre: + return self.genre + if not self.fetchinggenre: + # Need to start fetching + getPage(self.genre_url.encode('ascii')) \ + .addCallbacks(self.gotGenre, self.errGenre) + self.fetchinggenre = defer.Deferred() + # Always raise this if we are waiting. + raise self.fetchinggenre + + synchronized = ['fetch_genres', 'gotGenre', ] + +threadable.synchronize(GenreFeedAsync) + +class ShoutcastFeedAsync(feeds.ShoutcastFeed): + def __init__(self, *args, **kwargs): + feeds.ShoutcastFeed.__init__(self, *args, **kwargs) + + self.shout_url = \ + 'http://www.shoutcast.com/sbin/newxml.phtml?genre=' + \ + self.genre + + self.havestations = False + self.fetchingstations = None + + def gotStations(self, page): + self.stations = page + self.havestations = True + + # Wake everyone up + self.fetchingstations.callback(None) + + def errStations(self, failure): + raise NotImplementedError, failure + + def fetch_stations(self): + if self.havestations: + return self.stations + if not self.fetchingstations: + # Need to start fetching + getPage(self.shout_url.encode('ascii')) \ + .addCallbacks(self.gotStations, self.errStations) + self.fetchingstations = defer.Deferred() + # Always raise this if we are waiting. + raise self.fetchingstations + + synchronized = ['fetch_stations', 'gotStations', ] + +threadable.synchronize(ShoutcastFeedAsync) + +class ShoutTransfer(shoutcast.ShoutcastClient): + def __init__(self, request, passback): + shoutcast.ShoutcastClient.__init__(self) + self.request = request + self.passback = passback + log.msg('ShoutTransfer:', `request`, `passback`) + request.registerProducer(self, 1) + + def connectionLost(self, reason): + log.msg('connectionLost:', `self.request`, `self.passback`) + shoutcast.ShoutcastClient.connectionLost(self, reason) + if self.request: + self.request.unregisterProducer(self) + if self.passback: + self.passback(self.request) + self.passback = None + self.request = None + + def stopProducing(self): + log.msg('stopProducing:', `self.request`, `self.passback`) + shoutcast.ShoutcastClient.stopProducing(self) + self.request = None + self.passback = None + + def gotMP3Data(self, data): + self.request.write(data) + + def gotMetaData(self, data): + log.msg("meta:", `data`) + pass + + # Remotely relay producer interface. + + def view_resumeProducing(self, issuer): + self.resumeProducing() + + def view_pauseProducing(self, issuer): + self.pauseProducing() + + def view_stopProducing(self, issuer): + self.stopProducing() + + synchronized = ['resumeProducing', 'stopProducing'] + +threadable.synchronize(ShoutTransfer) + +class ShoutProxy(resource.Resource): + # We should probably expire the PLS after a while. + + # setResponseCode(self, code, message=None) + # setHeader(self, k, v) + # write(self, data) + # finish(self) + + isLeaf = True + + def __init__(self, url, mt): + resource.Resource.__init__(self) + self.shoutpls = url + self.mt = mt + self.urls = None + self.fetchingurls = False + + def dump_exc(self): + exc = StringIO() + traceback.print_exc(file=exc) + exc.seek(0) + self.request.setHeader('content-type', 'text/html') + self.request.write(error.ErrorPage(http.INTERNAL_SERVER_ERROR, + http.RESPONSES[http.INTERNAL_SERVER_ERROR], + '

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�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 Q7Rbq{t4}wZAt&>H0BveDQvd(} literal 0 HcmV?d00001 diff --git a/docs/ConnectionManager1.0.pdf b/docs/ConnectionManager1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9789eec0d965fb3ec6b9d9d033b90f6bfc0665e GIT binary patch literal 287455 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�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%0ARX7fX>s4t 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/AVTransport1.0.pdf b/docs/AVTransport1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..922caeeec0cf99fc0942432ce1e2a9318b4383b3 GIT binary patch literal 719554 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