From 6e1c9c648a431226d248b7163afd18ae0fdd6273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 27 Apr 2010 17:51:11 +0000 Subject: [PATCH] Adjusted the resolving algorithm such that when the preferred handler of the super type is among the handlers with direct support for the sub-type, that this handler is at the beginning of the list of fall-back handlers. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36507 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/app/Roster.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/kits/app/Roster.cpp b/src/kits/app/Roster.cpp index aeea462246..d5071adc87 100644 --- a/src/kits/app/Roster.cpp +++ b/src/kits/app/Roster.cpp @@ -2614,6 +2614,7 @@ BRoster::_TranslateType(const char* mimeType, BMimeType* appMeta, // applications for the sub and the super type respectively. const char* kSigField = "applications"; BMessage signatures; + bool addedSecondarySignature = false; if (error == B_OK) { if (primarySignature[0] != '\0') error = signatures.AddString(kSigField, primarySignature); @@ -2624,8 +2625,10 @@ BRoster::_TranslateType(const char* mimeType, BMimeType* appMeta, // we fall-back to non-preferred but supporting apps only in the // case when there is a preferred handler for the sub-type but // it cannot be resolved (misconfiguration). - if (secondarySignature[0] != '\0') + if (secondarySignature[0] != '\0') { error = signatures.AddString(kSigField, secondarySignature); + addedSecondarySignature = true; + } } } @@ -2635,30 +2638,48 @@ BRoster::_TranslateType(const char* mimeType, BMimeType* appMeta, int32 subCount; if (supportingSignatures.FindInt32("be:sub", &subCount) != B_OK) subCount = 0; - // Add all signatures with direct support for the sub-type + // Add all signatures with direct support for the sub-type. const char* supportingType; + if (!addedSecondarySignature) { + // Try to add the secondarySignature in front of all other + // supporting apps, if we find it among those. + for (int32 i = 0; error == B_OK && i < subCount + && supportingSignatures.FindString(kSigField, i, + &supportingType) == B_OK; i++) { + if (strcmp(primarySignature, supportingType) != 0 + && strcmp(secondarySignature, supportingType) == 0) { + error = signatures.AddString(kSigField, supportingType); + addedSecondarySignature = true; + break; + } + } + } for (int32 i = 0; error == B_OK && i < subCount && supportingSignatures.FindString(kSigField, i, &supportingType) == B_OK; i++) { - // don't add the signature if it's the preferred app already. - if (strcmp(primarySignature, supportingType) != 0) + if (strcmp(primarySignature, supportingType) != 0 + && strcmp(secondarySignature, supportingType) != 0) { error = signatures.AddString(kSigField, supportingType); + } } // Add the preferred type of the super type here before adding // the other types supporting the super type, but only if we have // not already added it in case there was no preferred app for the // sub-type configured. - if (error == B_OK && primarySignature[0] != '\0' + if (error == B_OK && !addedSecondarySignature && secondarySignature[0] != '\0') { error = signatures.AddString(kSigField, secondarySignature); } - // Add all signatures with support for the super-type + // Add all signatures with support for the super-type. for (int32 i = subCount; error == B_OK && supportingSignatures.FindString(kSigField, i, &supportingType) == B_OK; i++) { - // don't add the signature if it's the preferred app already. - if (strcmp(secondarySignature, supportingType) != 0) + // Don't add the signature if it's one of the preferred apps + // already. + if (strcmp(primarySignature, supportingType) != 0 + && strcmp(secondarySignature, supportingType) != 0) { error = signatures.AddString(kSigField, supportingType); + } } } else { // Failed to get supporting apps, just add the preferred apps.