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,): self._name = 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') if len(title) > 10: logging.debug('the length is %s',len(title)) title = title.rsplit(title[10:],1)[0] + '...' self._cancel.get_child().set_text(_(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 updateQueue(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.findPrinters() self._halmgr.connect_to_signal('DeviceAdded', self.deviceAdded) self._halmgr.connect_to_signal('DeviceRemoved', self.deviceRemoved,) self._bus.add_signal_receiver(self.updateLists, path=_SPOOLER_PATH, dbus_interface=_SPOOLER_IFACE) def updateLists(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.updateQueue) def findPrinters(self): try: printerLocation = self._halmgr.FindDeviceByCapability('printer') except AttributeError and IndexError: logging.debug('No Print Device found') else: for printerLoc in printerLocation: self.deviceAdded(printerLoc) def deviceAdded(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 deviceRemoved(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)