from gettext import gettext as _ import logging import sha import socket import struct import gtk import gobject import gconf import dbus import time from datetime import date from sugar.graphics.icon import get_icon_state, Icon from sugar.graphics import style from sugar.graphics.palette import Palette from sugar.graphics.toolbutton import ToolButton from sugar.graphics.tray import TrayIcon from sugar.graphics import xocolor from sugar.util import unique_id from sugar.graphics.menuitem import MenuItem from sugar import profile from jarabe.frame.frameinvoker import FrameWidgetInvoker from printscript import * _HAL_SERVICE = 'org.freedesktop.Hal' _HAL_IFACE = 'org.freedesktop.Hal.Manager' _HAL_PATH = '/org/freedesktop/Hal/Manager' _PRINTER_SERVICE = 'org.freedesktop.Hal' _PRINTER_PATH = '' _PRINTER_IFACE = 'org.freedesktop.Hal.Device' _SPOOLER_PATH="/com/redhat/PrinterSpooler" _SPOOLER_IFACE="com.redhat.PrinterSpooler" #_PRINTER_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device' _ICON_NAME = 'printer' class PrinterPalette(Palette): def __init__(self,name,): Palette.__init__(self, label=_('Printer')) self._model = DeviceModel() logging.debug("hey this is 1" ) self._hbars = {} self._indexToidmapper = [] self.tryJobs() self.props.secondary_text = name self.connectEvents() def connectEvents(self): for key in self._hbars.keys(): self._hbars[key].connect('activate',self.cancel,key) #logging.debug("hey this got deleted %s",key) def clearMenu(self): for key in self._hbars.keys(): self.menu.remove(self._hbars[key]) del self._hbars[key] def tryJobs(self): self.clearMenu() self._jobids = self._model.GetLiveJobs()[0] self._jobids.sort() try: for jobid in self._jobids: logging.debug(self._model.GetJobStatus(jobid)) status=self._model.GetJobStatus(jobid) title = self._model.GetJobTitle(jobid) self.createHBars(status,title,jobid) self._indexToidmapper.append(jobid) except TypeError: pass def cancel(self,widget,key): self._model.CancelAJob(key) self.menu.remove(self._hbars[key]) #self.connectEvents(self) del self._hbars[key] def createHBars(self,status,title,jobid): self._cancel = MenuItem('') self._icon = Icon(icon_size=gtk.ICON_SIZE_MENU) self._cancel.set_image(self._icon) self._icon.props.icon_name = 'dialog-cancel' self._cancel.get_child().set_text ('Document:' + title + '\n' + status) self.menu.append(self._cancel) self._cancel.show() self._hbars[jobid]= self._cancel def redraw(self): logging.debug("I come from class 1") self._model.update() self.tryJobs() self.connectEvents() class DeviceModel(): def __init__(self): self._cups = serverConnection() self.update() def GetLiveJobs(self,): return [self.livejobsKeys, self.livejobsDict] def GetJobStatus(self,jobkey): if self.livejobsDict[jobkey]["job-state"] == 5: return "Processing" elif self.livejobsDict[jobkey]["job-state"] == 3: return "Pending" else: return "Cancelled" def GetJobTitle(self,jobkey): return self.livejobsDict[jobkey]["job-name"] def CancelAJob(self,jobkey): logging.debug("lololol") logging.debug(jobkey) self._cups._cancelAJob(jobkey) def update(self,): self.livejobsDict = self._cups._getLiveJobQueue() self.livejobsKeys = self.livejobsDict.keys() class PrinterDeviceView(TrayIcon): FRAME_POSITION_RELATIVE = 301 def __init__(self,name): client = gconf.client_get_default() sh = sha.new() data = profile.get_nick_name() sh.update(data) h = hash(sh.digest()) idx = h % len(xocolor.colors) color = xocolor.XoColor('%s,%s' % (xocolor.colors[idx][0], xocolor.colors[idx][1])) TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=color) self.set_palette_invoker(FrameWidgetInvoker(self)) self._palette = PrinterPalette(name) self.set_palette(self._palette) self._palette.set_group_id('frame') logging.debug('I come from PrinterDeviceView') def update_queue(self): logging.debug("I come from class 2") try: gobject.source_remove(self.timer) except AttributeError: pass self.timer = gobject.timeout_add (500,self._palette.redraw) #self._palette.redraw() class PrinterManagerObserver(object): def __init__(self, tray): self._bus = dbus.SystemBus() self._halmgr = None self._tray = tray self._devices = {} try: obj = self._bus.get_object(_HAL_SERVICE, _HAL_PATH) self._halmgr = dbus.Interface(obj, _HAL_IFACE) except dbus.DBusException: logging.error('%s service not available', _HAL_SERVICE) return self.find_Printers() self._halmgr.connect_to_signal('DeviceAdded', self.device_added) self._halmgr.connect_to_signal('DeviceRemoved', self.device_removed,) self._bus.add_signal_receiver (self.update_lists, path=_SPOOLER_PATH, dbus_interface=_SPOOLER_IFACE) def update_lists(self,*agrs): logging.debug("I come from class 3") try: gobject.source_remove(self.timer) except AttributeError: pass #self._device_view.update_queue() self.timer = gobject.timeout_add (200,self._device_view.update_queue) def find_Printers(self): try: printerLocation = self._halmgr.FindDeviceByCapability('printer') except AttributeError and IndexError: logging.debug('No Print Device found') else: for printerLoc in printerLocation: self.device_added(printerLoc) def device_added(self, printerLoc ): self.PrinterObj = self._bus.get_object(_PRINTER_SERVICE,printerLoc) self.printeriface = dbus.Interface(self.PrinterObj, _PRINTER_IFACE) try: print self.printeriface.GetProperty('info.capabilities')[0] except dbus.DBusException, IndexError: return self.properties = self.printeriface.GetAllProperties() self.headerString = self.properties[u'info.vendor']+' '+self.properties[u'info.product'] logging.debug('Print Device found %s',self.headerString) self._device_view = PrinterDeviceView(self.headerString) self._tray.add_device(self._device_view) self._devices[printerLoc] = self._device_view def device_removed(self, printerLoc): logging.debug('No Print Device found, so Disconnecting Device') #self._device_view.disconnect() self._tray.remove_device(self._devices[printerLoc]) del self._devices[printerLoc] self._devices[printerLoc] = None def setup(tray): device_observer = PrinterManagerObserver(tray)