On Wednesday 30 November 2005 15:41, Danny Pansters wrote: > Hi, > > I'm working on a PyKDE app and have been adding a dcop interface like such: > > def __init__(self, obj, id): > DCOPExObj.__init__(self, id) > self.addMethod("void quit()", obj.slotQuit) > > where obj is the mainwindow instance that has all the relevant methods > (most equal actions). > > Using kdcop and the dcop CLI, it seems that although the methods are > executed alright, kdcop complains: "DCOP call failed. Application is still > registered with DCOP; I do not know why this call failed." And on the > console: > > Traceback (most recent call last): > File "/usr/local/lib/python2.4/site-packages/dcopexport.py", line 96, in > process > dcop_add (s, result) > TypeError: argument 2 of dcop_add() has an invalid type > > When trying with example_decopexport.py the same happens with the set > method (the gets work OK), e.g. > > %dcop petshop-46787 "dead parrot" setParrotType "Big Bird" > call failed > %dcop petshop-46787 "dead parrot" getParrotType > Big Bird > > I think dcopexport.py has a bug when a void or otherwise non-QString(List) > type is returned? > > System: FreeBSD-6.0, KDE 3.4.3, PyKDE 20051013
The error appears to be in extensions/dcopexport.py (or site-packages/dcopexport.py after installation). The code (around line 96) that marshalls the return values doesn't handle a 'void' return correctly. I think this is something related either to KDE or sip versions being used, because it doesn't throw an error with sip 4.1.1/KDE 3.3 but does with sip 4.3/KDE 3.4, although the error I get is "can't use None as argument 1" in the same line. The easiet fix is in dcopexport.py. Insert the # marked if statement at line 88 and indent the block beginning with "s =" #marshall the result as 'replyData' if self.method.rtype != "void": ###### s = QDataStream (replyData, IO_WriteOnly) if self.method.rtype in numericTypes: dcop_add (s, result, self.method.rtype) elif self.method.rtype in stringTypes and isinstance (result, str): dcop_add (s, eval ("%s('''%s''')" % (self.method.rtype, result))) elif self.method.rtype.startswith ("QMap") or self.method.rtype.startswith ("QValueList"): dcop_add (params, args [i], self.argtypes [i]) else: dcop_add (s, result) Make sure you modify the 'site-packages' version of the file (don't need to reinstall then). That works for me - let me know if it works for you. Jim _______________________________________________ PyKDE mailing list PyKDE@mats.imk.fraunhofer.de http://mats.imk.fraunhofer.de/mailman/listinfo/pykde