Add app filename localization catalog entry support to BAppFileInfo, registrar and mimeset. Need help to understand why the build-version of UpdateMimeInfoThread.cpp does not compile with the added code, currently commented out. Sorry about the arbitrary B_MIME_TYPE_LENGTH*3. Advice and review welcome.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40858 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström
2011-03-07 15:14:46 +00:00
parent b70b735dca
commit 82e7ef6709
6 changed files with 183 additions and 0 deletions
+3
View File
@@ -58,6 +58,9 @@ public:
status_t GetSignature(char *signature) const;
status_t SetSignature(const char *signature);
status_t GetCatalogEntry(char *catalogEntry) const;
status_t SetCatalogEntry(const char *catalogEntry);
status_t GetAppFlags(uint32 *flags) const;
status_t SetAppFlags(uint32 flags);
+3
View File
@@ -64,6 +64,9 @@ class BAppFileInfo: public BNodeInfo {
status_t GetSignature(char *signature) const;
status_t SetSignature(const char *signature);
status_t GetCatalogEntry(char *catalogEntry) const;
status_t SetCatalogEntry(const char *catalogEntry);
status_t GetAppFlags(uint32 *flags) const;
status_t SetAppFlags(uint32 flags);
+77
View File
@@ -32,6 +32,7 @@ static const char *kVersionInfoAttribute = "BEOS:APP_VERSION";
static const char *kMiniIconAttribute = "BEOS:M:";
static const char *kLargeIconAttribute = "BEOS:L:";
static const char *kStandardIconType = "STD_ICON";
static const char *kCatalogEntryAttribute = "SYS:NAME";
// resource IDs
static const int32 kTypeResourceID = 2;
@@ -43,6 +44,7 @@ static const int32 kLargeIconResourceID = 101;
static const int32 kVersionInfoResourceID = 1;
static const int32 kMiniIconForTypeResourceID = 0;
static const int32 kLargeIconForTypeResourceID = 0;
static const int32 kCatalogEntryResourceID = 1;
// type codes
enum {
@@ -308,6 +310,81 @@ BAppFileInfo::SetSignature(const char *signature)
return error;
}
// GetCatalogEntry
/*! \brief Gets the file's catalog entry. (localization)
\param catalogEntry A pointer to a pre-allocated character buffer of size
\c B_MIME_TYPE_LENGTH * 3 or larger into which the catalog entry
of the file shall be written.
\return
- \c B_OK: Everything went fine.
- \c B_NO_INIT: The object is not properly initialized.
- \c B_BAD_VALUE: \c NULL \a catalogEntry or the entry stored in the
attribute/resources is longer than \c B_MIME_TYPE_LENGTH * 3.
- \c B_BAD_TYPE: The attribute/resources the entry is stored in have
the wrong type.
- \c B_ENTRY_NOT_FOUND: No catalog entry is set on the file.
- other error codes
*/
status_t
BAppFileInfo::GetCatalogEntry(char *catalogEntry) const
{
if (catalogEntry == NULL)
return B_BAD_VALUE;
if (InitCheck() != B_OK)
return B_NO_INIT;
size_t read = 0;
status_t error = _ReadData(kCatalogEntryAttribute, kCatalogEntryResourceID,
B_STRING_TYPE, catalogEntry, B_MIME_TYPE_LENGTH * 3, read);
if (error != B_OK)
return error;
if (read >= B_MIME_TYPE_LENGTH * 3)
return B_ERROR;
catalogEntry[read] = '\0';
return B_OK;
}
// SetCatalogEntry
/*! \brief Sets the file's catalog entry. (localization)
If \a catalogEntry is \c NULL the file's catalog entry is unset.
\param catalogEntry The catalog entry to be assigned to the file.
Of the form "x-vnd.Haiku-app:context:name".
Must not be longer than \c B_MIME_TYPE_LENGTH * 3
(including the terminating null). May be \c NULL.
\return
- \c B_OK: Everything went fine.
- \c B_NO_INIT: The object is not properly initialized.
- \c B_BAD_VALUE: \a catalogEntry is longer than \c B_MIME_TYPE_LENGTH * 3.
- other error codes
*/
status_t
BAppFileInfo::SetCatalogEntry(const char *catalogEntry)
{
if (InitCheck() != B_OK)
return B_NO_INIT;
if (catalogEntry == NULL)
return _RemoveData(kCatalogEntryAttribute, B_STRING_TYPE);
size_t nameLength = strlen(catalogEntry);
if (nameLength > B_MIME_TYPE_LENGTH * 3)
return B_BAD_VALUE;
return _WriteData(kCatalogEntryAttribute, kCatalogEntryResourceID,
B_STRING_TYPE, catalogEntry, nameLength + 1);
}
// GetAppFlags
/*! \brief Gets the file's application flags.
@@ -269,6 +269,19 @@ UpdateMimeInfoThread::DoMimeUpdate(const entry_ref *entry, bool *entryIsDir)
if (err != B_OK)
return err;
/* TODO: figure out why this doesn't compile here
when the same code works in src/servers/registrar/mime
// catalog entry
char catalogEntry[B_MIME_TYPE_LENGTH * 3];
err = appFileInfoRead.GetCatalogEntry(catalogEntry);
if (err == B_OK)
err = appFileInfoWrite.SetCatalogEntry(catalogEntry);
else if (err == B_ENTRY_NOT_FOUND)
err = appFileInfoWrite.SetCatalogEntry(NULL);
if (err != B_OK)
return err;
*/
// app flags
uint32 appFlags;
err = appFileInfoRead.GetAppFlags(&appFlags);
+77
View File
@@ -36,6 +36,7 @@ static const char *kLargeIconAttribute = "BEOS:L:";
static const char *kIconAttribute = "BEOS:";
static const char *kStandardIconType = "STD_ICON";
static const char *kIconType = "ICON";
static const char *kCatalogEntryAttribute = "SYS:NAME";
// resource IDs
static const int32 kTypeResourceID = 2;
@@ -49,6 +50,7 @@ static const int32 kVersionInfoResourceID = 1;
static const int32 kMiniIconForTypeResourceID = 0;
static const int32 kLargeIconForTypeResourceID = 0;
static const int32 kIconForTypeResourceID = 0;
static const int32 kCatalogEntryResourceID = 1;
// type codes
enum {
@@ -328,6 +330,81 @@ BAppFileInfo::SetSignature(const char *signature)
return error;
}
// GetCatalogEntry
/*! \brief Gets the file's catalog entry. (localization)
\param catalogEntry A pointer to a pre-allocated character buffer of size
\c B_MIME_TYPE_LENGTH * 3 or larger into which the catalog entry
of the file shall be written.
\return
- \c B_OK: Everything went fine.
- \c B_NO_INIT: The object is not properly initialized.
- \c B_BAD_VALUE: \c NULL \a catalogEntry or the entry stored in the
attribute/resources is longer than \c B_MIME_TYPE_LENGTH * 3.
- \c B_BAD_TYPE: The attribute/resources the entry is stored in have
the wrong type.
- \c B_ENTRY_NOT_FOUND: No catalog entry is set on the file.
- other error codes
*/
status_t
BAppFileInfo::GetCatalogEntry(char *catalogEntry) const
{
if (catalogEntry == NULL)
return B_BAD_VALUE;
if (InitCheck() != B_OK)
return B_NO_INIT;
size_t read = 0;
status_t error = _ReadData(kCatalogEntryAttribute, kCatalogEntryResourceID,
B_STRING_TYPE, catalogEntry, B_MIME_TYPE_LENGTH * 3, read);
if (error != B_OK)
return error;
if (read >= B_MIME_TYPE_LENGTH * 3)
return B_ERROR;
catalogEntry[read] = '\0';
return B_OK;
}
// SetCatalogEntry
/*! \brief Sets the file's catalog entry. (localization)
If \a catalogEntry is \c NULL the file's catalog entry is unset.
\param catalogEntry The catalog entry to be assigned to the file.
Of the form "x-vnd.Haiku-app:context:name".
Must not be longer than \c B_MIME_TYPE_LENGTH * 3
(including the terminating null). May be \c NULL.
\return
- \c B_OK: Everything went fine.
- \c B_NO_INIT: The object is not properly initialized.
- \c B_BAD_VALUE: \a catalogEntry is longer than \c B_MIME_TYPE_LENGTH * 3.
- other error codes
*/
status_t
BAppFileInfo::SetCatalogEntry(const char *catalogEntry)
{
if (InitCheck() != B_OK)
return B_NO_INIT;
if (catalogEntry == NULL)
return _RemoveData(kCatalogEntryAttribute, B_STRING_TYPE);
size_t nameLength = strlen(catalogEntry);
if (nameLength > B_MIME_TYPE_LENGTH * 3)
return B_BAD_VALUE;
return _WriteData(kCatalogEntryAttribute, kCatalogEntryResourceID,
B_STRING_TYPE, catalogEntry, nameLength + 1);
}
// GetAppFlags
/*! \brief Gets the file's application flags.
@@ -149,6 +149,16 @@ UpdateMimeInfoThread::DoMimeUpdate(const entry_ref *entry, bool *entryIsDir)
if (err != B_OK)
return err;
// catalog entry
char catalogEntry[B_MIME_TYPE_LENGTH * 3];
err = appFileInfoRead.GetCatalogEntry(catalogEntry);
if (err == B_OK)
err = appFileInfoWrite.SetCatalogEntry(catalogEntry);
else if (err == B_ENTRY_NOT_FOUND)
err = appFileInfoWrite.SetCatalogEntry(NULL);
if (err != B_OK)
return err;
// app flags
uint32 appFlags;
err = appFileInfoRead.GetAppFlags(&appFlags);