예제 #1
0
	def on_remove_task_button_clicked(self,*arg):
		def is_current_selection_null():
			if not self.current_selection or not self.current_selection[1] :
				dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
		        Gtk.ButtonsType.OK, "Attention.......")
				dialog.format_secondary_text("NO File is selected.!")
				dialog.run()
				dialog.destroy()
				return True
			else:	
				return False
		def after_delete_task(data,error):
			self.info_label.set_text("Deletion is done")
			self.init_view(self.bdstoken)
			self.spinn.destroy()

		if is_current_selection_null(): 
			return
		store,treepaths = self.current_selection
	

		for tpath in treepaths:
			task = ()
			for i in store[tpath]:
				task = task + (i,)
				
			task_id = task[5]
			self.spinn = SpinnerDialog(self)
			self.spinn.show()
			self.info_label.set_text("Deleting task %s "%task[1])
			utils.async_call(cloudapi.delete_task, self.bdstoken,task_id ,
						 callback=after_delete_task)
예제 #2
0
    def on_start_task_button_clicked(self, *arg):
        if self.is_current_selection_null():
            return
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        store, treepaths = self.current_selection
        self.q = queue.LifoQueue()

        for tpath in treepaths:

            print(store[tpath][2], store[tpath][4])
            row = store[tpath]
            num = row[0]
            filename = row[2]
            path = row[4]
            isdir = row[5]
            fsid = row[6]
            spath = row[8]
            if not self.in_list(row, self.downlink):
                print(filename, fsid)
                npath = os.path.join(path, filename)
                utils.async_call(cloudapi.get_dlink,
                                 self.tokens,
                                 fsid,
                                 npath,
                                 num,
                                 callback=self.get_down_link)
                self.downlink.append((filename, None, spath, fsid))
        print('0000sync888', self.downlink)
예제 #3
0
    def __init__(self, parent, url):
        Gtk.Dialog.__init__(
            self,
            "Verification Code",
            parent,
            0,
        )
        self.file_list = []
        #self.downlink = []
        #self.tokens = tokens
        self.url = url
        #self.bdstoken,sign1,sign3,timestamp = self.tokens
        self.vcodefile = "image/vcode.jpeg"
        self.set_default_size(300, 200)
        self.set_border_width(10)
        label = Gtk.Label("Please input verification code above to proceed.")
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        self.vcodeimg = Gtk.Image.new()

        self.box = self.get_content_area()
        self.entry = Gtk.Entry()
        self.entry.connect("activate", self.on_enter_entry)
        self.entry.set_can_focus(True)
        self.entry.grab_focus()
        self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf)
        pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
        self.liststore.append([pix])
        iconview = Gtk.IconView.new()
        iconview.set_model(self.liststore)
        iconview.set_pixbuf_column(0)
        #self.liststore.append([pix])
        self.show_vcode("image/loading.gif", None)  #"image/loading.gif",

        self.box.add(iconview)
        #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
        #Gtk.Image.new_from_pixbuf(pix)
        button = Gtk.Button("Refresh Code")
        button.connect("clicked", self.on_click_refresh_clicked)
        self.on_click_refresh_clicked(button)

        #self.entry.set_text("Input vcode above")

        self.okbtn = self.add_button("OK", 22)
        self.okbtn.connect("clicked", self.on_click_OK_clicked)
        self.box.set_child_packing(button, False, False, 1, Gtk.PackType.START)

        self.box.set_spacing(8)
        self.box.add(label)

        self.box.add(self.entry)
        self.box.add(button)
        #self.box.add(okbtn)

        self.box.show_all()
예제 #4
0
    def on_click_login(self, button):
        self.username = self.uentry.get_text()
        self.password = self.pentry.get_text()
        if not self.username or not self.password:
            self.info_label.set_text("Username or Password is blank.")
            return
        self.info_label.set_text("Going to index")
        logger.info("Username|Password %s %s" % (self.username, self.password))
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        utils.async_call(auth.index, callback=self.after_goto_index)
        #bdstoken,sign1,sign3,timestamp = auth.index()

        print("click")
예제 #5
0
	def on_start_task_button_clicked(self,*arg):
		if self.is_current_selection_null(): 
			return
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		store,treepaths = self.current_selection
		self.q = queue.LifoQueue()

		for tpath in treepaths:
		
			print(store[tpath][2],store[tpath][4])
			row = store[tpath]
			num = row[0]
			filename = row[2]
			path = row[4]
			isdir = row[5]
			fsid = row[6] 
			spath = row[8]
			if not self.in_list(row,self.downlink):
				print(filename,fsid)
				npath = os.path.join(path,filename)
				utils.async_call(cloudapi.get_dlink,self.tokens,fsid,npath,num,
						 callback=self.get_down_link)
				self.downlink.append((filename,None,spath,fsid))
		print('0000sync888',self.downlink)
예제 #6
0
	def __init__(self,parent,url):
		Gtk.Dialog.__init__(self, "Verification Code", parent, 0,)
		self.file_list = []
		#self.downlink = []
		#self.tokens = tokens
		self.url = url
		#self.bdstoken,sign1,sign3,timestamp = self.tokens
		self.vcodefile = "image/vcode.jpeg"
		self.set_default_size(300, 200)
		self.set_border_width(10)
		label = Gtk.Label("Please input verification code above to proceed.")
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		self.vcodeimg = Gtk.Image.new()

		self.box = self.get_content_area()
		self.entry = Gtk.Entry()
		self.entry.connect("activate",self.on_enter_entry)
		self.entry.set_can_focus(True)
		self.entry.grab_focus()
		self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf)
		pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
		self.liststore.append([pix])
		iconview = Gtk.IconView.new()
		iconview.set_model(self.liststore)
		iconview.set_pixbuf_column(0)
		#self.liststore.append([pix])
		self.show_vcode("image/loading.gif",None)#"image/loading.gif",
	
		self.box.add(iconview)
		#pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
		 #Gtk.Image.new_from_pixbuf(pix)
		button = Gtk.Button("Refresh Code")
		button.connect("clicked", self.on_click_refresh_clicked)
		self.on_click_refresh_clicked(button)

	
		#self.entry.set_text("Input vcode above")

		self.okbtn = self.add_button("OK", 22)
		self.okbtn.connect("clicked", self.on_click_OK_clicked)
		self.box.set_child_packing(button,False,False,1,Gtk.PackType.START)

		self.box.set_spacing(8)
		self.box.add(label)
		
		self.box.add(self.entry)
		self.box.add(button)
		#self.box.add(okbtn)
		
		self.box.show_all()
예제 #7
0
 def init_view(self, path):
     self.current_selection = None
     self.current_path = path
     logger.debug("Current Path: %s" % self.current_path)
     #list_json = cloudapi.list_path(self.current_path,500,
     #								settings.DRY,self.bdstoken)
     utils.async_call(cloudapi.list_path,
                      self.current_path,
                      500,
                      settings.DRY,
                      self.bdstoken,
                      callback=self.populate_view)
     #logger.debug("Size of list json: %s"%str(len(list_json)))
     #file_list = cloudapi.get_list(list_json)
     #logger.debug("Size of file_list: %s"%str(len(file_list)))
     #self.liststore.clear()
     #self.fill_liststore(file_list)
     #self.loading_spin.start()
     #self.loading_spin.show_all()
     self.spinn = SpinnerDialog(self)
     self.spinn.show()
     file_list = []
     pix_list = self.get_pix_list(file_list)
     self.fill_liststore(pix_list)
예제 #8
0
	def on_click_login(self,button):
		self.username = self.uentry.get_text()
		self.password = self.pentry.get_text()
		if not self.username or not self.password:
			self.info_label.set_text("Username or Password is blank.")
			return
		self.info_label.set_text("Going to index")
		logger.info("Username|Password %s %s"%(self.username,self.password))
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		utils.async_call(auth.index,
							 callback=self.after_goto_index)
		#bdstoken,sign1,sign3,timestamp = auth.index()


		print("click")
예제 #9
0
	def init_view(self,path):
		self.current_selection = None
		self.current_path = path
		logger.debug("Current Path: %s"%self.current_path)
		#list_json = cloudapi.list_path(self.current_path,500,
		#								settings.DRY,self.bdstoken)
		utils.async_call(cloudapi.list_path, self.current_path,500,
										settings.DRY,self.bdstoken,
				     callback=self.populate_view)
		#logger.debug("Size of list json: %s"%str(len(list_json)))
		#file_list = cloudapi.get_list(list_json)
		#logger.debug("Size of file_list: %s"%str(len(file_list)))
		#self.liststore.clear()
		#self.fill_liststore(file_list)
		#self.loading_spin.start()
		#self.loading_spin.show_all()
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		file_list = []
		pix_list = self.get_pix_list(file_list)
		self.fill_liststore(pix_list)
예제 #10
0
class LoginDialog(Gtk.Dialog):
    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "Login...", parent, 0)

        self.set_default_size(350, 200)
        self.set_border_width(15)
        grid = Gtk.Grid()
        grid.set_row_spacing(10)
        #grid.set_row_baseline_position(1,Gtk.BaselinePosition.CENTER )
        #labelu = Gtk.Label("User Name:")
        #labelu.set_markup("<span style=\"oblique\">%s</span>")
        #labelp = Gtk.Label("Password:"******"xivhwo2002")
        self.pentry.set_text("mnja12")
        self.pentry.set_visibility(False)
        lbutton = self.add_button("Login...", 11)  #Gtk.Button("Login...")
        lbutton.props.xalign = 0.5
        lbutton.connect("clicked", self.on_click_login)
        offline = Gtk.CheckButton("Offline Mode")
        offline.connect("toggled", self.on_toggle_offline)
        verbose = Gtk.CheckButton("Verbose Mode")
        verbose.connect("toggled", self.on_toggle_verbose)
        box = self.get_content_area()
        box.set_spacing(8)
        #box.add(grid)
        box.add(self.uentry)
        box.add(self.pentry)
        box.add(offline)
        box.add(verbose)
        #grid.add(labelu)
        #grid.attach_next_to(self.uentry,labelu,Gtk.PositionType.RIGHT,13,1)
        #grid.attach(labelp,0, 2, 1, 1)
        #grid.attach_next_to(self.pentry,labelp,Gtk.PositionType.RIGHT,13,1)
        #grid.attach_next_to(lbutton,self.pentry,Gtk.PositionType.BOTTOM,13,1)

        self.infobar = Gtk.InfoBar()
        self.infobar.set_message_type(Gtk.MessageType.ERROR)
        #box.pack_end(self.infobar, False, False, 0)
        #grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1)
        box.add(self.infobar)
        info_content = self.infobar.get_content_area()
        self.info_label = Gtk.Label.new("Input username/password to log in..")
        info_content.pack_start(self.info_label, False, False, 0)

        self.infobar.hide()

        self.show_all()

    def on_click_login(self, button):
        self.username = self.uentry.get_text()
        self.password = self.pentry.get_text()
        if not self.username or not self.password:
            self.info_label.set_text("Username or Password is blank.")
            return
        self.info_label.set_text("Going to index")
        logger.info("Username|Password %s %s" % (self.username, self.password))
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        utils.async_call(auth.index, callback=self.after_goto_index)
        #bdstoken,sign1,sign3,timestamp = auth.index()

        print("click")
        #self.destroy()
    def after_goto_index(self, data, error):
        print(data)
        bdstoken, sign1, sign3, timestamp = data
        if not bdstoken:

            self.info_label.set_text("Geting token")

            #token = auth.get_token()
            utils.async_call(auth.get_token, callback=self.after_get_token)

        else:
            info = "bdstoken %s existing,no need to login again!" % bdstoken
            logger.info(info)
            self.info_label.set_text(info)
            self.spinn.destroy()

    def after_get_token(self, token, error):

        self.token = token
        self.info_label.set_text("Geting public key")
        utils.async_call(auth.get_public_key,
                         self.token,
                         callback=self.after_get_public_key)
        #rsakey,pubkey = auth.get_public_key(token)
    def after_get_public_key(self, data, error):
        rsakey, pubkey = data

        self.info_label.set_text("Loging in now")
        #xml = auth.login(rsakey,pubkey,self.username,self.password,self.token)
        utils.async_call(auth.login,
                         rsakey,
                         pubkey,
                         self.username,
                         self.password,
                         self.token,
                         callback=self.after_login)

    def after_login(self, data, error):
        xml, errdict = data
        if errdict['err_no'] == 257:  #Need verification Code
            codestring = errdict['codeString']
            url = 'https://passport.baidu.com/cgi-bin/genimage?' + codestring

            vd = VcodeDialog(self, url)
            vd.run()
            vf = vd.get_user_input()
            if not vf or len(vf) != 4:
                self.info_label.set_text(
                    "Verification Code missing or incorrect!")
                return
            else:
                vd.destory()
            utils.async_call(auth.relogin,
                             rsakey,
                             pubkey,
                             self.username,
                             self.password,
                             vf,
                             codeString,
                             callback=self.after_login)

        elif errdict['err_no'] == 0:
            self.info_label.set_text("Login Successfully!")
            self.hide()
        self.spinn.destroy()

    def on_toggle_offline(self, button):
        if button.get_active():
            settings.DRY = True
        else:
            settings.DRY = False
        logger.info("Flag DRY toggled to %s" % settings.DRY)

    def on_toggle_verbose(self, button):
        if button.get_active():
            settings.VERBOSE = True
        else:
            settings.VERBOSE = False
        logger.info("Flag VERBOSE toggled to %s" % settings.VERBOSE)
예제 #11
0
class VcodeDialog(Gtk.Dialog):
    __metaclass__ = Singleton

    def __init__(self, parent, url):
        Gtk.Dialog.__init__(
            self,
            "Verification Code",
            parent,
            0,
        )
        self.file_list = []
        #self.downlink = []
        #self.tokens = tokens
        self.url = url
        #self.bdstoken,sign1,sign3,timestamp = self.tokens
        self.vcodefile = "image/vcode.jpeg"
        self.set_default_size(300, 200)
        self.set_border_width(10)
        label = Gtk.Label("Please input verification code above to proceed.")
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        self.vcodeimg = Gtk.Image.new()

        self.box = self.get_content_area()
        self.entry = Gtk.Entry()
        self.entry.connect("activate", self.on_enter_entry)
        self.entry.set_can_focus(True)
        self.entry.grab_focus()
        self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf)
        pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
        self.liststore.append([pix])
        iconview = Gtk.IconView.new()
        iconview.set_model(self.liststore)
        iconview.set_pixbuf_column(0)
        #self.liststore.append([pix])
        self.show_vcode("image/loading.gif", None)  #"image/loading.gif",

        self.box.add(iconview)
        #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
        #Gtk.Image.new_from_pixbuf(pix)
        button = Gtk.Button("Refresh Code")
        button.connect("clicked", self.on_click_refresh_clicked)
        self.on_click_refresh_clicked(button)

        #self.entry.set_text("Input vcode above")

        self.okbtn = self.add_button("OK", 22)
        self.okbtn.connect("clicked", self.on_click_OK_clicked)
        self.box.set_child_packing(button, False, False, 1, Gtk.PackType.START)

        self.box.set_spacing(8)
        self.box.add(label)

        self.box.add(self.entry)
        self.box.add(button)
        #self.box.add(okbtn)

        self.box.show_all()

    def on_enter_entry(self, *arg):
        self.okbtn.clicked()

    def on_click_refresh_clicked(self, *arg):
        utils.async_call(self.download_vcodeimg,
                         self.url,
                         self.vcodefile,
                         callback=self.show_vcode)

    def new_url(self, url):
        self.url = url

    def on_click_OK_clicked(self, *arg):
        if not self.entry.get_text().strip():
            dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
                                       Gtk.ButtonsType.OK, "Attention.......")
            dialog.format_secondary_text("Nothing is input!")
            dialog.run()
            dialog.destroy()
            return

    def get_user_input(self, *arg):
        print(arg)
        inputtxt = self.entry.get_text().strip()

        return inputtxt

    def download_vcodeimg(self, imgurl, vcodeimg):
        f = open(vcodeimg, "wb")
        fp = fetch(imgurl, {}, "GetVcode")
        f.write(fp)
        f.close()
        return vcodeimg

    def show_vcode(self, imgfile, error):
        print('filename:', imgfile, error)
        pix = GdkPixbuf.Pixbuf.new_from_file(imgfile)
        fmat = GdkPixbuf.Pixbuf.get_file_info(imgfile)
        print(fmat[0].get_description(), fmat[0].get_extensions(),
              fmat[0].get_mime_types())
        print(pix)
        #if not self.vcodeimg:
        #self.vcodeimg.clear()
        #self.vcodeimg = Gtk.Image.new_from_pixbuf(pix)
        path = Gtk.TreePath(0)
        #self.liststore.append([pix])
        treeiter = self.liststore.get_iter(path)
        self.liststore.set_value(treeiter, 0, pix)
        #else:
        #	self.vcodeimg = Gtk.Image.set_from_pixbuf(pix)
        #self.vcodeimg.show()

        self.spinn.destroy()
예제 #12
0
class DownloadDialog(Gtk.Dialog):
    __metaclass__ = Singleton

    def __init__(self, parent, file_list=[], tokens=None):
        Gtk.Dialog.__init__(self, "Download Task", parent, 0)
        self.file_list = file_list
        self.downlink = []
        self.tokens = tokens
        #self.file_list = nlist
        #self.remove_list = file_list
        self.current_selection = None

        #self.draw_widget(file_list)
        #def draw_widget(self,file_list):
        self.set_default_size(1100, 500)
        self.set_border_width(10)

        box = self.get_content_area()

        ##							   num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status
        #                              0   1   2        3     4    5     6    7    8     9     10       11
        self.liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, str, str, str,
                                       int, str, int, str, str, int, str)
        self.liststore.connect("row-changed", self.row_changed)
        self.fill_liststore(self.file_list)

        #creating the treeview, making it use the filter as a model, and adding the columns
        self.treeview = Gtk.TreeView(model=self.liststore)
        for i, column_title in enumerate([
                "Num", "Thumb", "File", "Size", "Status", "Saving Path",
                "Speed", "Progress"
        ]):

            if column_title == "Thumb":

                renderer_pixbuf = Gtk.CellRendererPixbuf()

                column = Gtk.TreeViewColumn(column_title,
                                            renderer_pixbuf,
                                            pixbuf=i)
            elif column_title == "Saving Path":

                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_title, renderer, text=8)
            elif column_title == "Speed":

                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_title, renderer, text=9)
            elif column_title == "Status":

                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_title, renderer, text=11)
            elif column_title == "Progress":
                renderer = Gtk.CellRendererProgress()
                column = Gtk.TreeViewColumn(column_title, renderer, value=1)

            else:
                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            self.treeview.append_column(column)

        self.treeview.props.activate_on_single_click = False
        self.treeview.connect("row-activated", self.on_row_double_click)

        self.selection = self.treeview.get_selection()
        self.selection.connect("changed", self.on_tree_selection_changed)
        self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)

        self.buttons = list()
        for act in [
                "Select All", "Unselect All", "Start Task", "Stop Task",
                "Remove Task"
        ]:
            button = Gtk.Button(act)
            self.buttons.append(button)
            funcname = "on_%s_button_clicked" % act.lower().replace(" ", "_")

            func = getattr(self, funcname)
            button.connect("clicked", func)

        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)

        box.pack_start(self.scrollable_treelist, True, True, 0)
        for i, button in enumerate(self.buttons):
            #box.pack_start(self.buttons[i], False,False, 0)
            self.add_action_widget(self.buttons[i], i + 1)
        self.scrollable_treelist.add(self.treeview)

        box.show_all()

    def row_changed(self, store, path, treeiter):
        print("rowchange:", path)
        row = tuple(i for i in store[path])

        print(row)
        print(self.file_list)
        self.file_list[int(path.to_string())] = row
        print(self.file_list)

    def fill_liststore(self, file_list):
        if file_list:
            for i, filerow in enumerate(file_list):

                self.liststore.append(list(filerow))

    def on_tree_selection_changed(self, selection):
        #print(selection.get_selected_rows() )
        references = []
        self.current_selection = selection.get_selected_rows()

    def on_row_double_click(self, treeview, treepath, treeviewcolumn):
        print("Double click")

    def on_select_all_button_clicked(self, *arg):
        self.selection.select_all()

    def on_unselect_all_button_clicked(self, *arg):
        self.selection.unselect_all()

    def set_value(self, num, value, pos):
        path = Gtk.TreePath(num)
        treeiter = self.liststore.get_iter(path)
        self.liststore.set_value(treeiter, pos, value)
        #self.liststore.row_changed(path,treeiter)

    def get_down_link(self, link_data, error):

        if not error:

            link, fsid, num = link_data
            logger.debug("Download Link Ready = %s" % str(link))

            for i, row in enumerate(self.downlink):
                if row[3] == fsid:
                    listrow = list(row)
                    listrow[1] = link
                    self.downlink[i] = tuple(listrow)
                    self.q.put(self.downlink[i])
                    break
            print('----async---', self.downlink)

            print(self.q)

            status = "Download Link Ready"
            self.set_value(num, status, 11)
        else:
            logger.debug("Get download link error %s" % str(error))
        self.spinn.destroy()

    def download_progress():
        while not self.q.empty():
            task = self.q.get()
            print(task)
            fn = task[0]
            link = task[1]
            spath = task[2]
            url = re.sub("http://([^/]*)/", 'http://hot.baidupcs.com/', link)
            #cmd=['aria2c','-c', '-s1', '-x1','-j1', url,'-o',fn]
            cmd = "cd %s && aria2c -c -s1 -x1 -j1 -o '%s' '%s'" % (spath, fn,
                                                                   url)
            logger.info(cmd)
            print(cmd)
            import shlex
            #os.system("cd %s && %s"%(downpath,cmd))
            #cmd = 'ls /etc/fstab /etc/non-existent-file'
            self.downproc = Popen(shlex.split(cmd),
                                  shell=True,
                                  stdin=PIPE,
                                  stdout=PIPE,
                                  stderr=STDOUT)
            output = self.downproc.stdout.read()
            #output,errs = self.downproc.communicate()
            #STDOUT
            output = output.decode('utf-8')
            print(output)
            speedmat = re.search("\|([^|]*\/s)\|", output)
            if speedmat:
                speed = speedmat.group(1).strip()
            else:
                spmat = re.findall("DL:([^\s|^\]]*)", output, re.MULTILINE)
                if spmat:
                    speed = spmat[len(spmat) - 1]
                else:
                    speed = '0B/s'
            errmat = re.search("(errorCode[^\n]*status[^\n]*)", output)
            progmat = re.findall("\(([^)]*)\)", output, re.MULTILINE)
            progress = 0
            if progmat:
                progress = int(progmat[len(progmat) - 1].strip("%"))
            error = ''
            if speedmat:
                error = errmat.group(1)
                self.set_value(num, error, 11)
            print(speed, progress)
            self.set_value(num, speed, 9)
            self.set_value(num, progress, 10)

    def on_start_task_button_clicked(self, *arg):
        if self.is_current_selection_null():
            return
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        store, treepaths = self.current_selection
        self.q = queue.LifoQueue()

        for tpath in treepaths:

            print(store[tpath][2], store[tpath][4])
            row = store[tpath]
            num = row[0]
            filename = row[2]
            path = row[4]
            isdir = row[5]
            fsid = row[6]
            spath = row[8]
            if not self.in_list(row, self.downlink):
                print(filename, fsid)
                npath = os.path.join(path, filename)
                utils.async_call(cloudapi.get_dlink,
                                 self.tokens,
                                 fsid,
                                 npath,
                                 num,
                                 callback=self.get_down_link)
                self.downlink.append((filename, None, spath, fsid))
        print('0000sync888', self.downlink)

    def on_stop_task_button_clicked(self, *arg):
        print('-------------after-------------', self.downlink)
        self.downproc.terminate()

    def on_remove_task_button_clicked(self, *arg):
        if self.is_current_selection_null():
            return

        store, treepaths = self.current_selection

        for tpath in treepaths:
            task = ()
            for i in store[tpath]:
                task = task + (i, )

            if task in self.file_list:

                self.file_list.remove(task)
        self.liststore.clear()
        self.fill_liststore(self.file_list)

    def is_current_selection_null(self):
        if not self.current_selection or not self.current_selection[1]:
            dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
                                       Gtk.ButtonsType.OK, "Attention.......")
            dialog.format_secondary_text("NO File is selected.!")
            dialog.run()
            dialog.destroy()
            return True
        else:
            return False

    def remove_task_in_list(self, task, dlist):
        for row in dlist:

            if task[2] == row[2]:
                old_task = row
                break
        dlist.remove(old_task)

    def in_list(self, item, dlist):
        for row in dlist:
            print(item[6], row[3])
            if item[6] == row[3]:
                return True

        return False
예제 #13
0
class VcodeDialog(Gtk.Dialog):
	__metaclass__ = Singleton
	def __init__(self,parent,url):
		Gtk.Dialog.__init__(self, "Verification Code", parent, 0,)
		self.file_list = []
		#self.downlink = []
		#self.tokens = tokens
		self.url = url
		#self.bdstoken,sign1,sign3,timestamp = self.tokens
		self.vcodefile = "image/vcode.jpeg"
		self.set_default_size(300, 200)
		self.set_border_width(10)
		label = Gtk.Label("Please input verification code above to proceed.")
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		self.vcodeimg = Gtk.Image.new()

		self.box = self.get_content_area()
		self.entry = Gtk.Entry()
		self.entry.connect("activate",self.on_enter_entry)
		self.entry.set_can_focus(True)
		self.entry.grab_focus()
		self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf)
		pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
		self.liststore.append([pix])
		iconview = Gtk.IconView.new()
		iconview.set_model(self.liststore)
		iconview.set_pixbuf_column(0)
		#self.liststore.append([pix])
		self.show_vcode("image/loading.gif",None)#"image/loading.gif",
	
		self.box.add(iconview)
		#pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif")
		 #Gtk.Image.new_from_pixbuf(pix)
		button = Gtk.Button("Refresh Code")
		button.connect("clicked", self.on_click_refresh_clicked)
		self.on_click_refresh_clicked(button)

	
		#self.entry.set_text("Input vcode above")

		self.okbtn = self.add_button("OK", 22)
		self.okbtn.connect("clicked", self.on_click_OK_clicked)
		self.box.set_child_packing(button,False,False,1,Gtk.PackType.START)

		self.box.set_spacing(8)
		self.box.add(label)
		
		self.box.add(self.entry)
		self.box.add(button)
		#self.box.add(okbtn)
		
		self.box.show_all()

	def on_enter_entry(self,*arg):
		self.okbtn.clicked()
	def on_click_refresh_clicked(self,*arg):
		utils.async_call(self.download_vcodeimg,self.url,self.vcodefile,
						 callback=self.show_vcode)
	def new_url(self,url):
		self.url = url
	def on_click_OK_clicked(self,*arg):
		if not self.entry.get_text().strip():
			dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK, "Attention.......")
			dialog.format_secondary_text("Nothing is input!")
			dialog.run()
			dialog.destroy()
			return
		
	def get_user_input(self,*arg):
		print(arg)
		inputtxt = self.entry.get_text().strip()

		return inputtxt
	def download_vcodeimg(self,imgurl,vcodeimg):
		f=open(vcodeimg,"wb")
		fp = fetch(imgurl,{},"GetVcode")
		f.write(fp)
		f.close()
		return vcodeimg
	def show_vcode(self,imgfile,error):
		print('filename:',imgfile,error)
		pix = GdkPixbuf.Pixbuf.new_from_file(imgfile)
		fmat = GdkPixbuf.Pixbuf.get_file_info(imgfile)
		print(fmat[0].get_description(),fmat[0].get_extensions(),fmat[0].get_mime_types())
		print(pix)
		#if not self.vcodeimg:
		#self.vcodeimg.clear()
		#self.vcodeimg = Gtk.Image.new_from_pixbuf(pix)
		path = Gtk.TreePath(0)
		#self.liststore.append([pix])
		treeiter = self.liststore.get_iter(path)
		self.liststore.set_value(treeiter, 0, pix)
		#else:
		#	self.vcodeimg = Gtk.Image.set_from_pixbuf(pix)
		#self.vcodeimg.show()
		
		self.spinn.destroy()
예제 #14
0
	def __init__(self,parent,tokens,save_path):
		Gtk.Dialog.__init__(self, "Download Task", parent, 0)
		self.file_list = []
		#self.downlink = []
		self.tokens = tokens
		
		self.bdstoken,sign1,sign3,timestamp = self.tokens
		#self.file_list = nlist
		#self.remove_list = file_list
		self.current_selection = None
		self.save_path = save_path
		#self.draw_widget(file_list)
		#def draw_widget(self,file_list):
		self.set_default_size(800, 500)
		self.set_border_width(10)


		box = self.get_content_area()

		##							   num,filename,size,status,path,
		#                              0   1       2        3     4    
		self.liststore = Gtk.ListStore(int,str, str, str,str,str)
		#self.liststore.connect("row-changed",self.row_changed)
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		self.init_view(self.bdstoken)


		#creating the treeview, making it use the filter as a model, and adding the columns
		self.treeview = Gtk.TreeView(model=self.liststore)
		for i, column_title in enumerate(["Num","File", "Size","Status", "Path"]):
						
			renderer = Gtk.CellRendererText()
			column = Gtk.TreeViewColumn(column_title, renderer,text=i)
			self.treeview.append_column(column)

		self.treeview.props.activate_on_single_click = False
		self.treeview.connect("row-activated",self.on_row_double_click)


		self.selection = self.treeview.get_selection()
		self.selection.connect("changed", self.on_tree_selection_changed)
		self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)


		self.buttons = list()
		for act in ["Add Magnet or Ed2k Link File","Select All","Unselect All", "Remove Task"]:
			button = Gtk.Button(act)
			self.buttons.append(button)
			funcname = "on_%s_button_clicked"%act.lower().replace(" ","_")
			
			func = getattr(self, funcname)
			button.connect("clicked", func)


		self.scrollable_treelist = Gtk.ScrolledWindow()
		self.scrollable_treelist.set_vexpand(True)

		box.pack_start(self.scrollable_treelist, True, True, 0)


		for i, button in enumerate(self.buttons):
			#box.pack_start(self.buttons[i], False,False, 0)
			self.add_action_widget(self.buttons[i],i+1)
		self.scrollable_treelist.add(self.treeview)
	

		self.infobar = Gtk.InfoBar()
		self.infobar.set_message_type(Gtk.MessageType.ERROR)
		#box.pack_end(self.infobar, False, False, 0)
		#grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1)
		box.add(self.infobar)
		info_content = self.infobar.get_content_area()
		self.info_label = Gtk.Label.new("Add magnet/ed2k file to add offline download task")
		info_content.pack_start(self.info_label, False, False, 0)

		
		self.infobar.hide()
		box.show_all()
예제 #15
0
	def on_add_magnet_or_ed2k_link_file_button_clicked(self,*arg):
		dialog = Gtk.FileChooserDialog("Please choose a file", self,
			Gtk.FileChooserAction.OPEN,
			(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
			 Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

		response = dialog.run()
		if response == Gtk.ResponseType.OK:
			#linkfile = dialog.get_file().read()
			filename = dialog.get_filename()
			
			print("Open clicked")
			print("File selected: " + dialog.get_filename())
		elif response == Gtk.ResponseType.CANCEL:
			return
		
		dialog.destroy()
		
		link_list = open(filename).read()
		task_list = []
		invalid_list = []
		for line in link_list.split("\n"):
			line = line.strip()
			if line and ( line.startswith("magnet:?xt=urn") or \
				 line.startswith("ed2k://") ):
				task_list.append(line)
				
			elif line:
				invalid_list.append(line)
		if invalid_list:
				dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
						Gtk.ButtonsType.OK, "Attention")
				dialog.format_secondary_text(
						"Only magnet or ed2k protocal is support! Invalid lines :%s"%str(invalid_list))
				response = dialog.run()
				dialog.destroy()
				return 
		print(self.save_path)
		
		maglist = [ i['source_url'] for i in self.task_list   if "magnet:?xt=urn:" in i['source_url'] ]
		logger.debug("maglist: %s "%str(maglist))
		
		for i,l in enumerate(task_list):
			mag = re.search('(&.*$)',l).group(1)
			task_name = dict(urllib.parse.parse_qsl(mag))['dn']
			txt = "%s out of %s | %s is running."%(str(i),len(task_list),str(task_name))
			logger.info(txt)
			self.info_label.set_text(txt)
			maglink = re.search("(magnet[^&]*)",l).group(1)
			logger.debug("maglink: %s "%maglink)
			self.spinn = SpinnerDialog(self)
			self.spinn.show()
			if maglink not in maglist:
				
				self.info_label.set_text("Adding task: %s "%task_name)
				taskjson = cloudapi.add_task(self.bdstoken, l,self.save_path,self)
				self.init_view(self.bdstoken)
				self.spinn.destroy()

				#taskjson = cloudapi.add_task(l,self.save_path)
				logger.debug("taskjson: %s "%taskjson)
				if 'task_id' in taskjson.keys():
					self.spinn = SpinnerDialog(self)
					self.spinn.show()
					self.info_label.set_text("Querying task: %s "%task_name)
					task_id = str(taskjson['task_id'])
					utils.async_call(cloudapi.query_task, self.bdstoken,task_id,
							 callback=self.after_query_task)
					self.spinn.destroy()
				else:
					error = taskjson['error_msg']
					logger.info(error)
					self.info_label.set_text(error)
					#self.spinn.destroy()
				
			else:
				info = "Already existed,pass"
				logger.info(info)
				self.info_label.set_text(info)
			
				self.spinn.destroy()
예제 #16
0
class TaskDialog(Gtk.Dialog):
	__metaclass__ = Singleton
	def __init__(self,parent,tokens,save_path):
		Gtk.Dialog.__init__(self, "Download Task", parent, 0)
		self.file_list = []
		#self.downlink = []
		self.tokens = tokens
		
		self.bdstoken,sign1,sign3,timestamp = self.tokens
		#self.file_list = nlist
		#self.remove_list = file_list
		self.current_selection = None
		self.save_path = save_path
		#self.draw_widget(file_list)
		#def draw_widget(self,file_list):
		self.set_default_size(800, 500)
		self.set_border_width(10)


		box = self.get_content_area()

		##							   num,filename,size,status,path,
		#                              0   1       2        3     4    
		self.liststore = Gtk.ListStore(int,str, str, str,str,str)
		#self.liststore.connect("row-changed",self.row_changed)
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		self.init_view(self.bdstoken)


		#creating the treeview, making it use the filter as a model, and adding the columns
		self.treeview = Gtk.TreeView(model=self.liststore)
		for i, column_title in enumerate(["Num","File", "Size","Status", "Path"]):
						
			renderer = Gtk.CellRendererText()
			column = Gtk.TreeViewColumn(column_title, renderer,text=i)
			self.treeview.append_column(column)

		self.treeview.props.activate_on_single_click = False
		self.treeview.connect("row-activated",self.on_row_double_click)


		self.selection = self.treeview.get_selection()
		self.selection.connect("changed", self.on_tree_selection_changed)
		self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)


		self.buttons = list()
		for act in ["Add Magnet or Ed2k Link File","Select All","Unselect All", "Remove Task"]:
			button = Gtk.Button(act)
			self.buttons.append(button)
			funcname = "on_%s_button_clicked"%act.lower().replace(" ","_")
			
			func = getattr(self, funcname)
			button.connect("clicked", func)


		self.scrollable_treelist = Gtk.ScrolledWindow()
		self.scrollable_treelist.set_vexpand(True)

		box.pack_start(self.scrollable_treelist, True, True, 0)


		for i, button in enumerate(self.buttons):
			#box.pack_start(self.buttons[i], False,False, 0)
			self.add_action_widget(self.buttons[i],i+1)
		self.scrollable_treelist.add(self.treeview)
	

		self.infobar = Gtk.InfoBar()
		self.infobar.set_message_type(Gtk.MessageType.ERROR)
		#box.pack_end(self.infobar, False, False, 0)
		#grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1)
		box.add(self.infobar)
		info_content = self.infobar.get_content_area()
		self.info_label = Gtk.Label.new("Add magnet/ed2k file to add offline download task")
		info_content.pack_start(self.info_label, False, False, 0)

		
		self.infobar.hide()
		box.show_all()


	def on_tree_selection_changed(self,*arg):
		self.current_selection = self.selection.get_selected_rows()

	def populate_view(self,*arg):
		listjson,error = arg
		print(listjson)
		if 'task_info' in list(listjson.keys()):
			task_list = listjson['task_info']
		
			file_list = []
			for i,row in enumerate(task_list):
				if int(row['status']) == 0:
					status = "Success"
				else:
					status = "Not Finised"
				nrow = (i,row['task_name'],'0B',status,row['save_path'],row['task_id'])
				file_list.append(nrow)
		
			self.fill_liststore(file_list)
		
		elif 'error_msg' in list(listjson.keys()):
			info =listjson['error_msg']
			logger.info(info)
			self.info_label.set_text(info)
		self.spinn.destroy()
		
	def init_view(self,bdstoken):
		
		utils.async_call(cloudapi.list_task, bdstoken,
				     callback=self.populate_view)

		self.fill_liststore([])

	def fill_liststore(self,file_list):
		if file_list:
			self.liststore.clear()
			for i,filerow  in enumerate(file_list):

				self.liststore.append(list(filerow))


	def on_select_all_button_clicked(self,*arg):
		self.selection.select_all()
	def on_unselect_all_button_clicked(self,*arg):
		self.selection.unselect_all()
	def on_remove_task_button_clicked(self,*arg):
		def is_current_selection_null():
			if not self.current_selection or not self.current_selection[1] :
				dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
		        Gtk.ButtonsType.OK, "Attention.......")
				dialog.format_secondary_text("NO File is selected.!")
				dialog.run()
				dialog.destroy()
				return True
			else:	
				return False
		def after_delete_task(data,error):
			self.info_label.set_text("Deletion is done")
			self.init_view(self.bdstoken)
			self.spinn.destroy()

		if is_current_selection_null(): 
			return
		store,treepaths = self.current_selection
	

		for tpath in treepaths:
			task = ()
			for i in store[tpath]:
				task = task + (i,)
				
			task_id = task[5]
			self.spinn = SpinnerDialog(self)
			self.spinn.show()
			self.info_label.set_text("Deleting task %s "%task[1])
			utils.async_call(cloudapi.delete_task, self.bdstoken,task_id ,
						 callback=after_delete_task)
		#self.liststore.clear()
		#self.fill_liststore(file_list)


	def on_row_double_click(self,*arg):
		pass
	def after_cancel_task(self,*arg):
		
		taskdata,error = arg
		canceljson,task_id,task_name = taskdata
		logger.debug("canceljson: %s "%canceljson)
		info ="Task:%s,id:%s is cancelled."%(task_name,task_id)
		logger.info(info)
		self.info_label.set_text(info)
		self.init_view(self.bdstoken)
		self.spinn.destroy()

	def after_query_task(self,*arg):
		taskdata,error = arg
		taskjson,task_id = taskdata
		#self.init_view(self.bdstoken)
		#taskjson = cloudapi.query_task(task_id)
		logger.debug("taskjson: %s "%taskjson)
		#if task_json:
		file_size = int(taskjson['task_info'][task_id]['file_size'])
		finished_size = int(taskjson['task_info'][task_id]['finished_size'])
		task_name  = taskjson['task_info'][task_id]['task_name']
		logger.debug("file_size: %s "%file_size)
		logger.debug("finished_size: %s "%finished_size)


		if finished_size/file_size < 1 :
			info = "%s : Finished rate is less than 0.6, canceling."%task_name
			logger.info(info)
			self.info_label.set_text(info)
			utils.async_call(cloudapi.cancel_task, self.bdstoken,task_id,task_name,
					 callback=self.after_cancel_task)

		else:
			info = "Task:%s,id:%s is successfully created."%(task_name,task_id)
			logger.info(info)
			self.info_label.set_text(info)
			#self.init_view(self.bdstoken)
			self.spinn.destroy()
			

	def after_add_task(self,*arg):
		taskjson,error = arg
		logger.debug("taskjson: %s "%taskjson)
		if 'task_id' in taskjson.keys():
			task_id = str(taskjson['task_id'])
			utils.async_call(cloudapi.query_task, self.bdstoken,task_id,
				     callback=self.after_query_task)

		else:
			error = taskjson['error_msg']
			logger.info(error)
			self.info_label.set_text(error)
			#self.init_view(self.bdstoken)
			self.spinn.destroy()

		#self.spinn.destroy()

	def on_add_magnet_or_ed2k_link_file_button_clicked(self,*arg):
		dialog = Gtk.FileChooserDialog("Please choose a file", self,
			Gtk.FileChooserAction.OPEN,
			(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
			 Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

		response = dialog.run()
		if response == Gtk.ResponseType.OK:
			#linkfile = dialog.get_file().read()
			filename = dialog.get_filename()
			
			print("Open clicked")
			print("File selected: " + dialog.get_filename())
		elif response == Gtk.ResponseType.CANCEL:
			return
		
		dialog.destroy()
		
		link_list = open(filename).read()
		task_list = []
		invalid_list = []
		for line in link_list.split("\n"):
			line = line.strip()
			if line and ( line.startswith("magnet:?xt=urn") or \
				 line.startswith("ed2k://") ):
				task_list.append(line)
				
			elif line:
				invalid_list.append(line)
		if invalid_list:
				dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
						Gtk.ButtonsType.OK, "Attention")
				dialog.format_secondary_text(
						"Only magnet or ed2k protocal is support! Invalid lines :%s"%str(invalid_list))
				response = dialog.run()
				dialog.destroy()
				return 
		print(self.save_path)
		
		maglist = [ i['source_url'] for i in self.task_list   if "magnet:?xt=urn:" in i['source_url'] ]
		logger.debug("maglist: %s "%str(maglist))
		
		for i,l in enumerate(task_list):
			mag = re.search('(&.*$)',l).group(1)
			task_name = dict(urllib.parse.parse_qsl(mag))['dn']
			txt = "%s out of %s | %s is running."%(str(i),len(task_list),str(task_name))
			logger.info(txt)
			self.info_label.set_text(txt)
			maglink = re.search("(magnet[^&]*)",l).group(1)
			logger.debug("maglink: %s "%maglink)
			self.spinn = SpinnerDialog(self)
			self.spinn.show()
			if maglink not in maglist:
				
				self.info_label.set_text("Adding task: %s "%task_name)
				taskjson = cloudapi.add_task(self.bdstoken, l,self.save_path,self)
				self.init_view(self.bdstoken)
				self.spinn.destroy()

				#taskjson = cloudapi.add_task(l,self.save_path)
				logger.debug("taskjson: %s "%taskjson)
				if 'task_id' in taskjson.keys():
					self.spinn = SpinnerDialog(self)
					self.spinn.show()
					self.info_label.set_text("Querying task: %s "%task_name)
					task_id = str(taskjson['task_id'])
					utils.async_call(cloudapi.query_task, self.bdstoken,task_id,
							 callback=self.after_query_task)
					self.spinn.destroy()
				else:
					error = taskjson['error_msg']
					logger.info(error)
					self.info_label.set_text(error)
					#self.spinn.destroy()
				
			else:
				info = "Already existed,pass"
				logger.info(info)
				self.info_label.set_text(info)
			
				self.spinn.destroy()
예제 #17
0
class MajorWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Cloud Disk")

        self.set_border_width(10)
        self.maximize()
        #Setting up the self.grid in which the elements are to be positionned
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)
        #box = Gtk.Box(spacing=6)
        #self.add(box)
        self.tokens = auth.index()

        self.bdstoken, self.sign1, self.sign3, self.timestamp = self.tokens

        #self.connect('activate', self.on_login_dialog_close)
        #self.connect("delete-event", Gtk.main_quit)
        if not self.bdstoken:
            dialog = LoginDialog(self)
            #dialog.connect("close",self.on_login_dialog_close)
            response = dialog.run()

            dialog.destroy()
            if response == Gtk.ResponseType.DELETE_EVENT:
                print(response)
                print("quit")
                #self.close()

                self.destroy()
                return
            elif response == 11:
                print("login")
            else:
                return
        self.down_list = []

        self.current_path = "/"
        self.current_selection = None
        ##							   num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status
        #                              0   1   2        3     4    5     6    7    8     9     10       11
        self.liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, str, str, str,
                                       int, str, int, str, str, int, str)
        self.current_list = []
        #self.loading_spin = Gtk.Spinner()
        #self.loading_spin.props.valign = Gtk.Align.CENTER
        #box.pack_start(self.loading_spin, False, False, 0)
        #self.grid.add(self.loading_spin)

        self.init_view(self.current_path)
        #self.spinn.hide()
        #list_json = cloudapi.list_path(self.current_path,500,settings.DRY,self.bdstoken)
        #logger.debug("list json: %s"%str(len(list_json))
        #file_list = cloudapi.get_list(list_json)
        #logger.debug("file_list: %s"%str(file_list))

        #self.populate_view(file_list)

        self.stop_gif = False

        #creating the treeview, making it use the filter as a model, and adding the columns
        self.treeview = Gtk.TreeView(model=self.liststore)
        for i, column_title in enumerate(
            ["Num", "Thumb", "File", "Size", "Path"]):
            if column_title != "Thumb":
                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            else:
                renderer_pixbuf = Gtk.CellRendererPixbuf()

                column = Gtk.TreeViewColumn(column_title,
                                            renderer_pixbuf,
                                            pixbuf=i)

            #if not column_title == 'isdir' and not column_title == 'fsid' and not column_title == 'cate'  :
            self.treeview.append_column(column)

        self.treeview.props.activate_on_single_click = False
        self.treeview.connect("row-activated", self.on_row_double_click)

        self.selection = self.treeview.get_selection()
        self.selection.connect("changed", self.on_tree_selection_changed)
        self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)
        #select = selection.get_selected_rows()

        #creating buttons to filter by programming language, and setting up their events
        self.buttons = list()
        for act in [
                "Up level", "Refresh View", "Batch Add Task", "Remove File",
                "Download", "CleanUp", "Search"
        ]:
            button = Gtk.Button(act)
            self.buttons.append(button)
            funcname = "on_%s_button_clicked" % act.lower().replace(" ", "_")
            print(funcname)
            func = getattr(self, funcname)
            button.connect("clicked", func)

        #setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row
        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        #self.grid.attach(self.loading_spin, 0, 0, 10, 20)
        #self.grid.attach_next_to(self.scrollable_treelist,self.loading_spin, Gtk.PositionType.BOTTOM, 10, 23)
        self.grid.attach(self.scrollable_treelist, 0, 0, 8, 20)
        #box.pack_start(self.scrollable_treelist, True, True, 0)
        self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist,
                                 Gtk.PositionType.BOTTOM, 1, 1)
        for i, button in enumerate(self.buttons[1:]):
            self.grid.attach_next_to(button, self.buttons[i],
                                     Gtk.PositionType.RIGHT, 1, 1)
            #self.add_action_widget(self.buttons[i],i+1)
            #box.pack_start(self.buttons[i], False, False, 0)
        self.scrollable_treelist.add(self.treeview)

        #box.show_all()
        self.grid.show_all()
        #self.loading_spin.start()
        #self.loading_spin.show_all()
        #self.loading_spin.hide()
        #self.hide()
    def reload_pix(self, re_data, error):
        pix = None
        if not error:
            num, thumbimg = re_data
            path = Gtk.TreePath(int(num))
            if len(self.liststore) > 0:
                treeiter = self.liststore.get_iter(path)
                if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:

                    pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg)
                else:
                    pix = None
                logger.debug("reloading pix,pix = %s" % str(pix))
                self.stop_gif = True
                self.liststore.set_value(treeiter, 1, pix)

        else:
            logger.debug("reload_pix error %s" % str(error))

    def get_pix_list(self, file_list):
        current_list = []

        def advance_frame(*user_data):

            num, pixiter = user_data
            #pass#
            if pixiter.advance() and not self.stop_gif:

                pix = pixiter.get_pixbuf()

                path = Gtk.TreePath(int(num))

                if len(self.liststore) > 0:

                    treeiter = self.liststore.get_iter(path)
                    self.liststore.set_value(treeiter, 1, pix)
                return True
            else:
                return False

        def down_img(num, thumbimg, link, fsid, header, path):
            logger.debug(" %s is downloading" % str(fsid))
            f = open(thumbimg, "wb")
            img = fetch(link, {}, fsid, header, path)
            f.write(img)
            f.close()
            return (num, thumbimg)

        def create_img_pix(thumbimg):
            if not GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:
                return None
            else:
                return GdkPixbuf.Pixbuf.new_from_file(thumbimg)

        for row in file_list:
            #if cate == 1:
            #(num,thumb,filename,size,path,isdir,fsid,cate)
            num = row[0]
            thumb = row[1]
            path = row[4]
            isdir = row[5]
            fsid = row[6]
            cate = row[7]
            host = urlparse(thumb)[1]

            header = {
                'Host': host,
                'Referer': DISK_HOME,
            }
            if not os.path.exists("image"):
                os.makedirs("image")
            thumbimg = "image/" + fsid + ".jpg"

            if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:

                pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg)

            elif thumb:
                self.stop_gif = False
                pixan = GdkPixbuf.PixbufAnimation.new_from_file(
                    "image/loading.gif")
                pixiter = pixan.get_iter()
                pix = pixiter.get_pixbuf()
                #pix.set_loop(True)
                GLib.timeout_add(pixiter.get_delay_time(), advance_frame, num,
                                 pixiter)
                logger.debug("Async call download for file %s " % str(fsid))
                utils.async_call(down_img,
                                 num,
                                 thumbimg,
                                 thumb,
                                 fsid,
                                 header,
                                 path,
                                 callback=self.reload_pix)
            elif isdir:
                pix = GdkPixbuf.Pixbuf.new_from_file("image/folder.png")
            else:
                pix = None
            rowlist = list(row)
            rowlist[1] = pix
            #elif cate == 6:
            #	pix = create_img_pix("image/folder.png")
            current_list.append(
                tuple(rowlist) + (SAVINGPATH, "0B", 0, "pending"))
        return current_list

    def populate_view(self, list_json, error=None):
        if list_json:
            self.current_list = []
            file_list = cloudapi.get_list(list_json)
            logger.debug("Size of file_list: %s" % str(len(file_list)))
            pix_list = self.get_pix_list(file_list)
            self.fill_liststore(pix_list)
            #self.loading_spin.stop()
            #self.loading_spin.hide()
            #self.spinn.hide()
            self.spinn.destroy()

    def fill_liststore(self, file_list):

        self.liststore.clear()
        for i, filerow in enumerate(file_list):

            #logger.info("Creating TreeView at %s"%str(i))

            self.liststore.append(list(filerow))

    def on_tree_selection_changed(self, selection):
        #print(selection.get_selected_rows() )
        references = []
        self.current_selection = selection.get_selected_rows()

    def on_login_dialog_close(self, *arg):
        print("close dialog")
        print(*arg)
        self.close()

    def init_view(self, path):
        self.current_selection = None
        self.current_path = path
        logger.debug("Current Path: %s" % self.current_path)
        #list_json = cloudapi.list_path(self.current_path,500,
        #								settings.DRY,self.bdstoken)
        utils.async_call(cloudapi.list_path,
                         self.current_path,
                         500,
                         settings.DRY,
                         self.bdstoken,
                         callback=self.populate_view)
        #logger.debug("Size of list json: %s"%str(len(list_json)))
        #file_list = cloudapi.get_list(list_json)
        #logger.debug("Size of file_list: %s"%str(len(file_list)))
        #self.liststore.clear()
        #self.fill_liststore(file_list)
        #self.loading_spin.start()
        #self.loading_spin.show_all()
        self.spinn = SpinnerDialog(self)
        self.spinn.show()
        file_list = []
        pix_list = self.get_pix_list(file_list)
        self.fill_liststore(pix_list)

    def on_row_double_click(self, treeview, treepath, treeviewcolumn):
        print("Double click")
        print(self.liststore[treepath])
        #treeiter = self.liststore.get_iter(treepath)
        #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress =
        row = self.liststore[treepath]
        #num = row[0]
        filename = row[2]
        #thumb = row[1]
        path = row[4]
        isdir = row[5]
        #fsid = row[6]
        #cate = row[7]
        logger.debug("row : %s" % (','.join(str(i) for i in row)))
        if isdir:
            npath = os.path.join(path, filename)
            self.init_view(npath)

        return True

    def on_up_level_button_clicked(self, *arg):

        path = os.path.abspath(os.path.join(self.current_path, ".."))
        self.init_view(path)

    def on_refresh_view_button_clicked(self, *arg):
        settings.DRY = False
        self.init_view(self.current_path)
        settings.DRY = True

    def on_batch_add_task_button_clicked(self, *arg):
        print("Click", arg)
        settings.DRY = False
        td = TaskDialog(self, self.tokens, self.current_path)
        response = td.show()
        if response == Gtk.ResponseType.DELETE_EVENT:

            settings.DRY = True

    def on_remove_file_button_clicked(self, *arg):

        if self.is_current_selection_null():
            return
        store, treepaths = self.current_selection

        remove_list = []
        for tpath in treepaths:
            row = store[tpath]
            filename = row[2]
            path = row[4]
            isdir = row[5]
            remove_list.append(os.path.join(path, filename))
        fl = '["' + '","'.join(str(i) for i in remove_list) + '"]'
        logger.debug("Flist: %s" % fl)
        if not self.agree_to_action(fl, "remove"):
            return

        cloudapi.delete_file(self.bdstoken, fl)
        settings.DRY = False
        self.init_view(self.current_path)
        settings.DRY = True

    def task_in_list(self, task, dlist):
        for row in dlist:
            #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row
            if task[6] == row[6]:
                return True

        return False

    def on_download_button_clicked(self, *arg):
        #if self.is_current_selection_null():
        #	return

        if self.current_selection and self.current_selection[1]:
            store, treepaths = self.current_selection

            for tpath in treepaths:

                task = store[tpath]
                num = task[0]
                filename = task[2]
                thumb = task[1]
                path = task[4]
                isdir = task[5]
                fsid = task[6]
                cate = task[7]

                if not isdir and not self.task_in_list(task, self.down_list):
                    self.down_list.append(task)
                else:
                    tasks = self.recursive_selected([task])

                    for task in tasks:

                        if not self.task_in_list(task, self.down_list):

                            self.down_list.append(task)
        print(self.down_list)
        self.downdialog = DownloadDialog(self, self.down_list, self.tokens)
        #self.downdialog.connect("delete-event",self.hide_down_dialog)
        #self.downdialog.hide()
        #self.downdialog.liststore.clear()

        #self.downdialog.fill_liststore(self.down_list)
        response = self.downdialog.show()

        if response == Gtk.ResponseType.DELETE_EVENT:
            print(response)
            self.downdialog.hide()
        self.selection.unselect_all()

    def on_cleanup_button_clicked(self, *arg):
        print("Click", arg)

    def on_search_button_clicked(self, button):
        print("Click", button)
        url = 'http://pan.baidu.com/genimage?33324238656332346361663334656637323237633636373637643239666664336662343932343631383931303030303030303030303030303031343335353131313938D9224DC2E75F22A923706D077C0CD5B2'
        vd = VcodeDialog(self, url)
        response = vd.run()
        print(response)
        if response == 22:
            print("The OK button was clicked")
            vcode = vd.get_user_input()
            vd.destroy()
        elif response == Gtk.ResponseType.DELETE_EVENT:
            vd.destroy()

    def is_current_selection_null(self):
        if not self.current_selection or not self.current_selection[1]:
            dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
                                       Gtk.ButtonsType.OK, "Attention.......")
            dialog.format_secondary_text("NO File is selected.!")
            dialog.run()
            dialog.destroy()
            return True
        else:
            return False

    def agree_to_action(self, fl, action):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
                                   Gtk.ButtonsType.YES_NO,
                                   "%s Confirmation" % action.title())
        dialog.format_secondary_text("Are you sure to %s file(s) : %s" %
                                     (action, fl))
        response = dialog.run()
        dialog.destroy()
        if response == Gtk.ResponseType.YES:
            return True
        elif response == Gtk.ResponseType.NO:
            return False

    def hide_down_dialog(self, *arg):
        self.downdialog.hide()

    def recursive_selected(self, lists):
        task_list = []
        folder = []

        for row in lists:
            filename = row[2]
            path = row[4]
            isdir = row[5]
            if not isdir:

                task_list.append(row)

            else:
                folder.append((path, filename))

        for path, filename in folder:
            npath = os.path.join(path, filename)

            list_json = cloudapi.list_path(npath, 300, True, self.bdstoken)
            nlists = []
            for row in self.get_pix_list(cloudapi.get_list(list_json)):

                nlists.append(row)

            task_list += self.recursive_selected(nlists)
        return task_list
예제 #18
0
class DownloadDialog(Gtk.Dialog):
	__metaclass__ = Singleton
	def __init__(self,parent,file_list=[],tokens=None):
		Gtk.Dialog.__init__(self, "Download Task", parent, 0)
		self.file_list = file_list
		self.downlink = []
		self.tokens = tokens
		#self.file_list = nlist
		#self.remove_list = file_list
		self.current_selection = None

		#self.draw_widget(file_list)
		#def draw_widget(self,file_list):
		self.set_default_size(1100, 500)
		self.set_border_width(10)


		box = self.get_content_area()

		##							   num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status
		#                              0   1   2        3     4    5     6    7    8     9     10       11
		self.liststore = Gtk.ListStore(int,GdkPixbuf.Pixbuf,str, str, str,int,str,int,str,str,int,str)
		self.liststore.connect("row-changed",self.row_changed)
		self.fill_liststore(self.file_list)


		#creating the treeview, making it use the filter as a model, and adding the columns
		self.treeview = Gtk.TreeView(model=self.liststore)
		for i, column_title in enumerate(["Num","Thumb","File", "Size","Status", "Saving Path","Speed","Progress"]):
			
			if column_title == "Thumb":
				
				renderer_pixbuf = Gtk.CellRendererPixbuf()
				
				column = Gtk.TreeViewColumn(column_title, renderer_pixbuf,pixbuf=i)
			elif column_title == "Saving Path":
				
				renderer = Gtk.CellRendererText()
				column = Gtk.TreeViewColumn(column_title, renderer,text=8)
			elif column_title == "Speed":
				
				renderer = Gtk.CellRendererText()
				column = Gtk.TreeViewColumn(column_title, renderer,text=9)
			elif column_title == "Status":
				
				renderer = Gtk.CellRendererText()
				column = Gtk.TreeViewColumn(column_title, renderer,text=11)
			elif column_title == "Progress":
				renderer = Gtk.CellRendererProgress()
				column = Gtk.TreeViewColumn(column_title, renderer,
				value=1)

			else:
				renderer = Gtk.CellRendererText()
				column = Gtk.TreeViewColumn(column_title, renderer,text=i)
			self.treeview.append_column(column)

		self.treeview.props.activate_on_single_click = False
		self.treeview.connect("row-activated",self.on_row_double_click)


		self.selection = self.treeview.get_selection()
		self.selection.connect("changed", self.on_tree_selection_changed)
		self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)
		
 

		self.buttons = list()
		for act in ["Select All","Unselect All", "Start Task","Stop Task", "Remove Task"]:
			button = Gtk.Button(act)
			self.buttons.append(button)
			funcname = "on_%s_button_clicked"%act.lower().replace(" ","_")
			
			func = getattr(self, funcname)
			button.connect("clicked", func)


		self.scrollable_treelist = Gtk.ScrolledWindow()
		self.scrollable_treelist.set_vexpand(True)

		box.pack_start(self.scrollable_treelist, True, True, 0)
		for i, button in enumerate(self.buttons):
			#box.pack_start(self.buttons[i], False,False, 0)
			self.add_action_widget(self.buttons[i],i+1)
		self.scrollable_treelist.add(self.treeview)
	
		box.show_all()
	def row_changed(self,store,path,treeiter):
		print("rowchange:",path)
		row = tuple( i for i in store[path] )
		
		print(row)
		print(self.file_list)
		self.file_list[int(path.to_string())] = row
		print(self.file_list)
		
	def fill_liststore(self,file_list):
		if file_list:
			for i,filerow  in enumerate(file_list):

				self.liststore.append(list(filerow))

	def on_tree_selection_changed(self,selection):
		#print(selection.get_selected_rows() )
		references = []
		self.current_selection = selection.get_selected_rows()

	def on_row_double_click(self,treeview,treepath,treeviewcolumn):
		print("Double click")
	def on_select_all_button_clicked(self,*arg):
		self.selection.select_all()
	def on_unselect_all_button_clicked(self,*arg):
		self.selection.unselect_all()

	def set_value(self,num,value,pos):
		path = Gtk.TreePath(num)
		treeiter = self.liststore.get_iter(path)
		self.liststore.set_value(treeiter, pos, value)
		#self.liststore.row_changed(path,treeiter)

	def get_down_link(self,link_data,error):
		
		if not error:
			
			link,fsid,num = link_data
			logger.debug("Download Link Ready = %s"%str(link))
			
			for i,row in enumerate(self.downlink):
				if row[3] == fsid:
					listrow = list(row)
					listrow[1] = link
					self.downlink[i] = tuple(listrow)
					self.q.put(self.downlink[i])
					break
			print('----async---',self.downlink)
			
			print(self.q)
		
			status = "Download Link Ready"
			self.set_value(num,status,11)
		else:
			logger.debug("Get download link error %s"%str(error))
		self.spinn.destroy()
	def download_progress():
		while not self.q.empty():
				task = self.q.get()
				print(task)
				fn = task[0]
				link = task[1]
				spath = task[2]
				url = re.sub("http://([^/]*)/",'http://hot.baidupcs.com/',link)
				#cmd=['aria2c','-c', '-s1', '-x1','-j1', url,'-o',fn]
				cmd="cd %s && aria2c -c -s1 -x1 -j1 -o '%s' '%s'"%(spath,fn,url)
				logger.info( cmd )
				print(cmd)
				import shlex 
				#os.system("cd %s && %s"%(downpath,cmd))
				#cmd = 'ls /etc/fstab /etc/non-existent-file'
				self.downproc = Popen(shlex.split(cmd), shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
				output = self.downproc.stdout.read()
				#output,errs = self.downproc.communicate()
				#STDOUT
				output = output.decode('utf-8')
				print(output)
				speedmat = re.search("\|([^|]*\/s)\|",output)
				if speedmat:
					speed = speedmat.group(1).strip()
				else:
					spmat =  re.findall("DL:([^\s|^\]]*)",output,re.MULTILINE)
					if spmat :
						speed = spmat[len(spmat)-1]
					else:
						speed = '0B/s'
				errmat = re.search("(errorCode[^\n]*status[^\n]*)",output)
				progmat = re.findall("\(([^)]*)\)",output,re.MULTILINE)
				progress = 0
				if progmat:
						progress = int(progmat[len(progmat)-1].strip("%"))
				error = ''
				if speedmat :
					error = errmat.group(1)
					self.set_value(num,error,11)
				print(speed,progress)
				self.set_value(num,speed,9)
				self.set_value(num,progress,10)

	def on_start_task_button_clicked(self,*arg):
		if self.is_current_selection_null(): 
			return
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		store,treepaths = self.current_selection
		self.q = queue.LifoQueue()

		for tpath in treepaths:
		
			print(store[tpath][2],store[tpath][4])
			row = store[tpath]
			num = row[0]
			filename = row[2]
			path = row[4]
			isdir = row[5]
			fsid = row[6] 
			spath = row[8]
			if not self.in_list(row,self.downlink):
				print(filename,fsid)
				npath = os.path.join(path,filename)
				utils.async_call(cloudapi.get_dlink,self.tokens,fsid,npath,num,
						 callback=self.get_down_link)
				self.downlink.append((filename,None,spath,fsid))
		print('0000sync888',self.downlink)


	def on_stop_task_button_clicked(self,*arg):
		print('-------------after-------------',self.downlink)
		self.downproc.terminate()
	def on_remove_task_button_clicked(self,*arg):
		if self.is_current_selection_null(): 
			return

		store,treepaths = self.current_selection
	

		for tpath in treepaths:
			task = ()
			for i in store[tpath]:
				task = task + (i,)
		
			if task in self.file_list:
				
				self.file_list.remove(task)
		self.liststore.clear()
		self.fill_liststore(self.file_list)

	def is_current_selection_null(self):
		if not self.current_selection or not self.current_selection[1] :
			dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK, "Attention.......")
			dialog.format_secondary_text("NO File is selected.!")
			dialog.run()
			dialog.destroy()
			return True
		else:	
			return False

	def remove_task_in_list(self,task,dlist):
		for row in dlist:
			
			if task[2] == row[2]:
				old_task = row
				break
		dlist.remove(old_task)

	def in_list(self,item,dlist):
		for row in dlist:
			print(item[6],row[3])
			if item[6] == row[3]:
				return True
			
		return False
예제 #19
0
class LoginDialog(Gtk.Dialog):

	def __init__(self, parent):
		Gtk.Dialog.__init__(self, "Login...", parent, 0)

		self.set_default_size(350, 200)
		self.set_border_width(15)
		grid = Gtk.Grid()
		grid.set_row_spacing(10)
		#grid.set_row_baseline_position(1,Gtk.BaselinePosition.CENTER )
		#labelu = Gtk.Label("User Name:")
		#labelu.set_markup("<span style=\"oblique\">%s</span>")
		#labelp = Gtk.Label("Password:"******"xivhwo2002")
		self.pentry.set_text("mnja12")
		self.pentry.set_visibility(False)
		lbutton = self.add_button("Login...",11) #Gtk.Button("Login...")
		lbutton.props.xalign  = 0.5
		lbutton.connect("clicked",self.on_click_login)
		offline = Gtk.CheckButton("Offline Mode")
		offline.connect("toggled",self.on_toggle_offline)
		verbose = Gtk.CheckButton("Verbose Mode")
		verbose.connect("toggled",self.on_toggle_verbose)
		box = self.get_content_area()
		box.set_spacing(8)
		#box.add(grid)
		box.add(self.uentry)
		box.add(self.pentry)
		box.add(offline)
		box.add(verbose)
		#grid.add(labelu)
		#grid.attach_next_to(self.uentry,labelu,Gtk.PositionType.RIGHT,13,1)
		#grid.attach(labelp,0, 2, 1, 1)
		#grid.attach_next_to(self.pentry,labelp,Gtk.PositionType.RIGHT,13,1)
		#grid.attach_next_to(lbutton,self.pentry,Gtk.PositionType.BOTTOM,13,1)

		self.infobar = Gtk.InfoBar()
		self.infobar.set_message_type(Gtk.MessageType.ERROR)
		#box.pack_end(self.infobar, False, False, 0)
		#grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1)
		box.add(self.infobar)
		info_content = self.infobar.get_content_area()
		self.info_label = Gtk.Label.new("Input username/password to log in..")
		info_content.pack_start(self.info_label, False, False, 0)

		
		self.infobar.hide()

		self.show_all()

	def on_click_login(self,button):
		self.username = self.uentry.get_text()
		self.password = self.pentry.get_text()
		if not self.username or not self.password:
			self.info_label.set_text("Username or Password is blank.")
			return
		self.info_label.set_text("Going to index")
		logger.info("Username|Password %s %s"%(self.username,self.password))
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		utils.async_call(auth.index,
							 callback=self.after_goto_index)
		#bdstoken,sign1,sign3,timestamp = auth.index()


		print("click")
		#self.destroy()
	def after_goto_index(self,data,error):
		print(data)
		bdstoken,sign1,sign3,timestamp = data
		if not bdstoken:

			self.info_label.set_text("Geting token")
			
			#token = auth.get_token()
			utils.async_call(auth.get_token, 
							 callback=self.after_get_token)

		else:
			info = "bdstoken %s existing,no need to login again!"%bdstoken
			logger.info(info)
			self.info_label.set_text(info)
			self.spinn.destroy()

	def after_get_token(self,token,error):

			self.token = token
			self.info_label.set_text("Geting public key")
			utils.async_call(auth.get_public_key,self.token,
							 callback=self.after_get_public_key)
			#rsakey,pubkey = auth.get_public_key(token)
	def after_get_public_key(self,data,error):
		rsakey,pubkey = data
		
		self.info_label.set_text("Loging in now")
		#xml = auth.login(rsakey,pubkey,self.username,self.password,self.token)
		utils.async_call(auth.login,rsakey,pubkey,self.username,self.password,self.token,
							 callback=self.after_login)
	def after_login(self,data,error):
		xml,errdict = data
		if errdict['err_no']  == 257 : #Need verification Code
			codestring = errdict['codeString'] 
			url = 'https://passport.baidu.com/cgi-bin/genimage?' + codestring
			
			vd = VcodeDialog(self,url)
			vd.run()
			vf = vd.get_user_input()
			if not vf or len(vf) != 4:
				self.info_label.set_text("Verification Code missing or incorrect!")
				return
			else:
				vd.destory()
			utils.async_call(auth.relogin,rsakey,pubkey,self.username,self.password,vf,codeString,
							 callback=self.after_login)

		elif errdict['err_no']  == 0: 
			self.info_label.set_text("Login Successfully!")
			self.hide()
		self.spinn.destroy()

	def on_toggle_offline(self,button):
		if button.get_active():
			settings.DRY = True
		else:
			settings.DRY = False
		logger.info("Flag DRY toggled to %s"%settings.DRY)
	def on_toggle_verbose(self,button):
		if button.get_active():
			settings.VERBOSE = True
		else:
			settings.VERBOSE = False
		logger.info("Flag VERBOSE toggled to %s"%settings.VERBOSE)
예제 #20
0
class MajorWindow(Gtk.Window):

	def __init__(self):
		Gtk.Window.__init__(self, title="Cloud Disk")

		self.set_border_width(10)
		self.maximize()
		#Setting up the self.grid in which the elements are to be positionned
		self.grid = Gtk.Grid()
		self.grid.set_column_homogeneous(True)
		self.grid.set_row_homogeneous(True)
		self.add(self.grid)
		#box = Gtk.Box(spacing=6)
		#self.add(box)
		self.tokens = auth.index()

		self.bdstoken,self.sign1,self.sign3,self.timestamp = self.tokens
	
		#self.connect('activate', self.on_login_dialog_close)
		#self.connect("delete-event", Gtk.main_quit)
		if not self.bdstoken:
			dialog = LoginDialog(self)	
			#dialog.connect("close",self.on_login_dialog_close)
			response = dialog.run()
	
			dialog.destroy()
			if response == Gtk.ResponseType.DELETE_EVENT:
				print(response)
				print("quit")
				#self.close()
		
				self.destroy()
				return
			elif response == 11:
				print("login")
			else:
				return 
		self.down_list = []

		self.current_path = "/"
		self.current_selection = None
		##							   num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status
		#                              0   1   2        3     4    5     6    7    8     9     10       11
		self.liststore = Gtk.ListStore(int,GdkPixbuf.Pixbuf,str, str, str,int,str,int,str,str,int,str)
		self.current_list = []
		#self.loading_spin = Gtk.Spinner()
		#self.loading_spin.props.valign = Gtk.Align.CENTER
		#box.pack_start(self.loading_spin, False, False, 0)
		#self.grid.add(self.loading_spin)
		
		self.init_view(self.current_path)
		#self.spinn.hide()
		#list_json = cloudapi.list_path(self.current_path,500,settings.DRY,self.bdstoken)
		#logger.debug("list json: %s"%str(len(list_json))
		#file_list = cloudapi.get_list(list_json)
		#logger.debug("file_list: %s"%str(file_list))


		#self.populate_view(file_list)
		
		self.stop_gif = False


		#creating the treeview, making it use the filter as a model, and adding the columns
		self.treeview = Gtk.TreeView(model=self.liststore)
		for i, column_title in enumerate(["Num","Thumb","File", "Size", "Path"]):
			if column_title != "Thumb":
				renderer = Gtk.CellRendererText()
				column = Gtk.TreeViewColumn(column_title, renderer, text=i)
			else:
				renderer_pixbuf = Gtk.CellRendererPixbuf()
				
				column = Gtk.TreeViewColumn(column_title, renderer_pixbuf,pixbuf=i)
			
			#if not column_title == 'isdir' and not column_title == 'fsid' and not column_title == 'cate'  :
			self.treeview.append_column(column)

		self.treeview.props.activate_on_single_click = False
		self.treeview.connect("row-activated",self.on_row_double_click)


		self.selection = self.treeview.get_selection()
		self.selection.connect("changed", self.on_tree_selection_changed)
		self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)
		#select = selection.get_selected_rows() 

		#creating buttons to filter by programming language, and setting up their events
		self.buttons = list()
		for act in ["Up level", "Refresh View", "Batch Add Task", "Remove File", "Download","CleanUp","Search"]:
			button = Gtk.Button(act)
			self.buttons.append(button)
			funcname = "on_%s_button_clicked"%act.lower().replace(" ","_")
			print(funcname)
			func = getattr(self, funcname)
			button.connect("clicked", func)


		#setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row
		self.scrollable_treelist = Gtk.ScrolledWindow()
		self.scrollable_treelist.set_vexpand(True)
		#self.grid.attach(self.loading_spin, 0, 0, 10, 20)
		#self.grid.attach_next_to(self.scrollable_treelist,self.loading_spin, Gtk.PositionType.BOTTOM, 10, 23)
		self.grid.attach(self.scrollable_treelist, 0, 0, 8, 20)
		#box.pack_start(self.scrollable_treelist, True, True, 0)
		self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1)
		for i, button in enumerate(self.buttons[1:]):
			self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1)
			#self.add_action_widget(self.buttons[i],i+1)
			#box.pack_start(self.buttons[i], False, False, 0)
		self.scrollable_treelist.add(self.treeview)

		#box.show_all()
		self.grid.show_all()
		#self.loading_spin.start()
		#self.loading_spin.show_all()
		#self.loading_spin.hide()
		#self.hide()
	def reload_pix(self,re_data,error):
		pix = None
		if not error:
			num,thumbimg = re_data
			path = Gtk.TreePath(int(num))
			if len(self.liststore) > 0 :
				treeiter = self.liststore.get_iter(path)
				if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:

					pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg)
				else:
					pix = None
				logger.debug("reloading pix,pix = %s"%str(pix))
				self.stop_gif = True
				self.liststore.set_value(treeiter, 1, pix)
				
		else:
			logger.debug("reload_pix error %s"%str(error))


	def get_pix_list(self,file_list):
		current_list = []
		def advance_frame(*user_data):
		
			num,pixiter = user_data
			#pass#
			if pixiter.advance() and not self.stop_gif:
			
				pix = pixiter.get_pixbuf()
			
				path = Gtk.TreePath(int(num))
			
				if len(self.liststore) > 0:
			
					treeiter = self.liststore.get_iter(path)
					self.liststore.set_value(treeiter, 1, pix)
				return True
			else:
				return False
		def down_img(num,thumbimg,link,fsid,header,path):
			logger.debug(" %s is downloading"%str(fsid))
			f=open(thumbimg,"wb")
			img = fetch(link,{},fsid,header,path)
			f.write(img)
			f.close()
			return (num,thumbimg)
		def create_img_pix(thumbimg):
			if not GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:
				return None
			else:
				return GdkPixbuf.Pixbuf.new_from_file(thumbimg)

		for row in file_list:
			#if cate == 1:
			#(num,thumb,filename,size,path,isdir,fsid,cate)
			num = row[0]
			thumb = row[1]
			path = row[4]
			isdir =row[5]
			fsid = row[6] 
			cate = row[7]
			host = urlparse(thumb)[1]

			header = {
			'Host':host,
			'Referer':DISK_HOME,
			}
			if not os.path.exists("image"):
					os.makedirs("image")
			thumbimg = "image/" + fsid + ".jpg"

			if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]:

				pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg)

			elif thumb:
				self.stop_gif = False
				pixan = GdkPixbuf.PixbufAnimation.new_from_file("image/loading.gif")
				pixiter = pixan.get_iter()
				pix = pixiter.get_pixbuf()
				#pix.set_loop(True)
				GLib.timeout_add(pixiter.get_delay_time(),
								 advance_frame,num,pixiter)
				logger.debug("Async call download for file %s "%str(fsid))
				utils.async_call(down_img, num,thumbimg,thumb,fsid,header,path,
				     callback=self.reload_pix)
			elif isdir:
				pix = GdkPixbuf.Pixbuf.new_from_file("image/folder.png")
			else:
				pix = None
			rowlist = list(row)
			rowlist[1] = pix
			#elif cate == 6:
			#	pix = create_img_pix("image/folder.png")
			current_list.append( tuple(rowlist) + (SAVINGPATH,"0B",0,"pending"))
		return current_list

	def populate_view(self,list_json,error=None):
		if list_json:
			self.current_list = []
			file_list = cloudapi.get_list(list_json)
			logger.debug("Size of file_list: %s"%str(len(file_list)))
			pix_list = self.get_pix_list(file_list)
			self.fill_liststore(pix_list)
			#self.loading_spin.stop()
			#self.loading_spin.hide()
			#self.spinn.hide()
			self.spinn.destroy()
		
			

	def fill_liststore(self,file_list):

		self.liststore.clear()
		for i,filerow  in enumerate(file_list):
			
			#logger.info("Creating TreeView at %s"%str(i))
			
			self.liststore.append(list(filerow))
		
	def on_tree_selection_changed(self,selection):
		#print(selection.get_selected_rows() )
		references = []
		self.current_selection = selection.get_selected_rows()
			
		
	def on_login_dialog_close(self,*arg):
		print("close dialog")
		print(*arg)
		self.close()


	def init_view(self,path):
		self.current_selection = None
		self.current_path = path
		logger.debug("Current Path: %s"%self.current_path)
		#list_json = cloudapi.list_path(self.current_path,500,
		#								settings.DRY,self.bdstoken)
		utils.async_call(cloudapi.list_path, self.current_path,500,
										settings.DRY,self.bdstoken,
				     callback=self.populate_view)
		#logger.debug("Size of list json: %s"%str(len(list_json)))
		#file_list = cloudapi.get_list(list_json)
		#logger.debug("Size of file_list: %s"%str(len(file_list)))
		#self.liststore.clear()
		#self.fill_liststore(file_list)
		#self.loading_spin.start()
		#self.loading_spin.show_all()
		self.spinn = SpinnerDialog(self)
		self.spinn.show()
		file_list = []
		pix_list = self.get_pix_list(file_list)
		self.fill_liststore(pix_list)
		

	def on_row_double_click(self,treeview,treepath,treeviewcolumn):
		print("Double click")
		print(self.liststore[treepath])
		#treeiter = self.liststore.get_iter(treepath)
		#num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = 
		row = self.liststore[treepath]
		#num = row[0]
		filename = row[2]
		#thumb = row[1]
		path = row[4]
		isdir = row[5]
		#fsid = row[6] 
		#cate = row[7]
		logger.debug("row : %s"%(','.join(str(i) for i in row )))
		if isdir:
			npath = os.path.join(path,filename)
			self.init_view(npath)

		return True
	def on_up_level_button_clicked(self,*arg):
	
		
		path = os.path.abspath(os.path.join(self.current_path,".."))
		self.init_view(path)

	def on_refresh_view_button_clicked(self,*arg):
		settings.DRY = False
		self.init_view(self.current_path)
		settings.DRY = True
	def on_batch_add_task_button_clicked(self,*arg):
		print("Click",arg)
		settings.DRY = False
		td = TaskDialog(self,self.tokens,self.current_path)
		response = td.show()
		if  response == Gtk.ResponseType.DELETE_EVENT:
		
			settings.DRY = True
			
				
		
		
	def on_remove_file_button_clicked(self,*arg):
		

		if self.is_current_selection_null(): 
			return
		store,treepaths = self.current_selection
		
		remove_list = []
		for tpath in treepaths:
			row = store[tpath]
			filename = row[2]
			path = row[4]
			isdir = row[5]
			remove_list.append(os.path.join(path,filename))
		fl = '["' + '","'.join(str(i) for i in remove_list) + '"]'
		logger.debug("Flist: %s"%fl)
		if not self.agree_to_action(fl,"remove"):
			return

		cloudapi.delete_file(self.bdstoken,fl)
		settings.DRY = False
		self.init_view(self.current_path)
		settings.DRY = True

	def task_in_list(self,task,dlist):
		for row in dlist:
			#num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row
			if task[6] == row[6]:
				return True
			
		return False

	def on_download_button_clicked(self,*arg):
		#if self.is_current_selection_null(): 
		#	return
		
		if self.current_selection and self.current_selection[1]:
			store,treepaths = self.current_selection
	

			for tpath in treepaths:
				
				task = store[tpath]
				num = task[0]
				filename = task[2]
				thumb = task[1]
				path = task[4]
				isdir = task[5]
				fsid = task[6] 
				cate = task[7]

				if not isdir and not self.task_in_list(task,self.down_list):
					self.down_list.append(task)
				else:
					tasks = self.recursive_selected([task])
				
					for task in tasks:

						if not self.task_in_list(task,self.down_list):
						
							self.down_list.append(task)
		print(self.down_list)
		self.downdialog = DownloadDialog(self,self.down_list,self.tokens)
		#self.downdialog.connect("delete-event",self.hide_down_dialog)
		#self.downdialog.hide()
		#self.downdialog.liststore.clear()
		
		#self.downdialog.fill_liststore(self.down_list)
		response = self.downdialog.show()
		
		if response == Gtk.ResponseType.DELETE_EVENT:
			print(response)
			self.downdialog.hide()
		self.selection.unselect_all()

	def on_cleanup_button_clicked(self,*arg):
		print("Click",arg)
	def on_search_button_clicked(self,button):
		print("Click",button)
		url = 'http://pan.baidu.com/genimage?33324238656332346361663334656637323237633636373637643239666664336662343932343631383931303030303030303030303030303031343335353131313938D9224DC2E75F22A923706D077C0CD5B2'
		vd = VcodeDialog(self,url)
		response = vd.run()
		print(response)
		if response == 22:
			print("The OK button was clicked")
			vcode = vd.get_user_input()
			vd.destroy()
		elif  response == Gtk.ResponseType.DELETE_EVENT:
			vd.destroy()
	def is_current_selection_null(self):
		if not self.current_selection or not self.current_selection[1] :
			dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK, "Attention.......")
			dialog.format_secondary_text("NO File is selected.!")
			dialog.run()
			dialog.destroy()
			return True
		else:	
			return False
	def agree_to_action(self,fl,action):
		dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
			Gtk.ButtonsType.YES_NO, "%s Confirmation"%action.title())
		dialog.format_secondary_text(
			"Are you sure to %s file(s) : %s"%(action,fl))
		response = dialog.run()
		dialog.destroy()
		if response == Gtk.ResponseType.YES:	
			return True
		elif response == Gtk.ResponseType.NO:
			return False
	def hide_down_dialog(self,*arg):
		self.downdialog.hide()
	def recursive_selected(self,lists):	
		task_list = []
		folder = []
		
		for row in lists:
			filename = row[2]
			path = row[4]
			isdir = row[5]
			if not isdir:
				
				task_list.append(row)
				
			else:
				folder.append((path,filename))

		
		for path,filename in folder:
			npath = os.path.join(path,filename)
			
			list_json = cloudapi.list_path(npath,300,True,self.bdstoken)
			nlists = []
			for row in self.get_pix_list(cloudapi.get_list(list_json )):
				
				nlists.append(row)
			
			task_list += self.recursive_selected(nlists)
		return task_list