Storage Kit: Source clean up to SupportingApps.

Remove extraneous comments, early-return on error (and thus de-indent.)
No functional change intended.
This commit is contained in:
Augustin Cavalier 2024-01-26 18:09:33 -05:00
parent 94d33dcbb6
commit 89fcf815e6

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2006, Haiku. * Copyright 2002-2024, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@ -35,13 +35,13 @@ namespace BPrivate {
namespace Storage { namespace Storage {
namespace Mime { namespace Mime {
/*! /*!
\class SupportingApps \class SupportingApps
\brief Supporting apps information for the entire database \brief Supporting apps information for the entire MIME database
*/ */
// Constructor
//! Constructs a new SupportingApps object
SupportingApps::SupportingApps(DatabaseLocation* databaseLocation) SupportingApps::SupportingApps(DatabaseLocation* databaseLocation)
: :
fDatabaseLocation(databaseLocation), fDatabaseLocation(databaseLocation),
@ -49,13 +49,12 @@ SupportingApps::SupportingApps(DatabaseLocation* databaseLocation)
{ {
} }
// Destructor
//! Destroys the SupportingApps object
SupportingApps::~SupportingApps() SupportingApps::~SupportingApps()
{ {
} }
// GetSupportingApps
/*! \brief Returns a list of signatures of supporting applications for the /*! \brief Returns a list of signatures of supporting applications for the
given type in the pre-allocated \c BMessage pointed to by \c apps. given type in the pre-allocated \c BMessage pointed to by \c apps.
@ -64,66 +63,71 @@ SupportingApps::~SupportingApps()
status_t status_t
SupportingApps::GetSupportingApps(const char *type, BMessage *apps) SupportingApps::GetSupportingApps(const char *type, BMessage *apps)
{ {
status_t err = type && apps ? B_OK : B_BAD_VALUE; if (type == NULL || apps == NULL)
return B_BAD_VALUE;
// See if we need to do our initial build still // See if we need to do our initial build still
if (!err && !fHaveDoneFullBuild) if (!fHaveDoneFullBuild) {
err = BuildSupportingAppsTable(); status_t status = BuildSupportingAppsTable();
if (status != B_OK)
return status;
}
if (!err) { // Clear the message, as we're just going to add to it
// Clear the message, as we're just going to add to it apps->MakeEmpty();
apps->MakeEmpty();
BMimeType mime(type); BMimeType mime(type);
err = mime.InitCheck(); status_t status = mime.InitCheck();
if (!err) { if (status != B_OK)
if (mime.IsSupertypeOnly()) { return status;
// Add the apps that support this supertype (plus their count)
std::set<std::string> &superApps = fSupportingApps[type]; if (mime.IsSupertypeOnly()) {
int32 count = 0; // Add the apps that support this supertype (plus their count)
std::set<std::string>::const_iterator i; std::set<std::string> &superApps = fSupportingApps[type];
for (i = superApps.begin(); i != superApps.end() && !err; i++) { int32 count = 0;
err = apps->AddString(kApplicationsField, (*i).c_str()); std::set<std::string>::const_iterator i;
for (i = superApps.begin(); i != superApps.end() && status == B_OK; i++) {
status = apps->AddString(kApplicationsField, (*i).c_str());
count++;
}
if (status == B_OK)
status = apps->AddInt32(kSupportingAppsSuperCountField, count);
} else {
// Add the apps that support this subtype (plus their count)
std::set<std::string> &subApps = fSupportingApps[type];
int32 count = 0;
std::set<std::string>::const_iterator i;
for (i = subApps.begin(); i != subApps.end() && status == B_OK; i++) {
status = apps->AddString(kApplicationsField, (*i).c_str());
count++;
}
if (status == B_OK)
status = apps->AddInt32(kSupportingAppsSubCountField, count);
// Now add any apps that support the supertype, but not the
// subtype (plus their count).
BMimeType superMime;
status = mime.GetSupertype(&superMime);
if (status == B_OK)
status = superMime.InitCheck();
if (status == B_OK) {
std::set<std::string> &superApps = fSupportingApps[superMime.Type()];
count = 0;
for (i = superApps.begin(); i != superApps.end() && status == B_OK; i++) {
if (subApps.find(*i) == subApps.end()) {
status = apps->AddString(kApplicationsField, (*i).c_str());
count++; count++;
} }
if (!err)
err = apps->AddInt32(kSupportingAppsSuperCountField, count);
} else {
// Add the apps that support this subtype (plus their count)
std::set<std::string> &subApps = fSupportingApps[type];
int32 count = 0;
std::set<std::string>::const_iterator i;
for (i = subApps.begin(); i != subApps.end() && !err; i++) {
err = apps->AddString(kApplicationsField, (*i).c_str());
count++;
}
if (!err)
err = apps->AddInt32(kSupportingAppsSubCountField, count);
// Now add any apps that support the supertype, but not the
// subtype (plus their count).
BMimeType superMime;
err = mime.GetSupertype(&superMime);
if (!err)
err = superMime.InitCheck();
if (!err) {
std::set<std::string> &superApps = fSupportingApps[superMime.Type()];
count = 0;
for (i = superApps.begin(); i != superApps.end() && !err; i++) {
if (subApps.find(*i) == subApps.end()) {
err = apps->AddString(kApplicationsField, (*i).c_str());
count++;
}
}
if (!err)
err = apps->AddInt32(kSupportingAppsSuperCountField, count);
}
} }
if (status == B_OK)
status = apps->AddInt32(kSupportingAppsSuperCountField, count);
} }
} }
return err;
return status;
} }
// SetSupportedTypes
/*! \brief Sets the list of supported types for the given application and /*! \brief Sets the list of supported types for the given application and
updates the supporting apps mappings. updates the supporting apps mappings.
@ -156,52 +160,53 @@ SupportingApps::GetSupportingApps(const char *type, BMessage *apps)
status_t status_t
SupportingApps::SetSupportedTypes(const char *app, const BMessage *types, bool fullSync) SupportingApps::SetSupportedTypes(const char *app, const BMessage *types, bool fullSync)
{ {
status_t err = app && types ? B_OK : B_BAD_VALUE; if (app == NULL || types == NULL)
return B_BAD_VALUE;
if (!fHaveDoneFullBuild) if (!fHaveDoneFullBuild)
return err; return B_OK;
std::set<std::string> oldTypes; std::set<std::string> oldTypes;
std::set<std::string> &newTypes = fSupportedTypes[app]; std::set<std::string> &newTypes = fSupportedTypes[app];
std::set<std::string> &strandedTypes = fStrandedTypes[app]; std::set<std::string> &strandedTypes = fStrandedTypes[app];
// Make a copy of the previous types if we're doing a full sync // Make a copy of the previous types if we're doing a full sync
if (!err) { oldTypes = newTypes;
oldTypes = newTypes;
// Read through the list of new supported types, creating the new // Read through the list of new supported types, creating the new
// supported types list and adding the app as a supporting app for // supported types list and adding the app as a supporting app for
// each type. // each type.
newTypes.clear(); newTypes.clear();
const char *type; const char *type;
for (int32 i = 0; types->FindString(kTypesField, i, &type) == B_OK; for (int32 i = 0; types->FindString(kTypesField, i, &type) == B_OK; i++) {
i++) { newTypes.insert(type);
newTypes.insert(type); AddSupportingApp(type, app);
AddSupportingApp(type, app);
}
// Update the list of stranded types by removing any types that are newly
// re-supported and adding any types that are newly un-supported
for (std::set<std::string>::const_iterator i = newTypes.begin();
i != newTypes.end(); i++) {
strandedTypes.erase(*i);
}
for (std::set<std::string>::const_iterator i = oldTypes.begin();
i != oldTypes.end(); i++) {
if (newTypes.find(*i) == newTypes.end())
strandedTypes.insert(*i);
}
// Now, if we're doing a full sync, remove the app as a supporting
// app for any of its stranded types and then clear said list of
// stranded types.
if (fullSync) {
for (std::set<std::string>::const_iterator i = strandedTypes.begin();
i != strandedTypes.end(); i++) {
RemoveSupportingApp((*i).c_str(), app);
}
strandedTypes.clear();
}
} }
return err;
// Update the list of stranded types by removing any types that are newly
// re-supported and adding any types that are newly un-supported
for (std::set<std::string>::const_iterator i = newTypes.begin();
i != newTypes.end(); i++) {
strandedTypes.erase(*i);
}
for (std::set<std::string>::const_iterator i = oldTypes.begin();
i != oldTypes.end(); i++) {
if (newTypes.find(*i) == newTypes.end())
strandedTypes.insert(*i);
}
// Now, if we're doing a full sync, remove the app as a supporting
// app for any of its stranded types and then clear said list of
// stranded types.
if (fullSync) {
for (std::set<std::string>::const_iterator i = strandedTypes.begin();
i != strandedTypes.end(); i++) {
RemoveSupportingApp((*i).c_str(), app);
}
strandedTypes.clear();
}
return B_OK;
} }
@ -217,7 +222,7 @@ SupportingApps::DeleteSupportedTypes(const char *app, bool fullSync)
return SetSupportedTypes(app, &types, fullSync); return SetSupportedTypes(app, &types, fullSync);
} }
// AddSupportingApp
/*! \brief Adds the given application signature to the set of supporting /*! \brief Adds the given application signature to the set of supporting
apps for the given type. apps for the given type.
@ -230,13 +235,14 @@ SupportingApps::DeleteSupportedTypes(const char *app, bool fullSync)
status_t status_t
SupportingApps::AddSupportingApp(const char *type, const char *app) SupportingApps::AddSupportingApp(const char *type, const char *app)
{ {
status_t err = type && app ? B_OK : B_BAD_VALUE; if (type == NULL || app == NULL)
if (!err) return B_BAD_VALUE;
fSupportingApps[type].insert(app);
return err; fSupportingApps[type].insert(app);
return B_OK;
} }
// RemoveSupportingApp
/*! \brief Removes the given application signature from the set of supporting /*! \brief Removes the given application signature from the set of supporting
apps for the given type. apps for the given type.
@ -249,13 +255,14 @@ SupportingApps::AddSupportingApp(const char *type, const char *app)
status_t status_t
SupportingApps::RemoveSupportingApp(const char *type, const char *app) SupportingApps::RemoveSupportingApp(const char *type, const char *app)
{ {
status_t err = type && app ? B_OK : B_BAD_VALUE; if (type == NULL || app == NULL)
if (!err) return B_BAD_VALUE;
fSupportingApps[type].erase(app);
return err; fSupportingApps[type].erase(app);
return B_OK;
} }
// BuildSupportingAppsTable
/*! \brief Crawls the mime database and builds a list of supporting application /*! \brief Crawls the mime database and builds a list of supporting application
signatures for every supported type. signatures for every supported type.
*/ */
@ -268,42 +275,42 @@ SupportingApps::BuildSupportingAppsTable()
DatabaseDirectory dir; DatabaseDirectory dir;
status_t status = dir.Init(fDatabaseLocation, "application"); status_t status = dir.Init(fDatabaseLocation, "application");
if (status != B_OK)
return status;
// Build the supporting apps table based on the mime database // Build the supporting apps table based on the mime database
if (status == B_OK) { dir.Rewind();
dir.Rewind();
// Handle each application type // Handle each application type
while (true) { while (true) {
entry_ref ref; entry_ref ref;
status = dir.GetNextRef(&ref); status = dir.GetNextRef(&ref);
if (status < B_OK) { if (status < B_OK) {
// If we've come to the end of list, it's not an error // If we've come to the end of list, it's not an error
if (status == B_ENTRY_NOT_FOUND) if (status == B_ENTRY_NOT_FOUND)
status = B_OK; status = B_OK;
break; break;
} }
// read application signature from file // read application signature from file
BString appSignature; BString appSignature;
BNode node(&ref); BNode node(&ref);
if (node.InitCheck() == B_OK && node.ReadAttrString(kTypeAttr, if (node.InitCheck() == B_OK && node.ReadAttrString(kTypeAttr,
&appSignature) >= B_OK) { &appSignature) >= B_OK) {
// Read in the list of supported types // Read in the list of supported types
BMessage msg; BMessage msg;
if (fDatabaseLocation->ReadMessageAttribute(appSignature, if (fDatabaseLocation->ReadMessageAttribute(appSignature,
kSupportedTypesAttr, msg) == B_OK) { kSupportedTypesAttr, msg) == B_OK) {
// Iterate through the supported types, adding them to the list of // Iterate through the supported types, adding them to the list of
// supported types for the application and adding the application's // supported types for the application and adding the application's
// signature to the list of supporting apps for each type // signature to the list of supporting apps for each type
BString type; BString type;
std::set<std::string> &supportedTypes = fSupportedTypes[appSignature.String()]; std::set<std::string> &supportedTypes = fSupportedTypes[appSignature.String()];
for (int i = 0; msg.FindString(kTypesField, i, &type) == B_OK; i++) { for (int i = 0; msg.FindString(kTypesField, i, &type) == B_OK; i++) {
type.ToLower(); type.ToLower();
// MIME types are case insensitive, so we lowercase everything // MIME types are case insensitive, so we lowercase everything
supportedTypes.insert(type.String()); supportedTypes.insert(type.String());
AddSupportingApp(type.String(), appSignature.String()); AddSupportingApp(type.String(), appSignature.String());
}
} }
} }
} }
@ -317,7 +324,7 @@ SupportingApps::BuildSupportingAppsTable()
return status; return status;
} }
} // namespace Mime } // namespace Mime
} // namespace Storage } // namespace Storage
} // namespace BPrivate } // namespace BPrivate