2008-04-30 Mark Doffman <mark.doffman@codethink.co.uk>
authorMark Doffman <mdoff@silver-wind.(none)>
Wed, 30 Apr 2008 14:23:13 +0000 (15:23 +0100)
committerMark Doffman <mdoff@silver-wind.(none)>
Wed, 30 Apr 2008 14:23:13 +0000 (15:23 +0100)
* tools/python/*
  Add some code to instrument the Tree interface.

tools/python/AccessibleTree.py [new file with mode: 0644]
tools/python/AccessibleTreeCache.py [new file with mode: 0644]
tools/python/desktop.xml [new file with mode: 0644]
tools/python/makeTree.py [new file with mode: 0644]
tools/python/testClient.py [new file with mode: 0644]
tools/python/testServer.py [new file with mode: 0644]

diff --git a/tools/python/AccessibleTree.py b/tools/python/AccessibleTree.py
new file mode 100644 (file)
index 0000000..29ca3c4
--- /dev/null
@@ -0,0 +1,57 @@
+import dbus
+import dbus.service
+
+TREE_UPDATE_ACCESSIBLE = 0
+TREE_REMOVE_ACCESSIBLE = 1
+
+class AccessibleTree(dbus.service.Object):
+       """
+       The Accessible tree provides the interface,
+       for accessing all the accessible objects
+       available on a particular application.
+       """
+
+       def __init__(self, bus, path):
+               """
+               Parameters:
+
+               bus - The D-Bus bus object to use
+               path - The object path this interface should use
+               """
+               dbus.service.Object.__init__(self, bus, path)
+               self._toSend = {}
+               self._objects = {}
+               self._root = '/'
+
+       @dbus.service.method(dbus_interface='org.freedesktop.atspi.Tree',
+                            out_signature='o')
+       def getRoot(self):
+               return self._root
+
+       @dbus.service.method(dbus_interface='org.freedesktop.atspi.Tree',
+                            out_signature='a(qooaoassus)')
+       def getTree(self):
+               wireObjects = []
+               for object in self._objects.values():
+                       wireObjects.append((TREE_UPDATE_ACCESSIBLE,) + object)
+               return wireObjects
+
+       @dbus.service.signal(dbus_interface='org.freedesktop.atspi.Tree',
+                            signature='a(qooaoassus)')
+       def updateTree(self, values):
+               #There are some locking issues here.
+               #Need to make sure that updates are not missed.
+               oldSend = self._toSend.values()
+               self._toSend = {}
+               return oldSend
+
+       def updateObject(self, path, object):
+               self._objects[path] = object
+               self._toSend[path] = (TREE_UPDATE_ACCESSIBLE,) + object
+               
+       def removeObject(self, path):
+               self._toSend[path] = (TREE_REMOVE_ACCESSIBLE,) + self._objects[path]
+               del(self._objects[path])
+
+       def setRoot(self, root):
+               self._root = root
diff --git a/tools/python/AccessibleTreeCache.py b/tools/python/AccessibleTreeCache.py
new file mode 100644 (file)
index 0000000..b91ca3c
--- /dev/null
@@ -0,0 +1,147 @@
+import dbus
+
+TREE_UPDATE_ACCESSIBLE = 0
+TREE_REMOVE_ACCESSIBLE = 1
+
+class AccessibleObjectDoesNotExist(Exception):
+       def __init__(self, path):
+               self.path = path
+       
+       def __str__(self):
+               return "Object %s does not exist" % (self.path)
+
+class AccessibleTreeCache():
+       """
+       Caches a collection of Accessible Objects.
+       """
+
+       _TREE_INTERFACE = 'org.freedesktop.atspi.Tree'
+
+       def __init__(self, connection, busName, objectStorePath):
+               """
+               Creates a cache for accessible objects.
+
+               All accessible objects are created and accessed through this cache.
+
+               Parameters:
+               connection - DBus connection.
+               busName - DBus bus name where accessible tree resides.
+               objectStorePath - Path where the accessible tree can be accessed.
+               """
+               storeObject = connection.get_object(busName, objectStorePath)
+
+               self._busName = busName
+               self._accessibleStore = dbus.Interface(storeObject, self._TREE_INTERFACE)
+               self._objects = {}
+               self._root = self._accessibleStore.getRoot()
+
+               self._updateObjects(self._accessibleStore.getTree())
+
+       def getRootAccessible(self):
+               """
+               Gets the accessible object at the root of the tree.
+               """
+               return self.getAccessible(self._root)
+
+       def getAccessible(self, objectPath):
+               """
+               Gets the accessible object for the given object path.
+               """
+               if objectPath in self._objects:
+                       return self._objects[objectPath]
+               else:
+                       raise AccessibleObjectDoesNotExist(objectPath)
+
+       def _updateObjects(self, objects):
+               """
+               Updates the object cache from an
+               array of wire format Accessible objects.
+               """
+               for object in objects:
+                       (flag, 
+                        path,
+                        parent,
+                        children,
+                        interfaces,
+                        name, 
+                        role,
+                        description) = object
+                       if flag == TREE_REMOVE_ACCESSIBLE:
+                               #TODO need to set object as invalid
+                               del(self._objects[path])
+                       else:
+                               if path in self._objects:
+                                       self._objects[path].update(path,
+                                                                  parent,
+                                                                  children, 
+                                                                  interfaces, 
+                                                                  name, 
+                                                                  role, 
+                                                                  description)
+                               else:
+                                       acc = AccessibleObjectProxy(self,
+                                                                   self._busName,
+                                                                   path,
+                                                                   parent,
+                                                                   children,
+                                                                   interfaces,
+                                                                   name,
+                                                                   role,
+                                                                   description)
+                                       self._objects[path] = acc;
+
+class AccessibleObjectProxy():
+       """
+       A D-Bus proxy for an element that implements one or more of the AT-SPI
+       Accessibility interfaces.
+       """
+
+       def __init__(self, cache, bus,
+                    path, parent,
+                    children, interfaces, 
+                    name, role, description):
+               """
+               Create an accessible object.
+
+               Parameters:
+
+               cache - The accessible cache that this object is owned by.
+               bus - Bus name where proxied object can be located.
+               path - The D-Bus object path of object proxied by this object.
+               parent - The parent accessible or '/' if the root object.
+               children - List of child accessible objects.
+               interfaces - List of interfaces supported by this object.
+               name - Name of the accessible.
+               role - The accessibles role.
+               description - Description of the accessible
+               """
+               self._cache = cache
+               self.bus = bus
+               self.update(path, parent, children, interfaces, name, role, description)
+
+       def update(self, path, parent,
+                  children, interfaces, 
+                  name, role, description):
+               """
+               update an accessible object.
+
+               Parameters:
+
+               path - The D-Bus object path of object proxied by this object.
+               parent - The parent accessible or '/' if the root object.
+               children - List of child accessible objects.
+               interfaces - List of interfaces supported by this object.
+               name - Name of the accessible.
+               role - The accessibles role.
+               description - Description of the accessible
+               """
+               self.path = path
+               self.parent = parent
+               self.children = children
+               self.interfaces = interfaces
+               self.name = name
+               self.role = role
+               self.description = description
+
+       def getChildren(self):
+               return [self._cache.getAccessible(path) for path in self.children]
diff --git a/tools/python/desktop.xml b/tools/python/desktop.xml
new file mode 100644 (file)
index 0000000..54b4f96
--- /dev/null
@@ -0,0 +1,469 @@
+<?xml version="1.0" ?>
+<accessible description="" name="main" parent="/" reference="/7d081ab722dd408f84211702cc675993" role="67">
+       <interface name="Accessible"/>
+       <interface name="Desktop"/>
+       <interface name="Component"/>
+       <accessible description="" name="gnome-settings-daemon" parent="/7d081ab722dd408f84211702cc675993" reference="/5a0b530b7f1c485096ff8ebc281471eb" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="" name="gnome-panel" parent="/7d081ab722dd408f84211702cc675993" reference="/142edb7b4217453aa99a02d1f144e041" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+               <accessible description="" name="Bottom Expanded Edge Panel" parent="/142edb7b4217453aa99a02d1f144e041" reference="/0d2b67a781a54602ab232480e2016f35" role="23">
+                       <interface name="Accessible"/>
+               </accessible>
+               <accessible description="" name="Top Expanded Edge Panel" parent="/142edb7b4217453aa99a02d1f144e041" reference="/ada9116ccfd24f848c5d963bff08fd56" role="23">
+                       <interface name="Accessible"/>
+               </accessible>
+       </accessible>
+       <accessible description="" name="nautilus" parent="/7d081ab722dd408f84211702cc675993" reference="/bc86d96f532c46edb8181c21c08f9728" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+               <accessible description="" name="Desktop" parent="/bc86d96f532c46edb8181c21c08f9728" reference="/89dccafc9b2e4e95aad8565643776ed1" role="23">
+                       <interface name="Accessible"/>
+               </accessible>
+       </accessible>
+       <accessible description="" name="metacity" parent="/7d081ab722dd408f84211702cc675993" reference="/a5dda1c8b9774f0ab1105c3035445206" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="" name="tracker-applet" parent="/7d081ab722dd408f84211702cc675993" reference="/147daf460d0e48c6b32586eb289bbeca" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="" name="empathy" parent="/7d081ab722dd408f84211702cc675993" reference="/a8b3e817db1a4dad941f9f444f9ffd8d" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+               <accessible description="" name="Contact List" parent="/a8b3e817db1a4dad941f9f444f9ffd8d" reference="/5256940c1db74b899b07b772561930ff" role="23">
+                       <interface name="Accessible"/>
+               </accessible>
+       </accessible>
+       <accessible description="" name="nm-applet" parent="/7d081ab722dd408f84211702cc675993" reference="/49cde83c3dd9417e9efa881063b34cfd" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="" name="gnome-power-manager" parent="/7d081ab722dd408f84211702cc675993" reference="/14ddbed408b944798a977776153aa05e" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="" name="update-notifier" parent="/7d081ab722dd408f84211702cc675993" reference="/4f1cf811c76d4796b6f559fedec59c09" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+       </accessible>
+       <accessible description="Firefox Application Accessible" name="Firefox" parent="/7d081ab722dd408f84211702cc675993" reference="/f4c6b3ef22a84fb39bc1c6e41ae0f71d" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+               <accessible description="Firefox Application Accessible" name="Google Reader - Mozilla Firefox 3 Beta 5" parent="/f4c6b3ef22a84fb39bc1c6e41ae0f71d" reference="/48f09fac5b8644e9bbe93a4748e49ac3" role="23">
+                       <interface name="Accessible"/>
+                       <interface name="Document"/>
+                       <interface name="Collection"/>
+                       <interface name="Component"/>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/23af90dc35e04f72a0f69895f86d8346" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Action"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="Strip originally conceived in conversation with Jeph Jacques. Soon to be a major motion picture." parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/a40d7b2c1feb43e6b43a265c35568a25" role="64">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/0e4b5b20d9eb4cfd9bdc9dd47e50aa8c" role="66">
+                               <interface name="Accessible"/>
+                               <interface name="Table"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                               <accessible description="" name="" parent="/0e4b5b20d9eb4cfd9bdc9dd47e50aa8c" reference="/a83352b689224781a453af65aaee5427" role="31">
+                                       <interface name="Accessible"/>
+                                       <interface name="Table"/>
+                                       <interface name="Component"/>
+                                       <accessible description="" name="" parent="/a83352b689224781a453af65aaee5427" reference="/1d80d828ba574262a507a15dc9e565da" role="10">
+                                               <interface name="Accessible"/>
+                                               <interface name="Action"/>
+                                               <interface name="Component"/>
+                                       </accessible>
+                                       <accessible description="" name="" parent="/a83352b689224781a453af65aaee5427" reference="/c32a9d4f2dda4cc9909c3110ed801009" role="10">
+                                               <interface name="Accessible"/>
+                                               <interface name="Action"/>
+                                               <interface name="Component"/>
+                                       </accessible>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/3d1ae86d62ea4a578b1708f8f885e19f" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Action"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                               <accessible description="" name="" parent="/3d1ae86d62ea4a578b1708f8f885e19f" reference="/155c89f9cb9d4f5e9a05ac02e6afcb59" role="67">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/d7a2d832bcc344a796a4b2cec16e2d6d" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/c8d2ff84f4194ecfad4826489f01723b" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/c56a398c8fa8457ebbd8e199ed191488" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/86e59e9c6fb34c1195949468087c9917" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/4f727d52049d4a7e9ac28410f7ad8090" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/c4712cd409a747a88137b9f75c12e19f" role="64">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/e924c5f09f24436b895ca006503b5e22" role="64">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/01031306ed5e46a1b6ae02fd42ff0972" role="63">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <accessible description="" name="Application" parent="/01031306ed5e46a1b6ae02fd42ff0972" reference="/238101c6cc154056a8d8d6d53b66cf7e" role="34">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/01031306ed5e46a1b6ae02fd42ff0972" reference="/0c7709c9fc154fd0b793efb4a15caf96" role="50">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="Activity Indicator" parent="/01031306ed5e46a1b6ae02fd42ff0972" reference="/9a624ccd6eda45949a6b90676eb3ac1f" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/afed1bfaac984206935ed9fe067c760d" role="63">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <accessible description="Go back one page" name="Back" parent="/afed1bfaac984206935ed9fe067c760d" reference="/acabc576fb8c418da7c174f3570b82b6" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="Go forwards one page" name="Forward" parent="/afed1bfaac984206935ed9fe067c760d" reference="/d713c536c7f943009457a6bbceee86d0" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/afed1bfaac984206935ed9fe067c760d" reference="/c4d1fe1e058a4a5bac9ecb2a06b8da42" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="Reload current page" name="Reload" parent="/afed1bfaac984206935ed9fe067c760d" reference="/293a96c80cb2409e9db09f450c5bb6eb" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="Stop loading this page" name="Stop" parent="/afed1bfaac984206935ed9fe067c760d" reference="/6d3880df16e5424caba26f52cb8a3373" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="chrome://ubufox/content/startpage.html" name="Home" parent="/afed1bfaac984206935ed9fe067c760d" reference="/5617423cf45e424cb7bb91f38c1dcdaa" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="Location" parent="/afed1bfaac984206935ed9fe067c760d" reference="/3e7a42b272204521b670f5b514fc0964" role="76">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="Search using Google" parent="/afed1bfaac984206935ed9fe067c760d" reference="/33834f7427fb442882d2581ed5429b3a" role="76">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/4cb62048e5e647279cc44501323e3186" role="63">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <accessible description="" name="Smart Bookmarks" parent="/4cb62048e5e647279cc44501323e3186" reference="/d2db6cc2e2a243cab4bcec7864e55299" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="Getting Started" parent="/4cb62048e5e647279cc44501323e3186" reference="/aa000f984a7d43db8ac45d5701eef39f" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="Latest Headlines" parent="/4cb62048e5e647279cc44501323e3186" reference="/7b1bbdd9b2ca409fa2c76d6da2d6e986" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/80cae36920024244878b31222193ece2" role="39">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <accessible description="" name="Google Reader" parent="/80cae36920024244878b31222193ece2" reference="/17631ebf23154d76843415f789dc087e" role="64">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/80cae36920024244878b31222193ece2" reference="/be0794f323b54bf08ab9b9ce7e587b32" role="33">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/80cae36920024244878b31222193ece2" reference="/98033bd5f113485dae22a994b6c21b5f" role="38">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/80cae36920024244878b31222193ece2" reference="/4edef0d82f7449209cd3c9825da94e9a" role="49">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/80cae36920024244878b31222193ece2" reference="/fd150750f0f64c11a489e372ff0d874a" role="49">
+                                       <interface name="Accessible"/>
+                                       <interface name="Component"/>
+                                       <accessible description="" name="Google Reader" parent="/fd150750f0f64c11a489e372ff0d874a" reference="/cffe9dc528e841458fbf23691856413c" role="28">
+                                               <interface name="Accessible"/>
+                                               <interface name="Action"/>
+                                               <interface name="Component"/>
+                                               <accessible description="" name="Google Reader" parent="/cffe9dc528e841458fbf23691856413c" reference="/31a96c6ca7184eb89588b14195ab02a0" role="82">
+                                                       <interface name="Accessible"/>
+                                                       <interface name="Document"/>
+                                                       <interface name="EditableText"/>
+                                                       <interface name="Text"/>
+                                                       <interface name="Collection"/>
+                                                       <interface name="Component"/>
+                                                       <interface name="Hypertext"/>
+                                                       <accessible description="" name="Click here for ARIA enhanced Google Reader." parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/0201d9e464aa4e5a965c9b2c223cec39" role="88">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/c0bcad5264d8407c9156747d4d954e75" role="85">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/196a96e8f81546979078b7736abb4418" role="85">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/cd41550f5aed4bf9b5ce3e1d5a683e54" role="85">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="Google Reader" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/0b0d64e2fe02431c88a1da412d8dc010" role="88">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/dfeaa10bbaea467f8f46b39d276f106e" role="61">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/a61783ec55284238a585306ccce12540" role="85">
+                                                               <interface name="Accessible"/>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/6111c8f600b045489e05fec01220349e" role="85">
+                                                               <interface name="Accessible"/>
+                                                               <interface name="EditableText"/>
+                                                               <interface name="Text"/>
+                                                               <interface name="Hyperlink"/>
+                                                               <interface name="Component"/>
+                                                               <interface name="Hypertext"/>
+                                                               <accessible description="" name="" parent="/6111c8f600b045489e05fec01220349e" reference="/d0609e68b5bd4506854aff4ff9fdf3e6" role="85">
+                                                                       <interface name="Accessible"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/6111c8f600b045489e05fec01220349e" reference="/fa1004781e4043458fed61ba6f937fc8" role="85">
+                                                                       <interface name="Accessible"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/6111c8f600b045489e05fec01220349e" reference="/154fa6e828404875bc9a88f9ae732e3c" role="85">
+                                                                       <interface name="Accessible"/>
+                                                                       <interface name="EditableText"/>
+                                                                       <interface name="Text"/>
+                                                                       <interface name="Hyperlink"/>
+                                                                       <interface name="Component"/>
+                                                                       <interface name="Hypertext"/>
+                                                                       <accessible description="" name="" parent="/154fa6e828404875bc9a88f9ae732e3c" reference="/de35bd9373a94be2bad26e0d6ea5740f" role="55">
+                                                                               <interface name="Accessible"/>
+                                                                       </accessible>
+                                                                       <accessible description="" name="" parent="/154fa6e828404875bc9a88f9ae732e3c" reference="/2833e734b1ac4e43a9475ccfec58dc5b" role="85">
+                                                                               <interface name="Accessible"/>
+                                                                               <interface name="EditableText"/>
+                                                                               <interface name="Text"/>
+                                                                               <interface name="Hyperlink"/>
+                                                                               <interface name="Component"/>
+                                                                               <interface name="Hypertext"/>
+                                                                               <accessible description="" name="" parent="/2833e734b1ac4e43a9475ccfec58dc5b" reference="/145ca33983f34fbba1c149245e9ad7de" role="85">
+                                                                                       <interface name="Accessible"/>
+                                                                                       <interface name="EditableText"/>
+                                                                                       <interface name="Text"/>
+                                                                                       <interface name="Hyperlink"/>
+                                                                                       <interface name="Component"/>
+                                                                                       <interface name="Hypertext"/>
+                                                                                       <accessible description="" name="" parent="/145ca33983f34fbba1c149245e9ad7de" reference="/e9f3512ee2954442970828dd850bd42d" role="85">
+                                                                                               <interface name="Accessible"/>
+                                                                                               <interface name="EditableText"/>
+                                                                                               <interface name="Text"/>
+                                                                                               <interface name="Hyperlink"/>
+                                                                                               <interface name="Component"/>
+                                                                                               <interface name="Hypertext"/>
+                                                                                               <accessible description="" name="" parent="/e9f3512ee2954442970828dd850bd42d" reference="/76ace448d79248c0810cb0835add3d5d" role="55">
+                                                                                                       <interface name="Accessible"/>
+                                                                                               </accessible>
+                                                                                               <accessible description="" name="" parent="/e9f3512ee2954442970828dd850bd42d" reference="/4832fa4965204fb5ac6c50de4d2e0fbf" role="55">
+                                                                                                       <interface name="Accessible"/>
+                                                                                                       <interface name="Table"/>
+                                                                                                       <interface name="Hyperlink"/>
+                                                                                                       <interface name="Component"/>
+                                                                                                       <accessible description="" name="" parent="/4832fa4965204fb5ac6c50de4d2e0fbf" reference="/091125105a3240baa59fb5d2118ced41" role="56">
+                                                                                                               <interface name="Accessible"/>
+                                                                                                               <interface name="EditableText"/>
+                                                                                                               <interface name="Text"/>
+                                                                                                               <interface name="Component"/>
+                                                                                                               <interface name="Hypertext"/>
+                                                                                                               <accessible description="" name="" parent="/091125105a3240baa59fb5d2118ced41" reference="/4f64e2dca33b4c5f80720e1dc0973777" role="85">
+                                                                                                                       <interface name="Accessible"/>
+                                                                                                                       <interface name="EditableText"/>
+                                                                                                                       <interface name="Text"/>
+                                                                                                                       <interface name="Hyperlink"/>
+                                                                                                                       <interface name="Component"/>
+                                                                                                                       <interface name="Hypertext"/>
+                                                                                                                       <accessible description="" name="" parent="/4f64e2dca33b4c5f80720e1dc0973777" reference="/3cfd49bf007c4c6fb443a6abb7b26ce0" role="85">
+                                                                                                                               <interface name="Accessible"/>
+                                                                                                                       </accessible>
+                                                                                                                       <accessible description="" name="" parent="/4f64e2dca33b4c5f80720e1dc0973777" reference="/0285c1ef52314814a1fbe019a9c57db6" role="61">
+                                                                                                                               <interface name="Accessible"/>
+                                                                                                                       </accessible>
+                                                                                                                       <accessible description="" name="Google News" parent="/4f64e2dca33b4c5f80720e1dc0973777" reference="/2cb87e9a10db41e3acd1dc7e85ed0983" role="88">
+                                                                                                                               <interface name="Accessible"/>
+                                                                                                                       </accessible>
+                                                                                                                       <accessible description="" name="" parent="/4f64e2dca33b4c5f80720e1dc0973777" reference="/36be829e8e9f453e8889c3bc974b9a86" role="85">
+                                                                                                                               <interface name="Accessible"/>
+                                                                                                                               <interface name="EditableText"/>
+                                                                                                                               <interface name="Text"/>
+                                                                                                                               <interface name="Hyperlink"/>
+                                                                                                                               <interface name="Component"/>
+                                                                                                                               <interface name="Hypertext"/>
+                                                                                                                               <accessible description="" name="" parent="/36be829e8e9f453e8889c3bc974b9a86" reference="/50ccc63252834010946e62c70e9faa01" role="85">
+                                                                                                                                       <interface name="Accessible"/>
+                                                                                                                                       <interface name="EditableText"/>
+                                                                                                                                       <interface name="Text"/>
+                                                                                                                                       <interface name="Hyperlink"/>
+                                                                                                                                       <interface name="Component"/>
+                                                                                                                                       <interface name="Hypertext"/>
+                                                                                                                               </accessible>
+                                                                                                                               <accessible description="" name="" parent="/36be829e8e9f453e8889c3bc974b9a86" reference="/d1890cce80aa4dd4b58a492667a55bd4" role="85">
+                                                                                                                                       <interface name="Accessible"/>
+                                                                                                                                       <interface name="EditableText"/>
+                                                                                                                                       <interface name="Text"/>
+                                                                                                                                       <interface name="Hyperlink"/>
+                                                                                                                                       <interface name="Component"/>
+                                                                                                                                       <interface name="Hypertext"/>
+                                                                                                                                       <accessible description="" name="Reader and ARIA: A new way to read" parent="/d1890cce80aa4dd4b58a492667a55bd4" reference="/974bc71ed3424976a40a6e9434053abd" role="88">
+                                                                                                                                               <interface name="Accessible"/>
+                                                                                                                                               <interface name="Action"/>
+                                                                                                                                               <interface name="EditableText"/>
+                                                                                                                                               <interface name="Text"/>
+                                                                                                                                               <interface name="Hyperlink"/>
+                                                                                                                                               <interface name="Component"/>
+                                                                                                                                               <interface name="Hypertext"/>
+                                                                                                                                       </accessible>
+                                                                                                                               </accessible>
+                                                                                                                               <accessible description="" name="" parent="/36be829e8e9f453e8889c3bc974b9a86" reference="/ed0d717a265a434397620314fb41a912" role="85">
+                                                                                                                                       <interface name="Accessible"/>
+                                                                                                                                       <interface name="EditableText"/>
+                                                                                                                                       <interface name="Text"/>
+                                                                                                                                       <interface name="Hyperlink"/>
+                                                                                                                                       <interface name="Component"/>
+                                                                                                                                       <interface name="Hypertext"/>
+                                                                                                                                       <accessible description="" name="Official Google Reader Blog" parent="/ed0d717a265a434397620314fb41a912" reference="/59c2db04618141deb2b5ceece43a9f6b" role="88">
+                                                                                                                                               <interface name="Accessible"/>
+                                                                                                                                               <interface name="Action"/>
+                                                                                                                                               <interface name="EditableText"/>
+                                                                                                                                               <interface name="Text"/>
+                                                                                                                                               <interface name="Hyperlink"/>
+                                                                                                                                               <interface name="Component"/>
+                                                                                                                                               <interface name="Hypertext"/>
+                                                                                                                                       </accessible>
+                                                                                                                               </accessible>
+                                                                                                                               <accessible description="" name="" parent="/36be829e8e9f453e8889c3bc974b9a86" reference="/e9b508f12c084a05ab112683eab845f6" role="85">
+                                                                                                                                       <interface name="Accessible"/>
+                                                                                                                               </accessible>
+                                                                                                                       </accessible>
+                                                                                                               </accessible>
+                                                                                                       </accessible>
+                                                                                                       <accessible description="" name="" parent="/4832fa4965204fb5ac6c50de4d2e0fbf" reference="/6de6237a06dc46188d4c330e748a8773" role="56">
+                                                                                                               <interface name="Accessible"/>
+                                                                                                       </accessible>
+                                                                                               </accessible>
+                                                                                       </accessible>
+                                                                                       <accessible description="" name="" parent="/145ca33983f34fbba1c149245e9ad7de" reference="/8ca4f981ab184b2a8c61b6ccba0816cb" role="85">
+                                                                                               <interface name="Accessible"/>
+                                                                                               <interface name="EditableText"/>
+                                                                                               <interface name="Text"/>
+                                                                                               <interface name="Hyperlink"/>
+                                                                                               <interface name="Component"/>
+                                                                                               <interface name="Hypertext"/>
+                                                                                               <accessible description="" name="Google Reader Blog" parent="/8ca4f981ab184b2a8c61b6ccba0816cb" reference="/d77ae2f3d889425190db70e8d7b26e26" role="88">
+                                                                                                       <interface name="Accessible"/>
+                                                                                               </accessible>
+                                                                                               <accessible description="" name="Discuss" parent="/8ca4f981ab184b2a8c61b6ccba0816cb" reference="/6cb6d67c8af349b5be7d2e74c2ce1919" role="88">
+                                                                                                       <interface name="Accessible"/>
+                                                                                               </accessible>
+                                                                                               <accessible description="" name="Privacy Policy" parent="/8ca4f981ab184b2a8c61b6ccba0816cb" reference="/f481eaf34698408b8cee9743035a1492" role="88">
+                                                                                                       <interface name="Accessible"/>
+                                                                                               </accessible>
+                                                                                               <accessible description="" name="Help" parent="/8ca4f981ab184b2a8c61b6ccba0816cb" reference="/0d02a2c8b5af43d3afd49761f8aad175" role="88">
+                                                                                                       <interface name="Accessible"/>
+                                                                                               </accessible>
+                                                                                               <accessible description="" name="" parent="/8ca4f981ab184b2a8c61b6ccba0816cb" reference="/f21c0b815ef44a0e86f8036a6c07be67" role="85">
+                                                                                                       <interface name="Accessible"/>
+                                                                                                       <interface name="EditableText"/>
+                                                                                                       <interface name="Text"/>
+                                                                                                       <interface name="Hyperlink"/>
+                                                                                                       <interface name="Component"/>
+                                                                                                       <interface name="Hypertext"/>
+                                                                                               </accessible>
+                                                                                       </accessible>
+                                                                               </accessible>
+                                                                       </accessible>
+                                                               </accessible>
+                                                       </accessible>
+                                                       <accessible description="" name="" parent="/31a96c6ca7184eb89588b14195ab02a0" reference="/369d55daee3d4ceab73bce8c9272b8bd" role="85">
+                                                               <interface name="Accessible"/>
+                                                               <interface name="EditableText"/>
+                                                               <interface name="Text"/>
+                                                               <interface name="Hyperlink"/>
+                                                               <interface name="Component"/>
+                                                               <interface name="Hypertext"/>
+                                                               <accessible description="" name="" parent="/369d55daee3d4ceab73bce8c9272b8bd" reference="/24b9a2bb46654a11bcc5d556fc8f8601" role="27">
+                                                                       <interface name="Accessible"/>
+                                                                       <interface name="Image"/>
+                                                                       <interface name="Hyperlink"/>
+                                                                       <interface name="Component"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/369d55daee3d4ceab73bce8c9272b8bd" reference="/0dd077f7fcd64f5397b90d49011b9b42" role="27">
+                                                                       <interface name="Accessible"/>
+                                                                       <interface name="Image"/>
+                                                                       <interface name="Hyperlink"/>
+                                                                       <interface name="Component"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/369d55daee3d4ceab73bce8c9272b8bd" reference="/e61ed70672824ad4aa4db581a8214422" role="27">
+                                                                       <interface name="Accessible"/>
+                                                                       <interface name="Image"/>
+                                                                       <interface name="Hyperlink"/>
+                                                                       <interface name="Component"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/369d55daee3d4ceab73bce8c9272b8bd" reference="/bfd75999f02d4eed903b51210ac75482" role="27">
+                                                                       <interface name="Accessible"/>
+                                                                       <interface name="Image"/>
+                                                                       <interface name="Hyperlink"/>
+                                                                       <interface name="Component"/>
+                                                               </accessible>
+                                                               <accessible description="" name="" parent="/369d55daee3d4ceab73bce8c9272b8bd" reference="/20f85aefbfe3404cafd403532b4b3701" role="27">
+                                                                       <interface name="Accessible"/>
+                                                               </accessible>
+                                                       </accessible>
+                                               </accessible>
+                                       </accessible>
+                               </accessible>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/021ea00d3e834540b4fe32b87deb78f3" role="33">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <interface name="Selection"/>
+                       </accessible>
+                       <accessible description="" name="" parent="/48f09fac5b8644e9bbe93a4748e49ac3" reference="/ee6e534a8890407c812f7e22e532cb8c" role="54">
+                               <interface name="Accessible"/>
+                               <interface name="Component"/>
+                               <accessible description="" name="Done" parent="/ee6e534a8890407c812f7e22e532cb8c" reference="/96ca24949d024cdba4ace74d68628b1b" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                               <accessible description="" name="" parent="/ee6e534a8890407c812f7e22e532cb8c" reference="/411f3a275f99473086caa7abb0f4c2cc" role="43">
+                                       <interface name="Accessible"/>
+                               </accessible>
+                       </accessible>
+               </accessible>
+       </accessible>
+       <accessible description="" name="gnome-terminal" parent="/7d081ab722dd408f84211702cc675993" reference="/15e53f8b19354205a39538caceeda5a5" role="75">
+               <interface name="Accessible"/>
+               <interface name="Application"/>
+               <accessible description="" name="mdoff@silver-wind: ~/Projects/accessibility/dbus-atspi/test" parent="/15e53f8b19354205a39538caceeda5a5" reference="/d81c3928d29642f5a5a1490f727da03c" role="23">
+                       <interface name="Accessible"/>
+               </accessible>
+       </accessible>
+</accessible>
diff --git a/tools/python/makeTree.py b/tools/python/makeTree.py
new file mode 100644 (file)
index 0000000..41395c2
--- /dev/null
@@ -0,0 +1,79 @@
+import sys
+import pyatspi
+import uuid
+
+from xml.dom import minidom
+
+INTERFACES = [
+"Accessible",
+"Desktop",
+"Image",
+"StreamableContent",
+"Action",
+"Document",
+"Table",
+"Application",
+"EditableText",
+"MatchRule",
+"Text",
+"Collection",
+"Hyperlink",
+"Value",
+"Component",
+"Hypertext",
+"Selection",
+]
+
+def getChild(accessible, i):
+       try:
+               child = accessible.getChildAtIndex(i)
+       except LookupError:
+               child = None
+       return child
+
+def createNode(accessible, parentRef, parentElement):
+       e = minidom.Element("accessible")
+       reference = '/' + str(uuid.uuid4()).replace('-', '')
+
+       e.attributes["reference"] = reference
+       e.attributes["parent"] = parentRef
+       e.attributes["name"] = accessible.name
+       e.attributes["role"] = str(accessible.getRole())
+       e.attributes["description"] = accessible.description
+
+       for i in INTERFACES:
+               query = getattr(accessible, "query" + i)
+               try:
+                       query()
+                       itf = minidom.Element("interface")
+                       itf.attributes["name"] = i
+                       e.appendChild(itf)
+               except NotImplementedError:
+                       pass
+               except LookupError:
+                       pass
+
+       try:
+               count = accessible.childCount
+       except LookupError:
+               count = 0
+       
+       for i in range(count):
+               child = getChild(accessible, i)
+               if child is not None:
+                       createNode(child, reference, e)
+
+       parentElement.appendChild(e)
+
+def main(argv):
+       filename = argv[1]
+       doc = minidom.Document()
+       desk = pyatspi.Registry.getDesktop(0)
+       createNode(desk, '/', doc)
+       
+       file = open(filename, 'w')
+       file.write(doc.toprettyxml())
+       file.close()
+
+if __name__ == "__main__":
+       sys.exit(main(sys.argv))
diff --git a/tools/python/testClient.py b/tools/python/testClient.py
new file mode 100644 (file)
index 0000000..5bc37c4
--- /dev/null
@@ -0,0 +1,41 @@
+import sys
+import dbus
+
+from xml.dom import minidom
+
+from AccessibleTreeCache import AccessibleTreeCache, AccessibleObjectProxy
+
+def createNode(accessible, parentRef, parentElement):
+       e = minidom.Element("accessible")
+
+       e.attributes["reference"] = accessible.path
+       e.attributes["parent"] = accessible.parent
+       e.attributes["name"] = accessible.name
+       e.attributes["role"] = str(int(accessible.role))
+       e.attributes["description"] = accessible.description
+
+       for i in accessible.interfaces:
+               itf = minidom.Element("interface")
+               itf.attributes["name"] = i
+               e.appendChild(itf)
+
+       for c in accessible.getChildren():
+               createNode(c, accessible.path, e)
+
+       parentElement.appendChild(e)
+
+def main(argv):
+       filename = argv[1]
+       bus = dbus.SessionBus()
+       cache = AccessibleTreeCache(bus, 'test.atspi.tree', '/org/freedesktop/atspi/tree')
+       root = cache.getRootAccessible()
+
+       doc = minidom.Document()
+       createNode(root, '/', doc)
+       
+       file = open(filename, 'w')
+       file.write(doc.toprettyxml())
+       file.close()
+
+if __name__ == '__main__':
+       sys.exit(main(sys.argv))
diff --git a/tools/python/testServer.py b/tools/python/testServer.py
new file mode 100644 (file)
index 0000000..0fe315a
--- /dev/null
@@ -0,0 +1,55 @@
+import sys
+from dbus.mainloop.glib import DBusGMainLoop
+
+import gobject
+import dbus
+
+from xml.dom import minidom
+
+from AccessibleTree import AccessibleTree
+
+DBusGMainLoop(set_as_default=True)
+
+def getChildrenByName(node, name):
+       return [child for child in node.childNodes if child.nodeType == child.ELEMENT_NODE and child.nodeName == name]
+
+def registerObject(tree, parent, node):
+       reference = node.getAttribute('reference').encode('ASCII')
+       name = node.getAttribute('name').encode('ASCII')
+       role = node.getAttribute('role').encode('ASCII')
+       description = node.getAttribute('description').encode('ASCII')
+
+       interfacen = getChildrenByName(node, 'interface')
+       interfaces = [itf.getAttribute('name').encode('ASCII') for itf in interfacen]
+
+       childrenn = getChildrenByName(node, 'accessible')
+       children = [cld.getAttribute('reference').encode('ASCII') for cld in childrenn]
+
+       object = (reference, parent, children, interfaces, name, int(role), description)
+       tree.updateObject(reference, object)
+
+       for child in childrenn:
+               registerObject(tree, reference, child)
+
+def main(argv):
+       filename = argv[1]
+       bus = dbus.SessionBus()
+
+       loop = gobject.MainLoop()
+
+       bus.request_name('test.atspi.tree', 0)
+
+       tree = AccessibleTree(bus, '/org/freedesktop/atspi/tree')
+       doc = minidom.parse(filename)
+       node = doc.firstChild
+       tree.setRoot(node.getAttribute('reference').encode('ASCII'))
+
+       registerObject(tree, '/', node)
+
+       try:
+               loop.run()
+       except KeyboardInterrupt:
+               loop.quit()
+
+if __name__ == '__main__':
+       sys.exit(main(sys.argv))