/* * Copyright 2001-2014 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Axel Dörfler, axeld@pinc-software.de * John Scipione, jscipione@gmail.com * Ingo Weinhold, ingo_weinhold@gmx.de * * Corresponds to: * headers/os/app/Roster.h hrev47355 * src/kits/app/Roster.cpp hrev47355 */ /*! \file Roster.h \ingroup app \ingroup libbe \brief Provides the app_info struct, the BRoster class and the #be_roster global. */ /*! \def B_SINGLE_LAUNCH \brief Single launch. \since BeOS R3 */ /*! \def B_MULTIPLE_LAUNCH \brief Multiple launch. \since BeOS R3 */ /*! \def B_EXCLUSIVE_LAUNCH \brief Exclusive launch. \since BeOS R3 */ /*! \def B_LAUNCH_MASK \brief Bitwise and this with app_info::flags to get at the flags above. \since BeOS R3 */ /*! \def B_BACKGROUND_APP \brief Background app, won't appear in Deskbar. \since BeOS R3 */ /*! \def B_ARGV_ONLY \brief The application can't receive messages, information must be passed at launch through argv, typically from the command line. \since BeOS R3 */ /*! \def _B_APP_INFO_RESERVED1_ \brief Reserved for future use, do not use. */ /*! \var B_REQUEST_LAUNCHED \brief \c B_SOME_APP_LAUNCHED \since BeOS R3 */ /*! \var B_REQUEST_QUIT \brief \c B_SOME_APP_QUIT \since BeOS R3 */ /*! \var B_REQUEST_ACTIVATED \brief \c B_SOME_APP_ACTIVATED \since BeOS R3 */ /*! \struct app_info \ingroup app \ingroup libbe \brief Provides info for a running app. \since BeOS R3 */ /*! \fn app_info::app_info() \brief Creates an uninitialized app_info. \since BeOS R3 */ /*! \fn app_info::~app_info() \brief Does nothing. \since BeOS R3 */ /*! \var app_info::thread \brief The main thread id or -1 if the application isn't running. \since BeOS R3 */ /*! \var app_info::team \brief The team id or -1 if the application isn't running. \since BeOS R3 */ /*! \var app_info::port \brief The main thread port, or -1 if the application isn't running. \since BeOS R3 */ /*! \var app_info::flags \brief Mask of flags that determine the behavior of the application. \since BeOS R3 */ /*! \var app_info::ref \brief A file ref that was executed to run the application. \since BeOS R3 */ /*! \var app_info::signature[] \brief The signature that uniquely identifies the application. */ /*! \var be_roster \brief Represents the default BRoster. */ /*! \class BRoster \ingroup app \ingroup libbe \brief The BRoster class lets you launch apps and keeps track of apps that are running. The global #be_roster object represents the default BRoster, while the app_info structure provides info for a running app. \since BeOS R3 */ /*! \fn BRoster::BRoster() \brief Creates a new BRoster and sets up the connection to the roster service. You should not need to call this, use the #be_roster global instead. \since BeOS R3 */ /*! \fn BRoster::~BRoster() \brief Does nothing. \since BeOS R3 */ /*! \name Querying */ //! @{ /*! \fn bool BRoster::IsRunning(const char* signature) const \brief Returns whether or not an application with the supplied signature is currently running. \param signature The app \a signature. \return \c true, if the supplied \a signature is not \c NULL and an application with this \a signature is running, \c false otherwise. \since BeOS R3 */ /*! \fn bool BRoster::IsRunning(entry_ref* ref) const \brief Returns whether or not an application ran from an executable referred to by the supplied entry_ref is currently running. \param ref The app's entry_ref \return \c true, if the supplied entry_ref is not \c NULL and an application executing this file is running, \c false otherwise. \since BeOS R3 */ /*! \fn team_id BRoster::TeamFor(const char* signature) const \brief Returns the team ID of a currently running application with the supplied \a signature. \param signature The app \a signature. \return The team ID of a running application with the supplied \a signature. \retval B_BAD_VALUE \a signature is \c NULL. \retval B_ERROR No application with the supplied \a signature is currently running. \since BeOS R3 */ /*! \fn team_id BRoster::TeamFor(entry_ref* ref) const \brief Returns the team ID of a currently running application executing the executable referred to by the supplied entry_ref. \param ref The app's entry_ref \return The team ID of a running application executing the file referred to by \a ref. \retval B_BAD_VALUE \a ref is \c NULL. \retval B_ERROR No application executing the file referred to by \a ref is currently running. \since BeOS R3 */ /*! \fn void BRoster::GetAppList(BList* teamIDList) const \brief Returns a list of all currently running applications. The supplied list is not emptied before adding the team IDs of the running applications. The list elements are team_id's, not pointers. \param teamIDList A pointer to a pre-allocated BList to be filled with the team IDs. \since BeOS R3 */ /*! \fn void BRoster::GetAppList(const char* signature, BList* teamIDList) const \brief Returns a list of all currently running applications with the specified \a signature. The supplied list is not emptied before adding the team IDs of the running applications. The list elements are team_id's, not pointers. If \a sig is \c NULL or invalid, no team IDs are added to the list. \param signature The application \a signature. \param teamIDList A pointer to a pre-allocated BList to be filled with the team IDs. \since BeOS R3 */ /*! \fn status_t BRoster::GetAppInfo(const char* signature, app_info* info) const \brief Returns the app_info of a currently running application with the supplied \a signature. \param signature The application \a signature. \param info A pointer to a pre-allocated app_info structure to be filled by this method. \return A status code. \retval B_OK: Everything went fine. \retval B_BAD_VALUE \a sig is \c NULL. \retval B_ERROR No application with the supplied signature is currently running. \since BeOS R3 */ /*! \fn status_t BRoster::GetAppInfo(entry_ref* ref, app_info* info) const \brief Returns the app_info of a currently running application executing the executable referred to by the supplied entry_ref. \param ref The app's entry_ref \param info A pointer to a pre-allocated app_info structure to be filled in by this method. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \a ref is \c NULL. \retval B_ERROR No application executing the file referred to by \a ref was currently running. \since BeOS R3 */ /*! \fn status_t BRoster::GetRunningAppInfo(team_id team, app_info* info) const \brief Returns the app_info of a currently running application identified by the supplied team ID. \param team The app's team ID. \param info A pointer to a pre-allocated app_info structure to be filled in by this method. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \a info was \c NULL. \retval B_BAD_TEAM_ID \a team did not identify a running application. \since BeOS R3 */ /*! \fn status_t BRoster::GetActiveAppInfo(app_info* info) const \brief Returns the app_info of a currently active application. \param info A pointer to a pre-allocated app_info structure to be filled in by this method. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \a info was \c NULL. \retval B_ERROR No application was currently active. \since BeOS R3 */ /*! \fn status_t BRoster::GetActiveAppInfo(app_info* info) const \brief Returns the app_info of a currently active application. \param info A pointer to a pre-allocated app_info structure to be filled in by this method. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \a info was \c NULL. \retval B_ERROR No application was currently active. \since BeOS R3 */ /*! \fn status_t BRoster::FindApp(const char* mimeType, entry_ref* app) const \brief Finds an application associated with a MIME type. The method gets the signature of the supplied type's preferred application and the signature of the super type's preferred application. It will also get all supporting applications for the type and super type and build a list of candiate handlers. In the case that a preferred handler is configured for the sub-type, other supporting apps will be inserted in the candidate list before the super-type preferred and supporting handlers, since it is assumed that the super type handlers are not well suited for the sub-type. The following resolving algorithm is performed on each signature of the resulting list: The MIME database is asked which executable is associated with the signature. If the database doesn't have a reference to an exectuable, the boot volume is queried for a file with the signature. If more than one file has been found, the one with the greatest version is picked, or if no file has a version info, the one with the most recent modification date. The first application from the signature list which can be successfully resolved by this algorithm is returned. Contrary to BeOS behavior, this means that if the preferred application of the provided MIME type cannot be resolved, or if it does not have a preferred application associated, the method will return other applications with direct support for the MIME type before it resorts to the preferred application or supporting applications of the super type. \param mimeType The MIME type for which an application shall be found. \param app A pointer to a pre-allocated entry_ref to be filled with a reference to the found application's executable. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType or \a app. \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated and no other supporting applications could be identified. \retval B_LAUNCH_FAILED_APP_NOT_FOUND: The supplied type was not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH: The supplied type's only supporting application was in the trash. \since BeOS R3 */ /*! \fn status_t BRoster::FindApp(entry_ref* ref, entry_ref* app) const \brief Finds an application associated with a file. The method first checks, if the file has a preferred application associated with it (see BNodeInfo::GetPreferredApp()) and if so, tries to find the executable the same way FindApp(const char*, entry_ref*) does. If not, it gets the MIME type of the file and searches an application for it exactly like the first FindApp() method. The type of the file is defined in a file attribute (BNodeInfo::GetType()), but if it is not set yet, the method tries to guess it via BMimeType::GuessMimeType(). As a special case the file may have execute permission. Then preferred application and type are ignored and an entry_ref to the file itself is returned. \param ref An entry_ref referring to the file for which an application shall be found. \param app A pointer to a pre-allocated entry_ref to be filled with a reference to the found application's executable. \return \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType or \a app. \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND: The supplied type was not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH: The supplied type's preferred application was in the trash. \since BeOS R3 */ //! @} /*! \name Launching, Activating, and Broadcasting */ //! @{ /*! \fn status_t BRoster::Broadcast(BMessage* message) const \brief Sends a message to all running applications. The methods doesn't broadcast the message itself, but it asks the roster to do so. It immediatly returns after sending the request. The return value only tells about whether the request has successfully been sent. The message is sent asynchronously. Replies to it go to the application. (\c be_app_messenger). \param message The message to be broadcast. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a message. \since BeOS R3 */ /*! \fn status_t BRoster::Broadcast(BMessage* message, BMessenger replyTo) const \brief Sends a message to all running applications. The methods doesn't broadcast the message itself, but it asks the roster to do so. It immediatly returns after sending the request. The return value only tells about whether the request has successfully been sent. The message is sent asynchronously. Replies to it go to the specified target (\a replyTo). \param message The message to be broadcast. \param replyTo Reply target for the message. \return A status code. \retval B_OK: Everything went fine. \retval B_BAD_VALUE: \c NULL \a message. \since BeOS R4 */ /*! \fn status_t BRoster::StartWatching(BMessenger target, uint32 eventMask) const \brief Adds a new roster application monitor. After StartWatching() event messages will be sent to the supplied target according to the specified flags until a respective StopWatching() call. \a eventMask must be a bitwise OR of one or more of the following flags: - \c B_REQUEST_LAUNCHED: A \c B_SOME_APP_LAUNCHED is sent, whenever an application has been launched. - \c B_REQUEST_QUIT: A \c B_SOME_APP_QUIT is sent, whenever an application has quit. - \c B_REQUEST_ACTIVATED: A \c B_SOME_APP_ACTIVATED is sent, whenever an application has been activated. All event messages contain the following fields supplying more information about the concerned application: - \c "be:signature", \c B_STRING_TYPE: The signature of the application. - \c "be:team", \c B_INT32_TYPE: The team ID of the application (\c team_id). - \c "be:thread", \c B_INT32_TYPE: The ID of the application's main thread (\c thread_id). - \c "be:flags", \c B_INT32_TYPE: The application flags (\c uint32). - \c "be:ref", \c B_REF_TYPE: An entry_ref referring to the application's executable. A second call to StartWatching() with the same \a target simply sets the new \a eventMask. The messages won't be sent twice to the target. \param target The target the event messages shall be sent to. \param eventMask Specifies the events the caller is interested in. \return \c B_OK if everything went fine or an error code, if some error occurred. \since BeOS R4 */ /*! \fn status_t BRoster::StopWatching(BMessenger target) const \brief Removes a roster application monitor added with StartWatching(). \param target The target that shall not longer receive any event messages. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE No application monitor has been associated with the specified \a target before. \since BeOS R4 */ /*! \fn status_t BRoster::ActivateApp(team_id team) const \brief Activates the application identified by the supplied team ID. \param team The app's team ID \return A status code. \retval B_OK Everything went fine. \retval B_BAD_TEAM_ID \a team does not identify a running application. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const char* mimeType, BMessage* initialMessage, team_id* appTeam) const \brief Launches the application associated with the supplied MIME type. The application to be started is searched the same way FindApp() does it. \a initialMessage is a message to be sent to the application "on launch", i.e. before ReadyToRun() is invoked on the BApplication object. The caller retains ownership of the supplied BMessage. In case the method fails with \c B_ALREADY_RUNNING the message is delivered to the already running instance. \param mimeType MIME type for which the application shall be launched. \param initialMessage Optional message to be sent to the application "on launch". May be \c NULL. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \retval B_ALREADY_RUNNING The application's app flags specify \retval B_SINGLE_LAUNCH or \c B_EXCLUSIVE_LAUNCH and the application (the very same (single) or at least one with the same signature (exclusive)) is already running. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const char* mimeType, BList* messageList, team_id* appTeam) const \brief Launches the application associated with the supplied MIME type. The application to be started is searched the same way FindApp() does it. \a messageList contains messages to be sent to the application "on launch", i.e. before ReadyToRun() is invoked on the BApplication object. The caller retains ownership of the supplied BList and the contained BMessages. In case the method fails with \c B_ALREADY_RUNNING the messages are delivered to the already running instance. \param mimeType MIME type for which the application shall be launched. \param messageList Optional list of messages to be sent to the application "on launch". May be \c NULL. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const char* mimeType, int argc, const char* const* args, team_id* appTeam) const \brief Launches the application associated with the supplied MIME type. The application to be started is searched the same way FindApp() does it. The supplied \a argc and \a args are (if containing at least one argument) put into a \c B_ARGV_RECEIVED message and sent to the launched application "on launch". The caller retains ownership of the supplied \a args. In case the method fails with \c B_ALREADY_RUNNING the message is delivered to the already running instance. \param mimeType MIME type for which the application shall be launched. \param argc Specifies the number of elements in \a args. \param args An array of C-strings to be sent as B_ARGV_RECEIVED messaged to the launched application. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const entry_ref* ref, const BMessage* initialMessage, team_id* appTeam) const \brief Launches the application associated with the entry referred to by the supplied entry_ref. The application to be started is searched the same way FindApp() does it. If \a ref does refer to an application executable, that application is launched. Otherwise the respective application is searched and launched, and \a ref is sent to it in a \c B_REFS_RECEIVED message. \a initialMessage is a message to be sent to the application "on launch", i.e. before ReadyToRun() is invoked on the BApplication object. The caller retains ownership of the supplied BMessage. In case the method fails with \c B_ALREADY_RUNNING the message is delivered to the already running instance. The same applies to the \c B_REFS_RECEIVED message. \param ref entry_ref referring to the file for which an application shall be launched. \param initialMessage Optional message to be sent to the application "on launch". May be \c NULL. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \retval B_ALREADY_RUNNING: The application's app flags specify \c B_SINGLE_LAUNCH or \c B_EXCLUSIVE_LAUNCH and the application (the very same (single) or at least one with the same signature (exclusive)) was already running. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const entry_ref* ref, const BList* messageList, team_id* appTeam) const \brief Launches the application associated with the entry referred to by the supplied entry_ref. The application to be started is searched the same way FindApp() does it. If \a ref does refer to an application executable, that application is launched. Otherwise the respective application is searched and launched, and \a ref is sent to it in a \c B_REFS_RECEIVED message. \a messageList contains messages to be sent to the application "on launch", i.e. before ReadyToRun() is invoked on the BApplication object. The caller retains ownership of the supplied BList and the contained BMessages. In case the method fails with \c B_ALREADY_RUNNING the messages are delivered to the already running instance. The same applies to the \c B_REFS_RECEIVED message. \param ref entry_ref referring to the file for which an application shall be launched. \param messageList Optional list of messages to be sent to the application "on launch". May be \c NULL. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \since BeOS R3 */ /*! \fn status_t BRoster::Launch(const entry_ref* ref, int argc, const char* const* args, team_id* appTeam) const \brief Launches the application associated with the entry referred to by the supplied entry_ref. The application to be started is searched the same way FindApp() does it. If \a ref does refer to an application executable, that application is launched. Otherwise the respective application is searched and launched, and \a ref is sent to it in a \c B_REFS_RECEIVED message, unless other arguments are passed via \a argc and \a args -- then the entry_ref is converted into a path (C-string) and added to the argument vector. The supplied \a argc and \a args are (if containing at least one argument) put into a \c B_ARGV_RECEIVED message and sent to the launched application "on launch". The caller retains ownership of the supplied \a args. In case the method fails with \c B_ALREADY_RUNNING the message is delivered to the already running instance. The same applies to the \c B_REFS_RECEIVED message, if no arguments are supplied via \a argc and \a args. \param ref entry_ref referring to the file for which an application shall be launched. \param argc Specifies the number of elements in \a args. \param args An array of C-strings to be sent as B_ARGV_RECEIVED messaged to the launched application. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. \return A status code. \retval B_OK Everything went fine. \retval B_BAD_VALUE \c NULL \a mimeType \retval B_LAUNCH_FAILED_NO_PREFERRED_APP Neither with the supplied type nor with its supertype (if the supplied isn't a supertype itself) a preferred application is associated. \retval B_LAUNCH_FAILED_APP_NOT_FOUND The supplied type is not installed or its preferred application could not be found. \retval B_LAUNCH_FAILED_APP_IN_TRASH The supplied type's preferred application was in the trash. \retval B_LAUNCH_FAILED_EXECUTABLE The found application was not executable. \since BeOS R3 */ //! @} /*! \name Recent Information */ //! @{ /*! \fn void BRoster::GetRecentDocuments(BMessage* refList, int32 maxCount, const char* fileType, const char* signature) const \brief Returns a list of the most recently used documents. \param refList Filled out with information about recently used documents. \param maxCount The maximum number of documents to get information on. \param fileType Filter documents by MIME-type string. \param signature Get info only on documents that were used by a specific application. \since BeOS R5 */ /*! \fn void BRoster::GetRecentDocuments(BMessage* refList, int32 maxCount, const char* fileTypes[], int32 fileTypesCount, const char* signature) const \brief Returns a list of the most recently used documents. \param refList Filled out with information about recently used documents. \param maxCount The maximum number of documents to get information on. \param fileTypes Filter documents by and array of MIME-type string. \param fileTypesCount The number of MIME-types in \a fileType. \param signature Get info only on documents that were used by a specific application. \since BeOS R5 */ /*! \fn void BRoster::GetRecentFolders(BMessage* refList, int32 maxCount, const char* signature) const \brief Returns a list of recently accessed folders. \param refList Filled out with information about recently used folders. \param maxCount The maximum number of folders to get information on. \param signature Get info only on folders that were used by a specific application. \since BeOS R5 */ /*! \fn void BRoster::GetRecentApps(BMessage* refList, int32 maxCount) const \brief Returns a list of the most recently launched applications. \param refList Filled out with information about recently used apps. \param maxCount The maximum number of apps to get information on. \since BeOS R5 */ /*! \fn void BRoster::AddToRecentDocuments(const entry_ref* document, const char* signature) const \brief Adds the \a document to the list of recent documents. \param document The \a document to add. \param signature To record that a specific application used the document. \since BeOS R5 */ /*! \fn void BRoster::AddToRecentFolders(const entry_ref* folder, const char* signature) const \brief Adds \a folder to the list of recent folders. \param folder The \a folder to add. \param signature To record that a specific application used the folder. \since BeOS R5 */ //! @}