import gimp, gimpplugin
from gimpenums import *
pdb = gimp.pdb
import gobject, dbus.service  , os                                             
from dbus.mainloop.glib import DBusGMainLoop                      
DBusGMainLoop(set_as_default=True)

class DBusWrapper(dbus.service.Object):
    @dbus.service.method('org.gimp.GIMP.DBus',
                         in_signature='', out_signature='as')
    def image_list(self):
        return [str(img.ID) for img in gimp.image_list()]
    @dbus.service.method('org.gimp.GIMP.DBus',
                         in_signature='ss', out_signature='')
    def save_as(self, imgid, filename):
        imgs = [img for img in gimp.image_list() if str(img.ID) == imgid]
        if not imgs:
            raise "No such image %s" % imgid
        img = imgs[0]
        nimg = img.duplicate()
        drawable = nimg.flatten()
        pdb.gimp_file_save(nimg, drawable, filename, os.path.split(filename)[1])
        gimp.delete(nimg)

class DBusWrapperPlugin(gimpplugin.plugin):
    def start(self):
        gimp.main(self.init, self.quit, self.query, self._run)

    def query(self):
        """Install our DBus wrapper starter function as an 'automatic' extension.
           As per http://developer.gimp.org/api/2.0/libgimp/libgimp-gimp.html#gimp-install-procedure
           a GIMP_EXTENSION procedure with no parameters (n_params == 0 and 
             params == NULL) is an "automatic" extension that will be 
             automatically started on each GIMP startup.
        """
        gimp.install_procedure(
            "dbuswrapperstartup",
            "Provide a D-Bus wrapper for some Gimp pdb functions",
            "", "Stuart Langridge", "Stuart Langridge", "2007", 
            None,  # no menu label reqd because we're startup
            "", 
            EXTENSION, # we are an extension not a plugin, so we can block
            [], []) # params is empty list, so we get run on startup not by menu

    def dbuswrapperstartup(self):
        "Create our wrapper object on the session bus and then loop forever"
        dbw = DBusWrapper()
        dbw.add_to_connection (dbus.Bus.get_session(), '/') # object path /
        dbus_name = dbus.service.BusName ('org.gimp.GIMP.DBus', 
            bus = dbus.Bus.get_session())
        loop = gobject.MainLoop()
        gimp.extension_ack() # we are an extension, so we can block
        # run a mainloop so d-bus works
        loop.run()

if __name__ == '__main__':
    DBusWrapperPlugin().start()
