comparison Generic/openwith.py @ 1:2ac1551ad2ab version 0.0.0

add code
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Sun, 31 Oct 2010 20:07:33 +0100
parents
children 2fc6b47dbe70
comparison
equal deleted inserted replaced
0:a1703c4f2990 1:2ac1551ad2ab
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 ## File openwith.py
4 ## This file is part of pyArq-Presupuestos.
5 ##
6 ## Copyright (C) 2010 Miguel Ángel Bárcena Rodríguez
7 ## <miguelangel@obraencurso.es>
8 ##
9 ## This file is based in gtkgui_helpers.py and common/helpers.py from gajim
10 ##
11 ## Copyright (C) 2003-2008 Yann Leboulanger <asterix AT lagaule.org>
12 ## Copyright (C) 2005-2006 Dimitur Kirov <dkirov AT gmail.com>
13 ## Nikos Kouremenos <kourem AT gmail.com>
14 ## Copyright (C) 2006 Alex Mauer <hawke AT hawkesnest.net>
15 ## Copyright (C) 2006-2007 Travis Shirk <travis AT pobox.com>
16 ## Copyright (C) 2006-2008 Jean-Marie Traissard <jim AT lapin.org>
17 ## Copyright (C) 2007 Lukas Petrovicky <lukas AT petrovicky.net>
18 ## James Newton <redshodan AT gmail.com>
19 ## Julien Pivotto <roidelapluie AT gmail.com>
20 ## Copyright (C) 2007-2008 Stephan Erb <steve-e AT h3c.de>
21 ## Copyright (C) 2008 Brendan Taylor <whateley AT gmail.com>
22 ## Jonathan Schleifer <js-gajim AT webkeks.org>
23 ## This program is free software; you can redistribute it and/or modify
24 ## it under the terms of the GNU General Public License as published
25 ## by the Free Software Foundation; version 3 only.
26 ##
27 ## This program is distributed in the hope that it will be useful,
28 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
29 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 ## GNU General Public License for more details.
31 ##
32 ## You should have received a copy of the GNU General Public License
33 ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
34 ##
35 # Modules
36 import subprocess
37 import os
38
39 # pyArq-Presupuestos modules
40 import globals
41
42 # from gtkgui_helpers.py
43 def autodetect_desktop():
44 # recognize the environment and sets it in globals
45 if os.name == 'nt':
46 globals.desktop["desktop"] = "windows"
47 else:
48 _processes = get_running_processes()
49 if 'gnome-session' in _processes:
50 globals.desktop["desktop"] = "gnome"
51 elif 'startkde' in _processes:
52 globals.desktop["desktop"] = "kde"
53 elif 'startxfce4' in _processes or 'xfce4-session' in _processes:
54 globals.desktop["desktop"] = "xfce"
55 else:
56 globals.desktop["desktop"] = ""
57
58 def get_running_processes():
59 '''returns running processes or None (if not /proc exists)'''
60 if os.path.isdir('/proc'):
61 # under Linux: checking if 'gnome-session' or
62 # 'startkde' programs were run before gajim, by
63 # checking /proc (if it exists)
64 #
65 # if something is unclear, read `man proc`;
66 # if /proc exists, directories that have only numbers
67 # in their names contain data about processes.
68 # /proc/[xxx]/exe is a symlink to executable started
69 # as process number [xxx].
70 # filter out everything that we are not interested in:
71 files = os.listdir('/proc')
72
73 # files that doesn't have only digits in names...
74 files = filter(str.isdigit, files)
75
76 # files that aren't directories...
77 files = [f for f in files if os.path.isdir('/proc/' + f)]
78
79 # processes owned by somebody not running gajim...
80 # (we check if we have access to that file)
81 files = [f for f in files if os.access('/proc/' + f +'/exe', os.F_OK)]
82
83 # be sure that /proc/[number]/exe is really a symlink
84 # to avoid TBs in incorrectly configured systems
85 files = [f for f in files if os.path.islink('/proc/' + f + '/exe')]
86
87 # list of processes
88 processes = [os.path.basename(os.readlink('/proc/' + f +'/exe')) for f in files]
89
90 return processes
91 return []
92
93 # from common/helpers.py
94
95 def exec_command(command):
96 subprocess.Popen('%s &' % command, shell=True).wait()
97
98 def build_command(executable, parameter):
99 # we add to the parameter (can hold path with spaces)
100 # "" so we have good parsing from shell
101 parameter = parameter.replace('"', '\\"') # but first escape "
102 command = '%s "%s"' % (executable, parameter)
103 return command
104
105 def launch_file(kind, uri):
106 # kind = "url" ,"mail", "image", "dxf"
107 _desktop = globals.desktop["desktop"]
108 if _desktop == "windows":
109 try:
110 os.startfile(uri) # if pywin32 is installed we open
111 except Exception:
112 pass
113 else:
114 if kind == 'mail' and not uri.startswith('mailto:'):
115 uri = 'mailto:' + uri
116 if _desktop == "gnome":
117 command = 'gnome-open'
118 elif _desktop == "kde":
119 command = 'kfmclient exec'
120 elif _desktop == "xfce":
121 command = 'exo-open'
122 else:
123 if kind == 'url':
124 command = globals.desktop["browser"]
125 elif kind == 'mail':
126 command = globals.desktop["mailapp"]
127 elif kind == 'image':
128 command = globals.desktop["imageapp"]
129 elif kind == 'dxf':
130 command = globals.desktop["cadapp"]
131 else: # if no app is configured
132 return
133 command = build_command(command, uri)
134 try:
135 exec_command(command)
136 except Exception:
137 pass