source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-indicator.install/usr/bin/lliurexGdriveIndicator @ 4022

Last change on this file since 4022 was 4022, checked in by jrpelegrina, 3 years ago

WIP in check connection

  • Property svn:executable set to *
File size: 8.5 KB
Line 
1#!/usr/bin/env python
2
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject, GLib
6gi.require_version('AppIndicator3', '0.1')
7from gi.repository import AppIndicator3 as appindicator
8
9import os
10import threading
11import sys
12import gettext
13import json
14
15import pyinotify
16from pyinotify import WatchManager, Notifier, ThreadedNotifier, EventsCodes, ProcessEvent
17
18import signal
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21import lliurex.lliurexgdrive
22
23import gettext
24gettext.textdomain('lliurex-gdrive')
25_ = gettext.gettext
26
27LOCK_INDICATOR="/tmp/lgdIndicator.lock"
28LOCK_GUI="/tmp/lgdGUI.lock"
29RSRC="/usr/share/lliurex-gdrive/"
30MOUNT_ON_IMAGE=RSRC+"rsrc/mount_on.png"
31MOUNT_OFF_IMAGE=RSRC+"rsrc/mount_off.png"
32
33class LlliurexGdriveIndicator:
34
35        WATCH_DIR=os.path.expanduser("~/.config/lliurex-google-drive-profiles/configProfiles")
36       
37        def __init__(self,icon_name):
38               
39                self.LliurexGoogleDriveManager=lliurex.lliurexgdrive.LliurexGoogleDriveManager()
40                self.app_indicator=appindicator.Indicator.new("lliurex-gdrive",icon_name,appindicator.IndicatorCategory.APPLICATION_STATUS)
41                self.app_indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
42                self.menu = Gtk.Menu()
43               
44                self.menu.add_events(Gdk.EventMask.ALL_EVENTS_MASK)
45                self.app_indicator.set_menu(self.menu)
46               
47                self.profiles_info=self.LliurexGoogleDriveManager.profiles_config.copy()
48                self.current_status={}
49
50                       
51                self.createLockToken()
52                self.populate_menu()
53                self.start_inotify()
54                self.init_t()
55               
56
57                GLib.timeout_add(60000,self.check_status)
58               
59        #def __init__
60
61
62        def init_t(self):
63
64                self.check_connection_t=threading.Thread(target=self.check_connection)
65                self.check_connection_t.daemon=True
66                self.check_connection_t.done=False
67                self.check_connection_t.launched=False
68
69        def createLockToken(self):
70
71                #self.lockpath=os.path(LOCK_INDICATOR)
72                if not os.path.exists(LOCK_INDICATOR):
73                        f=open(LOCK_INDICATOR,'w')
74                        f.close
75
76        #def createLockToken
77                       
78        def start_inotify(self):
79
80                t=threading.Thread(target=self._inotify)
81                t.daemon=True
82                t.start()
83
84        #def start_inotif
85
86
87        def _inotify(self):
88               
89               
90                wm=WatchManager()
91                mask=pyinotify.IN_CLOSE_WRITE
92                       
93                class Process_handler(ProcessEvent):
94                               
95                        def __init__(self,main):
96                               
97                                self.main=main
98                               
99                        def process_IN_CLOSE_WRITE(self,event):
100
101                                self.main.update_info()
102                                for profile in self.main.update_profiles:
103                                        if not profile in self.main.profiles_info:
104                                                mountpoint=self.main.update_profiles[profile]["mountpoint"]
105                                                self.main.add_menu_item(profile,mountpoint)
106
107                                for item in self.main.menu.get_children():
108                                        if item.profile !="":
109                                                if not item.profile in self.main.update_profiles:
110                                                        self.main.menu.remove(item)     
111                               
112                                self.main.profiles_info=self.main.update_profiles.copy()
113                                self.main.menu.show_all()                                       
114                                                               
115       
116                notifier=Notifier(wm,Process_handler(self))
117                wdd=wm.add_watch(LlliurexGdriveIndicator.WATCH_DIR,mask,rec=True)
118                       
119                while True:
120                        try:
121                                       
122                                notifier.process_events()
123                                if notifier.check_events():
124                                        notifier.read_events()
125                               
126                        except Exception as e:
127                                notifier.stop()
128                                       
129                return False
130       
131        #def _inotify
132
133        def update_info(self):
134
135                f=open(self.LliurexGoogleDriveManager.config_file)
136
137                try:
138                        self.update_profiles=json.load(f)
139                except:
140                        self.update_profiles={}
141               
142                f.close()
143
144        #def update_info       
145       
146        def add_menu_item(self,profile,mountpoint):
147
148                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
149                info=self.item_status_info(status_info)
150                self.current_status[profile]=status_info["status"]     
151
152                label_item=profile     
153                item=Gtk.ImageMenuItem()
154                item.set_label(label_item)
155                item.set_image(info["img"])
156                item.set_tooltip_text(info["tooltip"])
157                item.profile=profile
158                item.size=False
159                item.status=True
160                item.set_always_show_image(True)
161                item.connect("activate",self.item_clicked,profile)
162                self.menu.insert(item,0)
163
164               
165                item=Gtk.MenuItem()
166                label_item=info["used_size"]
167                item.set_label(label_item)
168                item.profile=profile
169                item.size=True
170                item.status=False
171                self.menu.insert(item,1)
172
173                item=Gtk.MenuItem()
174                label_item=_("Open folder")
175                item.set_label(label_item)
176                item.connect("activate",self.open_folder,profile)
177                item.profile=profile
178                item.size=False
179                item.status=False
180                self.menu.insert(item,2)
181
182                item=Gtk.SeparatorMenuItem()
183                item.profile=profile
184                item.size=False
185                item.status=False
186                self.menu.insert(item,3)
187
188        #def add_menu_item     
189
190
191        def populate_menu(self,empty=True):
192               
193               
194                if empty:
195                        for c in self.menu.get_children():
196                                self.menu.remove(c)
197               
198               
199                for profile in self.profiles_info:
200                        mountpoint=self.profiles_info[profile]["mountpoint"]
201                        self.add_menu_item(profile,mountpoint)
202                       
203                       
204                item=Gtk.ImageMenuItem()
205                label_item=_("Open Lliurex GDrive")
206                item.set_label(label_item)
207                img=Gtk.Image()
208                img.set_from_stock(Gtk.STOCK_PREFERENCES,Gtk.IconSize.MENU)
209                item.set_image(img)
210                item.set_always_show_image(True)
211                item.connect("activate",self.open_gui)
212                item.profile=""
213                item.size=False
214                item.status=False
215                self.menu.append(item)
216
217                item=Gtk.ImageMenuItem()
218                img=Gtk.Image()
219                img.set_from_stock(Gtk.STOCK_CLOSE,Gtk.IconSize.MENU)
220                item.set_image(img)
221                item.set_always_show_image(True)
222                label_item=_("Close")
223                item.set_label(label_item)
224                item.connect("activate",self.quit)
225                item.profile=""
226                item.size=False
227                item.status=False
228                self.menu.append(item)
229
230
231                self.menu.show_all()
232               
233               
234        #def populate_menu
235       
236       
237        def item_clicked(self,widget,profile):
238
239
240                mountpoint=self.profiles_info[profile]["mountpoint"]
241                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
242
243                if self.current_status[profile]==status_info["status"]:
244                                GLib.timeout_add(6000,self.pulsate_check_connection)
245
246                #       status_mod=self.LliurexGoogleDriveManager.sync_profile(profile,mountpoint)
247
248                #       if status_mod["result"]:
249                #               status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
250                                       
251                # info=self.item_status_info(status_info)
252                # self.current_status[profile]=status_info["status"]
253                # for item in self.menu.get_children():
254                #       if item.size:
255                #               if item.profile==profile:
256                #                       item.set_label(info["used_size"])
257               
258
259                # widget.set_tooltip_text(info["tooltip"])
260                # widget.set_image(info["img"])
261               
262               
263        #def item_clicked
264
265        def pulsate_check_connection(self):
266
267                if not self.check_connection_t.launched:
268                        self.check_connection_t.launched=True
269                        self.check_connection_t.start()
270
271
272                if self.check_connection_t.done:
273                        if self.connect:
274                                print "GOLA"
275                                self.init_t()
276
277                        return False
278
279
280                if self.check_connection_t.launched:
281                        if not self.check_connection_t.done:
282                                print "HOLA"   
283                                return True
284
285        def     check_connection(self):
286                print "Comprobando"
287                self.connect=self.LliurexGoogleDriveManager.check_google_connection()
288                self.check_connection_t.done=True
289
290
291        def open_folder(self,widget,profile):
292
293               
294                mountpoint=self.profiles_info[profile]["mountpoint"]
295                cmd="caja " + mountpoint.encode("utf-8")
296
297                os.system(cmd) 
298
299        #def open_folder       
300
301        def open_gui(self,widget):
302               
303                if not os.path.exists(LOCK_GUI):
304                        cmd='/usr/bin/lliurex-gdrive' +"&" 
305                        os.system(cmd)
306
307        #def open_gui
308               
309        def item_status_info(self,status_info):
310       
311                size=status_info["size"]
312                used=status_info["used"]
313
314                if status_info["status"]:
315                        img=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
316                        tooltip=_("Dismount now")
317                        used_size=_("Used: %s of %s")%(used,size)
318               
319                else:
320                        img=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
321                        tooltip=_("Mount now")
322                        used_size=_("Used: not available")     
323
324                return {"img":img ,"tooltip":tooltip, "used_size":used_size}   
325
326        #def item_status_info                   
327
328        def check_status(self):
329                print "vamos a ver2"
330                connect=self.LliurexGoogleDriveManager.check_google_connection()
331                print connect
332       
333                for profile in self.profiles_info:
334                        mountpoint=self.profiles_info[profile]["mountpoint"]
335                        status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
336                        info=self.item_status_info(status_info)
337                        self.current_status[profile]=status_info["status"]
338
339                        for item in self.menu.get_children():
340                                if item.profile==profile:
341                                        if item.size:
342                                                item.set_label(info["used_size"])
343                                       
344                                        if item.status:
345                                                item.set_tooltip_text(info["tooltip"])
346                                                item.set_image(info["img"])
347               
348                return True
349               
350               
351        #def check_status
352
353
354        def cleanIndicatorLock(self):
355
356                if os.path.exists(LOCK_INDICATOR):
357                        os.remove(LOCK_INDICATOR)
358
359        #def cleanIndicatorLock                 
360       
361        def quit(self,widget):
362
363                self.cleanIndicatorLock()
364                Gtk.main_quit() 
365
366        #def quit       
367
368       
369#class LlliurexGdriveIndicator
370
371if __name__=="__main__":
372       
373        lliurexgdrive=LlliurexGdriveIndicator("gdrive")
374        GObject.threads_init()
375        Gtk.main()
376       
Note: See TracBrowser for help on using the repository browser.