RecentEntries class; handles recent documents and folders.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1796 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Tyler Dauwalder
2002-10-31 07:08:25 +00:00
parent 2cd1ec325f
commit 15a66e61ce
2 changed files with 319 additions and 0 deletions
+263
View File
@@ -0,0 +1,263 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: RecentEntries.cpp
// Author: Tyler Dauwalder ([email protected])
// Description: Recently launched apps list
//------------------------------------------------------------------------------
/*! \file RecentEntries.cpp
\brief RecentEntries class implementation
*/
#include "RecentEntries.h"
#include <AppFileInfo.h>
#include <Entry.h>
#include <File.h>
#include <Message.h>
#include <Mime.h>
#include <Roster.h>
#include <String.h>
#include <storage_support.h>
#include <new>
#include <stdio.h>
#include <string>
#define DBG(x) (x)
//#define DBG(x)
#define OUT printf
//------------------------------------------------------------------------------
// recent_entry
//------------------------------------------------------------------------------
/*! \brief An recent entry and the corresponding signature of the application
that launched/used/opened/viewed/whatevered it.
*/
struct recent_entry {
recent_entry(const entry_ref *ref, const char *appSig);
entry_ref ref;
std::string sig;
private:
recent_entry();
};
recent_entry::recent_entry(const entry_ref *ref, const char *appSig)
: ref(ref ? *ref : entry_ref())
, sig(appSig)
{
}
//------------------------------------------------------------------------------
// RecentEntries
//------------------------------------------------------------------------------
/*! \class RecentEntries
\brief Implements the common functionality used by the roster's recent
folders and recent documents lists.
*/
/*! \var std::list<std::string> RecentEntries::fEntryList
\brief The list of entries and their corresponding app sigs, most recent first
The signatures are expected to be stored all lowercase, as MIME
signatures are case-independent.
*/
// constructor
/*! \brief Creates a new list.
The list is initially empty.
*/
RecentEntries::RecentEntries()
{
}
// destructor
/*! \brief Frees all resources associated with the object.
*/
RecentEntries::~RecentEntries()
{
Clear();
}
// Add
/*! \brief Places the given entry Places the app with the given signature at the front of
the recent apps list.
If the app already exists elsewhere in the list, that item is
removed so only one instance exists in the list at any time.
\param appSig The application's signature
\param appFlags The application's flags. If \a appFlags contains
either \c B_ARGV_ONLY or \c B_BACKGROUND_APP, the
application is \b not added to the list (but \c B_OK
is still returned).
\return
- \c B_OK: success (even if the app was not added due to appFlags)
- error code: failure
*/
status_t
RecentEntries::Add(const entry_ref *ref, const char *appSig)
{
std::string sig;
status_t error = ref && appSig ? B_OK : B_BAD_VALUE;
if (!error) {
// Store all sigs as lowercase
sig = BPrivate::Storage::to_lower(appSig);
// Look for a previous instance of this entry
std::list<recent_entry*>::iterator item;
for (item = fEntryList.begin(); item != fEntryList.end(); item++) {
if ((*item)->ref == *ref && (*item)->sig == sig) {
fEntryList.erase(item);
break;
}
}
// Add this entry to the front of the list
recent_entry *entry = new(nothrow) recent_entry(ref, appSig);
error = entry ? B_OK : B_NO_MEMORY;
if (!error)
fEntryList.push_front(entry);
}
return error;
}
// Get
/*! \brief Returns the first \a maxCount recent apps in the \c BMessage
pointed to by \a list.
The message is cleared first, and \c entry_refs for the the apps are
stored in the \c "refs" field of the message (\c B_REF_TYPE).
If there are fewer than \a maxCount items in the list, the entire
list is returned.
Since BRoster::GetRecentEntries() returns \c void, the message pointed
to by \a list is simply cleared if maxCount is invalid (i.e. <= 0).
\param fileTypes An array of file type filters. These file types are
expected to be all lowercase.
*/
status_t
RecentEntries::Get(int32 maxCount, const char *fileTypes[], int32 fileTypesCount,
const char *appSig, BMessage *result)
{
status_t error = result && (fileTypesCount == 0 || (fileTypesCount > 0 && fileTypes))
? B_OK : B_BAD_VALUE;
if (!error) {
result->MakeEmpty();
std::list<recent_entry*>::iterator item;
int count = 0;
for (item = fEntryList.begin();
count < maxCount && item != fEntryList.end();
item++)
{
bool match = true;
// Filter if necessary
if (fileTypesCount > 0 || appSig) {
match = false;
// Filter by app sig
if (appSig)
match = (*item)->sig == appSig;
// Filter by file type
if (!match && fileTypesCount > 0) {
char type[B_MIME_TYPE_LENGTH];
if (GetTypeForRef(&(*item)->ref, type) == B_OK) {
for (int i = 0; i < fileTypesCount; i++) {
if (strcmp(type, fileTypes[i]) == 0) {
match = true;
break;
}
}
}
}
}
if (match) {
result->AddRef("refs", &(*item)->ref);
count++;
}
}
}
return error;
}
// Clear
/*! \brief Clears the list of recently launched apps
*/
status_t
RecentEntries::Clear()
{
std::list<recent_entry*>::iterator i;
for (i = fEntryList.begin(); i != fEntryList.end(); i++)
delete *i;
fEntryList.clear();
return B_OK;
}
// Print
/*! \brief Dumps the the current list of entries to stdout.
*/
status_t
RecentEntries::Print()
{
std::list<recent_entry*>::iterator item;
int counter = 1;
for (item = fEntryList.begin();
item != fEntryList.end();
item++)
{
printf("%d: device == '%ld', dir == '%lld', name == '%s', app == '%s'\n",
counter++, (*item)->ref.device, (*item)->ref.directory, (*item)->ref.name,
(*item)->sig.c_str());
}
}
// RecentEntries
/*! \brief Fetches the file type of the given file.
If the file has no type, an empty string is returned. The file
is *not* sniffed.
*/
status_t
RecentEntries::GetTypeForRef(const entry_ref *ref, char *result)
{
BNode node;
status_t error = ref && result ? B_OK : B_BAD_VALUE;
// Read the type and force to lowercase
if (!error)
error = node.SetTo(ref);
if (!error) {
ssize_t bytes = node.ReadAttr("BEOS:TYPE", B_MIME_STRING_TYPE,
0, result, B_MIME_TYPE_LENGTH-1);
if (bytes < 0)
error = bytes;
else
result[bytes] = '\0';
}
if (!error)
BPrivate::Storage::to_lower(result);
return error;
}
+56
View File
@@ -0,0 +1,56 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: RecentEntries.h
// Author: Tyler Dauwalder ([email protected])
// Description: Recently used entries list
//------------------------------------------------------------------------------
/*! \file RecentEntries.h
\brief RecentEntries class declarations
*/
#ifndef RECENT_ENTRIES_H
#define RECENT_ENTRIES_H
#include <SupportDefs.h>
#include <list>
struct entry_ref;
struct recent_entry;
class RecentEntries {
public:
RecentEntries();
~RecentEntries();
status_t Add(const entry_ref *ref, const char *appSig);
status_t Get(int32 maxCount, const char *fileTypes[], int32 fileTypesCount,
const char *appSig, BMessage *result);
status_t Clear();
status_t Print();
private:
static status_t GetTypeForRef(const entry_ref *ref, char *result);
std::list<recent_entry*> fEntryList;
};
#endif // RECENT_FOLDERS_H