Add mime support for Windows platform
svn: r6911
This commit is contained in:
parent
c6b026e6dd
commit
3f9adb3771
@ -1,3 +1,9 @@
|
|||||||
|
2006-06-18 Brian Matherly <brian@gramps-project.org>
|
||||||
|
* src/Mime/__init__.py: Add WinMime
|
||||||
|
* src/Mime/_WinMime.py: Added
|
||||||
|
* src/Utils.py: make launch work in Windows
|
||||||
|
* src/docgen/*: use Utils.launch to start external viewers
|
||||||
|
|
||||||
2006-06-17 Don Allingham <don@gramps-project.org>
|
2006-06-17 Don Allingham <don@gramps-project.org>
|
||||||
* src/Editors/_EditPerson.py: select given name field if the
|
* src/Editors/_EditPerson.py: select given name field if the
|
||||||
surname field is already defined
|
surname field is already defined
|
||||||
|
153
src/Mime/_WinMime.py
Normal file
153
src/Mime/_WinMime.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2006 Brian Matherly
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id:
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Standard python modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import os
|
||||||
|
from _winreg import *
|
||||||
|
from gettext import gettext as _
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# GNOME/GTK
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import gtk
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import const
|
||||||
|
import _PythonMime
|
||||||
|
|
||||||
|
|
||||||
|
def get_application(type):
|
||||||
|
"""Returns the application command and application name of the
|
||||||
|
specified mime type"""
|
||||||
|
extension = _get_extension(type)
|
||||||
|
progId = _get_prog_id(extension)
|
||||||
|
|
||||||
|
if progId:
|
||||||
|
# Find the application associated with this program ID
|
||||||
|
aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT)
|
||||||
|
subkey = OpenKey(aReg, "%s\shell\open\command" % progId)
|
||||||
|
n,command,type = EnumValue(subkey, 0)
|
||||||
|
if type == REG_EXPAND_SZ:
|
||||||
|
command = command.replace( '%SystemRoot%',
|
||||||
|
os.getenv('SystemRoot') )
|
||||||
|
|
||||||
|
# TODO: figure out how to get a description of the application
|
||||||
|
# use that instead of progId
|
||||||
|
return (command,progId)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_description(mime_type):
|
||||||
|
"""Returns the description of the specfied mime type"""
|
||||||
|
desc = None
|
||||||
|
extension = _get_extension(mime_type)
|
||||||
|
progId = _get_prog_id(extension)
|
||||||
|
|
||||||
|
if progId:
|
||||||
|
aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT)
|
||||||
|
desc = QueryValue(aReg, progId)
|
||||||
|
CloseKey(aReg)
|
||||||
|
|
||||||
|
if not desc:
|
||||||
|
desc = _("unknown")
|
||||||
|
|
||||||
|
return desc
|
||||||
|
|
||||||
|
def get_type(file):
|
||||||
|
"""Returns the mime type of the specified file"""
|
||||||
|
return _PythonMime.get_type(file)
|
||||||
|
|
||||||
|
def mime_type_is_defined(mime_type):
|
||||||
|
"""
|
||||||
|
Return True if a description for a mime type exists.
|
||||||
|
"""
|
||||||
|
extension = _get_extension(mime_type)
|
||||||
|
if extension:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return _PythonMime.mime_type_is_defined(mime_type)
|
||||||
|
|
||||||
|
_icon_theme = gtk.icon_theme_get_default()
|
||||||
|
|
||||||
|
def find_mime_type_pixbuf(mime_type):
|
||||||
|
return _PythonMime.find_mime_type_pixbuf(mime_type)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# private functions
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def _get_extension(mime_type):
|
||||||
|
"""
|
||||||
|
Return the extension associated with this mime type
|
||||||
|
Return None if no association exists
|
||||||
|
"""
|
||||||
|
extension = None
|
||||||
|
try:
|
||||||
|
aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT)
|
||||||
|
subkey = OpenKey(aReg, "MIME\DataBase\Content Type")
|
||||||
|
mimekey = OpenKey(subkey, mime_type)
|
||||||
|
extension,type = QueryValueEx(mimekey, "Extension")
|
||||||
|
CloseKey(mimekey)
|
||||||
|
CloseKey(subkey)
|
||||||
|
CloseKey(aReg)
|
||||||
|
except:
|
||||||
|
extension = None
|
||||||
|
|
||||||
|
if not extension:
|
||||||
|
# Work around for Windows mime problems
|
||||||
|
extmap = {
|
||||||
|
'application/abiword' : '.abw',
|
||||||
|
'application/rtf' : '.rtf',
|
||||||
|
}
|
||||||
|
if extmap.has_key(mime_type):
|
||||||
|
extension = extmap[mime_type]
|
||||||
|
|
||||||
|
return extension
|
||||||
|
|
||||||
|
|
||||||
|
def _get_prog_id(extension):
|
||||||
|
"""
|
||||||
|
Return the program ID associated with this extension
|
||||||
|
Return None if no association exists
|
||||||
|
"""
|
||||||
|
if not extension:
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
aReg = ConnectRegistry(None,HKEY_CLASSES_ROOT)
|
||||||
|
progId = QueryValue(aReg, extension)
|
||||||
|
CloseKey(aReg)
|
||||||
|
return progId
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
@ -21,7 +21,10 @@
|
|||||||
try:
|
try:
|
||||||
from _GnomeMime import *
|
from _GnomeMime import *
|
||||||
except:
|
except:
|
||||||
from _PythonMime import *
|
try:
|
||||||
|
from _WinMime import *
|
||||||
|
except:
|
||||||
|
from _PythonMime import *
|
||||||
|
|
||||||
def base_type(val):
|
def base_type(val):
|
||||||
return val.split('/')[0]
|
return val.split('/')[0]
|
||||||
|
65
src/Utils.py
65
src/Utils.py
@ -459,7 +459,10 @@ def gformat(val):
|
|||||||
return return_val.replace(decimal_point,'.')
|
return return_val.replace(decimal_point,'.')
|
||||||
|
|
||||||
def search_for(name):
|
def search_for(name):
|
||||||
name = name.split()[0]
|
if name.startswith( '"' ):
|
||||||
|
name = name.split('"')[1]
|
||||||
|
else:
|
||||||
|
name = name.split()[0]
|
||||||
for i in os.environ['PATH'].split(':'):
|
for i in os.environ['PATH'].split(':'):
|
||||||
fname = os.path.join(i,name)
|
fname = os.path.join(i,name)
|
||||||
if os.access(fname,os.X_OK) and not os.path.isdir(fname):
|
if os.access(fname,os.X_OK) and not os.path.isdir(fname):
|
||||||
@ -992,31 +995,43 @@ class ProgressMeter:
|
|||||||
|
|
||||||
def launch(prog_str,path):
|
def launch(prog_str,path):
|
||||||
|
|
||||||
subval = {
|
if sys.platform == "win32":
|
||||||
'%F' : path,
|
|
||||||
'%f' : path,
|
|
||||||
'%u' : path,
|
|
||||||
'%U' : path,
|
|
||||||
'%n' : path,
|
|
||||||
'%N' : path,
|
|
||||||
}
|
|
||||||
|
|
||||||
prog_data = prog_str.split()
|
import subprocess
|
||||||
prog = prog_data[0]
|
if prog_str.find("%1") != -1:
|
||||||
prog_list = []
|
prog_str = prog_str.replace("%1",path)
|
||||||
need_path = True
|
else:
|
||||||
|
prog_str = '%s "%s"' %(prog_str,path)
|
||||||
|
subprocess.Popen(prog_str)
|
||||||
|
|
||||||
if len(prog_data) > 1:
|
|
||||||
for item in prog_data:
|
|
||||||
if subval.has_key(item):
|
|
||||||
need_path = False
|
|
||||||
value = subval[item]
|
|
||||||
else:
|
|
||||||
value = item
|
|
||||||
prog_list.append(value)
|
|
||||||
else:
|
else:
|
||||||
prog_list = [prog_data[0]]
|
subval = {
|
||||||
|
'%F' : path,
|
||||||
|
'%f' : path,
|
||||||
|
'%u' : path,
|
||||||
|
'%U' : path,
|
||||||
|
'%n' : path,
|
||||||
|
'%N' : path,
|
||||||
|
}
|
||||||
|
|
||||||
|
prog_data = prog_str.split()
|
||||||
|
prog = prog_data[0]
|
||||||
|
prog_list = []
|
||||||
|
need_path = True
|
||||||
|
|
||||||
|
if len(prog_data) > 1:
|
||||||
|
for item in prog_data:
|
||||||
|
if subval.has_key(item):
|
||||||
|
need_path = False
|
||||||
|
value = subval[item]
|
||||||
|
else:
|
||||||
|
value = item
|
||||||
|
prog_list.append(value)
|
||||||
|
else:
|
||||||
|
prog_list = [prog_data[0]]
|
||||||
|
|
||||||
|
if need_path:
|
||||||
|
prog_list.append(path)
|
||||||
|
|
||||||
|
os.spawnvpe(os.P_NOWAIT, prog, prog_list, os.environ)
|
||||||
|
|
||||||
if need_path:
|
|
||||||
prog_list.append(path)
|
|
||||||
os.spawnvpe(os.P_NOWAIT, prog, prog_list, os.environ)
|
|
||||||
|
@ -45,6 +45,7 @@ import ImgManip
|
|||||||
import Mime
|
import Mime
|
||||||
import Utils
|
import Utils
|
||||||
|
|
||||||
|
mime_type = ""
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Class Definitions
|
# Class Definitions
|
||||||
@ -181,11 +182,9 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
self.f.close()
|
self.f.close()
|
||||||
|
|
||||||
if self.print_req:
|
if self.print_req:
|
||||||
apptype = 'application/x-abiword'
|
|
||||||
try:
|
try:
|
||||||
app = Mime.get_application(apptype)[0]
|
app = Mime.get_application(mime_type)[0]
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(app,self.filename)
|
||||||
os.system ('%s "$FILE" &' % app)
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -330,8 +329,13 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
|
|
||||||
try:
|
try:
|
||||||
prog = Mime.get_application("application/x-abiword")
|
if Mime.mime_type_is_defined("application/x-abiword"):
|
||||||
mtype = Mime.get_description('application/x-abiword')
|
mime_type = "application/x-abiword"
|
||||||
|
elif Mime.mime_type_is_defined("application/abiword"):
|
||||||
|
mime_type = "application/abiword"
|
||||||
|
|
||||||
|
prog = Mime.get_application(mime_type)
|
||||||
|
mtype = Mime.get_description(mime_type)
|
||||||
|
|
||||||
if Utils.search_for(prog[0]):
|
if Utils.search_for(prog[0]):
|
||||||
print_label=_("Open in %s") % prog[1]
|
print_label=_("Open in %s") % prog[1]
|
||||||
|
@ -37,6 +37,8 @@ import BaseDoc
|
|||||||
from PluginUtils import register_text_doc
|
from PluginUtils import register_text_doc
|
||||||
import Errors
|
import Errors
|
||||||
import Mime
|
import Mime
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -154,8 +156,7 @@ class AsciiDoc(BaseDoc.BaseDoc):
|
|||||||
if self.print_req:
|
if self.print_req:
|
||||||
apptype = 'text/plain'
|
apptype = 'text/plain'
|
||||||
prog = Mime.get_application(apptype)
|
prog = Mime.get_application(apptype)
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(prog[0],self.filename)
|
||||||
os.system ('%s "$FILE" &' % prog[0])
|
|
||||||
|
|
||||||
def get_usable_width(self):
|
def get_usable_width(self):
|
||||||
return _WIDTH_IN_CHARS
|
return _WIDTH_IN_CHARS
|
||||||
@ -381,8 +382,6 @@ class AsciiDoc(BaseDoc.BaseDoc):
|
|||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
print_label = None
|
print_label = None
|
||||||
try:
|
try:
|
||||||
import Utils
|
|
||||||
|
|
||||||
mprog = Mime.get_application("text/plain")
|
mprog = Mime.get_application("text/plain")
|
||||||
mtype = Mime.get_description('text/plain')
|
mtype = Mime.get_description('text/plain')
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@ import Errors
|
|||||||
import BaseDoc
|
import BaseDoc
|
||||||
import QuestionDialog
|
import QuestionDialog
|
||||||
import Mime
|
import Mime
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -357,8 +359,7 @@ class HtmlDoc(BaseDoc.BaseDoc):
|
|||||||
if self.print_req:
|
if self.print_req:
|
||||||
apptype = 'text/html'
|
apptype = 'text/html'
|
||||||
app = Mime.get_application(apptype)
|
app = Mime.get_application(apptype)
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(app[0],self.filename)
|
||||||
os.system ('%s "$FILE" &' % app[0])
|
|
||||||
|
|
||||||
def write_support_files(self):
|
def write_support_files(self):
|
||||||
if self.map:
|
if self.map:
|
||||||
@ -496,9 +497,8 @@ class HtmlDoc(BaseDoc.BaseDoc):
|
|||||||
# Register the document generator with the GRAMPS plugin system
|
# Register the document generator with the GRAMPS plugin system
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
|
print_label = None
|
||||||
try:
|
try:
|
||||||
import Utils
|
|
||||||
|
|
||||||
prog = Mime.get_application("text/html")
|
prog = Mime.get_application("text/html")
|
||||||
mtype = Mime.get_description("text/html")
|
mtype = Mime.get_description("text/html")
|
||||||
|
|
||||||
@ -506,6 +506,10 @@ try:
|
|||||||
print_label=_("Open in %s") % prog[1]
|
print_label=_("Open in %s") % prog[1]
|
||||||
else:
|
else:
|
||||||
print_label=None
|
print_label=None
|
||||||
|
|
||||||
|
if mtype == _("unknown"):
|
||||||
|
mtype = _('HTML')
|
||||||
|
|
||||||
register_text_doc(mtype,HtmlDoc,1,0,1,".html", print_label)
|
register_text_doc(mtype,HtmlDoc,1,0,1,".html", print_label)
|
||||||
except:
|
except:
|
||||||
register_text_doc(_('HTML'),HtmlDoc,1,0,1,".html", None)
|
register_text_doc(_('HTML'),HtmlDoc,1,0,1,".html", None)
|
||||||
|
@ -519,6 +519,10 @@ try:
|
|||||||
print_label=_("Open in %s") % prog[1]
|
print_label=_("Open in %s") % prog[1]
|
||||||
else:
|
else:
|
||||||
print_label=None
|
print_label=None
|
||||||
|
|
||||||
|
if mtype == _("unknown"):
|
||||||
|
mtype = _('KWord')
|
||||||
|
|
||||||
register_text_doc(mtype, KwordDoc, 1, 1, 1, ".kwd", print_label)
|
register_text_doc(mtype, KwordDoc, 1, 1, 1, ".kwd", print_label)
|
||||||
except:
|
except:
|
||||||
register_text_doc(_('KWord'), KwordDoc, 1, 1, 1, ".kwd", print_label)
|
register_text_doc(_('KWord'), KwordDoc, 1, 1, 1, ".kwd", print_label)
|
||||||
|
@ -45,6 +45,7 @@ from ReportBase import ReportUtils
|
|||||||
import ImgManip
|
import ImgManip
|
||||||
import FontScale
|
import FontScale
|
||||||
import Mime
|
import Mime
|
||||||
|
import Utils
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -414,8 +415,7 @@ class ODFDoc(BaseDoc.BaseDoc):
|
|||||||
self._write_zip()
|
self._write_zip()
|
||||||
if self.print_req:
|
if self.print_req:
|
||||||
app = Mime.get_application(_apptype)
|
app = Mime.get_application(_apptype)
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(app[0],self.filename)
|
||||||
os.system ('%s "$FILE" &' % app[0])
|
|
||||||
|
|
||||||
def add_media_object(self,name,pos,x_cm,y_cm):
|
def add_media_object(self,name,pos,x_cm,y_cm):
|
||||||
|
|
||||||
@ -1138,8 +1138,6 @@ class ODFDoc(BaseDoc.BaseDoc):
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
print_label = None
|
print_label = None
|
||||||
try:
|
try:
|
||||||
import Utils
|
|
||||||
|
|
||||||
mprog = Mime.get_application(_apptype)
|
mprog = Mime.get_application(_apptype)
|
||||||
mtype = Mime.get_description(_apptype)
|
mtype = Mime.get_description(_apptype)
|
||||||
|
|
||||||
|
@ -382,8 +382,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
|
|||||||
self._write_zip()
|
self._write_zip()
|
||||||
if self.print_req:
|
if self.print_req:
|
||||||
app = Mime.get_application(_apptype)
|
app = Mime.get_application(_apptype)
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(app[0],self.filename)
|
||||||
os.system ('%s "$FILE" &' % app[0])
|
|
||||||
|
|
||||||
def add_media_object(self,name,pos,x_cm,y_cm):
|
def add_media_object(self,name,pos,x_cm,y_cm):
|
||||||
|
|
||||||
|
@ -38,6 +38,9 @@ from PluginUtils import register_text_doc
|
|||||||
import ImgManip
|
import ImgManip
|
||||||
import Errors
|
import Errors
|
||||||
import Mime
|
import Mime
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
mime_type = "application/rtf"
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -125,11 +128,9 @@ class RTFDoc(BaseDoc.BaseDoc):
|
|||||||
self.f.close()
|
self.f.close()
|
||||||
|
|
||||||
if self.print_req:
|
if self.print_req:
|
||||||
apptype = 'application/rtf'
|
|
||||||
try:
|
try:
|
||||||
app = Mime.get_application(apptype)[0]
|
app = Mime.get_application(mime_type)[0]
|
||||||
os.environ["FILE"] = self.filename
|
Utils.launch(app,self.filename)
|
||||||
os.system ('%s "$FILE" &' % app)
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -422,12 +423,9 @@ class RTFDoc(BaseDoc.BaseDoc):
|
|||||||
# Register the document generator with the GRAMPS plugin system
|
# Register the document generator with the GRAMPS plugin system
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import Utils
|
mprog = Mime.get_application(mime_type)
|
||||||
|
mtype = Mime.get_description(mime_type)
|
||||||
mprog = Mime.get_application("application/rtf")
|
|
||||||
mtype = Mime.get_description("application/rtf")
|
|
||||||
|
|
||||||
if Utils.search_for(mprog[0]):
|
if Utils.search_for(mprog[0]):
|
||||||
print_label=_("Open in %s") % mprog[1]
|
print_label=_("Open in %s") % mprog[1]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user