From a689e076c376b803c55a6f5ba17c62fe56daa5cb Mon Sep 17 00:00:00 2001 From: Matthew Wilber Date: Sun, 24 Oct 2004 19:42:05 +0000 Subject: [PATCH] "Fixed" BTranslatorRoster so that it no longer stores the list of translators backwards. This is the order that applications assume, so this must be done to prevent inconsistent behavior between the R5 translation kit and the Haiku version. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9490 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/translation/TranslatorRoster.h | 7 +++++-- src/kits/translation/TranslatorRoster.cpp | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/headers/os/translation/TranslatorRoster.h b/headers/os/translation/TranslatorRoster.h index 8e983e77bb..900fe3f54d 100644 --- a/headers/os/translation/TranslatorRoster.h +++ b/headers/os/translation/TranslatorRoster.h @@ -218,14 +218,17 @@ private: static BTranslatorRoster *fspDefaultTranslators; // object that contains the default translators + + // list of translators maintained by this object translator_node *fpTranslators; - // list of translators maintained by this object + translator_node *fpLastTranslator; + sem_id fSem; // semaphore used to lock this object // used to maintain binary combatibility with // past and future versions of this object - int32 fUnused[5]; + int32 fUnused[4]; virtual void ReservedTranslatorRoster1(); virtual void ReservedTranslatorRoster2(); virtual void ReservedTranslatorRoster3(); diff --git a/src/kits/translation/TranslatorRoster.cpp b/src/kits/translation/TranslatorRoster.cpp index 52b9fe1274..746596ea34 100644 --- a/src/kits/translation/TranslatorRoster.cpp +++ b/src/kits/translation/TranslatorRoster.cpp @@ -157,7 +157,7 @@ BTranslatorRoster::BTranslatorRoster(BMessage *model) : BArchivable() // --------------------------------------------------------------- void BTranslatorRoster::Initialize() { - fpTranslators = NULL; + fpTranslators = fpLastTranslator = NULL; fSem = create_sem(1, "BTranslatorRoster Lock"); } @@ -212,7 +212,7 @@ BTranslatorRoster::~BTranslatorRoster() delete pDelTranNode; } - fpTranslators = NULL; + fpTranslators = fpLastTranslator = NULL; } delete_sem(fSem); @@ -823,12 +823,11 @@ BTranslatorRoster::GetAllTranslators( translator_node *pTranNode = NULL; for (pTranNode = fpTranslators; pTranNode; pTranNode = pTranNode->next) (*outCount)++; - // because translators are stored in the list backwards, - // populate the outList backwards to produce the original order + // populate the outList *outList = new translator_id[*outCount]; - int32 i = (*outCount) - 1; + int32 i = 0; for (pTranNode = fpTranslators; pTranNode; pTranNode = pTranNode->next) - (*outList)[i--] = pTranNode->id; + (*outList)[i++] = pTranNode->id; result = B_NO_ERROR; release_sem(fSem); @@ -1606,15 +1605,20 @@ BTranslatorRoster::AddTranslatorToList(BTranslator *translator, pTranNode->translator = translator; if (fpTranslators) - pTranNode->id = fpTranslators->id + 1; + pTranNode->id = fpLastTranslator->id + 1; else pTranNode->id = 1; pTranNode->path = new char[strlen(path) + 1]; strcpy(pTranNode->path, path); pTranNode->image = image; - pTranNode->next = fpTranslators; - fpTranslators = pTranNode; + pTranNode->next = NULL; + if (!fpTranslators) + fpTranslators = fpLastTranslator = pTranNode; + else { + fpLastTranslator->next = pTranNode; + fpLastTranslator = pTranNode; + } return B_OK; }