<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.webos-internals.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct</id>
	<title>WebOS Internals - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.webos-internals.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct"/>
	<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/wiki/Special:Contributions/Newacct"/>
	<updated>2026-05-05T11:11:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Tutorials_Export_Text_Messages_Using_Perl&amp;diff=10870</id>
		<title>Tutorials Export Text Messages Using Perl</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Tutorials_Export_Text_Messages_Using_Perl&amp;diff=10870"/>
		<updated>2010-08-17T07:07:30Z</updated>

		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a rather simple script to export text messages in a readable format from [[PalmDatabase.db3 File|PalmDatabase.db3]].  You must first import PalmDatabase.db3 to your pc from /var/luna/data/dbdata /PalmDatabase.db3 on the Pre. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run this code (assuming PalmDatabase.db3 is in the same folder and the name is unchanged) and it will spit out information in an &amp;quot;ID - NAME&amp;quot; format.  Copy the ID for the second script.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use DBI;&lt;br /&gt;
&lt;br /&gt;
$dbh = DBI-&amp;gt;connect( &amp;quot;dbi:SQLite:PalmDatabase.db3&amp;quot; ) || die &amp;quot;Cannot connect: $DBI::errstr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$res = $dbh-&amp;gt;selectall_arrayref( q( SELECT firstName, lastName,id FROM com_palm_messaging_data_ChatThread WHERE _class_id = 11) );&lt;br /&gt;
foreach( @$res ) {&lt;br /&gt;
&lt;br /&gt;
    $first = $_-&amp;gt;[0];&lt;br /&gt;
    $last = $_-&amp;gt;[1];&lt;br /&gt;
    $id = $_-&amp;gt;[2];&lt;br /&gt;
    print &amp;quot;$id - $first $last \n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Run the following as &amp;quot;perl script2.pl id yourname otherpersonsname&amp;quot; format.  The last 2 variables are optional.  Set the $time_zone variable as needed.  In the code below, it is set for Central Standard Time.  See [http://search.cpan.org/~drolsky/DateTime-0.55/lib/DateTime.pm#%22Set%22_Methods CPAN#DateTime] for more info.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use DBI;&lt;br /&gt;
use DateTime;&lt;br /&gt;
&lt;br /&gt;
($input,$me,$you) = @ARGV;&lt;br /&gt;
&lt;br /&gt;
$time_zone = 'America/Chicago';&lt;br /&gt;
&lt;br /&gt;
if ($me eq '')&lt;br /&gt;
{&lt;br /&gt;
    $me = 'Me';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($you eq '')&lt;br /&gt;
{&lt;br /&gt;
    $you = 'You';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$me.= &amp;quot; : &amp;quot;;&lt;br /&gt;
$you.= &amp;quot; : &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$dbh = DBI-&amp;gt;connect( &amp;quot;dbi:SQLite:PalmDatabase.db3&amp;quot; ) || die &amp;quot;Cannot connect: $DBI::errstr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$res = $dbh-&amp;gt;selectall_arrayref( qq( SELECT belongs_id FROM com_palm_messaging_data_ChatThread_com_palm_pim_FolderEntry_Chat_Messages WHERE has_id = $input) );&lt;br /&gt;
&lt;br /&gt;
foreach( @$res ) {&lt;br /&gt;
   &lt;br /&gt;
    $id = $_-&amp;gt;[0];&lt;br /&gt;
    $temp = $dbh-&amp;gt;selectall_arrayref( qq( SELECT timeStamp, messageText,flags FROM com_palm_pim_FolderEntry  WHERE messageType = 'SMS' and id=$id) );&lt;br /&gt;
    foreach $x (@$temp)&lt;br /&gt;
    {&lt;br /&gt;
        $time = $x-&amp;gt;[0];&lt;br /&gt;
        $time = $time/1000;&lt;br /&gt;
        $tofrom = find_code ( $x-&amp;gt;[2] );&lt;br /&gt;
        $dt = DateTime-&amp;gt;from_epoch(epoch =&amp;gt; $time);&lt;br /&gt;
        $dt-&amp;gt;set_time_zone( $time_zone );&lt;br /&gt;
         &lt;br /&gt;
        print $dt-&amp;gt;month.'/'.$dt-&amp;gt;day.'/'.$dt-&amp;gt;year.' '.$dt-&amp;gt;hour.':'.$dt-&amp;gt;minute.':'.$dt-&amp;gt;second.' '.$tofrom.$x-&amp;gt;[1];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 print &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub find_code {&lt;br /&gt;
    ($code) = @_;&lt;br /&gt;
    if ($code == 133)&lt;br /&gt;
    {&lt;br /&gt;
        return $me;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if ($code == 5)&lt;br /&gt;
    {&lt;br /&gt;
        return $you;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;Unknown&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=OpenGL_Triangle_of_Doom&amp;diff=10390</id>
		<title>OpenGL Triangle of Doom</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=OpenGL_Triangle_of_Doom&amp;diff=10390"/>
		<updated>2010-06-26T15:45:26Z</updated>

		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:SDL]]&lt;br /&gt;
&lt;br /&gt;
== The demo app ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Opengldemo.png|160px|left]]This app is loosely based on a [http://wiki.maemo.org/SimpleGL_Example an OpenGL example from the maemo project] and is ported from X11 OpenGL code to SDL to function in webos&lt;br /&gt;
&lt;br /&gt;
First, follow the tutorial [[WebOS Internals PDK]] to set up the cross compilation environment.&lt;br /&gt;
&lt;br /&gt;
Next, copy the source below into a file doomtriangle.c &lt;br /&gt;
&lt;br /&gt;
Now run scratchbox2 with the webos / pre mapping file:&lt;br /&gt;
 $ sb2 -M /srv/preware/cross-compile/staging/mapping-armv7&lt;br /&gt;
&lt;br /&gt;
You will get a different prompt indicating you are in a scratchbox shell, like:&lt;br /&gt;
 [SB2 mapping-armv7 armv7] $&lt;br /&gt;
&lt;br /&gt;
Now just &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export LIBS=&amp;quot;-Wl,-rpath-link=/usr/local/lib -L/usr/local/lib&amp;quot;&lt;br /&gt;
gcc -I/usr/local/include/SDL $LIBS -o doomtriangle doomtriangle.c -lSDL -lGLESv2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, copy the resulting binary doomtriangle to your pre and run it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===doomtriangle.c===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;SDL.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SDL_opengles.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SDL_video.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char* vertexSrc = &amp;quot;attribute vec4 position; varying mediump vec2 pos; void main() { gl_Position = position; pos = position.xy; }&amp;quot;;&lt;br /&gt;
const char* fragmentSrc = &amp;quot;varying mediump vec2 pos; uniform mediump float phase; void main() { gl_FragColor = vec4(1, 1, 1, 1) * sin((pos.x * pos.x + pos.y * pos.y) * 40.0 + phase); }&amp;quot;;&lt;br /&gt;
//const char* fragmentSrc = &amp;quot;varying mediump vec2 pos; uniform mediump float phase; void main() { gl_FragColor = vec4(1, 1, 1, 1) * step(pos.x * pos.x + pos.y * pos.y, phase * 0.2); }&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
void printShaderInfoLog(GLuint shader) {&lt;br /&gt;
    GLint length;&lt;br /&gt;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &amp;amp;length);&lt;br /&gt;
    if(length) {&lt;br /&gt;
        char* buffer = malloc( sizeof(char) * length ) ;&lt;br /&gt;
        glGetShaderInfoLog(shader, length, NULL, buffer);&lt;br /&gt;
        printf(&amp;quot;%s&amp;quot;, buffer);&lt;br /&gt;
        free( buffer ) ;&lt;br /&gt;
        GLint success;&lt;br /&gt;
        glGetShaderiv(shader, GL_COMPILE_STATUS, &amp;amp;success);&lt;br /&gt;
        if(success != GL_TRUE) {&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GLuint createShader(GLenum type, const char* pSource) {&lt;br /&gt;
    GLuint shader = glCreateShader(type);&lt;br /&gt;
    glShaderSource(shader, 1, &amp;amp;pSource, NULL);&lt;br /&gt;
    glCompileShader(shader);&lt;br /&gt;
    printShaderInfoLog(shader);&lt;br /&gt;
    return shader;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int phaseLocation ;&lt;br /&gt;
&lt;br /&gt;
const float vertexArray[] = {&lt;br /&gt;
    0, -1, 0, 1,&lt;br /&gt;
    1, 1, 0, 1,&lt;br /&gt;
    -1, 1, 0, 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define false 0&lt;br /&gt;
#define true 1&lt;br /&gt;
#define bool int&lt;br /&gt;
&lt;br /&gt;
void render() {&lt;br /&gt;
        static float offset = 0;&lt;br /&gt;
&lt;br /&gt;
        glViewport(0, 0, 320, 480 ) ;&lt;br /&gt;
        glClearColor(0, 1, 0, 1);&lt;br /&gt;
        glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
        &lt;br /&gt;
        glUniform1f(phaseLocation, offset);&lt;br /&gt;
        &lt;br /&gt;
        glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, vertexArray);&lt;br /&gt;
        glEnableVertexAttribArray(0);&lt;br /&gt;
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);&lt;br /&gt;
        &lt;br /&gt;
        SDL_GL_SwapBuffers( ) ;&lt;br /&gt;
        &lt;br /&gt;
        offset = fmodf(offset + 0.2, 2*3.141f);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
    if( SDL_Init( SDL_INIT_VIDEO ) &amp;lt; 0 ) {&lt;br /&gt;
        fprintf( stderr, &amp;quot;Couldn't initialize SDL: %s\n&amp;quot;, SDL_GetError() ) ;&lt;br /&gt;
        exit( 1 ) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( SDL_SetVideoMode( 320, 480, 32, SDL_OPENGLES ) == NULL ) {&lt;br /&gt;
        fprintf(stderr, &amp;quot;Couldn't set GL mode: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        SDL_Quit();&lt;br /&gt;
        exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Screen BPP: %d\n&amp;quot;, SDL_GetVideoSurface()-&amp;gt;format-&amp;gt;BitsPerPixel);&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    printf( &amp;quot;Vendor     : %s\n&amp;quot;, glGetString( GL_VENDOR ) );&lt;br /&gt;
    printf( &amp;quot;Renderer   : %s\n&amp;quot;, glGetString( GL_RENDERER ) );&lt;br /&gt;
    printf( &amp;quot;Version    : %s\n&amp;quot;, glGetString( GL_VERSION ) );&lt;br /&gt;
    printf( &amp;quot;Extensions : %s\n&amp;quot;, glGetString( GL_EXTENSIONS ) );&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    GLuint shaderProgram = glCreateProgram();&lt;br /&gt;
    GLuint vertexShader = createShader(GL_VERTEX_SHADER, vertexSrc);&lt;br /&gt;
    GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, fragmentSrc);&lt;br /&gt;
    &lt;br /&gt;
    glAttachShader(shaderProgram, vertexShader);&lt;br /&gt;
    glAttachShader(shaderProgram, fragmentShader);&lt;br /&gt;
    &lt;br /&gt;
    glLinkProgram(shaderProgram);&lt;br /&gt;
    &lt;br /&gt;
    glUseProgram(shaderProgram);&lt;br /&gt;
    &lt;br /&gt;
    phaseLocation = glGetUniformLocation(shaderProgram, &amp;quot;phase&amp;quot;);&lt;br /&gt;
    if(phaseLocation &amp;lt; 0) {&lt;br /&gt;
        printf(&amp;quot;Unable to get uniform location\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    bool quit = false;&lt;br /&gt;
    &lt;br /&gt;
    //timeval startTime;&lt;br /&gt;
    //timezone tz;&lt;br /&gt;
    //gettimeofday(&amp;amp;startTime, &amp;amp;tz);&lt;br /&gt;
    int numFrames = 0;&lt;br /&gt;
    &lt;br /&gt;
    while(!quit) {&lt;br /&gt;
        SDL_Event event ;&lt;br /&gt;
        while( SDL_PollEvent( &amp;amp;event ) ) {&lt;br /&gt;
            if( event.type == SDL_KEYDOWN &amp;amp;&amp;amp; event.key.keysym.sym == SDLK_ESCAPE ) quit = 1 ;&lt;br /&gt;
        }&lt;br /&gt;
                render();&lt;br /&gt;
                numFrames++;&lt;br /&gt;
                if(numFrames % 100 == 0) {&lt;br /&gt;
                    //timeval now;&lt;br /&gt;
                    //gettimeofday(&amp;amp;now, &amp;amp;tz);&lt;br /&gt;
                    //float delta = now.tv_sec - startTime.tv_sec + (now.tv_usec - startTime.tv_usec) * 0.000001f;&lt;br /&gt;
                    //printf(&amp;quot;fps: %f\n&amp;quot;, numFrames / delta);&lt;br /&gt;
                }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Introspecting_Dbus&amp;diff=9405</id>
		<title>Introspecting Dbus</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Introspecting_Dbus&amp;diff=9405"/>
		<updated>2010-03-19T04:57:51Z</updated>

		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__ &lt;br /&gt;
&lt;br /&gt;
=Palm/DBUS Namspaces=&lt;br /&gt;
&lt;br /&gt;
(these should be split up into Palm and 3rd-party lists at some point)&lt;br /&gt;
{{article-three-columns&lt;br /&gt;
|width1=30%&lt;br /&gt;
|width2=30%&lt;br /&gt;
|column1=&lt;br /&gt;
* com.palm.accounts&lt;br /&gt;
* com.palm.accountservices&lt;br /&gt;
* com.palm.amazon&lt;br /&gt;
* com.palm.applicationManager&lt;br /&gt;
* com.palm.audio&lt;br /&gt;
* com.palm.bluetooth&lt;br /&gt;
* com.palm.browserServer&lt;br /&gt;
* com.palm.bus&lt;br /&gt;
* com.palm.calendar&lt;br /&gt;
* com.palm.certificatemanager&lt;br /&gt;
* com.palm.connectionmanager&lt;br /&gt;
* com.palm.contacts&lt;br /&gt;
* com.palm.crotest&lt;br /&gt;
* com.palm.customization&lt;br /&gt;
* com.palm.data.carriernetworksettings&lt;br /&gt;
&lt;br /&gt;
|column2=&lt;br /&gt;
* com.palm.dataimport&lt;br /&gt;
* com.palm.deviceprofile&lt;br /&gt;
* com.palm.display&lt;br /&gt;
* com.palm.downloadmanager&lt;br /&gt;
* com.palm.hidd&lt;br /&gt;
* com.palm.keys&lt;br /&gt;
* com.palm.location&lt;br /&gt;
* com.palm.lunabus&lt;br /&gt;
* com.palm.mail&lt;br /&gt;
* com.palm.mediadb&lt;br /&gt;
* com.palm.mediaevents&lt;br /&gt;
* com.palm.messaging&lt;br /&gt;
* com.palm.office&lt;br /&gt;
* com.palm.omadm&lt;br /&gt;
* com.palm.pdf&lt;br /&gt;
&lt;br /&gt;
|column3=&lt;br /&gt;
* com.palm.photos&lt;br /&gt;
* com.palm.pimsync&lt;br /&gt;
* com.palm.power&lt;br /&gt;
* com.palm.provisioning&lt;br /&gt;
* com.palm.preferences&lt;br /&gt;
* com.palm.superlog&lt;br /&gt;
* com.palm.systemmanager&lt;br /&gt;
* com.palm.systemservice&lt;br /&gt;
* com.palm.taskScheduler&lt;br /&gt;
* com.palm.telephony&lt;br /&gt;
* com.palm.update&lt;br /&gt;
* com.palm.wan&lt;br /&gt;
* com.palm.wifi&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
=Python Code=&lt;br /&gt;
&lt;br /&gt;
Below is a Python app (shamelessly ripped from http://code.google.com/p/dbus-tools/wiki/DBusCli) for doing some dbus introspection...&lt;br /&gt;
&lt;br /&gt;
Use the link above for usage help.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import dbus, sys&lt;br /&gt;
from xml.dom import minidom&lt;br /&gt;
from optparse import OptionParser&lt;br /&gt;
&lt;br /&gt;
class Signature(dbus.Signature):&lt;br /&gt;
	def Variant(x):&lt;br /&gt;
		return x&lt;br /&gt;
	&lt;br /&gt;
	_dbus_types = {&lt;br /&gt;
		&amp;quot;{&amp;quot;: dbus.Dictionary,&lt;br /&gt;
		&amp;quot;(&amp;quot;: dbus.Struct,&lt;br /&gt;
		&amp;quot;a&amp;quot;: dbus.Array, &lt;br /&gt;
		&amp;quot;y&amp;quot;: dbus.Byte,&lt;br /&gt;
		&amp;quot;b&amp;quot;: dbus.Boolean,&lt;br /&gt;
		&amp;quot;n&amp;quot;: dbus.Int16,&lt;br /&gt;
		&amp;quot;q&amp;quot;: dbus.UInt16,&lt;br /&gt;
		&amp;quot;i&amp;quot;: dbus.Int32,&lt;br /&gt;
		&amp;quot;u&amp;quot;: dbus.UInt32,&lt;br /&gt;
		&amp;quot;x&amp;quot;: dbus.Int64,&lt;br /&gt;
		&amp;quot;t&amp;quot;: dbus.UInt64,&lt;br /&gt;
		&amp;quot;d&amp;quot;: dbus.Double,&lt;br /&gt;
		&amp;quot;s&amp;quot;: dbus.String,&lt;br /&gt;
		&amp;quot;o&amp;quot;: dbus.ObjectPath,&lt;br /&gt;
		&amp;quot;g&amp;quot;: dbus.Signature,&lt;br /&gt;
		&amp;quot;v&amp;quot;: Variant }&lt;br /&gt;
	&lt;br /&gt;
	def __iter__(self):&lt;br /&gt;
		return ( Signature(x) for x in dbus.Signature.__iter__(self) )&lt;br /&gt;
	&lt;br /&gt;
	def get_type(self):&lt;br /&gt;
		return self._dbus_types[self[0]]&lt;br /&gt;
	&lt;br /&gt;
	def container_type(self):&lt;br /&gt;
		if self.startswith(&amp;quot;(&amp;quot;): return dbus.Struct&lt;br /&gt;
		elif self.startswith(&amp;quot;a{&amp;quot;): return dbus.Dictionary&lt;br /&gt;
		elif self.startswith(&amp;quot;a&amp;quot;): return dbus.Array&lt;br /&gt;
		else: return None&lt;br /&gt;
	&lt;br /&gt;
	def container_content(self):&lt;br /&gt;
		if self.container_type() == dbus.Struct: return Signature(self[1:-1])&lt;br /&gt;
		elif self.container_type() == dbus.Dictionary: return Signature(self[2:-1])&lt;br /&gt;
		elif self.container_type() == dbus.Array: return Signature(self[1:])&lt;br /&gt;
		else: return None&lt;br /&gt;
	&lt;br /&gt;
	def tostring(self):&lt;br /&gt;
		if len(tuple(self)) &amp;gt; 1:&lt;br /&gt;
			return &amp;quot;, &amp;quot;.join( x.tostring() for x in self )&lt;br /&gt;
		&lt;br /&gt;
		t, c = self.container_type(), self.container_content()&lt;br /&gt;
		if t is None:&lt;br /&gt;
			return self.get_type().__name__&lt;br /&gt;
		elif t == dbus.Array:&lt;br /&gt;
			return c.tostring() + &amp;quot;[]&amp;quot;&lt;br /&gt;
		else:&lt;br /&gt;
			return t.__name__ + &amp;quot; {&amp;quot; + c.tostring() + &amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Object(object):&lt;br /&gt;
	class XMLChild(object):&lt;br /&gt;
		def __init__(self, obj, name):&lt;br /&gt;
			self.obj = obj&lt;br /&gt;
			self.name = name&lt;br /&gt;
			self.xml = None&lt;br /&gt;
		&lt;br /&gt;
		def node(self):&lt;br /&gt;
			if not self.xml:&lt;br /&gt;
				for iface in self.parent().getElementsByTagName(self.tag):&lt;br /&gt;
					if iface.getAttribute('name') == self.name:&lt;br /&gt;
						self.xml = iface&lt;br /&gt;
						return self.xml&lt;br /&gt;
			&lt;br /&gt;
			return self.xml&lt;br /&gt;
		&lt;br /&gt;
		def children(self, tag):&lt;br /&gt;
			for method in self.node().getElementsByTagName(tag):&lt;br /&gt;
				name = method.getAttribute('name')&lt;br /&gt;
				if name:&lt;br /&gt;
					yield name&lt;br /&gt;
	&lt;br /&gt;
	class Interface(XMLChild):&lt;br /&gt;
		tag = &amp;quot;interface&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def parent(self):&lt;br /&gt;
			return self.obj.introspect()&lt;br /&gt;
		&lt;br /&gt;
		def methods(self):&lt;br /&gt;
			return self.children('method')&lt;br /&gt;
		&lt;br /&gt;
		def signals(self):&lt;br /&gt;
			return self.children('signal')&lt;br /&gt;
		&lt;br /&gt;
		def method(self, name):&lt;br /&gt;
			return self.obj.method(name, self.name)&lt;br /&gt;
		&lt;br /&gt;
		def signal(self, name):&lt;br /&gt;
			return self.obj.signal(name, self.name)&lt;br /&gt;
	&lt;br /&gt;
	class MethodSignal(XMLChild):&lt;br /&gt;
		class Argument:&lt;br /&gt;
			def __getattr__(self, x):&lt;br /&gt;
				return self.xml.getAttribute(x)&lt;br /&gt;
		&lt;br /&gt;
		def __init__(self, obj, name, iface):&lt;br /&gt;
			Object.XMLChild.__init__(self, obj, name)&lt;br /&gt;
			self.iface = iface&lt;br /&gt;
		&lt;br /&gt;
		def parent(self):&lt;br /&gt;
			return self.obj.interface(self.iface).node()&lt;br /&gt;
			&lt;br /&gt;
		def args(self):&lt;br /&gt;
			for arg in self.node().getElementsByTagName(&amp;quot;arg&amp;quot;):&lt;br /&gt;
				argobj = Object.MethodSignal.Argument()&lt;br /&gt;
				argobj.xml = arg&lt;br /&gt;
				assert argobj.type&lt;br /&gt;
				argobj.signature = Signature(argobj.type)&lt;br /&gt;
				yield argobj&lt;br /&gt;
	&lt;br /&gt;
	class Method(MethodSignal):&lt;br /&gt;
		tag = &amp;quot;method&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def inargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				if arg.direction == &amp;quot;in&amp;quot;:&lt;br /&gt;
					yield arg&lt;br /&gt;
	&lt;br /&gt;
		def outargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				if arg.direction == &amp;quot;out&amp;quot;:&lt;br /&gt;
					yield arg&lt;br /&gt;
	&lt;br /&gt;
	class Signal(MethodSignal):&lt;br /&gt;
		tag = &amp;quot;signal&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def outargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				assert arg.direction != &amp;quot;out&amp;quot;&lt;br /&gt;
			return []&lt;br /&gt;
		&lt;br /&gt;
		def inargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				assert not arg.direction or arg.direction == &amp;quot;in&amp;quot;&lt;br /&gt;
				yield arg&lt;br /&gt;
	&lt;br /&gt;
	def __init__(self, bus, service, path):&lt;br /&gt;
		self.bus = bus&lt;br /&gt;
		self.service = service&lt;br /&gt;
		self.path = path&lt;br /&gt;
		self.object = None&lt;br /&gt;
		self.intr_data = None&lt;br /&gt;
		self.cached_childrens = {}&lt;br /&gt;
		self.cached_interfaces = {}&lt;br /&gt;
		self.cached_methods = {}&lt;br /&gt;
		self.cached_signals = {}&lt;br /&gt;
	&lt;br /&gt;
	def get_object(self):&lt;br /&gt;
		if not self.object:&lt;br /&gt;
			self.object = self.bus.get_object(self.service, self.path)&lt;br /&gt;
		return self.object&lt;br /&gt;
	&lt;br /&gt;
	def introspect(self):&lt;br /&gt;
		if not self.intr_data:&lt;br /&gt;
			self.intr_data = minidom.parseString(self.get_object().Introspect())&lt;br /&gt;
		return self.intr_data&lt;br /&gt;
	&lt;br /&gt;
	def children(self):&lt;br /&gt;
		intr_data = self.introspect()&lt;br /&gt;
		for node in intr_data.getElementsByTagName('node'):&lt;br /&gt;
			name = node.getAttribute(&amp;quot;name&amp;quot;)&lt;br /&gt;
			if node == intr_data.documentElement or not name:&lt;br /&gt;
				continue&lt;br /&gt;
			else:&lt;br /&gt;
				yield name&lt;br /&gt;
	&lt;br /&gt;
	def interfaces(self):&lt;br /&gt;
		for node in self.introspect().getElementsByTagName('interface'):&lt;br /&gt;
			name = node.getAttribute(&amp;quot;name&amp;quot;)&lt;br /&gt;
			if name:&lt;br /&gt;
				yield name&lt;br /&gt;
	&lt;br /&gt;
	def methods(self, iface):&lt;br /&gt;
		return self.interface(iface).methods()&lt;br /&gt;
	&lt;br /&gt;
	def signals(self, iface):&lt;br /&gt;
		return self.interface(iface).signals()&lt;br /&gt;
	&lt;br /&gt;
	def _cached(self, list, name, constr, *constr_args):&lt;br /&gt;
		if name not in list:&lt;br /&gt;
			list[name] = constr(*constr_args)&lt;br /&gt;
		return list[name]&lt;br /&gt;
	&lt;br /&gt;
	def child(self, name):&lt;br /&gt;
		if self.path == '/':&lt;br /&gt;
			full_name = '/' + name&lt;br /&gt;
		else:&lt;br /&gt;
			full_name = self.path + '/' + name&lt;br /&gt;
		return self._cached(self.cached_childrens, full_name, Object, self.bus, self.service, full_name)&lt;br /&gt;
	&lt;br /&gt;
	def interface(self, name):&lt;br /&gt;
		return self._cached(self.cached_interfaces, name, Object.Interface, self, name)&lt;br /&gt;
	&lt;br /&gt;
	def method(self, name, iface):&lt;br /&gt;
		full_name = iface + '.' + name&lt;br /&gt;
		return self._cached(self.cached_methods, full_name, Object.Method, self, name, iface)&lt;br /&gt;
	&lt;br /&gt;
	def signal(self, name, iface):&lt;br /&gt;
		full_name = iface + '.' + name&lt;br /&gt;
		return self._cached(self.cached_methods, full_name, Object.Signal, self, name, iface)&lt;br /&gt;
&lt;br /&gt;
def nonempty_generator(generator):&lt;br /&gt;
	try:&lt;br /&gt;
		x = generator.next() # this is not good; it loses the first thing generated by the generator&lt;br /&gt;
		return True&lt;br /&gt;
	except StopIteration:&lt;br /&gt;
		return False&lt;br /&gt;
&lt;br /&gt;
def nonempty_iface(iface):&lt;br /&gt;
	if options.signals and nonempty_generator(iface.signals()):&lt;br /&gt;
		return True&lt;br /&gt;
	if nonempty_generator(iface.methods()):&lt;br /&gt;
		return True&lt;br /&gt;
	return False&lt;br /&gt;
	&lt;br /&gt;
def nonempty_object(obj, recursive = True):&lt;br /&gt;
	# Check wether an object has a method or a signal (of options.signals)&lt;br /&gt;
	# If recursive is True, then it will also return True if the object don't has any method nor signal but one of its child has&lt;br /&gt;
	try:&lt;br /&gt;
		for iface in obj.interfaces():&lt;br /&gt;
			if nonempty_iface(obj.interface(iface)):&lt;br /&gt;
				return  True&lt;br /&gt;
		&lt;br /&gt;
		if not recursive:&lt;br /&gt;
			return False&lt;br /&gt;
		&lt;br /&gt;
		for child in obj.children():&lt;br /&gt;
			if nonempty_object(obj.child(child)):&lt;br /&gt;
				return True&lt;br /&gt;
		&lt;br /&gt;
		return False&lt;br /&gt;
	except: # HACK: HAL returns a non-existent object in the list of chilren, ignore this error&lt;br /&gt;
		return False&lt;br /&gt;
&lt;br /&gt;
opts = OptionParser()&lt;br /&gt;
opts.add_option(&amp;quot;-a&amp;quot;, &amp;quot;--all&amp;quot;, help=&amp;quot;Equivalent to -u -e -s -t&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-c&amp;quot;, &amp;quot;--completion&amp;quot;, help=&amp;quot;Set this ON if you are ZSH&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-e&amp;quot;, &amp;quot;--empty&amp;quot;, help=&amp;quot;Also show empty services/objects&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-s&amp;quot;, &amp;quot;--signals&amp;quot;, help=&amp;quot;Also show signals&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-t&amp;quot;, &amp;quot;--activatables&amp;quot;, help=&amp;quot;Also show activatables services&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-u&amp;quot;, &amp;quot;--unnamed&amp;quot;, help=&amp;quot;Also show unnamed services (most likely clients)&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-y&amp;quot;, &amp;quot;--system-bus&amp;quot;, help=&amp;quot;Work on system bus instead of session bus&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
options, args = opts.parse_args()&lt;br /&gt;
if options.all:&lt;br /&gt;
	options.empty = options.signals = options.unnamed = options.activatables = True&lt;br /&gt;
&lt;br /&gt;
if options.system_bus:&lt;br /&gt;
	bus = dbus.SystemBus()&lt;br /&gt;
else:&lt;br /&gt;
	bus = dbus.SessionBus()&lt;br /&gt;
&lt;br /&gt;
if len(args) == 0:&lt;br /&gt;
	def nonempty_service(service):&lt;br /&gt;
		# A service is empty if all its (registered) objects are empty&lt;br /&gt;
		return nonempty_object(Object(bus, service, '/'))&lt;br /&gt;
	&lt;br /&gt;
	def named(service):&lt;br /&gt;
		return not service.startswith(':')&lt;br /&gt;
	&lt;br /&gt;
	dbusd = Object(bus, 'org.freedesktop.DBus', '/')&lt;br /&gt;
	services = dbusd.get_object().ListNames(dbus_interface = 'org.freedesktop.DBus')&lt;br /&gt;
	if options.activatables:&lt;br /&gt;
		services += dbusd.get_object().ListActivatableNames(dbus_interface = 'org.freedesktop.DBus')&lt;br /&gt;
	if not options.unnamed: # Delete unnamed services if needed&lt;br /&gt;
		services = filter(named, services)&lt;br /&gt;
	if not options.empty: # Delete empty services if needed&lt;br /&gt;
		services = filter(nonempty_service, services)&lt;br /&gt;
	&lt;br /&gt;
	for service in services:&lt;br /&gt;
		print service&lt;br /&gt;
elif len(args) == 1:&lt;br /&gt;
	def obj_path(obj):&lt;br /&gt;
		return obj.path&lt;br /&gt;
	&lt;br /&gt;
	def list_objects(root_obj):&lt;br /&gt;
		# Return a list of objects contained in root_obj, including root_obj&lt;br /&gt;
		# but excluding (including root_obj) empty objects if needed&lt;br /&gt;
		if not options.empty and not nonempty_object(root_obj):&lt;br /&gt;
			# The object and its children are empty, no need to continue&lt;br /&gt;
			return []&lt;br /&gt;
		if not options.empty and not nonempty_object(root_obj, False): &lt;br /&gt;
			# The object is empty but one of its children isn't, so continue&lt;br /&gt;
			result = []&lt;br /&gt;
		else:&lt;br /&gt;
			result = [root_obj]&lt;br /&gt;
		&lt;br /&gt;
		for child in root_obj.children():&lt;br /&gt;
			result.extend(list_objects(root_obj.child(child)))&lt;br /&gt;
		return result&lt;br /&gt;
	&lt;br /&gt;
	for obj in map(obj_path, list_objects(Object(bus, args[0], '/'))):&lt;br /&gt;
		print obj&lt;br /&gt;
elif len(args) == 2:&lt;br /&gt;
	def pprint(method, signal = False):&lt;br /&gt;
		def pprint_arg(arg):&lt;br /&gt;
			s = arg.signature&lt;br /&gt;
			n = arg.name&lt;br /&gt;
			x = s.tostring()&lt;br /&gt;
			if n:&lt;br /&gt;
				x += &amp;quot; &amp;quot; + n&lt;br /&gt;
			return x&lt;br /&gt;
		&lt;br /&gt;
		inargs = list(method.inargs())&lt;br /&gt;
		outargs = list(method.outargs())&lt;br /&gt;
		&lt;br /&gt;
		if signal:&lt;br /&gt;
			print &amp;quot; signal&amp;quot;,&lt;br /&gt;
		elif len(outargs) == 0:&lt;br /&gt;
			print &amp;quot; void&amp;quot;,&lt;br /&gt;
		else:&lt;br /&gt;
			print &amp;quot; &amp;quot; + &amp;quot;, &amp;quot;.join(map(pprint_arg, outargs)),&lt;br /&gt;
		&lt;br /&gt;
		print method.name + '(' + &amp;quot;, &amp;quot;.join(map(pprint_arg, inargs)) + ')'&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	obj = Object(bus, args[0], args[1])&lt;br /&gt;
	&lt;br /&gt;
	if options.completion:&lt;br /&gt;
		for ifname in obj.interfaces():&lt;br /&gt;
			iface = obj.interface(ifname)&lt;br /&gt;
			for x in iface.methods():&lt;br /&gt;
				print x&lt;br /&gt;
				print ifname + &amp;quot;.&amp;quot; + x&lt;br /&gt;
			if options.signals:&lt;br /&gt;
				for x in iface.signals():&lt;br /&gt;
					print x&lt;br /&gt;
					print ifname + &amp;quot;.&amp;quot; + x&lt;br /&gt;
	else:&lt;br /&gt;
		for ifname in obj.interfaces():&lt;br /&gt;
			iface = obj.interface(ifname)&lt;br /&gt;
			if not options.empty and not nonempty_iface(iface):&lt;br /&gt;
				continue&lt;br /&gt;
			print &amp;quot;Interface %s:&amp;quot; % ifname&lt;br /&gt;
			&lt;br /&gt;
			i = 0&lt;br /&gt;
			for methodname in iface.methods():&lt;br /&gt;
				pprint(iface.method(methodname))&lt;br /&gt;
				i += 1&lt;br /&gt;
			if i:&lt;br /&gt;
				print&lt;br /&gt;
			&lt;br /&gt;
			if not options.signals:&lt;br /&gt;
				if not i:&lt;br /&gt;
					print&lt;br /&gt;
				continue&lt;br /&gt;
			&lt;br /&gt;
			j = 0&lt;br /&gt;
			for signalname in iface.signals():&lt;br /&gt;
				pprint(iface.signal(signalname), True)&lt;br /&gt;
				j += 1&lt;br /&gt;
			if j or not i:&lt;br /&gt;
				print&lt;br /&gt;
else:&lt;br /&gt;
	def indent(level):&lt;br /&gt;
		sys.stdout.write(&amp;quot;  &amp;quot;*level)&lt;br /&gt;
&lt;br /&gt;
	def print_arg(arg, name):&lt;br /&gt;
		def dump(data, lvl):&lt;br /&gt;
			indent(lvl)&lt;br /&gt;
			&lt;br /&gt;
			if type(data) in (dbus.Struct, dbus.Array):&lt;br /&gt;
				print type(data).__name__&lt;br /&gt;
				for x in arg:&lt;br /&gt;
					dump(x, lvl + 1)&lt;br /&gt;
					print&lt;br /&gt;
			elif type(data) == dbus.Dictionary:&lt;br /&gt;
				print type(data).__name__&lt;br /&gt;
				for k, v in data.iteritems():&lt;br /&gt;
					dump(k, lvl+1)&lt;br /&gt;
					print &amp;quot;:&amp;quot;,&lt;br /&gt;
					dump(v, 0)&lt;br /&gt;
					print&lt;br /&gt;
			else:&lt;br /&gt;
				print data,&lt;br /&gt;
			&lt;br /&gt;
		if name:&lt;br /&gt;
			print name,&amp;quot;= &amp;quot;,&lt;br /&gt;
		dump(arg, 0)&lt;br /&gt;
		print&lt;br /&gt;
&lt;br /&gt;
	service, path, method = args[0:3]&lt;br /&gt;
	obj = Object(bus, service, path)&lt;br /&gt;
	args = args[3:]&lt;br /&gt;
	if &amp;quot;.&amp;quot; in method:&lt;br /&gt;
		iface, method = method.rsplit(&amp;quot;.&amp;quot;, 1)&lt;br /&gt;
	else:&lt;br /&gt;
		iface = None&lt;br /&gt;
		try:&lt;br /&gt;
			for iface in obj.interfaces():&lt;br /&gt;
				if method in list(obj.interface(iface).methods()):&lt;br /&gt;
					break&lt;br /&gt;
		except:&lt;br /&gt;
			raise&lt;br /&gt;
	&lt;br /&gt;
	if options.completion:&lt;br /&gt;
		try:&lt;br /&gt;
			for i, arg in enumerate(obj.interface(iface).method(method).inargs()):&lt;br /&gt;
				if i == len(args):&lt;br /&gt;
					print arg.signature.tostring(),&lt;br /&gt;
					if arg.name:&lt;br /&gt;
						print arg.name,&lt;br /&gt;
					print&lt;br /&gt;
		except:&lt;br /&gt;
			pass&lt;br /&gt;
		&lt;br /&gt;
		sys.exit(0)&lt;br /&gt;
	&lt;br /&gt;
	args2 = []&lt;br /&gt;
	for arg in args:&lt;br /&gt;
		if len(arg) &amp;gt;= 2 and arg[0] == '%':&lt;br /&gt;
			if arg[1] == '%':&lt;br /&gt;
				args2.append('%' + arg[2:])&lt;br /&gt;
			else:&lt;br /&gt;
				args2.append(eval(arg[1:], {}))&lt;br /&gt;
		else:&lt;br /&gt;
			args2.append(arg)&lt;br /&gt;
	args = args2&lt;br /&gt;
	&lt;br /&gt;
	ret = obj.get_object().get_dbus_method(method, iface)(*args)&lt;br /&gt;
	try:&lt;br /&gt;
		outargs = list(obj.method(method, iface).outargs())&lt;br /&gt;
	except:&lt;br /&gt;
		outargs = []&lt;br /&gt;
	&lt;br /&gt;
	if not isinstance(ret, tuple) or isinstance(ret, dbus.Struct):&lt;br /&gt;
		ret = (ret,)&lt;br /&gt;
	&lt;br /&gt;
	for i, arg in enumerate(ret):&lt;br /&gt;
		if len(outargs) &amp;gt; i:&lt;br /&gt;
			print_arg(arg, outargs[i].name)&lt;br /&gt;
		else:&lt;br /&gt;
			print_arg(arg, None)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Introspecting_Dbus&amp;diff=9220</id>
		<title>Introspecting Dbus</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Introspecting_Dbus&amp;diff=9220"/>
		<updated>2010-02-28T09:17:49Z</updated>

		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__ &lt;br /&gt;
&lt;br /&gt;
=Palm/DBUS Namspaces=&lt;br /&gt;
&lt;br /&gt;
(these should be split up into Palm and 3rd-party lists at some point)&lt;br /&gt;
{{article-three-columns&lt;br /&gt;
|width1=30%&lt;br /&gt;
|width2=30%&lt;br /&gt;
|column1=&lt;br /&gt;
* com.palm.accounts&lt;br /&gt;
* com.palm.accountservices&lt;br /&gt;
* com.palm.amazon&lt;br /&gt;
* com.palm.applicationManager&lt;br /&gt;
* com.palm.audio&lt;br /&gt;
* com.palm.bluetooth&lt;br /&gt;
* com.palm.browserServer&lt;br /&gt;
* com.palm.bus&lt;br /&gt;
* com.palm.calendar&lt;br /&gt;
* com.palm.certificatemanager&lt;br /&gt;
* com.palm.connectionmanager&lt;br /&gt;
* com.palm.contacts&lt;br /&gt;
* com.palm.crotest&lt;br /&gt;
* com.palm.customization&lt;br /&gt;
* com.palm.data.carriernetworksettings&lt;br /&gt;
&lt;br /&gt;
|column2=&lt;br /&gt;
* com.palm.dataimport&lt;br /&gt;
* com.palm.deviceprofile&lt;br /&gt;
* com.palm.display&lt;br /&gt;
* com.palm.downloadmanager&lt;br /&gt;
* com.palm.hidd&lt;br /&gt;
* com.palm.keys&lt;br /&gt;
* com.palm.location&lt;br /&gt;
* com.palm.lunabus&lt;br /&gt;
* com.palm.mail&lt;br /&gt;
* com.palm.mediadb&lt;br /&gt;
* com.palm.mediaevents&lt;br /&gt;
* com.palm.messaging&lt;br /&gt;
* com.palm.office&lt;br /&gt;
* com.palm.omadm&lt;br /&gt;
* com.palm.pdf&lt;br /&gt;
&lt;br /&gt;
|column3=&lt;br /&gt;
* com.palm.photos&lt;br /&gt;
* com.palm.pimsync&lt;br /&gt;
* com.palm.power&lt;br /&gt;
* com.palm.provisioning&lt;br /&gt;
* com.palm.preferences&lt;br /&gt;
* com.palm.superlog&lt;br /&gt;
* com.palm.systemmanager&lt;br /&gt;
* com.palm.systemservice&lt;br /&gt;
* com.palm.taskScheduler&lt;br /&gt;
* com.palm.telephony&lt;br /&gt;
* com.palm.update&lt;br /&gt;
* com.palm.wan&lt;br /&gt;
* com.palm.wifi&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
=Python Code=&lt;br /&gt;
&lt;br /&gt;
Below is a Python app (shamelessly ripped from http://code.google.com/p/dbus-tools/wiki/DBusCli) for doing some dbus introspection...&lt;br /&gt;
&lt;br /&gt;
Use the link above for usage help.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import dbus, sys&lt;br /&gt;
from xml.dom import minidom&lt;br /&gt;
from optparse import OptionParser&lt;br /&gt;
&lt;br /&gt;
class Signature(dbus.Signature):&lt;br /&gt;
	def Variant(x):&lt;br /&gt;
		return x&lt;br /&gt;
	&lt;br /&gt;
	_dbus_types = {&lt;br /&gt;
		&amp;quot;{&amp;quot;: dbus.Dictionary,&lt;br /&gt;
		&amp;quot;(&amp;quot;: dbus.Struct,&lt;br /&gt;
		&amp;quot;a&amp;quot;: dbus.Array, &lt;br /&gt;
		&amp;quot;y&amp;quot;: dbus.Byte,&lt;br /&gt;
		&amp;quot;b&amp;quot;: dbus.Boolean,&lt;br /&gt;
		&amp;quot;n&amp;quot;: dbus.Int16,&lt;br /&gt;
		&amp;quot;q&amp;quot;: dbus.UInt16,&lt;br /&gt;
		&amp;quot;i&amp;quot;: dbus.Int32,&lt;br /&gt;
		&amp;quot;u&amp;quot;: dbus.UInt32,&lt;br /&gt;
		&amp;quot;x&amp;quot;: dbus.Int64,&lt;br /&gt;
		&amp;quot;t&amp;quot;: dbus.UInt64,&lt;br /&gt;
		&amp;quot;d&amp;quot;: dbus.Double,&lt;br /&gt;
		&amp;quot;s&amp;quot;: dbus.String,&lt;br /&gt;
		&amp;quot;o&amp;quot;: dbus.ObjectPath,&lt;br /&gt;
		&amp;quot;g&amp;quot;: dbus.Signature,&lt;br /&gt;
		&amp;quot;v&amp;quot;: Variant }&lt;br /&gt;
	&lt;br /&gt;
	def __iter__(self):&lt;br /&gt;
		return ( Signature(x) for x in dbus.Signature.__iter__(self) )&lt;br /&gt;
	&lt;br /&gt;
	def get_type(self):&lt;br /&gt;
		return self._dbus_types[self[0]]&lt;br /&gt;
	&lt;br /&gt;
	def container_type(self):&lt;br /&gt;
		if self.startswith(&amp;quot;(&amp;quot;): return dbus.Struct&lt;br /&gt;
		elif self.startswith(&amp;quot;a{&amp;quot;): return dbus.Dictionary&lt;br /&gt;
		elif self.startswith(&amp;quot;a&amp;quot;): return dbus.Array&lt;br /&gt;
		else: return None&lt;br /&gt;
	&lt;br /&gt;
	def container_content(self):&lt;br /&gt;
		if self.container_type() == dbus.Struct: return Signature(self[1:-1])&lt;br /&gt;
		elif self.container_type() == dbus.Dictionary: return Signature(self[2:-1])&lt;br /&gt;
		elif self.container_type() == dbus.Array: return Signature(self[1:])&lt;br /&gt;
		else: return None&lt;br /&gt;
	&lt;br /&gt;
	def tostring(self):&lt;br /&gt;
		if len(tuple(self)) &amp;gt; 1:&lt;br /&gt;
			return &amp;quot;, &amp;quot;.join( x.tostring() for x in self )&lt;br /&gt;
		&lt;br /&gt;
		t, c = self.container_type(), self.container_content()&lt;br /&gt;
		if t is None:&lt;br /&gt;
			return self.get_type().__name__&lt;br /&gt;
		elif t == dbus.Array:&lt;br /&gt;
			return c.tostring() + &amp;quot;[]&amp;quot;&lt;br /&gt;
		else:&lt;br /&gt;
			return t.__name__ + &amp;quot; {&amp;quot; + c.tostring() + &amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Object(object):&lt;br /&gt;
	class XMLChild(object):&lt;br /&gt;
		def __init__(self, obj, name):&lt;br /&gt;
			self.obj = obj&lt;br /&gt;
			self.name = name&lt;br /&gt;
			self.xml = None&lt;br /&gt;
		&lt;br /&gt;
		def node(self):&lt;br /&gt;
			if not self.xml:&lt;br /&gt;
				for iface in self.parent().getElementsByTagName(self.tag):&lt;br /&gt;
					if iface.getAttribute('name') == self.name:&lt;br /&gt;
						self.xml = iface&lt;br /&gt;
						return self.xml&lt;br /&gt;
			&lt;br /&gt;
			return self.xml&lt;br /&gt;
		&lt;br /&gt;
		def children(self, tag):&lt;br /&gt;
			for method in self.node().getElementsByTagName(tag):&lt;br /&gt;
				name = method.getAttribute('name')&lt;br /&gt;
				if name:&lt;br /&gt;
					yield name&lt;br /&gt;
	&lt;br /&gt;
	class Interface(XMLChild):&lt;br /&gt;
		tag = &amp;quot;interface&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def parent(self):&lt;br /&gt;
			return self.obj.introspect()&lt;br /&gt;
		&lt;br /&gt;
		def methods(self):&lt;br /&gt;
			return self.children('method')&lt;br /&gt;
		&lt;br /&gt;
		def signals(self):&lt;br /&gt;
			return self.children('signal')&lt;br /&gt;
		&lt;br /&gt;
		def method(self, name):&lt;br /&gt;
			return self.obj.method(name, self.name)&lt;br /&gt;
		&lt;br /&gt;
		def signal(self, name):&lt;br /&gt;
			return self.obj.signal(name, self.name)&lt;br /&gt;
	&lt;br /&gt;
	class MethodSignal(XMLChild):&lt;br /&gt;
		class Argument:&lt;br /&gt;
			def __getattr__(self, x):&lt;br /&gt;
				return self.xml.getAttribute(x)&lt;br /&gt;
		&lt;br /&gt;
		def __init__(self, obj, name, iface):&lt;br /&gt;
			Object.XMLChild.__init__(self, obj, name)&lt;br /&gt;
			self.iface = iface&lt;br /&gt;
		&lt;br /&gt;
		def parent(self):&lt;br /&gt;
			return self.obj.interface(self.iface).node()&lt;br /&gt;
			&lt;br /&gt;
		def args(self):&lt;br /&gt;
			for arg in self.node().getElementsByTagName(&amp;quot;arg&amp;quot;):&lt;br /&gt;
				argobj = Object.MethodSignal.Argument()&lt;br /&gt;
				argobj.xml = arg&lt;br /&gt;
				assert(argobj.type)&lt;br /&gt;
				argobj.signature = Signature(argobj.type)&lt;br /&gt;
				yield argobj&lt;br /&gt;
	&lt;br /&gt;
	class Method(MethodSignal):&lt;br /&gt;
		tag = &amp;quot;method&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def inargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				if arg.direction == &amp;quot;in&amp;quot;:&lt;br /&gt;
					yield arg&lt;br /&gt;
	&lt;br /&gt;
		def outargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				if arg.direction == &amp;quot;out&amp;quot;:&lt;br /&gt;
					yield arg&lt;br /&gt;
	&lt;br /&gt;
	class Signal(MethodSignal):&lt;br /&gt;
		tag = &amp;quot;signal&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		def outargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				if arg.direction == &amp;quot;out&amp;quot;:&lt;br /&gt;
					assert(0)&lt;br /&gt;
			return []&lt;br /&gt;
		&lt;br /&gt;
		def inargs(self):&lt;br /&gt;
			for arg in self.args():&lt;br /&gt;
				assert(not arg.direction or arg.direction == &amp;quot;in&amp;quot;)&lt;br /&gt;
				yield arg&lt;br /&gt;
	&lt;br /&gt;
	def __init__(self, bus, service, path):&lt;br /&gt;
		self.bus = bus&lt;br /&gt;
		self.service = service&lt;br /&gt;
		self.path = path&lt;br /&gt;
		self.object = None&lt;br /&gt;
		self.intr_data = None&lt;br /&gt;
		self.cached_childrens = {}&lt;br /&gt;
		self.cached_interfaces = {}&lt;br /&gt;
		self.cached_methods = {}&lt;br /&gt;
		self.cached_signals = {}&lt;br /&gt;
	&lt;br /&gt;
	def get_object(self):&lt;br /&gt;
		if not self.object:&lt;br /&gt;
			self.object = self.bus.get_object(self.service, self.path)&lt;br /&gt;
		return self.object&lt;br /&gt;
	&lt;br /&gt;
	def introspect(self):&lt;br /&gt;
		if not self.intr_data:&lt;br /&gt;
			self.intr_data = minidom.parseString(self.get_object().Introspect())&lt;br /&gt;
		return self.intr_data&lt;br /&gt;
	&lt;br /&gt;
	def children(self):&lt;br /&gt;
		intr_data = self.introspect()&lt;br /&gt;
		for node in intr_data.getElementsByTagName('node'):&lt;br /&gt;
			name = node.getAttribute(&amp;quot;name&amp;quot;)&lt;br /&gt;
			if node == intr_data.documentElement or not name:&lt;br /&gt;
				continue&lt;br /&gt;
			else:&lt;br /&gt;
				yield name&lt;br /&gt;
	&lt;br /&gt;
	def interfaces(self):&lt;br /&gt;
		for node in self.introspect().getElementsByTagName('interface'):&lt;br /&gt;
			name = node.getAttribute(&amp;quot;name&amp;quot;)&lt;br /&gt;
			if name:&lt;br /&gt;
				yield name&lt;br /&gt;
	&lt;br /&gt;
	def methods(self, iface):&lt;br /&gt;
		return self.interface(iface).methods()&lt;br /&gt;
	&lt;br /&gt;
	def signals(self, iface):&lt;br /&gt;
		return self.interface(iface).signals()&lt;br /&gt;
	&lt;br /&gt;
	def _cached(self, list, name, constr, *constr_args):&lt;br /&gt;
		if not (name in list):&lt;br /&gt;
			list[name] = constr(*constr_args)&lt;br /&gt;
		return list[name]&lt;br /&gt;
	&lt;br /&gt;
	def child(self, name):&lt;br /&gt;
		if self.path == '/':&lt;br /&gt;
			full_name = '/' + name&lt;br /&gt;
		else:&lt;br /&gt;
			full_name = self.path + '/' + name&lt;br /&gt;
		return self._cached(self.cached_childrens, full_name, Object, self.bus, self.service, full_name)&lt;br /&gt;
	&lt;br /&gt;
	def interface(self, name):&lt;br /&gt;
		return self._cached(self.cached_interfaces, name, Object.Interface, self, name)&lt;br /&gt;
	&lt;br /&gt;
	def method(self, name, iface):&lt;br /&gt;
		full_name = iface + '.' + name&lt;br /&gt;
		return self._cached(self.cached_methods, full_name, Object.Method, self, name, iface)&lt;br /&gt;
	&lt;br /&gt;
	def signal(self, name, iface):&lt;br /&gt;
		full_name = iface + '.' + name&lt;br /&gt;
		return self._cached(self.cached_methods, full_name, Object.Signal, self, name, iface)&lt;br /&gt;
&lt;br /&gt;
def nonempty_generator(generator):&lt;br /&gt;
	try:&lt;br /&gt;
		x = generator.next()&lt;br /&gt;
		return True&lt;br /&gt;
	except StopIteration:&lt;br /&gt;
		return False&lt;br /&gt;
&lt;br /&gt;
def nonempty_iface(iface):&lt;br /&gt;
	if options.signals and nonempty_generator(iface.signals()):&lt;br /&gt;
		return True&lt;br /&gt;
	if nonempty_generator(iface.methods()):&lt;br /&gt;
		return True&lt;br /&gt;
	return False&lt;br /&gt;
	&lt;br /&gt;
def nonempty_object(obj, recursive = True):&lt;br /&gt;
	# Check wether an object has a method or a signal (of options.signals)&lt;br /&gt;
	# If recursive is True, then it will also return True if the object don't has any method nor signal but one of its child has&lt;br /&gt;
	try:&lt;br /&gt;
		for iface in obj.interfaces():&lt;br /&gt;
			if nonempty_iface(obj.interface(iface)):&lt;br /&gt;
				return  True&lt;br /&gt;
		&lt;br /&gt;
		if not recursive:&lt;br /&gt;
			return False&lt;br /&gt;
		&lt;br /&gt;
		for child in obj.children():&lt;br /&gt;
			if nonempty_object(obj.child(child)):&lt;br /&gt;
				return True&lt;br /&gt;
		&lt;br /&gt;
		return False&lt;br /&gt;
	except: # HACK: HAL returns a non-existent object in the list of chilren, ignore this error&lt;br /&gt;
		return False&lt;br /&gt;
&lt;br /&gt;
opts = OptionParser()&lt;br /&gt;
opts.add_option(&amp;quot;-a&amp;quot;, &amp;quot;--all&amp;quot;, help=&amp;quot;Equivalent to -u -e -s -t&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-c&amp;quot;, &amp;quot;--completion&amp;quot;, help=&amp;quot;Set this ON if you are ZSH&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-e&amp;quot;, &amp;quot;--empty&amp;quot;, help=&amp;quot;Also show empty services/objects&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-s&amp;quot;, &amp;quot;--signals&amp;quot;, help=&amp;quot;Also show signals&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-t&amp;quot;, &amp;quot;--activatables&amp;quot;, help=&amp;quot;Also show activatables services&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-u&amp;quot;, &amp;quot;--unnamed&amp;quot;, help=&amp;quot;Also show unnamed services (most likely clients)&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
opts.add_option(&amp;quot;-y&amp;quot;, &amp;quot;--system-bus&amp;quot;, help=&amp;quot;Work on system bus instead of session bus&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False)&lt;br /&gt;
options, args = opts.parse_args()&lt;br /&gt;
if options.all:&lt;br /&gt;
	options.empty = options.signals = options.unnamed = options.activatables = True&lt;br /&gt;
&lt;br /&gt;
if options.system_bus:&lt;br /&gt;
	bus = dbus.SystemBus()&lt;br /&gt;
else:&lt;br /&gt;
	bus = dbus.SessionBus()&lt;br /&gt;
&lt;br /&gt;
if len(args) == 0:&lt;br /&gt;
	def nonempty_service(service):&lt;br /&gt;
		# A service is empty if all its (registered) objects are empty&lt;br /&gt;
		return nonempty_object(Object(bus, service, '/'))&lt;br /&gt;
	&lt;br /&gt;
	def named(service):&lt;br /&gt;
		return not service.startswith(':')&lt;br /&gt;
	&lt;br /&gt;
	dbusd = Object(bus, 'org.freedesktop.DBus', '/')&lt;br /&gt;
	services = dbusd.get_object().ListNames(dbus_interface = 'org.freedesktop.DBus')&lt;br /&gt;
	if options.activatables:&lt;br /&gt;
		services += dbusd.get_object().ListActivatableNames(dbus_interface = 'org.freedesktop.DBus')&lt;br /&gt;
	if not options.unnamed: # Delete unnamed services if needed&lt;br /&gt;
		services = filter(named, services)&lt;br /&gt;
	if not options.empty: # Delete empty services if needed&lt;br /&gt;
		services = filter(nonempty_service, services)&lt;br /&gt;
	&lt;br /&gt;
	for service in services:&lt;br /&gt;
		print service&lt;br /&gt;
elif len(args) == 1:&lt;br /&gt;
	def obj_path(obj):&lt;br /&gt;
		return obj.path&lt;br /&gt;
	&lt;br /&gt;
	def list_objects(root_obj):&lt;br /&gt;
		# Return a list of objects contained in root_obj, including root_obj&lt;br /&gt;
		# but excluding (including root_obj) empty objects if needed&lt;br /&gt;
		if not options.empty and not nonempty_object(root_obj):&lt;br /&gt;
			# The object and its children are empty, no need to continue&lt;br /&gt;
			return []&lt;br /&gt;
		if not options.empty and not nonempty_object(root_obj, False): &lt;br /&gt;
			# The object is empty but one of its children isn't, so continue&lt;br /&gt;
			result = []&lt;br /&gt;
		else:&lt;br /&gt;
			result = [root_obj]&lt;br /&gt;
		&lt;br /&gt;
		for child in root_obj.children():&lt;br /&gt;
			result.extend(list_objects(root_obj.child(child)))&lt;br /&gt;
		return result&lt;br /&gt;
	&lt;br /&gt;
	for obj in map(obj_path, list_objects(Object(bus, args[0], '/'))):&lt;br /&gt;
		print obj&lt;br /&gt;
elif len(args) == 2:&lt;br /&gt;
	def pprint(method, signal = False):&lt;br /&gt;
		def pprint_arg(arg):&lt;br /&gt;
			s = arg.signature&lt;br /&gt;
			n = arg.name&lt;br /&gt;
			x = s.tostring()&lt;br /&gt;
			if n:&lt;br /&gt;
				x += &amp;quot; &amp;quot; + n&lt;br /&gt;
			return x&lt;br /&gt;
		&lt;br /&gt;
		inargs = list(method.inargs())&lt;br /&gt;
		outargs = list(method.outargs())&lt;br /&gt;
		&lt;br /&gt;
		if signal:&lt;br /&gt;
			print &amp;quot; signal&amp;quot;,&lt;br /&gt;
		elif len(outargs) == 0:&lt;br /&gt;
			print &amp;quot; void&amp;quot;,&lt;br /&gt;
		else:&lt;br /&gt;
			print &amp;quot; &amp;quot; + &amp;quot;, &amp;quot;.join(map(pprint_arg, outargs)),&lt;br /&gt;
		&lt;br /&gt;
		print method.name + '(' + &amp;quot;, &amp;quot;.join(map(pprint_arg, inargs)) + ')'&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	obj = Object(bus, args[0], args[1])&lt;br /&gt;
	&lt;br /&gt;
	if options.completion:&lt;br /&gt;
		for ifname in obj.interfaces():&lt;br /&gt;
			iface = obj.interface(ifname)&lt;br /&gt;
			for x in iface.methods():&lt;br /&gt;
				print x&lt;br /&gt;
				print ifname + &amp;quot;.&amp;quot; + x&lt;br /&gt;
			if options.signals:&lt;br /&gt;
				for x in iface.signals():&lt;br /&gt;
					print x&lt;br /&gt;
					print ifname + &amp;quot;.&amp;quot; + x&lt;br /&gt;
	else:&lt;br /&gt;
		for ifname in obj.interfaces():&lt;br /&gt;
			iface = obj.interface(ifname)&lt;br /&gt;
			if not options.empty and not nonempty_iface(iface):&lt;br /&gt;
				continue&lt;br /&gt;
			print &amp;quot;Interface %s:&amp;quot; % ifname&lt;br /&gt;
			&lt;br /&gt;
			i = 0&lt;br /&gt;
			for methodname in iface.methods():&lt;br /&gt;
				pprint(iface.method(methodname))&lt;br /&gt;
				i += 1&lt;br /&gt;
			if i:&lt;br /&gt;
				print&lt;br /&gt;
			&lt;br /&gt;
			if not options.signals:&lt;br /&gt;
				if not i:&lt;br /&gt;
					print&lt;br /&gt;
				continue&lt;br /&gt;
			&lt;br /&gt;
			j = 0&lt;br /&gt;
			for signalname in iface.signals():&lt;br /&gt;
				pprint(iface.signal(signalname), True)&lt;br /&gt;
				j += 1&lt;br /&gt;
			if j or (not j and not i):&lt;br /&gt;
				print&lt;br /&gt;
else:&lt;br /&gt;
	def indent(level):&lt;br /&gt;
		sys.stdout.write(&amp;quot;  &amp;quot;*level)&lt;br /&gt;
&lt;br /&gt;
	def print_arg(arg, name):&lt;br /&gt;
		def dump(data, lvl):&lt;br /&gt;
			indent(lvl)&lt;br /&gt;
			&lt;br /&gt;
			if type(data) in (dbus.Struct, dbus.Array):&lt;br /&gt;
				print type(data).__name__&lt;br /&gt;
				for x in arg:&lt;br /&gt;
					dump(x, lvl + 1)&lt;br /&gt;
					print&lt;br /&gt;
			elif type(data) == dbus.Dictionary:&lt;br /&gt;
				print type(data).__name__&lt;br /&gt;
				for k, v in data.iteritems():&lt;br /&gt;
					dump(k, lvl+1)&lt;br /&gt;
					print &amp;quot;:&amp;quot;,&lt;br /&gt;
					dump(v, 0)&lt;br /&gt;
					print&lt;br /&gt;
			else:&lt;br /&gt;
				print data,&lt;br /&gt;
			&lt;br /&gt;
		if name:&lt;br /&gt;
			print name,&amp;quot;= &amp;quot;,&lt;br /&gt;
		dump(arg, 0)&lt;br /&gt;
		print&lt;br /&gt;
&lt;br /&gt;
	service, path, method = args[0:3]&lt;br /&gt;
	obj = Object(bus, service, path)&lt;br /&gt;
	args = args[3:]&lt;br /&gt;
	if &amp;quot;.&amp;quot; in method:&lt;br /&gt;
		iface, method = method.rsplit(&amp;quot;.&amp;quot;, 1)&lt;br /&gt;
	else:&lt;br /&gt;
		iface = None&lt;br /&gt;
		try:&lt;br /&gt;
			for iface in obj.interfaces():&lt;br /&gt;
				if method in list(obj.interface(iface).methods()):&lt;br /&gt;
					break&lt;br /&gt;
		except:&lt;br /&gt;
			raise&lt;br /&gt;
	&lt;br /&gt;
	if options.completion:&lt;br /&gt;
		try:&lt;br /&gt;
			for i, arg in enumerate(obj.interface(iface).method(method).inargs()):&lt;br /&gt;
				if i == len(args):&lt;br /&gt;
					print arg.signature.tostring(),&lt;br /&gt;
					if arg.name:&lt;br /&gt;
						print arg.name,&lt;br /&gt;
					print&lt;br /&gt;
		except:&lt;br /&gt;
			pass&lt;br /&gt;
		&lt;br /&gt;
		sys.exit(0)&lt;br /&gt;
	&lt;br /&gt;
	args2 = []&lt;br /&gt;
	for arg in args:&lt;br /&gt;
		if len(arg) &amp;gt;= 2 and arg[0] == '%':&lt;br /&gt;
			if arg[1] == '%':&lt;br /&gt;
				args2.append('%' + arg[2:])&lt;br /&gt;
			else:&lt;br /&gt;
				args2.append(eval(arg[1:], {}))&lt;br /&gt;
		else:&lt;br /&gt;
			args2.append(arg)&lt;br /&gt;
	args = args2&lt;br /&gt;
	&lt;br /&gt;
	ret = obj.get_object().get_dbus_method(method, iface)(*args)&lt;br /&gt;
	try:&lt;br /&gt;
		outargs = list(obj.method(method, iface).outargs())&lt;br /&gt;
	except:&lt;br /&gt;
		outargs = []&lt;br /&gt;
	&lt;br /&gt;
	if not isinstance(ret, tuple) or isinstance(ret, dbus.Struct):&lt;br /&gt;
		ret = (ret,)&lt;br /&gt;
	&lt;br /&gt;
	for i, arg in enumerate(ret):&lt;br /&gt;
		if len(outargs) &amp;gt; i:&lt;br /&gt;
			print_arg(arg, outargs[i].name)&lt;br /&gt;
		else:&lt;br /&gt;
			print_arg(arg, None)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>
	</entry>
</feed>