[haiku-commits] r36276 - in haiku/trunk: headers/private/locale src/add-ons/locale/catalogs/plaintext src/apps/readonlybootprompt src/kits/locale

  • From: pulkomandy@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 15 Apr 2010 01:48:01 +0200 (CEST)

Author: pulkomandy
Date: 2010-04-15 01:48:01 +0200 (Thu, 15 Apr 2010)
New Revision: 36276
Changeset: http://dev.haiku-os.org/changeset/36276/haiku

Modified:
   haiku/trunk/headers/private/locale/DefaultCatalog.h
   haiku/trunk/src/add-ons/locale/catalogs/plaintext/Catalog.cpp
   haiku/trunk/src/apps/readonlybootprompt/BootPromptWindow.cpp
   haiku/trunk/src/kits/locale/DefaultCatalog.cpp
   haiku/trunk/src/kits/locale/LocaleRoster.cpp
Log:
 * Implement a function to get all the available languages for a given 
application
 * use it in readonlybootprompt instead of previous workaround code.
This makes the readonlybootprompt faster and lighter as it doesn't open and 
parse all the catalogs anymore, but only checks for their existence.


Modified: haiku/trunk/headers/private/locale/DefaultCatalog.h
===================================================================
--- haiku/trunk/headers/private/locale/DefaultCatalog.h 2010-04-14 22:26:54 UTC 
(rev 36275)
+++ haiku/trunk/headers/private/locale/DefaultCatalog.h 2010-04-14 23:48:01 UTC 
(rev 36276)
@@ -61,6 +61,10 @@
                mutable BString         fPath;
 };
 
+extern "C" status_t
+default_catalog_get_available_languages(BMessage* availableLanguages,
+       const char* sigPattern, const char* langPattern = NULL,
+       int32 fingerprint = 0);
 
 }      // namespace BPrivate
 

Modified: haiku/trunk/src/add-ons/locale/catalogs/plaintext/Catalog.cpp
===================================================================
--- haiku/trunk/src/add-ons/locale/catalogs/plaintext/Catalog.cpp       
2010-04-14 22:26:54 UTC (rev 36275)
+++ haiku/trunk/src/add-ons/locale/catalogs/plaintext/Catalog.cpp       
2010-04-14 23:48:01 UTC (rev 36276)
@@ -417,9 +417,8 @@
 }
 
 
-extern "C"
-BCatalogAddOn *create_catalog(const char *signature,
-       const char *language)
+extern "C" BCatalogAddOn *
+create_catalog(const char *signature, const char *language)
 {
        PlainTextCatalog *catalog
                = new(std::nothrow) PlainTextCatalog("emptycat", signature, 
language);
@@ -427,5 +426,15 @@
 }
 
 
+extern "C" status_t
+get_available_languages(BMessage* availableLanguages,
+       const char* sigPattern = NULL, const char* langPattern = NULL,
+       int32 fingerprint = 0)
+{
+       // TODO
+       return B_ERROR;
+}
+
+
 uint8 gCatalogAddOnPriority = 99;
        // give low priority to this add on, we don't want it to be actually 
used

Modified: haiku/trunk/src/apps/readonlybootprompt/BootPromptWindow.cpp
===================================================================
--- haiku/trunk/src/apps/readonlybootprompt/BootPromptWindow.cpp        
2010-04-14 22:26:54 UTC (rev 36275)
+++ haiku/trunk/src/apps/readonlybootprompt/BootPromptWindow.cpp        
2010-04-14 23:48:01 UTC (rev 36276)
@@ -266,36 +266,33 @@
                firstPreferredLanguage = "en";
        }
 
-// TODO: Use this API instead once it's ready.
-//     BMessage installedCatalogs;
-//     be_locale_roster->GetInstalledCatalogs(&installedCatalogs);
-//     installedCatalogs.PrintToStream();
+       BMessage installedCatalogs;
+       be_locale_roster->GetInstalledCatalogs(&installedCatalogs,
+               "x-vnd.Haiku-ReadOnlyBootPrompt");
 
        // Try to instantiate a BCatalog for each language, it will only work
        // for translations of this application. So the list of languages will 
be
        //  limited to catalogs written for this application, which is on 
purpose!
+       
        const char* languageString;
        for (int32 i = 0;
-               fInstalledLanguages.FindString("langs", i, &languageString) == 
B_OK;
+               installedCatalogs.FindString("langs", i, &languageString) == 
B_OK;
                i++) {
-               BCatalog catalog("x-vnd.Haiku-ReadOnlyBootPrompt", 
languageString);
-               if (catalog.InitCheck() == B_OK) {
-                       BLanguage* language;
-                       if (be_locale_roster->GetLanguage(&language,
-                                       BString(languageString)) == B_OK) {
-                               BString name;
-                               language->GetName(&name);
-                               LanguageItem* item = new 
LanguageItem(name.String(),
-                                       languageString);
-                               fLanguagesListView->AddItem(item);
-                               // Select this item if it is the first 
preferred language
-                               if (strcmp(firstPreferredLanguage, 
languageString) == 0) {
-                                       fLanguagesListView->Select(
-                                               
fLanguagesListView->CountItems() - 1);
-                               }
-                       } else
-                               printf("failed to get BLanguage for %s\n", 
languageString);
-               }
+               BLanguage* language;
+               if (be_locale_roster->GetLanguage(&language,
+                               BString(languageString)) == B_OK) {
+                       BString name;
+                       language->GetName(&name);
+                       LanguageItem* item = new LanguageItem(name.String(),
+                               languageString);
+                       fLanguagesListView->AddItem(item);
+                       // Select this item if it is the first preferred 
language
+                       if (strcmp(firstPreferredLanguage, languageString) == 
0) {
+                               fLanguagesListView->Select(
+                                       fLanguagesListView->CountItems() - 1);
+                       }
+               } else
+                       printf("failed to get BLanguage for %s\n", 
languageString);
        }
 
        // Re-enable sending the selection message.

Modified: haiku/trunk/src/kits/locale/DefaultCatalog.cpp
===================================================================
--- haiku/trunk/src/kits/locale/DefaultCatalog.cpp      2010-04-14 22:26:54 UTC 
(rev 36275)
+++ haiku/trunk/src/kits/locale/DefaultCatalog.cpp      2010-04-14 23:48:01 UTC 
(rev 36276)
@@ -575,3 +575,64 @@
        }
        return catalog;
 }
+
+extern "C" status_t
+default_catalog_get_available_languages(BMessage* availableLanguages,
+       const char* sigPattern, const char* langPattern = NULL,
+       int32 fingerprint = 0)
+{
+       if (availableLanguages == NULL || sigPattern == NULL)
+               return B_BAD_DATA;
+
+       app_info appInfo;
+       be_app->GetAppInfo(&appInfo);
+       node_ref nref;
+       nref.device = appInfo.ref.device;
+       nref.node = appInfo.ref.directory;
+       BDirectory appDir(&nref);
+       BString catalogName("locale/");
+       catalogName << kCatFolder
+               << "/" << sigPattern ;
+       BPath catalogPath(&appDir, catalogName.String());
+       BEntry file(catalogPath.Path());
+       BDirectory dir(&file);
+       
+       char fileName[B_FILE_NAME_LENGTH];
+       while(dir.GetNextEntry(&file) == B_OK) {                        
+               file.GetName(fileName);
+               BString langName(fileName);
+               langName.Replace(kCatExtension,"",1);
+               availableLanguages->AddString("langs",langName);
+       }
+
+       // search in data folders
+
+       directory_which which[] = {
+               B_USER_DATA_DIRECTORY,
+               B_COMMON_DATA_DIRECTORY,
+               B_SYSTEM_DATA_DIRECTORY
+       };
+
+       for (size_t i = 0; i < sizeof(which) / sizeof(which[0]); i++) {
+               BPath path;
+               if (find_directory(which[i], &path) == B_OK) {
+                       catalogName = BString("locale/") 
+                               << kCatFolder
+                               << "/" << sigPattern;
+                       
+                       BPath catalogPath(path.Path(), catalogName.String());
+                       BEntry file(catalogPath.Path());
+                       BDirectory dir(&file);
+                       
+                       char fileName[B_FILE_NAME_LENGTH];
+                       while(dir.GetNextEntry(&file) == B_OK) {                
        
+                               file.GetName(fileName);
+                               BString langName(fileName);
+                               langName.Replace(kCatExtension,"",1);
+                               availableLanguages->AddString("langs",langName);
+                       }
+               }
+       }
+       
+       return B_OK;
+}

Modified: haiku/trunk/src/kits/locale/LocaleRoster.cpp
===================================================================
--- haiku/trunk/src/kits/locale/LocaleRoster.cpp        2010-04-14 22:26:54 UTC 
(rev 36275)
+++ haiku/trunk/src/kits/locale/LocaleRoster.cpp        2010-04-14 23:48:01 UTC 
(rev 36276)
@@ -47,6 +47,9 @@
 
 typedef BCatalogAddOn *(*InstantiateEmbeddedCatalogFunc)(
        entry_ref *appOrAddOnRef);
+       
+typedef status_t (*GetAvailableLanguagesFunc)(BMessage*, const char*,
+       const char*, int32);
 
 static BLocaleRoster gLocaleRoster;
 BLocaleRoster *be_locale_roster = &gLocaleRoster;
@@ -62,6 +65,7 @@
        InstantiateCatalogFunc fInstantiateFunc;
        InstantiateEmbeddedCatalogFunc fInstantiateEmbeddedFunc;
        CreateCatalogFunc fCreateFunc;
+       GetAvailableLanguagesFunc fLanguagesFunc;
        uint8 fPriority;
        BList fLoadedCatalogs;
        bool fIsEmbedded;
@@ -84,6 +88,7 @@
        fInstantiateFunc(NULL),
        fInstantiateEmbeddedFunc(NULL),
        fCreateFunc(NULL),
+       fLanguagesFunc(NULL),
        fPriority(priority),
        fIsEmbedded(path.Length()==0)
 {
@@ -118,6 +123,8 @@
                                B_SYMBOL_TYPE_TEXT, (void 
**)&fInstantiateEmbeddedFunc);
                        get_image_symbol(fAddOnImage, "create_catalog",
                                B_SYMBOL_TYPE_TEXT, (void **)&fCreateFunc);
+                       get_image_symbol(fAddOnImage, "get_available_languages",
+                               B_SYMBOL_TYPE_TEXT, (void **)&fLanguagesFunc);
                        log_team(LOG_DEBUG, "catalog-add-on %s has been loaded",
                                fName.String());
                } else {
@@ -125,6 +132,9 @@
                                fName.String(), strerror(fAddOnImage));
                        return false;
                }
+       } else if (fIsEmbedded) {
+               // The built-in catalog still has to provide this function
+               fLanguagesFunc = default_catalog_get_available_languages;
        }
        return true;
 }
@@ -139,6 +149,7 @@
                fInstantiateFunc = NULL;
                fInstantiateEmbeddedFunc = NULL;
                fCreateFunc = NULL;
+               fLanguagesFunc = NULL;
                log_team(LOG_DEBUG, "catalog-add-on %s has been unloaded",
                        fName.String());
        }
@@ -533,6 +544,29 @@
 }
 
 
+status_t
+BLocaleRoster::GetInstalledCatalogs(BMessage * languageList, const char* 
sigPattern,
+       const char* langPattern, int32 fingerprint) const
+{
+       if (languageList == NULL)
+               return B_BAD_VALUE;
+       
+       int32 count = gRosterData.fCatalogAddOnInfos.CountItems();
+       for (int32 i = 0; i < count; ++i) {
+               BCatalogAddOnInfo *info
+                       = 
(BCatalogAddOnInfo*)gRosterData.fCatalogAddOnInfos.ItemAt(i);
+
+               if (!info->MakeSureItsLoaded() || !info->fInstantiateFunc)
+                       continue;
+                       
+               info->fLanguagesFunc(languageList, sigPattern, langPattern,
+                       fingerprint);
+       }
+       
+       return B_OK;
+}
+
+
 /*
  * creates a new (empty) catalog of the given type (the request is dispatched
  * to the appropriate add-on).


Other related posts:

  • » [haiku-commits] r36276 - in haiku/trunk: headers/private/locale src/add-ons/locale/catalogs/plaintext src/apps/readonlybootprompt src/kits/locale - pulkomandy