home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / bin / hwdb-gui < prev    next >
Encoding:
Text File  |  2006-08-16  |  20.7 KB  |  605 lines

  1. #!/usr/bin/python
  2.  
  3. import os
  4. import os.path
  5. import string
  6. import gtk
  7. import gtk.glade
  8. import gnome.ui
  9. import gnomecanvas
  10. import gobject
  11.  
  12. #from gettext import gettext as _
  13. import gettext
  14. def _(x): return x
  15. import locale
  16.  
  17. from gtk import RcStyle
  18. from gtk import Settings
  19.  
  20. from hwdb_client import Constants
  21.  
  22. class Collector:
  23.     def __init__(self):
  24.         self.output = []
  25.         self.comments = []
  26.     self.devdata = []
  27.     self.devicename = ''
  28.         self.i = 3638089728
  29.     self.wTree=gtk.glade.XML (Constants.DATADIR + "/collector.glade",
  30.                                   "window","hwdb-client")
  31.     self.xmlfile = Constants.DATADIR + "/questions_en.xml"
  32.     self.step = 0
  33.     self.headericon = ''
  34.     self.headtxt = ''
  35.     self.cont_txt = ''
  36.     self.hline = ''
  37.     self.yesno = ''
  38.     self.comtxt = ''
  39.     self.comwin = ''
  40.     self.comrtf = ''
  41.     self.box1 = ''
  42.     self.donetxt = ''
  43.     self.radio = ''
  44.     self.cont_rec = ''
  45.     self.yesbutt = gtk.RadioButton(None, _("Yes"))
  46.     self.redo = gtk.Button()
  47.     self.urlbutt = gtk.Button()
  48.     self.cpybutt = gtk.Button()
  49.     self.co_textview = gtk.TextView()
  50.     hwdb_lock = ""
  51.     home_path=os.environ["HOME"]    
  52.     path = home_path+'/.hwdb'
  53.     clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
  54.  
  55.     if os.path.isfile(path):
  56.         lock = open(path)
  57.         hwdb_lock = lock.read()
  58.  
  59.     canvas = self.wTree.get_widget("canvas")
  60.     self.root = canvas.root().add(gnomecanvas.CanvasGroup)
  61.     canvas_bg = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/canvas_bg.png") 
  62.  
  63.     self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = canvas_bg, 
  64.          x = 0, y = 0, anchor = "nw")
  65.  
  66.     cancel = self.wTree.get_widget("cancel_button")
  67.     self.advance = self.wTree.get_widget("adv_button")
  68.     help = self.wTree.get_widget("help_button")
  69.  
  70.     if hwdb_lock:
  71.           tt = gtk.Tooltips()
  72.         self.advance.hide()
  73.         urlbox1 = gtk.HBox(False, 0)
  74.             image = gtk.Image()
  75.             image.set_from_stock(gtk.STOCK_CONNECT, gtk.ICON_SIZE_BUTTON)
  76.             label = gtk.Label(_('Show online record'))
  77.             urlbox1.add(image)
  78.             urlbox1.add(label)
  79.         self.online_button = self.root.add(gnomecanvas.CanvasWidget, x = 250, y = 200, widget = self.urlbutt, 
  80.              width = 160, height = 30)
  81.            self.urlbutt.add(urlbox1)
  82.         self.urlbutt.show_all()
  83.         cpybox1 = gtk.HBox(False, 0)
  84.             image = gtk.Image()
  85.             image.set_from_stock(gtk.STOCK_COPY, gtk.ICON_SIZE_BUTTON)
  86.             label = gtk.Label(_('Copy to clipboard'))
  87.             cpybox1.add(image)
  88.             cpybox1.add(label)
  89.         self.copy_button = self.root.add(gnomecanvas.CanvasWidget, x = 80, y = 200, widget = self.cpybutt, 
  90.              width = 160, height = 30)
  91.            self.cpybutt.add(cpybox1)
  92.         self.cpybutt.show_all()
  93.  
  94.         self.urlbutt.connect("clicked", lambda w: self.open_online(hwdb_lock))
  95.         self.cpybutt.connect("clicked", lambda w: clip.set_text(hwdb_lock))
  96.         tt.set_tip(self.urlbutt, _('Click here to open a browser with your record on the database server'), '')
  97.         tt.set_tip(self.cpybutt, _('Click here to copy the id to the Gnome clipboard'), '')
  98.  
  99.         logo_img = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/hwdb.png") 
  100.         logo = (self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = logo_img, 
  101.                      x = 50, y = 45, anchor = "nw"))
  102.         line = self.root.add(gnomecanvas.CanvasLine,
  103.                 points = [40,85, 400, 85],
  104.                 width_pixels = 1, 
  105.                 fill_color_rgba = 288581136)
  106.  
  107.         self.donetxt = self.root.add(gnomecanvas.CanvasText, 
  108.             markup = '<span size="12000"><b>%s:</b>\n'%_("Submission id")+hwdb_lock+'</span>\n\
  109.                 \n<span size="8500" color="#000000">%s</span>'%_("Attach this id to your bugreports or use it \nif you get online support.\nUse the 'Copy to clipboard' button to copy and \npaste the id or the 'Show online record' button to \naccess your online datasheet directly."), 
  110.             fill_color_rgba = 288581375, x = 250, y = 105)
  111.  
  112.         self.advance.set_sensitive(False)
  113.     else:
  114.             txt = "<big><b>%s</b></big>\n" % _("Hardware Database Collection")
  115.             txt += _("This is the Ubuntu hardware database collection tool.\n"
  116.                      "It obtains all possible data about your hardware,\n"
  117.                      "performs certain self-tests, and asks you some\n"
  118.                      "questions about the autodetected values.\n\n")
  119.             txt += "<b>%s</b>\n" % _("Online Submission")
  120.             txt += _("The collected data is submitted to the central\n"
  121.                      "Ubuntu hardware database for building a web-based\n"
  122.                      "information resource about supported hardware.\n"
  123.                      "(for detailed information about the collected data "
  124.                      "see help)\n\n")
  125.             txt += "<b>%s</b>\n"%_("Improvement")
  126.             txt += _("Developers utilize the collected data to fine tune "
  127.                      "autodetection \n"
  128.                      "and improve Ubuntu hardware support.  By submitting "
  129.                      "your hardware \n"
  130.                      "information to the central Ubuntu database, you will "
  131.                      "have \n"
  132.                      "online access to your data in the future.  No personal "
  133.                      "user information \n"
  134.                      "will be collected or transmitted through this process."
  135.                      "\n\n\t\t")
  136.             txt += _("Thank you for helping to improve Ubuntu.")
  137.             self.inittext = self.root.add(gnomecanvas.CanvasText, markup = txt,
  138.                         size = 8000, fill_color_rgba = self.i, x = 220, y = 140)
  139.         self.fadein(self.inittext)
  140.                     
  141.     self.win = self.wTree.get_widget("window")
  142.     self.win.set_resizable(False)
  143.     self.win.set_size_request(450,400)
  144.     self.win.set_icon_from_file(Constants.DATADIR + "/ubuntu_logo.png")
  145.     
  146.     #self.advance.grab_focus()
  147.  
  148.     help.connect("clicked", lambda w: gnome.help_display_uri ('ghelp:///usr/share/gnome/help/hwdb-client/C/hwdb-client.xml'))
  149.     cancel.connect("clicked", lambda w: gtk.main_quit())
  150.     self.win.connect("destroy", lambda w: gtk.main_quit())
  151.     self.advance.connect("clicked", lambda w: self.adv(self.xmlfile))
  152.     
  153.     def main(self):
  154.     gtk.main()
  155.  
  156.     def open_online(self, id):
  157.     gnome.url_show ('http://hwdb.ubuntu.com/?xml='+id)
  158.     gobject.timeout_add(1000, lambda: gtk.main_quit())
  159.  
  160.     def test(self, set):
  161.     self.netani = [] 
  162.     spk_ani = gtk.gdk.PixbufAnimation(Constants.DATADIR + "/speaker_shadow.gif") 
  163.     spk_img = gtk.image_new_from_animation(spk_ani)
  164.  
  165.     yes_img = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/yes.png") 
  166.     no_img = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/no.png") 
  167.     self.anibox = gtk.VBox(False, 0)
  168.     self.anibox.add(spk_img)
  169.     self.anibox.show_all()
  170.  
  171.         if set[1].startswith("Audio"):
  172.         gnome.sound_init("localhost")
  173.         gnome.sound_play(Constants.DATADIR + "/sound.wav")
  174.         devname = os.popen('cat /proc/asound/card0/id')
  175.         for line in devname:
  176.             self.devicename = line.strip()
  177.             set[2] = _("Testing detected soundcard: ") + self.devicename+"\n"+set[2]
  178.             if len(self.devdata) < 1:
  179.                     self.devdata.append(self.devicename)
  180.         self.canvasani = self.root.add(gnomecanvas.CanvasWidget, x = 40, y = 130, widget = self.anibox, 
  181.              width = 145, height = 160)
  182.         if not (self.redo.flags() & gtk.MAPPED):
  183.             self.repeat(set)
  184.             self.draw_content(set)
  185.         self.redo.set_sensitive(False)
  186.         gobject.timeout_add(1700, lambda: self.killani(set[1]))
  187.         gobject.timeout_add(1800, lambda: self.draw_yesno(set[1]))
  188.     
  189.       if set[1].startswith("Network") or set[1].startswith("Wireless"):
  190.         repflag = 0
  191.         netdevice = self.getroute()[len(self.getroute())-1].strip()
  192.         if not (self.redo.flags() & gtk.MAPPED):
  193.             self.repeat(set)
  194.             set[2] = set[2]+_(" On interface: ")+netdevice
  195.             self.draw_content(set)
  196.         else:
  197.             repflag = 1
  198.  
  199.         self.redo.set_sensitive(False)
  200.         command = 'LC_ALL=C fping '+self.getroute()[9]+' 2>/dev/null'
  201.          seq = 0    
  202.         flag = 0
  203.         while (seq < 4):
  204.                 while gtk.events_pending():
  205.                     gtk.main_iteration(True)
  206.             img = yes_img
  207.             timer = 0
  208.             for line in os.popen(command):
  209.                 fields = string.splitfields(line, 'is')
  210.             status = fields[1].strip()
  211.             if status.startswith('unreachable'):
  212.                 img = no_img
  213.                 timer = 1
  214.                 flag = flag +1
  215.             if timer == 0:
  216.                 i=0
  217.                 while i<500000:
  218.                     i = i + 1
  219.             if seq == 3:
  220.                 self.output.append(flag)
  221.                 self.comments.append(netdevice+" failures: "+str(flag))
  222.                 self.killnettest(set)
  223.                     self.devdata.append(netdevice)
  224.                 break
  225.             gnome.sound_init("localhost")
  226.             self.netani.append(self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = img, 
  227.                      x = 50+(seq*130), y = 140, anchor = "nw"))
  228.             gnome.sound_play(Constants.DATADIR + "/ping.wav")
  229.             seq = seq+1
  230.         return
  231.  
  232.     def getroute(self):
  233.     for line in os.popen('route -n'):
  234.         if line.startswith('0.0.0.0'):
  235.             route = string.splitfields(line, ' ')
  236.     return route
  237.  
  238.     def get_xorgdata(self):
  239.         ati_brain_damage = []
  240.         command = 'xrandr -q'
  241.     for item in os.popen('lsmod|grep fglrx'):
  242.         ati_brain_damage.append(item)
  243.     if len(ati_brain_damage):
  244.         retval = _("\nDetected settings: impossible with fglrx")
  245.     else:
  246.             for line in os.popen(command):
  247.                 fields = string.splitfields(line, '  ')
  248.                 if fields[0].startswith('*'):
  249.                     freq = fields[4].strip('*')
  250.                     if fields[4].strip('*') == '\n':
  251.                         freq = "N/A"
  252.                     retval = _("\nDetected settings: ")+fields[1]+" @ "+freq+" Hz"
  253.                         self.devdata.append(fields[1].lstrip()+" @ "+fields[4].strip('*')+" Hz")
  254.     return retval
  255.     
  256.     def killani(self, set):
  257.     self.redo.set_sensitive(True)
  258.         self.canvasani.destroy()
  259.     return False
  260.    
  261.     def repeat(self, set):
  262.         repbox1 = gtk.HBox(False, 0)
  263.     image = gtk.Image()
  264.     image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_BUTTON)
  265.     label = gtk.Label(_("Test again"))
  266.     repbox1.add(image)
  267.     repbox1.add(label)
  268.     self.redo.add(repbox1)
  269.     self.redobutt = self.root.add(gnomecanvas.CanvasWidget, x = 330, y = 80, widget = self.redo, 
  270.              width = 100, height = 30)
  271.     self.redo.show_all()
  272.  
  273.     self.redo.connect("clicked", lambda w: self.retest(set))
  274.  
  275.     def retest(self, set):
  276.     if set[1].startswith('Network') and (self.donetxt.flags() & gtk.MAPPED):
  277.         self.donetxt.destroy()
  278.             self.output.pop()
  279.             self.comments.pop()
  280.     else:
  281.             self.yesno_hide()
  282.     gnome.sound_init("localhost")
  283.     self.test(set)
  284.  
  285.     def killnettest(self, set):
  286.         i=0
  287.         while (i<3):
  288.             self.netani[i].destroy()
  289.         i=i+1
  290.     self.donetxt = self.root.add(gnomecanvas.CanvasText, 
  291.             markup = "<span size='16000'><b>%s</b></span>" % _("Test done, please proceed"), 
  292.             fill_color_rgba = 288581375, x = 230, y = 182)
  293.     self.redo.set_sensitive(True)
  294.     self.advance.set_sensitive(True)
  295.     #self.advance.grab_focus()
  296.     return False 
  297.  
  298.     def yesno_hide(self):
  299.     if self.yesno:
  300.         buffer = self.textview.get_buffer()
  301.         self.comments.append(buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()))
  302.         if self.yesbutt.get_active():
  303.             self.output.append(0)
  304.         elif  self.partbutt.get_active():
  305.             self.output.append(1)
  306.         elif self.nobutt.get_active():
  307.             self.output.append(2)
  308.         else:
  309.               self.output.append(3)
  310.         self.yesno.destroy()
  311.         self.comtxt.destroy()
  312.         self.comwin.destroy()
  313.         self.combg.destroy()
  314.         
  315.     def draw_yesno(self, set):
  316.       tt = gtk.Tooltips()
  317.     i_out = gtk.Image()
  318.     if self.yesno:
  319.         self.yesno.destroy()
  320.         self.box1.destroy()
  321.         self.comtxt.destroy()
  322.         self.combg.destroy()
  323.  
  324.     self.yesbutt = gtk.RadioButton(None, _("Yes"))
  325.     self.yesbutt.connect("clicked", lambda w: i_out.set_from_file(Constants.DATADIR + "/true.png"))
  326.     self.nobutt = gtk.RadioButton(self.yesbutt, _("No"))
  327.     self.nobutt.connect("clicked", lambda w: i_out.set_from_file(Constants.DATADIR + "/false.png"))
  328.     self.partbutt = gtk.RadioButton(self.yesbutt, _("Partial"))
  329.     self.partbutt.connect("clicked", lambda w: i_out.set_from_file(Constants.DATADIR + "/partial.png"))
  330.     self.neutbutt = gtk.RadioButton(self.yesbutt, _("N/A"))
  331.     self.neutbutt.connect("clicked", lambda w: i_out.set_from_file(Constants.DATADIR + "/neutral.png"))
  332.  
  333.     self.yesbutt.connect("toggled", lambda w: self.advance.set_sensitive(True))
  334.     self.nobutt.connect("toggled", lambda w: self.advance.set_sensitive(True))
  335.     self.partbutt.connect("toggled", lambda w: self.advance.set_sensitive(False))
  336.     self.neutbutt.connect("toggled", lambda w: self.advance.set_sensitive(True))
  337.  
  338.     commentwin = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/comment_bg.png") 
  339.     i_out.set_from_file(Constants.DATADIR + "/true.png")
  340.  
  341.     self.box1 = gtk.VBox(False, 0)
  342.     self.hbox1 = gtk.HBox(False, 0)
  343.     self.box1.pack_start(self.yesbutt, False, False, 2)
  344.     self.box1.pack_start(self.partbutt, False, False, 2)
  345.     self.box1.pack_start(self.nobutt, False, False, 2)
  346.     self.box1.pack_start(self.neutbutt, False, False, 2)
  347.  
  348.     self.hbox1.pack_start(i_out, False, False, 10)
  349.     self.hbox1.pack_start(self.box1, False, False, 0)
  350.     self.hbox1.show_all()
  351.  
  352.         self.yesno = self.root.add(gnomecanvas.CanvasWidget, x = 40, y = 160, widget = self.hbox1, 
  353.                 width = 140, height = 100) 
  354.     self.comtxt = self.root.add(gnomecanvas.CanvasText, 
  355.             markup = "<span size='10000'><b>%s</b></span>" % _("Comments:"), 
  356.             fill_color_rgba = 288581375, x = 225, y = 135)
  357.     self.combg = (self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = commentwin, 
  358.                      x = 175, y = 140, anchor = "nw"))
  359.     self.comwin = gtk.ScrolledWindow(None, None)
  360.     self.comwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  361.     self.textview = gtk.TextView()
  362.     self.textview.set_editable(True)
  363.     self.textview.set_cursor_visible(True)
  364.     self.textview.set_wrap_mode(gtk.WRAP_WORD)
  365.     self.comwin.add(self.textview)
  366.     self.comwin.show_all()
  367.     
  368.     buffer = self.textview.get_buffer()
  369.     buffer.connect("changed", lambda w: self.buffoc(buffer))
  370.  
  371.         self.comrtf = self.root.add(gnomecanvas.CanvasWidget, x = 185, y = 150, widget = self.comwin, width = 220, height = 120) 
  372.     
  373.     tt.set_tip(self.yesbutt, _("The device was automatically detected and is functioning properly"), '')
  374.     tt.set_tip(self.nobutt, _("The device is not functioning at all"), '')
  375.     tt.set_tip(self.partbutt, _("The device is functioning, but not fully, or it required manual configuration (please explain in comment)"), '')
  376.     tt.set_tip(self.neutbutt, _("The device is not available"), '')
  377.     tt.enable()
  378.  
  379.     self.advance.set_sensitive(True)
  380.     #self.advance.grab_focus()
  381.    
  382.     def buffoc(self, buffer):
  383.         if buffer.get_char_count() and self.partbutt.get_active(): 
  384.         self.advance.set_sensitive(True)
  385.     elif self.yesbutt.get_active() or self.nobutt.get_active() or self.neutbutt.get_active():
  386.         self.advance.set_sensitive(True)
  387.     else:
  388.         self.advance.set_sensitive(False)
  389.  
  390.     def draw_commentwin(self):
  391.     self.advance.set_sensitive(True)
  392.     scrwin = gtk.ScrolledWindow(None, None)
  393.     scrwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  394.     self.co_textview.set_editable(True)
  395.     self.co_textview.set_cursor_visible(True)
  396.     self.co_textview.set_wrap_mode(gtk.WRAP_WORD)
  397.     scrwin.add(self.co_textview)
  398.     scrwin.show_all()
  399.  
  400.     c_win = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/full_comment_bg.png") 
  401.     self.cont_rec = (self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = c_win, 
  402.                      x = 80, y = 120, anchor = "nw"))
  403.  
  404.         self.cont_inp = self.root.add(gnomecanvas.CanvasWidget, x = 95, y = 130, widget = scrwin, 
  405.                 width = 265, height = 150) 
  406.  
  407.     #self.advance.grab_focus()
  408.  
  409.     def draw_content(self, set):
  410.     if self.cont_txt:
  411.         self.cont_txt.hide()
  412.     if self.hline:
  413.         self.hline.hide()
  414.     gtk.rc_parse_string('gtk_font_name = "Sans 8"')
  415.     self.cont_txt = self.root.add(gnomecanvas.CanvasRichText, x = 30, y = 80, width = 300, height = 180, 
  416.                 text = set[2], cursor_visible = False, grow_height = True) 
  417.     self.hline = self.root.add(gnomecanvas.CanvasLine,
  418.                 points = [30,120, 430, 120],
  419.                 width_pixels = 1, 
  420.                 fill_color_rgba = 288581136)
  421.     gtk.rc_reset_styles(gtk.settings_get_default())
  422.     
  423.     def draw_header(self, set):
  424.     if self.headtxt:
  425.         self.fadeout(self.headtxt)
  426.     if self.headericon:
  427.         self.headericon.hide()
  428.  
  429.     icon_pixbuf = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/"+set[0]) 
  430.     head_pixbuf = gtk.gdk.pixbuf_new_from_file(Constants.DATADIR + "/header_bg.png") 
  431.  
  432.     self.headerbg = self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = head_pixbuf, 
  433.          x = 24, y = 26, anchor = "nw")
  434.     self.headtxt = self.root.add(gnomecanvas.CanvasText, markup = "<span size='20000'><b>"+set[1]+"</b></span>", 
  435.                 fill_color_rgba = 288581375, x = 230, y = 42)
  436.     self.headericon = self.root.add(gnomecanvas.CanvasPixbuf, pixbuf = icon_pixbuf, 
  437.          x = 40, y = 15, anchor = "nw")
  438.         
  439.     def propstrip(self, line, type):
  440.             line = line.rstrip("</property>\n")
  441.         line = line.lstrip('<property name="'+type+'">')
  442.         return _(line.strip())
  443.  
  444.     def fadein(self, text):
  445.         self.i = self.i-538976288
  446.             while self.i > 0:
  447.             while gtk.events_pending():
  448.                 gtk.main_iteration(1)
  449.             if self.i <= 0:
  450.             self.i = 0
  451.                 text.set(fill_color_rgba = self.i)   
  452.             self.i = self.i-353703189
  453.         return 1
  454.  
  455.     def fadeout(self, text):
  456.         self.i = 1
  457.         while self.i <= 4294967040:
  458.             while gtk.events_pending():
  459.                     gtk.main_iteration(1)
  460.                 text.set(fill_color_rgba = self.i)   
  461.             self.i = self.i+623191333
  462.         text.hide()
  463.         return 1
  464.  
  465.     def assemble(self):
  466.         self.datapipe = []
  467.         self.pbar = gtk.ProgressBar()
  468.         self.as_bar = self.root.add(gnomecanvas.CanvasWidget, x = 60, y = 175, widget = self.pbar, 
  469.                 width = 350, height = 24) 
  470.  
  471.     self.pbar.show()
  472.  
  473.     self.timer = gobject.timeout_add (100, lambda w: self.pulsator(), self)
  474.     while gtk.events_pending():
  475.             gtk.main_iteration(True)
  476.  
  477.     for line in os.popen('/usr/bin/hwdb-xml -a'):
  478.         self.datapipe.append(line)
  479.         while gtk.events_pending():
  480.                 gtk.main_iteration(True)
  481.     
  482.     self.datapipe.append("<!--<quadata>\n")
  483.     i = 0
  484.     for line in open(self.xmlfile, 'r'):
  485.         line = line.strip()
  486.         if line.startswith('<property name="title">'):
  487.             line = self.propstrip(line, 'title')
  488.             if not line.startswith("Assembling"):
  489.                 line = line.rstrip()
  490.                 self.datapipe.append("<question id=\""+line.lower()+"\">\n")
  491.                 if not line.startswith("Comments"):
  492.                     self.datapipe.append(" <result>"+str(self.output[i])+"</result>\n")
  493.                         self.datapipe.append("  <detected>"+str(self.devdata[i])+"</detected>\n")
  494.                 self.datapipe.append(" <comment>"+str(self.comments[i])+"</comment>\n")
  495.                 self.datapipe.append("</question>\n")
  496.                 i = i + 1
  497.     self.datapipe.append("</quadata>\n-->\n")
  498.  
  499.     while gtk.events_pending():
  500.             gtk.main_iteration(True)
  501.  
  502.     self.timeout = gobject.timeout_add (5000, lambda w: self.hidepulse(), self)
  503.     
  504.     def pulsator(self):
  505.     self.pbar.pulse()
  506.     return True
  507.  
  508.     def hidepulse(self):
  509.  
  510.     #####################################################
  511.     # call hwdb-send here (print to tmpfile)        #
  512.     #####################################################
  513.  
  514.      self.pbar.hide()
  515.     self.donetxt = self.root.add(gnomecanvas.CanvasText, 
  516.             markup = "<span size='16000'><b>Thank you for your contribution</b></span>", 
  517.             fill_color_rgba = 288581375, x = 230, y = 182)
  518.  
  519.     sendpipe = open('/tmp/hwdb_data.xml', 'w')
  520.  
  521.     for line in self.datapipe:
  522.         while gtk.events_pending():
  523.         gtk.main_iteration(True)
  524.         sendpipe.write(line)
  525.     sendpipe.close()
  526.     os.spawnl(os.P_NOWAIT, '/usr/bin/hwdb-send')
  527.  
  528.     gtk.main_quit()
  529.     return False
  530.  
  531.     def adv(self, xmlfile):
  532.         elem = 0
  533.     set = []
  534.   
  535.     self.advance.set_sensitive(False)
  536.     self.fadeout(self.inittext)
  537.  
  538.     if (self.yesbutt.flags() & gtk.MAPPED):
  539.         self.yesno_hide()
  540.  
  541.     if (self.redo.flags() & gtk.MAPPED):
  542.         self.redo.destroy()
  543.     
  544.     if (self.co_textview.flags() & gtk.MAPPED):
  545.         buffer = self.co_textview.get_buffer()
  546.         self.comments.append(buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()))
  547.         self.cont_rec.destroy()
  548.         self.cont_inp.destroy()
  549.     
  550.     self.step = self.step + 1
  551.     for line in open(xmlfile, 'r'):
  552.         line = line.strip()
  553.         if line.startswith('<advmark step="'+str(self.step)+'"'):
  554.             elem = 1
  555.             newline = line.rsplit("=", 1)
  556.             showline = newline[1].strip('\">\n')
  557.             set.append(showline+".png")
  558.         if elem == 1:
  559.             if line.startswith('<property name="title">'):
  560.                 line = self.propstrip(line, 'title')
  561.                 set.append(line.strip())
  562.             if line.startswith('<property name="content">'):
  563.                 line = self.propstrip(line, 'content')
  564.                 set.append(line.strip())
  565.         if line.startswith("</advmark>"):
  566.             elem = 0
  567.             
  568.     if len(set) >= 1:
  569.                 print "set[1]: " + set[1]
  570.         self.draw_header(set)
  571.         if self.donetxt:
  572.             self.donetxt.hide()
  573.         if not set[1].startswith("Comments") and \
  574.             not set[1].endswith("Test") and \
  575.             not set[1].startswith("Video") and \
  576.             not set[1].startswith("Assembling"):
  577.             self.devdata.append('null')
  578.             self.draw_content(set)
  579.             self.draw_yesno(set)
  580.         elif set[1].startswith("Video"):
  581.             set[2] = set[2]+self.get_xorgdata()
  582.             self.draw_content(set)
  583.             self.draw_yesno(set)
  584.         elif set[1].endswith("Test"):
  585.                     print "doing test"
  586.             self.test(set)
  587.         elif set[1].startswith("Assembling"):
  588.             self.draw_content(set)
  589.             self.assemble()
  590.         else:
  591.             self.draw_content(set)
  592.             self.draw_commentwin()
  593.             self.devdata.append('null')
  594.  
  595. if __name__ == "__main__":
  596.  
  597.     localesApp="hwdb-client"
  598.     localesDir="/usr/share/locale"
  599.     locale.setlocale(locale.LC_ALL, '')
  600.     gettext.bindtextdomain(localesApp, localesDir)
  601.     gettext.textdomain(localesApp)
  602.     
  603.     base = Collector()
  604.     base.main()
  605.