From 6f2961ffab0af380ae03ee3be7cec0c4d6e86179 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 26 May 2009 01:05:57 +0000 Subject: [PATCH] Added awareness for running with a non-native ABI (hybrid build). In this case we test for a respective subdirectory for any translators path added and use that instead, if existing. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30859 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/translation/TranslatorRoster.cpp | 30 ++++++++++++++++++- .../translation/TranslatorRosterPrivate.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/kits/translation/TranslatorRoster.cpp b/src/kits/translation/TranslatorRoster.cpp index fffc510102..6236989319 100644 --- a/src/kits/translation/TranslatorRoster.cpp +++ b/src/kits/translation/TranslatorRoster.cpp @@ -126,6 +126,7 @@ BTranslatorRoster::Private::Private() : BHandler("translator roster"), BLocker("translator list"), + fABISubDirectory(NULL), fNextID(1), fLazyScanning(true), fSafeMode(false) @@ -149,6 +150,23 @@ BTranslatorRoster::Private::Private() fSafeMode = true; } + // We might run in compatibility mode on a system with a different ABI. The + // translators matching our ABI can usually be found in respective + // subdirectories of the translator directories. + system_info info; + if (get_system_info(&info) == B_OK + && (info.abi & B_HAIKU_ABI_MAJOR) + != (B_HAIKU_ABI & B_HAIKU_ABI_MAJOR)) { + switch (B_HAIKU_ABI & B_HAIKU_ABI_MAJOR) { + case B_HAIKU_ABI_GCC_2: + fABISubDirectory = "gcc2"; + break; + case B_HAIKU_ABI_GCC_4: + fABISubDirectory = "gcc4"; + break; + } + } + // we're sneaking us into the BApplication if (be_app != NULL && be_app->Lock()) { be_app->AddHandler(this); @@ -387,9 +405,19 @@ BTranslatorRoster::Private::AddPath(const char* path, int32* _added) { BDirectory directory(path); status_t status = directory.InitCheck(); - if (status < B_OK) + if (status != B_OK) return status; + // if a subdirectory for our ABI exists, use that instead + if (fABISubDirectory != NULL) { + BEntry entry(&directory, fABISubDirectory); + if (entry.IsDirectory()) { + status = directory.SetTo(&entry); + if (status != B_OK) + return status; + } + } + node_ref nodeRef; status = directory.GetNodeRef(&nodeRef); if (status < B_OK) diff --git a/src/kits/translation/TranslatorRosterPrivate.h b/src/kits/translation/TranslatorRosterPrivate.h index e078f191ce..dac2c01ef1 100644 --- a/src/kits/translation/TranslatorRosterPrivate.h +++ b/src/kits/translation/TranslatorRosterPrivate.h @@ -112,6 +112,7 @@ private: TranslatorMap fTranslators; MessengerList fMessengers; EntryRefSet fRescanEntries; + const char* fABISubDirectory; int32 fNextID; bool fLazyScanning; bool fSafeMode;