@ -22,6 +22,7 @@ UNSTABLE.
"""
from ConfigParser import ConfigParser
import tempfile
import os
import urllib
@ -48,15 +49,10 @@ class ContentBundle(Bundle):
Bundle . __init__ ( self , path )
self . _locale = None
self . _l10n = None
self . _category = None
self . _name = None
self . _subcategory = None
self . _category_class = None
self . _category_icon = None
self . _icon = None
self . _library_version = ' 0 '
self . _bundle_class = None
self . _activity_start = None
self . _activity_start = ' index.html '
self . _global_name = None
info_file = self . get_file ( ' library/library.info ' )
@ -64,11 +60,10 @@ class ContentBundle(Bundle):
raise MalformedBundleException ( ' No library.info file ' )
self . _parse_info ( info_file )
if ( self . get_file ( ' index.html ' ) is None and
self . get_file ( ' library/library.xml ' ) is None ) :
if self . get_file ( self . _activity_start ) is None :
raise MalformedBundleException (
' Content bundle %s has neither index.html nor library.xml ' %
self . _path )
' Content bundle %s does not have start page %s ' %
( self . _path , self . _activity_start ) )
def _parse_info ( self , info_file ) :
cp = ConfigParser ( )
@ -92,67 +87,26 @@ class ContentBundle(Bundle):
( self . _path , version ) )
self . _library_version = version
if cp . has_option ( section , ' l10n ' ) :
l10n = cp . get ( section , ' l10n ' )
if l10n == ' true ' :
self . _l10n = True
elif l10n == ' false ' :
self . _l10n = False
else :
raise MalformedBundleException (
' Content bundle %s has invalid l10n key %r ' %
( self . _path , l10n ) )
else :
raise MalformedBundleException (
' Content bundle %s does not specify if it is localized ' %
self . _path )
if cp . has_option ( section , ' locale ' ) :
self . _locale = cp . get ( section , ' locale ' )
else :
raise MalformedBundleException (
' Content bundle %s does not specify a locale ' % self . _path )
if cp . has_option ( section , ' category ' ) :
self . _category = cp . get ( section , ' category ' )
else :
raise MalformedBundleException (
' Content bundle %s does not specify a category ' % self . _path )
if cp . has_option ( section , ' global_name ' ) :
self . _global_name = cp . get ( section , ' global_name ' )
else :
self . _global_name = None
if cp . has_option ( section , ' category_icon ' ) :
self . _category_icon = cp . get ( section , ' category_icon ' )
else :
self . _category_icon = None
if cp . has_option ( section , ' icon ' ) :
self . _icon = cp . get ( section , ' icon ' )
if cp . has_option ( section , ' category_class ' ) :
self . _category_class = cp . get ( section , ' category_class ' )
else :
self . _category_class = None
if cp . has_option ( section , ' subcategory ' ) :
self . _subcategory = cp . get ( section , ' subcategory ' )
else :
self . _subcategory = None
if cp . has_option ( section , ' bundle_class ' ) :
self . _bundle_class = cp . get ( section , ' bundle_class ' )
else :
self . _bundle_class = None
# Compatibility with old content bundles
if not self . _global_name is None \
and cp . has_option ( section , ' bundle_class ' ) :
self . _global_name = cp . get ( section , ' bundle_class ' )
if cp . has_option ( section , ' activity_start ' ) :
self . _activity_start = cp . get ( section , ' activity_start ' )
else :
self . _activity_start = ' index.html '
if self . _ bundle_class is None and self . _ global_name is None :
if self . _global_name is None :
raise MalformedBundleException (
' Content bundle %s must specify either global_name or '
' bundle_class ' % self . _path )
' Content bundle %s must specify global_name ' % self . _path )
def get_name ( self ) :
return self . _name
@ -160,74 +114,53 @@ class ContentBundle(Bundle):
def get_library_version ( self ) :
return self . _library_version
def get_l10n ( self ) :
return self . _l10n
def get_locale ( self ) :
return self . _locale
def get_category ( self ) :
return self . _category
def get_category_icon ( self ) :
return self . _category_icon
def get_category_class ( self ) :
return self . _category_class
def get_subcategory ( self ) :
return self . _subcategory
def get_bundle_class ( self ) :
return self . _bundle_class
def get_activity_start ( self ) :
return self . _activity_start
def get_icon ( self ) :
# To be implemented later
return None
if not self . _icon :
return None
def _run_indexer ( self ) :
xdg_data_dirs = os . getenv ( ' XDG_DATA_DIRS ' ,
' /usr/local/share/:/usr/share/ ' )
for path in xdg_data_dirs . split ( ' : ' ) :
indexer = os . path . join ( path , ' library-common ' , ' make_index.py ' )
if os . path . exists ( indexer ) :
os . spawnlp ( os . P_WAIT , ' python ' , ' python ' , indexer )
icon_path = os . path . join ( ' library ' , self . _icon )
ext = os . path . splitext ( icon_path ) [ 1 ]
if ext == ' ' :
ext = ' .svg '
icon_path + = ext
def get_root_dir ( self ) :
return os . path . join ( env . get_user_library_path ( ) , self . _zip_root_dir )
def get_start_path ( self ) :
return os . path . join ( self . get_root_dir ( ) , self . _activity_start )
if self . _zip_file is None :
return os . path . join ( self . _path , icon_path )
else :
icon_data = self . get_file ( icon_path ) . read ( )
temp_file , temp_file_path = tempfile . mkstemp ( prefix = self . _icon ,
suffix = ext )
os . write ( temp_file , icon_data )
os . close ( temp_file )
return temp_file_path
def get_start_uri ( self ) :
return ' file:// ' + urllib . pathname2url ( self . get_start_path ( ) )
path = os . path . join ( self . get_path ( ) , self . _activity_start )
return ' file:// ' + urllib . pathname2url ( path )
def get_bundle_id ( self ) :
# TODO treat ContentBundle in special way
# needs rethinking while fixing ContentBundle support
if self . _bundle_class is not None :
return self . _bundle_class
else :
return self . _global_name
return self . _global_name
def get_activity_version ( self ) :
# TODO treat ContentBundle in special way
# needs rethinking while fixing ContentBundle support
return self . _library_version
def get_tags ( self ) :
return None
def install ( self ) :
install_path = env . get_user_library_path ( )
self . _unzip ( install_path )
self . _run_indexer ( )
return self . get_root_dir ( )
return os . path . join ( install_path , self . _zip_root_dir )
def uninstall ( self , force = False , delete_profile = False ) :
install_dir = self . _path
self . _uninstall ( install_dir )
self . _run_indexer ( )
def is_user_activity ( self ) :
# All content bundles are installed in user storage