diff --git a/src/kits/tracker/Model.cpp b/src/kits/tracker/Model.cpp index 053753574d..745655f4f4 100644 --- a/src/kits/tracker/Model.cpp +++ b/src/kits/tracker/Model.cpp @@ -1281,7 +1281,24 @@ Model::Mimeset(bool force) opener.OpenNode(); AttrChanged(NULL); - return !oldType.ICompare(MimeType()); + return oldType.ICompare(MimeType()) != 0; +} + + +void +Model::SniffMimeIfNeeded() +{ + if (fMimeType != B_FILE_MIMETYPE) + return; + + BVolume volume(fStatBuf.st_dev); + if (volume.InitCheck() == B_OK && !volume.KnowsMime()) { + BMimeType mimeType; + if (BMimeType::GuessMimeType(&fEntryRef, &mimeType) == B_OK) + fMimeType = mimeType.Type(); + } + + return; } diff --git a/src/kits/tracker/Model.h b/src/kits/tracker/Model.h index cda33cfb1a..9b7b34f5b0 100644 --- a/src/kits/tracker/Model.h +++ b/src/kits/tracker/Model.h @@ -208,6 +208,9 @@ public: bool Mimeset(bool force); // returns true if mime type changed + void SniffMimeIfNeeded(); + // if the filesystem does not support MIME, sets fMimeType using the MIME sniffer; + // makes no attempt to write the file's MIME attribute bool HasLocalizedName() const; diff --git a/src/kits/tracker/OpenWithWindow.cpp b/src/kits/tracker/OpenWithWindow.cpp index 48464c065e..4c3f433f9a 100644 --- a/src/kits/tracker/OpenWithWindow.cpp +++ b/src/kits/tracker/OpenWithWindow.cpp @@ -617,6 +617,7 @@ AddOneRefSignatures(const entry_ref* ref, void* castToIterator) Model model(ref, true, true); if (model.InitCheck() != B_OK) return NULL; + model.SniffMimeIfNeeded(); BString mimeType(model.MimeType()); @@ -1586,6 +1587,7 @@ SearchForSignatureEntryList::Relation(const BMessage* entriesToOpen, Model model(&ref, true, true); if (model.InitCheck()) continue; + model.SniffMimeIfNeeded(); int32 result = Relation(&model, applicationModel); if (result != kNoRelation) { @@ -1626,6 +1628,7 @@ SearchForSignatureEntryList::RelationDescription(const BMessage* entriesToOpen, Model model(&ref, true, true); if (model.InitCheck()) continue; + model.SniffMimeIfNeeded(); BMimeType mimeType; int32 result = Relation(&model, applicationModel); diff --git a/src/kits/tracker/Tracker.cpp b/src/kits/tracker/Tracker.cpp index 7612a51d04..c11b1f9cd5 100644 --- a/src/kits/tracker/Tracker.cpp +++ b/src/kits/tracker/Tracker.cpp @@ -1171,6 +1171,7 @@ TTracker::OpenInfoWindows(BMessage* message) wind->Activate(); delete model; } else { + model->SniffMimeIfNeeded(); wind = new BInfoWindow(model, index, &fWindowList); wind->PostMessage(kRestoreState); }