new fortune
[feisty_meow.git] / nucleus / library / processes / configured_applications.h
1 #ifndef CONFIGURED_APPLICATIONS_CLASS
2 #define CONFIGURED_APPLICATIONS_CLASS
3
4 /*****************************************************************************\
5 *                                                                             *
6 *  Name   : configured_applications
7 *  Author : Chris Koeritz
8 *                                                                             *
9 *******************************************************************************
10 * Copyright (c) 2000 By Author.  This program is free software; you can       *
11 * redistribute it and/or modify it under the terms of the GNU General Public  *
12 * License as published by the Free Software Foundation; either version 2 of   *
13 * the License or (at your option) any later version.  This is online at:      *
14 *     http://www.fsf.org/copyleft/gpl.html                                    *
15 * Please send any updates to: fred@gruntose.com                               *
16 \*****************************************************************************/
17
18 #include <basis/astring.h>
19 #include <basis/contracts.h>
20 #include <basis/mutex.h>
21 #include <configuration/ini_configurator.h>
22 #include <configuration/section_manager.h>
23 #include <structures/string_table.h>
24
25 namespace processes {
26
27 //! Manages the initialization file for a set of registered applications.
28 /*!
29   This records the list of programs that are allowed to be executed as well
30   as the list of applications launched at object startup time.
31 */
32
33 class configured_applications
34 {
35 public:
36   configured_applications(const basis::astring &config_file, const basis::astring &basename);
37     //!< manages application settings for in the "config_file".
38     /*!< the "basename" is used for the section name of a list of products
39     that can be managed by this class.  each product has a set of applications
40     that are part of the product's full package. */
41
42   virtual ~configured_applications();
43
44   // this section has mainly informational functions.
45
46   DEFINE_CLASS_NAME("configured_applications");
47
48   static const char *STARTUP_SECTION();
49     //!< the section where startup info is stored.
50
51   static const char *STARTUP_APP_NAME();
52     //!< a special placeholder name that will appear in the startup list.
53     /*!< it is not to be executed like the other programs for startup. */
54
55   static bool find_entry(const structures::string_table &table, const basis::astring &name,
56           basis::astring &location);
57     //!< returns true if the key "name" for a program is found in the "table".
58     /*!< the "location" is set to the value found in the table if successful.
59     */
60
61   static basis::astring make_startup_entry(const basis::astring &product,
62           const basis::astring &parms, bool one_shot);
63     //!< returns the appropriate string for a startup record.
64
65   static bool parse_startup_entry(const basis::astring &info, basis::astring &product,
66           basis::astring &parms, bool &one_shot);
67     //!< processes the items in "info" as an application startup list.
68     /*!< using a string "info" that was listed as the startup entry for an
69     application, the "product", "parms" and "one_shot" bits are parsed out
70     and returned. */
71
72   bool product_exists(const basis::astring &product);
73     //!< returns true if the section for "product" exists in the TOC.
74
75   basis::astring find_program(const basis::astring &product, const basis::astring &app_name,
76           int &level);
77     //!< seeks out the entry for the "product" and "app_name" in our info.
78     /*!< the returned string will either be empty (on failure) or will contain
79     the full path to the application (on success).  the "level" will specify
80     the ordering of shutdown, where larger levels are shut down first. */
81
82   // the following functions actually modify the configuration file.
83
84   bool find_section(const basis::astring &section_name, structures::string_table &info_found);
85     //!< locates the entries for "section_name" and stores them in "info_found".
86
87   bool add_section(const basis::astring &section_name, const structures::string_table &info);
88     //!< puts a chunk of "info" into the section for "section_name".
89     /*!< this fails if the section already exists. */
90
91   bool replace_section(const basis::astring &section_name, const structures::string_table &info);
92     //!< replaces the section for "section_name" with "info".
93     /*!< this fails if the section does not already exist. */
94
95   bool add_program(const basis::astring &product, const basis::astring &app_name,
96           const basis::astring &full_path, int level);
97     //!< registers a program "app_name" into the "product" section.
98     /*!< the "full_path" specifies where to find the program and the "level"
99     gives the application an ordering for shutdown.  higher levels are shut
100     down before lower ones. */
101
102   bool remove_program(const basis::astring &product, const basis::astring &app_name);
103     //!< takes a previously registered "app_name" out of the list for "product".
104
105   bool add_startup_entry(const basis::astring &product, const basis::astring &app_name,
106           const basis::astring &parameters, int one_shot);
107     //!< establishes the "app_name" as a program launched at object startup.
108     /*!< adds an entry to the startup section for a program that will be
109     launched when the application manager restarts. */
110
111   bool remove_startup_entry(const basis::astring &product, const basis::astring &app_name);
112     //!< takes an existing entry for the "app_name" out of the startup section.
113
114 private:
115   basis::mutex *_lock;  //!< synchronization protection for our objects.
116   configuration::ini_configurator *_config;  //!< manages our configuration settings.
117   configuration::section_manager *_sector;  //!< keeps track of our product sections.
118 };
119
120 } //namespace.
121
122 #endif
123