#!/usr/bin/env python import gi gi.require_version('Gtk', '3.0') gi.require_version('Wnck','3.0') from gi.repository import Gtk,GObject,Gio,Wnck,GdkX11 import threading import time import os import pwd import lliurex.net import xmlrpclib import signal signal.signal(signal.SIGINT, signal.SIG_DFL) DEBUG=True def dprint(data): global DEBUG if DEBUG: print("[PrintaClient] %s"%data) class PrintaClient: def __init__(self): self.path="/run/user/%s/printa_client"%os.getuid() dprint(self.path) self.create_path_file() self.running=True self.window_ref=None self.uid=os.geteuid() self.user=pwd.getpwuid(self.uid).pw_name c=xmlrpclib.ServerProxy("https://localhost:9779") self.remote_server=c.get_variable("","VariablesManager","PRINTACLIENTCONFIG") if self.remote_server==None: self.remote_server="localhost" GObject.threads_init() self.init_gio_watcher() self.date=time.time() self.start_gui() #def init def create_path_file(self): f=open(self.path,"w") f.write(str(time.time())) f.close() #def create_path_file def hide_window(self,widget,event=None): self.w.hide() return True #def hide_window def map_event(self,widget,event): dprint("Window is shown. Requesting focus...") xid=self.w.get_window().get_xid() tstamp=GdkX11.x11_get_server_time(self.w.get_window()) if self.window_ref==None: screen=Wnck.Screen.get_default() screen.force_update() for w in screen.get_windows(): if w.get_xid()==xid: self.window_ref=w #w.activate(tstamp) break self.window_ref.activate(tstamp) #def map_event def start_gui(self): dprint("Creating gui...") builder=Gtk.Builder() builder.add_from_file("printa-client.ui") self.window=builder.get_object("window") self.print_button=builder.get_object("print_button") self.cancel_button=builder.get_object("cancel_button") self.w=builder.get_object("window2") self.job_name=builder.get_object("label20") self.printer=builder.get_object("label21") self.pages=builder.get_object("label22") self.print_button=builder.get_object("button4") self.cancel_button=builder.get_object("button3") self.print_button.connect("clicked",self.click) self.cancel_button.connect("clicked",self.click2) self.w.connect("delete_event",self.hide_window) self.w.connect("map-event",self.map_event) ''' self.w=Gtk.Window() self.w.connect("delete_event",self.hide_window) self.w.connect("map-event",self.map_event) self.w.set_size_request(300,300) self.l=Gtk.Label("HOLA") self.b=Gtk.Button("Print") self.b2=Gtk.Button("Cancel") v=Gtk.VBox() v.pack_start(self.l,True,True,5) v.pack_start(self.b,True,True,5) v.pack_start(self.b2,True,True,5) self.b.connect("clicked",self.click) self.b2.connect("clicked",self.click2) self.w.add(v) dprint("Starting GTK Main loop...") ''' Gtk.main() #def start_gui def click(self,widget): self.job["status"]="completed" c=xmlrpclib.ServerProxy("https://server:9779") self.user_info=("lliurex","lliurex") status,st_code=c.check_if_printable(self.user_info,"PrintaServer",self.job) dprint("Able to print? %s"%status) dprint(st_code) if status: dprint("Adding history...") ret=c.add_job_history(self.user_info,"PrintaServer",self.user,self.job) dprint(ret) if st_code != -1: dprint("Updating quota...") cost={} cost["color"]=0 cost["gray"]=0 cost[self.job["color-mode"]]=self.job["pages"] ret=c.substract_user_quota(self.user_info,"PrintaServer",self.user,cost) dprint(ret) else: dprint("user has free pass") else: dprint("User can't print this job. st_code: %s"%st_code) self.w.hide() #def click def click2(self,widget): dprint("Cancelling...") self.job["status"]="cancelled" c=xmlrpclib.ServerProxy("https://server:9779") self.user_info=("lliurex","lliurex") c.add_job_history(self.user_info,"PrintaServer",self.user,self.job) self.w.hide() #def click2 def init_gio_watcher(self): gio_file=Gio.File.new_for_path(self.path) self.monitor=gio_file.monitor_file(Gio.FileMonitorFlags.NONE,None) self.monitor.connect("changed",self.file_changed) #def init_gio_watcher def file_changed(self,monitor,file,other_file,event): if event == Gio.FileMonitorEvent.CHANGES_DONE_HINT: self.process_msg_variable() #def file_changed def process_msg_variable(self): dprint("Processing variable...") c=xmlrpclib.ServerProxy("https://server:9779") v=c.get_request_var("","PrintaServer") msgs=[] if self.remote_server=="localhost": if "localhost" in v: v["localhost"] else: for item in lliurex.net.get_devices_info(): if item["ip"] in v and self.user in v[item["ip"]]: for msg in v[item["ip"]][self.user]: if self.date < msg["date"]: msgs.append(msg) txt="" for msg in msgs: txt="Date: %s\n"%msg["date"] txt+="Msg type: %s\n"%msg["msg_type"] txt+="Error type: %s\n"%msg["error_type"] txt+="Callback: %s\n"%msg["callback"] txt+="Job info:\n" for key in msg["job_info"]: if key=="args": continue txt+="\t%s: %s\t\n"%(key,msg["job_info"][key]) txt+="\n" #self.l.set_text(txt) dprint(msg["job_info"].keys()) self.job_name.set_text(msg["job_info"]["job_name"]) self.printer.set_text(msg["job_info"]["printer_name"]) self.pages.set_text(str(msg["job_info"]["pages"])) self.job=msg["job_info"] dprint("Requesting window...") self.w.show_all() #def process_msg_variable #class PrintaClient if __name__=="__main__": pc=PrintaClient()