home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / LanguageSelector / LangCache.py < prev    next >
Encoding:
Python Source  |  2009-05-07  |  9.0 KB  |  225 lines

  1.  
  2. import warnings
  3. warnings.filterwarnings("ignore", "apt API not stable yet", FutureWarning)
  4. import apt
  5. import apt_pkg
  6.  
  7. from xml.etree.ElementTree import ElementTree
  8.  
  9. from gettext import gettext as _
  10.  
  11. class LanguagePackageStatus(object):
  12.     def __init__(self, pkg_template):
  13.         self.pkgname_template = pkg_template
  14.         self.available = False
  15.         self.installed = False
  16.         self.doChange = False
  17.  
  18.  
  19. # the language-support information
  20. class LanguageInformation(object):
  21.     def __init__(self):
  22.         self.language = None
  23.         self.languageCode = None
  24.         # langPack/support status 
  25.         self.languagePkgList = {}
  26.         self.languagePkgList["languagePack"] = LanguagePackageStatus("language-pack-%s")
  27.         #self.languagePkgList["languageSupport"] = LanguagePackageStatus("language-support-%s")
  28.         self.languagePkgList["languageSupportWritingAids"] = LanguagePackageStatus("language-support-writing-%s")
  29.         self.languagePkgList["languageSupportTranslations"] = LanguagePackageStatus("language-support-translations-%s")
  30.         self.languagePkgList["languageSupportInputMethods"] = LanguagePackageStatus("language-support-input-%s")
  31.         self.languagePkgList["languageSupportFonts"] = LanguagePackageStatus("language-support-fonts-%s")
  32.         self.languagePkgList["languageSupportExtra"] = LanguagePackageStatus("language-support-extra-%s")
  33.         
  34.     @property
  35.     def inconsistent(self):
  36.         " returns True if only parts of the language support packages are installed "
  37.         if (not self.notInstalled and not self.fullInstalled) : return True
  38.         return False
  39.     @property
  40.     def fullInstalled(self):
  41.         " return True if all of the available language support packages are installed "
  42.         for pkg in self.languagePkgList.values() :
  43.             if not pkg.available : continue
  44.             if not ((pkg.installed and not pkg.doChange) or (not pkg.installed and pkg.doChange)) : return False
  45.         return True
  46.     @property
  47.     def notInstalled(self):
  48.         " return True if none of the available language support packages are installed "
  49.         for pkg in self.languagePkgList.values() :
  50.             if not pkg.available : continue
  51.             if not ((not pkg.installed and not pkg.doChange) or (pkg.installed and pkg.doChange)) : return False
  52.         return True
  53.     @property
  54.     def changes(self):
  55.         " returns true if anything in the state of the language packs/support changes "
  56.         for pkg in self.languagePkgList.values() :
  57.             if (pkg.doChange) : return True
  58.         return False
  59.     def __str__(self):
  60.         return "%s (%s)" % (self.language, self.languageCode)
  61.  
  62. # the pkgcache stuff
  63. class ExceptionPkgCacheBroken(Exception):
  64.     pass
  65.  
  66. class LanguageSelectorPkgCache(apt.Cache):
  67.  
  68.     # packages that need special translation packs (not covered by
  69.     # the normal langpacks) 
  70.     pkg_translations = [
  71.         ("kdelibs-data", "language-pack-kde-"),
  72.         ("libgnome2-common", "language-pack-gnome-"),
  73. #        ("firefox-2", "mozilla-firefox-locale-"),
  74. #        ("thunderbird", "language-support-translations-"),
  75. #        ("openoffice.org", "language-support-translations-"),
  76. #        ("openoffice.org", "language-support-translations-"),
  77.         ("libsword5c2a", "sword-language-pack-")
  78.     ]
  79.  
  80.     def __init__(self, localeinfo, progress):
  81.         apt.Cache.__init__(self, progress)
  82.         if self._depcache.BrokenCount > 0:
  83.             raise ExceptionPkgCacheBroken()
  84.         self._localeinfo = localeinfo
  85.         # keep the lists 
  86.         self.to_inst = []
  87.         self.to_rm = []
  88.  
  89.     @property
  90.     def havePackageLists(self):
  91.         " verify that a network package lists exists "
  92.         for metaindex in self._list.List:
  93.             for indexfile in metaindex.IndexFiles:
  94.                 if indexfile.ArchiveURI("").startswith("cdrom:"):
  95.                     continue
  96.                 if indexfile.ArchiveURI("").startswith("http://security.ubuntu.com"):
  97.                     continue
  98.                 if indexfile.Exists and indexfile.HasPackages:
  99.                     return True
  100.         return False
  101.  
  102.     def clear(self):
  103.         """ clear the selections """
  104.         self._depcache.Init()
  105.         
  106.     def getChangesList(self):
  107.         to_inst = []
  108.         to_rm = []
  109.         for pkg in self.getChanges():
  110.             if pkg.markedInstall or pkg.markedUpgrade:
  111.                 to_inst.append(pkg.name)
  112.             if pkg.markedDelete:
  113.                 to_rm.append(pkg.name)
  114.         return (to_inst,to_rm)
  115.  
  116.     def _getPkgList(self, languageCode):
  117.         """ helper that returns the list of needed pkgs for the language """
  118.         # normal langpack+support first
  119.         pkg_list = ["language-support-input-%s"%languageCode,\
  120.                     "language-support-writing-%s"%languageCode,\
  121.                     "language-support-fonts-%s"%languageCode,\
  122.                     "language-support-translations-%s"%languageCode,\
  123.                     "language-support-extra-%s"%languageCode,\
  124.                       "language-pack-%s"%languageCode]
  125.         # see what additional pkgs are needed
  126.         for (pkg, translation) in self.pkg_translations:
  127.             if self.has_key(pkg) and self[pkg].isInstalled:
  128.                 pkg_list.append(translation+languageCode)
  129.         return pkg_list
  130.         
  131.     def tryChangeDetails(self, li):
  132.         " change the status of the support details (fonts, input methods) "
  133.         #print li
  134.         for item in li.languagePkgList.values():
  135.             if item.doChange:
  136.                 try:
  137.                     if item.installed:
  138.                         self[item.pkgname_template % li.languageCode].markDelete()
  139.                     else:
  140.                         self[item.pkgname_template % li.languageCode].markInstall()
  141.                 except SystemError:
  142.                     pass
  143.         # Check for additional translation packages
  144.         item = li.languagePkgList["languagePack"]
  145.         if ((item.installed and not item.doChange) or (item.available and not item.installed and item.doChange)):
  146.             for (pkg, translation) in self.pkg_translations:
  147.                 if self.has_key(pkg) and \
  148.                    self[pkg].isInstalled and \
  149.                    self.has_key(translation+li.languageCode) and \
  150.                    not self[translation+li.languageCode].isInstalled:
  151.                    self[translation+li.languageCode].markInstall()
  152.                    #print ("Will pull: %s" % translation+li.languageCode)
  153.         elif ((not item.installed and not item.doChange) or (item.installed and item.doChange)) :
  154.             for (pkg, translation) in self.pkg_translations:
  155.                 if self.has_key(pkg) and \
  156.                    self[pkg].isInstalled and \
  157.                    self.has_key(translation+li.languageCode) and \
  158.                    self[translation+li.languageCode].isInstalled:
  159.                    self[translation+li.languageCode].markDelete()
  160.                    #print ("Will remove: %s" % translation+li.languageCode)
  161.         return
  162.  
  163.     def tryInstallLanguage(self, languageCode):
  164.         """ mark the given language for install """
  165.         to_inst = []
  166.         for name in self._getPkgList(languageCode):
  167.             if self.has_key(name):
  168.                 try:
  169.                     self[name].markInstall()
  170.                     to_inst.append(name)
  171.                 except SystemError:
  172.                     pass
  173.                 try:
  174.                     self[name].markInstall()
  175.                     to_inst.append(name)
  176.                 except SystemError:
  177.                     pass
  178.  
  179.     def tryRemoveLanguage(self, languageCode):
  180.         """ mark the given language for remove """
  181.         to_rm = []
  182.         for name in self._getPkgList(languageCode):
  183.             if self.has_key(name):
  184.                 try:
  185.                     # purge
  186.                     self[name].markDelete(True)
  187.                     to_rm.append(name)
  188.                 except SystemError:
  189.                     pass
  190.     
  191.     def getLanguageInformation(self):
  192.         """ returns a list with language packs/support packages """
  193.         res = []
  194.         for (code,lang) in self._localeinfo._lang.items():
  195.             li = LanguageInformation()
  196.             li.languageCode = code
  197.             li.language = lang
  198.             for langpkg_status in li.languagePkgList.values() :
  199.                 pkgname = langpkg_status.pkgname_template % code
  200.                 langpkg_status.available = self.has_key(pkgname)
  201.                 if langpkg_status.available:
  202.                     langpkg_status.installed = self[pkgname].isInstalled
  203.             if len(filter(lambda s: s.available, li.languagePkgList.values())) > 0:
  204.                 res.append(li)
  205.         return res
  206.  
  207.  
  208. if __name__ == "__main__":
  209.  
  210.     from LocaleInfo import LocaleInfo
  211.     datadir = "/usr/share/language-selector"
  212.     li = LocaleInfo("%s/data/languagelist" % datadir)
  213.  
  214.     lc = LanguageSelectorPkgCache(li,apt.progress.OpProgress())
  215.     print "available language information"
  216.     print ", ".join(["%s" %x for x in lc.getLanguageInformation()])
  217.  
  218.     print "Trying to install 'zh'"
  219.     lc.tryInstallLanguage("zh")
  220.     print lc.getChangesList()
  221.  
  222.     print "Trying to remove it again"
  223.     lc.tryRemoveLanguage("zh")
  224.     print lc.getChangesList()
  225.