Merge branch 'master' of git://git.assembla.com/fpdb-eric
This commit is contained in:
		
						commit
						1e051e47ec
					
				|  | @ -41,7 +41,8 @@ class GuiPlayerStats (threading.Thread): | ||||||
|         self.main_window = mainwin |         self.main_window = mainwin | ||||||
|         self.sql = querylist |         self.sql = querylist | ||||||
| 
 | 
 | ||||||
|         self.liststore = None |         self.liststore = []   # gtk.ListStore[]         stores the contents of the grids | ||||||
|  |         self.listcols = []    # gtk.TreeViewColumn[][]  stores the columns in the grids | ||||||
| 
 | 
 | ||||||
|         self.MYSQL_INNODB   = 2 |         self.MYSQL_INNODB   = 2 | ||||||
|         self.PGSQL          = 3 |         self.PGSQL          = 3 | ||||||
|  | @ -162,6 +163,8 @@ class GuiPlayerStats (threading.Thread): | ||||||
|     def refreshStats(self, widget, data): |     def refreshStats(self, widget, data): | ||||||
|         try: self.stats_vbox.destroy() |         try: self.stats_vbox.destroy() | ||||||
|         except AttributeError: pass |         except AttributeError: pass | ||||||
|  |         self.liststore = [] | ||||||
|  |         self.listcols = [] | ||||||
|         #self.stats_vbox = gtk.VBox(False, 0) |         #self.stats_vbox = gtk.VBox(False, 0) | ||||||
|         self.stats_vbox = gtk.VPaned() |         self.stats_vbox = gtk.VPaned() | ||||||
|         self.stats_vbox.show() |         self.stats_vbox.show() | ||||||
|  | @ -217,8 +220,10 @@ class GuiPlayerStats (threading.Thread): | ||||||
|         # 3rd parameter passes extra flags, currently includes: |         # 3rd parameter passes extra flags, currently includes: | ||||||
|         #   holecards - whether to display card breakdown (True/False) |         #   holecards - whether to display card breakdown (True/False) | ||||||
|         #   numhands  - min number hands required when displaying all players |         #   numhands  - min number hands required when displaying all players | ||||||
|         flags = [False, self.filters.getNumHands()] |         #   gridnum   - index for grid data structures | ||||||
|         self.addTable(swin, 'playerDetailedStats', flags, playerids, sitenos, limits, type, seats, groups, dates) |         flags = [False, self.filters.getNumHands(), 0] | ||||||
|  |         self.addGrid(swin, 'playerDetailedStats', flags, playerids | ||||||
|  |                     ,sitenos, limits, type, seats, groups, dates) | ||||||
| 
 | 
 | ||||||
|         # Separator |         # Separator | ||||||
|         vbox2 = gtk.VBox(False, 0) |         vbox2 = gtk.VBox(False, 0) | ||||||
|  | @ -236,7 +241,9 @@ class GuiPlayerStats (threading.Thread): | ||||||
| 
 | 
 | ||||||
|         # Detailed table |         # Detailed table | ||||||
|         flags[0] = True |         flags[0] = True | ||||||
|         self.addTable(swin, 'playerDetailedStats', flags, playerids, sitenos, limits, type, seats, groups, dates) |         flags[2] = 1 | ||||||
|  |         self.addGrid(swin, 'playerDetailedStats', flags, playerids | ||||||
|  |                     ,sitenos, limits, type, seats, groups, dates) | ||||||
| 
 | 
 | ||||||
|         self.db.rollback() |         self.db.rollback() | ||||||
|         print "Stats page displayed in %4.2f seconds" % (time() - starttime) |         print "Stats page displayed in %4.2f seconds" % (time() - starttime) | ||||||
|  | @ -257,11 +264,12 @@ class GuiPlayerStats (threading.Thread): | ||||||
| 
 | 
 | ||||||
|         return |         return | ||||||
| 
 | 
 | ||||||
|     def sortnums(self, model, iter1, iter2, n): |     def sortnums(self, model, iter1, iter2, nums): | ||||||
|         try: |         try: | ||||||
|             ret = 0 |             ret = 0 | ||||||
|             a = self.liststore.get_value(iter1, n) |             (n, grid) = nums | ||||||
|             b = self.liststore.get_value(iter2, n) |             a = self.liststore[grid].get_value(iter1, n) | ||||||
|  |             b = self.liststore[grid].get_value(iter2, n) | ||||||
|             if 'f' in self.cols_to_show[n][4]: |             if 'f' in self.cols_to_show[n][4]: | ||||||
|                 try:     a = float(a) |                 try:     a = float(a) | ||||||
|                 except:  a = 0.0 |                 except:  a = 0.0 | ||||||
|  | @ -281,7 +289,7 @@ class GuiPlayerStats (threading.Thread): | ||||||
|                     ret = 0 |                     ret = 0 | ||||||
|                 else: |                 else: | ||||||
|                     ret = 1 |                     ret = 1 | ||||||
|             #print "n =", n, "iter1[n] =", self.liststore.get_value(iter1,n), "iter2[n] =", self.liststore.get_value(iter2,n), "ret =", ret |             #print "n =", n, "iter1[n] =", self.liststore[grid].get_value(iter1,n), "iter2[n] =", self.liststore[grid].get_value(iter2,n), "ret =", ret | ||||||
|         except: |         except: | ||||||
|             err = traceback.extract_tb(sys.exc_info()[2]) |             err = traceback.extract_tb(sys.exc_info()[2]) | ||||||
|             print "***sortnums error: " + str(sys.exc_info()[1]) |             print "***sortnums error: " + str(sys.exc_info()[1]) | ||||||
|  | @ -289,18 +297,19 @@ class GuiPlayerStats (threading.Thread): | ||||||
| 
 | 
 | ||||||
|         return(ret) |         return(ret) | ||||||
| 
 | 
 | ||||||
|     def sortcols(self, col, n): |     def sortcols(self, col, nums): | ||||||
|         try: |         try: | ||||||
|             #This doesn't actually work yet - clicking heading in top section sorts bottom section :-( |             #This doesn't actually work yet - clicking heading in top section sorts bottom section :-( | ||||||
|             if col.get_sort_order() == gtk.SORT_ASCENDING: |             (n, grid) = nums | ||||||
|  |             if not col.get_sort_indicator() or col.get_sort_order() == gtk.SORT_ASCENDING: | ||||||
|                 col.set_sort_order(gtk.SORT_DESCENDING) |                 col.set_sort_order(gtk.SORT_DESCENDING) | ||||||
|             else: |             else: | ||||||
|                 col.set_sort_order(gtk.SORT_ASCENDING) |                 col.set_sort_order(gtk.SORT_ASCENDING) | ||||||
|             self.liststore.set_sort_column_id(n, col.get_sort_order()) |             self.liststore[grid].set_sort_column_id(n, col.get_sort_order()) | ||||||
|             self.liststore.set_sort_func(n, self.sortnums, n) |             self.liststore[grid].set_sort_func(n, self.sortnums, (n,grid)) | ||||||
|             for i in xrange(len(self.listcols)): |             for i in xrange(len(self.listcols[grid])): | ||||||
|                 self.listcols[i].set_sort_indicator(False) |                 self.listcols[grid][i].set_sort_indicator(False) | ||||||
|             self.listcols[n].set_sort_indicator(True) |             self.listcols[grid][n].set_sort_indicator(True) | ||||||
|             # use this   listcols[col].set_sort_indicator(True) |             # use this   listcols[col].set_sort_indicator(True) | ||||||
|             # to turn indicator off for other cols |             # to turn indicator off for other cols | ||||||
|         except: |         except: | ||||||
|  | @ -308,12 +317,12 @@ class GuiPlayerStats (threading.Thread): | ||||||
|             print "***sortcols error: " + str(sys.exc_info()[1]) |             print "***sortcols error: " + str(sys.exc_info()[1]) | ||||||
|             print "\n".join( [e[0]+':'+str(e[1])+" "+e[2] for e in err] ) |             print "\n".join( [e[0]+':'+str(e[1])+" "+e[2] for e in err] ) | ||||||
| 
 | 
 | ||||||
|     def addTable(self, vbox, query, flags, playerids, sitenos, limits, type, seats, groups, dates): |     def addGrid(self, vbox, query, flags, playerids, sitenos, limits, type, seats, groups, dates): | ||||||
|         counter = 0 |         counter = 0 | ||||||
|         row = 0 |         row = 0 | ||||||
|         sqlrow = 0 |         sqlrow = 0 | ||||||
|         if not flags:  holecards = False |         if not flags:  holecards,grid = False,0 | ||||||
|         else:          holecards = flags[0] |         else:          holecards,grid = flags[0],flags[2] | ||||||
| 
 | 
 | ||||||
|         tmp = self.sql.query[query] |         tmp = self.sql.query[query] | ||||||
|         tmp = self.refineQuery(tmp, flags, playerids, sitenos, limits, type, seats, groups, dates) |         tmp = self.refineQuery(tmp, flags, playerids, sitenos, limits, type, seats, groups, dates) | ||||||
|  | @ -325,8 +334,9 @@ class GuiPlayerStats (threading.Thread): | ||||||
|         self.cols_to_show = [x for x in self.columns if x[colshow]] |         self.cols_to_show = [x for x in self.columns if x[colshow]] | ||||||
|         hgametypeid_idx = colnames.index('hgametypeid') |         hgametypeid_idx = colnames.index('hgametypeid') | ||||||
| 
 | 
 | ||||||
|         self.liststore = gtk.ListStore(*([str] * len(self.cols_to_show))) |         assert len(self.liststore) == grid, "len(self.liststore)="+str(len(self.liststore))+" grid-1="+str(grid) | ||||||
|         view = gtk.TreeView(model=self.liststore) |         self.liststore.append( gtk.ListStore(*([str] * len(self.cols_to_show))) ) | ||||||
|  |         view = gtk.TreeView(model=self.liststore[grid]) | ||||||
|         view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH) |         view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH) | ||||||
|         #vbox.pack_start(view, expand=False, padding=3) |         #vbox.pack_start(view, expand=False, padding=3) | ||||||
|         vbox.add(view) |         vbox.add(view) | ||||||
|  | @ -335,7 +345,8 @@ class GuiPlayerStats (threading.Thread): | ||||||
|         textcell50.set_property('xalign', 0.5) |         textcell50.set_property('xalign', 0.5) | ||||||
|         numcell = gtk.CellRendererText() |         numcell = gtk.CellRendererText() | ||||||
|         numcell.set_property('xalign', 1.0) |         numcell.set_property('xalign', 1.0) | ||||||
|         self.listcols = [] |         assert len(self.listcols) == grid | ||||||
|  |         self.listcols.append( [] ) | ||||||
| 
 | 
 | ||||||
|         # Create header row   eg column: ("game",     True, "Game",     0.0, "%s") |         # Create header row   eg column: ("game",     True, "Game",     0.0, "%s") | ||||||
|         for col, column in enumerate(self.cols_to_show): |         for col, column in enumerate(self.cols_to_show): | ||||||
|  | @ -343,31 +354,33 @@ class GuiPlayerStats (threading.Thread): | ||||||
|                 s = [x for x in self.columns if x[colalias] == 'hand'][0][colheading] |                 s = [x for x in self.columns if x[colalias] == 'hand'][0][colheading] | ||||||
|             else: |             else: | ||||||
|                 s = column[colheading] |                 s = column[colheading] | ||||||
|             self.listcols.append(gtk.TreeViewColumn(s)) |             self.listcols[grid].append(gtk.TreeViewColumn(s)) | ||||||
|             view.append_column(self.listcols[col]) |             view.append_column(self.listcols[grid][col]) | ||||||
|             if column[colformat] == '%s': |             if column[colformat] == '%s': | ||||||
|                 if column[colxalign] == 0.0: |                 if column[colxalign] == 0.0: | ||||||
|                     self.listcols[col].pack_start(textcell, expand=True) |                     self.listcols[grid][col].pack_start(textcell, expand=True) | ||||||
|                     self.listcols[col].add_attribute(textcell, 'text', col) |                     self.listcols[grid][col].add_attribute(textcell, 'text', col) | ||||||
|  |                     cellrend = textcell | ||||||
|                 else: |                 else: | ||||||
|                     self.listcols[col].pack_start(textcell50, expand=True) |                     self.listcols[grid][col].pack_start(textcell50, expand=True) | ||||||
|                     self.listcols[col].add_attribute(textcell50, 'text', col) |                     self.listcols[grid][col].add_attribute(textcell50, 'text', col) | ||||||
|                 self.listcols[col].set_expand(True) |                     cellrend = textcell50 | ||||||
|  |                 self.listcols[grid][col].set_expand(True) | ||||||
|             else: |             else: | ||||||
|                 self.listcols[col].pack_start(numcell, expand=True) |                 self.listcols[grid][col].pack_start(numcell, expand=True) | ||||||
|                 self.listcols[col].add_attribute(numcell, 'text', col) |                 self.listcols[grid][col].add_attribute(numcell, 'text', col) | ||||||
|                 self.listcols[col].set_expand(True) |                 self.listcols[grid][col].set_expand(True) | ||||||
|                 #self.listcols[col].set_alignment(column[colxalign]) # no effect? |                 cellrend = numcell | ||||||
|             if holecards: |                 #self.listcols[grid][col].set_alignment(column[colxalign]) # no effect? | ||||||
|                 self.listcols[col].set_clickable(True) |             self.listcols[grid][col].set_clickable(True) | ||||||
|                 self.listcols[col].connect("clicked", self.sortcols, col) |             self.listcols[grid][col].connect("clicked", self.sortcols, (col,grid)) | ||||||
|             if col == 0: |             if col == 0: | ||||||
|                     self.listcols[col].set_sort_order(gtk.SORT_DESCENDING) |                 self.listcols[grid][col].set_sort_order(gtk.SORT_DESCENDING) | ||||||
|                     self.listcols[col].set_sort_indicator(True) |                 self.listcols[grid][col].set_sort_indicator(True) | ||||||
|             if column[coltype] == 'cash': |             if column[coltype] == 'cash': | ||||||
|                 self.listcols[col].set_cell_data_func(numcell, self.ledger_style_render_func) |                 self.listcols[grid][col].set_cell_data_func(numcell, self.ledger_style_render_func) | ||||||
|             else: |             else: | ||||||
|                 self.listcols[col].set_cell_data_func(numcell, self.reset_style_render_func) |                 self.listcols[grid][col].set_cell_data_func(cellrend, self.reset_style_render_func) | ||||||
| 
 | 
 | ||||||
|         rows = len(result) # +1 for title row |         rows = len(result) # +1 for title row | ||||||
| 
 | 
 | ||||||
|  | @ -408,12 +421,12 @@ class GuiPlayerStats (threading.Thread): | ||||||
|                     treerow.append(column[colformat] % value) |                     treerow.append(column[colformat] % value) | ||||||
|                 else: |                 else: | ||||||
|                     treerow.append(' ') |                     treerow.append(' ') | ||||||
|             iter = self.liststore.append(treerow) |             iter = self.liststore[grid].append(treerow) | ||||||
|             sqlrow += 1 |             sqlrow += 1 | ||||||
|             row += 1 |             row += 1 | ||||||
|         vbox.show_all() |         vbox.show_all() | ||||||
|          |          | ||||||
|     #end def addTable(self, query, vars, playerids, sitenos, limits, type, seats, groups, dates): |     #end def addGrid(self, query, vars, playerids, sitenos, limits, type, seats, groups, dates): | ||||||
| 
 | 
 | ||||||
|     def refineQuery(self, query, flags, playerids, sitenos, limits, type, seats, groups, dates): |     def refineQuery(self, query, flags, playerids, sitenos, limits, type, seats, groups, dates): | ||||||
|         having = '' |         having = '' | ||||||
|  |  | ||||||
|  | @ -24,18 +24,22 @@ import os | ||||||
| import traceback | import traceback | ||||||
| from time import time, strftime, localtime | from time import time, strftime, localtime | ||||||
| try: | try: | ||||||
|  |     calluse = not 'matplotlib' in sys.modules | ||||||
|     import matplotlib |     import matplotlib | ||||||
|  |     if calluse: | ||||||
|         matplotlib.use('GTK') |         matplotlib.use('GTK') | ||||||
|     from matplotlib.figure import Figure |     from matplotlib.figure import Figure | ||||||
|     from matplotlib.backends.backend_gtk import FigureCanvasGTK as FigureCanvas |     from matplotlib.backends.backend_gtk import FigureCanvasGTK as FigureCanvas | ||||||
|     from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NavigationToolbar |     from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NavigationToolbar | ||||||
|     from matplotlib.finance import candlestick2 |     from matplotlib.finance import candlestick2 | ||||||
| 
 | 
 | ||||||
|     from numpy import diff, nonzero, sum, cumsum, max, mina |     from numpy import diff, nonzero, sum, cumsum, max, min | ||||||
| #    from matplotlib.dates import  DateFormatter, WeekdayLocator, HourLocator, \ | #    from matplotlib.dates import  DateFormatter, WeekdayLocator, HourLocator, \ | ||||||
| #     DayLocator, MONDAY, timezone | #     DayLocator, MONDAY, timezone | ||||||
| 
 | 
 | ||||||
| except: | except: | ||||||
|  |     err = traceback.extract_tb(sys.exc_info()[2])[-1] | ||||||
|  |     print "***Error: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1]) | ||||||
|     print """Failed to load numpy in Session Viewer""" |     print """Failed to load numpy in Session Viewer""" | ||||||
|     print """This is of no consequence as the module currently doesn't do anything.""" |     print """This is of no consequence as the module currently doesn't do anything.""" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -189,7 +189,6 @@ class HUD_main(object): | ||||||
| #    be passed to HUDs for use in the gui thread. HUD objects should not | #    be passed to HUDs for use in the gui thread. HUD objects should not | ||||||
| #    need their own access to the database, but should open their own | #    need their own access to the database, but should open their own | ||||||
| #    if it is required. | #    if it is required. | ||||||
|         try: |  | ||||||
|         self.db_connection = Database.Database(self.config) |         self.db_connection = Database.Database(self.config) | ||||||
|         tourny_finder = re.compile('(\d+) (\d+)') |         tourny_finder = re.compile('(\d+) (\d+)') | ||||||
|          |          | ||||||
|  | @ -279,9 +278,6 @@ class HUD_main(object): | ||||||
|                 else: |                 else: | ||||||
|                     self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, type, stat_dict, cards) |                     self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, type, stat_dict, cards) | ||||||
|             self.db_connection.connection.rollback() |             self.db_connection.connection.rollback() | ||||||
|         except: |  | ||||||
|             err = traceback.extract_tb(sys.exc_info()[2])[-1] |  | ||||||
|             print "***Error: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1]) |  | ||||||
| 
 | 
 | ||||||
| if __name__== "__main__": | if __name__== "__main__": | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -238,7 +238,8 @@ def discover_nt_by_name(c, tablename): | ||||||
|         try: |         try: | ||||||
|             # maybe it's better to make global titles[hwnd] decoding? |             # maybe it's better to make global titles[hwnd] decoding? | ||||||
|             # this can blow up in XP on some windows, eg firefox displaying http://docs.python.org/tutorial/classes.html |             # this can blow up in XP on some windows, eg firefox displaying http://docs.python.org/tutorial/classes.html | ||||||
|             if not tablename.lower() in titles[hwnd].decode(LOCALE_ENCODING).lower(): continue |             if not tablename.lower() in titles[hwnd].decode(LOCALE_ENCODING).lower(): | ||||||
|  |                 continue | ||||||
|         except: |         except: | ||||||
|             continue |             continue | ||||||
|         if 'History for table:' in titles[hwnd]: continue # Everleaf Network HH viewer window |         if 'History for table:' in titles[hwnd]: continue # Everleaf Network HH viewer window | ||||||
|  | @ -246,8 +247,8 @@ def discover_nt_by_name(c, tablename): | ||||||
|         if 'Chat:' in titles[hwnd]: continue # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows |         if 'Chat:' in titles[hwnd]: continue # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows | ||||||
|         if ' - Table ' in titles[hwnd]: continue # Absolute table Chat window.. sigh. TODO: Can we tell what site we're trying to discover for somehow in here, so i can limit this check just to AP searches? |         if ' - Table ' in titles[hwnd]: continue # Absolute table Chat window.. sigh. TODO: Can we tell what site we're trying to discover for somehow in here, so i can limit this check just to AP searches? | ||||||
|         temp = decode_windows(c, titles[hwnd], hwnd) |         temp = decode_windows(c, titles[hwnd], hwnd) | ||||||
|         #print "attach to window", temp |         print "attach to window", temp | ||||||
|         return decode_windows(c, titles[hwnd], hwnd) |         return temp | ||||||
|     return None |     return None | ||||||
| 
 | 
 | ||||||
| def discover_nt_tournament(c, tour_number, tab_number): | def discover_nt_tournament(c, tour_number, tab_number): | ||||||
|  | @ -257,9 +258,12 @@ def discover_nt_tournament(c, tour_number, tab_number): | ||||||
|     titles ={} |     titles ={} | ||||||
|     win32gui.EnumWindows(win_enum_handler, titles) |     win32gui.EnumWindows(win_enum_handler, titles) | ||||||
|     for hwnd in titles: |     for hwnd in titles: | ||||||
|         if 'Chat:' in titles[hwnd]: continue # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows |         # Some sites (FTP? PS? Others?) have seperable or seperately constructed chat windows | ||||||
|         if 'History for table:' in titles[hwnd]: continue # Everleaf Network HH viewer window |         if 'Chat:' in titles[hwnd]: continue | ||||||
|         if 'HUD:' in titles[hwnd]: continue # FPDB HUD window |         # Everleaf Network HH viewer window | ||||||
|  |         if 'History for table:' in titles[hwnd]: continue | ||||||
|  |         # FPDB HUD window | ||||||
|  |         if 'HUD:' in titles[hwnd]: continue | ||||||
| 
 | 
 | ||||||
|         if re.search(search_string, titles[hwnd]): |         if re.search(search_string, titles[hwnd]): | ||||||
|             return decode_windows(c, titles[hwnd], hwnd) |             return decode_windows(c, titles[hwnd], hwnd) | ||||||
|  | @ -268,18 +272,30 @@ def discover_nt_tournament(c, tour_number, tab_number): | ||||||
| def get_nt_exe(hwnd): | def get_nt_exe(hwnd): | ||||||
|     """Finds the name of the executable that the given window handle belongs to.""" |     """Finds the name of the executable that the given window handle belongs to.""" | ||||||
|      |      | ||||||
|     # Request privileges to enable "debug process", so we can later use PROCESS_VM_READ, retardedly required to GetModuleFileNameEx() |     # Request privileges to enable "debug process", so we can later use | ||||||
|  |     # PROCESS_VM_READ, retardedly required to GetModuleFileNameEx() | ||||||
|     priv_flags = win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY |     priv_flags = win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY | ||||||
|     hToken = win32security.OpenProcessToken (win32api.GetCurrentProcess(), priv_flags) |     hToken = win32security.OpenProcessToken (win32api.GetCurrentProcess(), | ||||||
|  |                                              priv_flags) | ||||||
|     # enable "debug process" |     # enable "debug process" | ||||||
|     privilege_id = win32security.LookupPrivilegeValue (None, win32security.SE_DEBUG_NAME) |     privilege_id = win32security.LookupPrivilegeValue(None, | ||||||
|     old_privs = win32security.AdjustTokenPrivileges (hToken, 0, [(privilege_id, win32security.SE_PRIVILEGE_ENABLED)]) |                                                       win32security.SE_DEBUG_NAME) | ||||||
|  |     old_privs = win32security.AdjustTokenPrivileges(hToken, 0, | ||||||
|  |                                                     [(privilege_id, | ||||||
|  |                                                       win32security.SE_PRIVILEGE_ENABLED)]) | ||||||
|      |      | ||||||
|     # Open the process, and query it's filename |     # Open the process, and query it's filename | ||||||
|     processid = win32process.GetWindowThreadProcessId(hwnd) |     processid = win32process.GetWindowThreadProcessId(hwnd) | ||||||
|     pshandle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, processid[1]) |     pshandle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | | ||||||
|  |                                     win32con.PROCESS_VM_READ, False, | ||||||
|  |                                     processid[1]) | ||||||
|  |     try: | ||||||
|         exename = win32process.GetModuleFileNameEx(pshandle, 0) |         exename = win32process.GetModuleFileNameEx(pshandle, 0) | ||||||
|      |     except pywintypes.error: | ||||||
|  |         # insert code to call GetProcessImageName if we can find it.. | ||||||
|  |         # returning None from here will hopefully break all following code | ||||||
|  |         exename = None  | ||||||
|  |     finally: | ||||||
|         # clean up |         # clean up | ||||||
|         win32api.CloseHandle(pshandle) |         win32api.CloseHandle(pshandle) | ||||||
|         win32api.CloseHandle(hToken) |         win32api.CloseHandle(hToken) | ||||||
|  | @ -305,6 +321,8 @@ def decode_windows(c, title, hwnd): | ||||||
|     info['width']  = int( width ) - 2*b_width |     info['width']  = int( width ) - 2*b_width | ||||||
|     info['height'] = int( height ) - b_width - tb_height |     info['height'] = int( height ) - b_width - tb_height | ||||||
|     info['exe']    = get_nt_exe(hwnd) |     info['exe']    = get_nt_exe(hwnd) | ||||||
|  |     print "get_nt_exe returned ", info['exe'] | ||||||
|  |     # TODO: 'width' here is all sorts of screwed up. | ||||||
| 
 | 
 | ||||||
|     title_bits = re.split(' - ', info['title']) |     title_bits = re.split(' - ', info['title']) | ||||||
|     info['name'] = title_bits[0] |     info['name'] = title_bits[0] | ||||||
|  |  | ||||||
|  | @ -516,6 +516,8 @@ class fpdb: | ||||||
|         print "Quitting normally" |         print "Quitting normally" | ||||||
|         #check if current settings differ from profile, if so offer to save or abort |         #check if current settings differ from profile, if so offer to save or abort | ||||||
|         self.db.disconnect() |         self.db.disconnect() | ||||||
|  |         # hide icon as it doesn't go away immediately in Windows - is this ok in Linux Eric? | ||||||
|  |         self.statusIcon.set_visible(False) | ||||||
|         gtk.main_quit() |         gtk.main_quit() | ||||||
| 
 | 
 | ||||||
|     def release_global_lock(self): |     def release_global_lock(self): | ||||||
|  |  | ||||||
|  | @ -77,10 +77,11 @@ class fpdb_db: | ||||||
|             import MySQLdb |             import MySQLdb | ||||||
|             if use_pool: |             if use_pool: | ||||||
|                 MySQLdb = pool.manage(MySQLdb, pool_size=5) |                 MySQLdb = pool.manage(MySQLdb, pool_size=5) | ||||||
|             try: | #            try: | ||||||
|             self.db = MySQLdb.connect(host=host, user=user, passwd=password, db=database, use_unicode=True) |             self.db = MySQLdb.connect(host=host, user=user, passwd=password, db=database, use_unicode=True) | ||||||
|             except: |             #TODO: Add port option | ||||||
|                 raise FpdbMySQLFailedError("MySQL connection failed") | #            except: | ||||||
|  | #                raise FpdbMySQLFailedError("MySQL connection failed") | ||||||
|         elif backend==fpdb_db.PGSQL: |         elif backend==fpdb_db.PGSQL: | ||||||
|             import psycopg2 |             import psycopg2 | ||||||
|             import psycopg2.extensions |             import psycopg2.extensions | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user