diff --git a/headers/private/storage/mime/UpdateMimeInfoThread.h b/headers/private/storage/mime/UpdateMimeInfoThread.h new file mode 100644 index 0000000000..6bae0b2624 --- /dev/null +++ b/headers/private/storage/mime/UpdateMimeInfoThread.h @@ -0,0 +1,30 @@ +//---------------------------------------------------------------------- +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +//--------------------------------------------------------------------- +/*! + \file UpdateMimeInfoThread.h + UpdateMimeInfoThread interface declaration +*/ + +#ifndef _MIME_UPDATE_MIME_INFO_THREAD_H +#define _MIME_UPDATE_MIME_INFO_THREAD_H + +#include + +namespace BPrivate { +namespace Storage { +namespace Mime { + +class UpdateMimeInfoThread : public MimeUpdateThread { +public: + UpdateMimeInfoThread(const char *name, int32 priority, BMessenger managerMessenger, + const entry_ref *root, bool recursive, bool force, BMessage *replyee); + status_t DoMimeUpdate(const entry_ref *entry, bool *entryIsDir); +}; + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate + +#endif // _MIME_UPDATE_MIME_INFO_THREAD_H diff --git a/src/kits/storage/mime/UpdateMimeInfoThread.cpp b/src/kits/storage/mime/UpdateMimeInfoThread.cpp new file mode 100644 index 0000000000..e9592fb954 --- /dev/null +++ b/src/kits/storage/mime/UpdateMimeInfoThread.cpp @@ -0,0 +1,73 @@ +//---------------------------------------------------------------------- +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +//--------------------------------------------------------------------- +/*! + \file UpdateMimeInfoThread.h + UpdateMimeInfoThread implementation +*/ + +#include "mime/UpdateMimeInfoThread.h" + +#include +#include +#include +#include + +namespace BPrivate { +namespace Storage { +namespace Mime { + +// constructor +//! Creates a new UpdateMimeInfoThread object +UpdateMimeInfoThread::UpdateMimeInfoThread(const char *name, int32 priority, + BMessenger managerMessenger, const entry_ref *root, bool recursive, bool force, BMessage *replyee) + : MimeUpdateThread(name, priority, managerMessenger, root, recursive, force, replyee) +{ +} + +// DoMimeUpdate +/*! \brief Performs an update_mime_info() update on the given entry + + If the entry has no \c BEOS:TYPE attribute, or if \c fForce is true, the + entry is sniffed and its \c BEOS:TYPE attribute is set accordingly. +*/ +status_t +UpdateMimeInfoThread::DoMimeUpdate(const entry_ref *entry, bool *entryIsDir) +{ + status_t err = entry ? B_OK : B_BAD_VALUE; + bool doUpdate = true; + BNode node; + + if (!err) + err = node.SetTo(entry); + if (!err && !fForce) { + // If not forced, only update if the entry has no file type attribute + attr_info info; + if (!err) + doUpdate = node.GetAttrInfo(kFileTypeAttr, &info) == B_ENTRY_NOT_FOUND; + } + if (!err && doUpdate) { + BMimeType type; + err = BMimeType::GuessMimeType(entry, &type); + if (!err) + err = type.InitCheck(); + if (!err) { + const char *typeStr = type.Type(); + ssize_t len = strlen(typeStr)+1; + ssize_t bytes = node.WriteAttr(kFileTypeAttr, kFileTypeType, 0, typeStr, len); + if (bytes < B_OK) + err = bytes; + else + err = (bytes != len ? B_FILE_ERROR : B_OK); + } + } + if (!err && entryIsDir) + *entryIsDir = node.IsDirectory(); + return err; +} + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate +