00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032
00033 #ifndef __CONFIG_MANAGER_H__
00034 #define __CONFIG_MANAGER_H__
00035
00036 #include "common.h"
00037 #include "mxml/mxml.h"
00038 #include "singleton.h"
00039 #include "dictionary.h"
00040 #include "object_dictionary.h"
00041 #include "xpath.h"
00042 #include "autoscan.h"
00043 #include "config_options.h"
00044
00045 #ifdef EXTERNAL_TRANSCODING
00046 #include "transcoding/transcoding.h"
00047 #endif
00048 #ifdef ONLINE_SERVICES
00049 #include "online_service.h"
00050 #endif
00051 typedef enum
00052 {
00053 CFG_SERVER_PORT = 0,
00054 CFG_SERVER_IP,
00055 CFG_SERVER_NETWORK_INTERFACE,
00056 CFG_SERVER_NAME,
00057 CFG_SERVER_MANUFACTURER_URL,
00058 CFG_SERVER_MODEL_NAME,
00059 CFG_SERVER_MODEL_DESCRIPTION,
00060 CFG_SERVER_MODEL_NUMBER,
00061 CFG_SERVER_SERIAL_NUMBER,
00062 CFG_SERVER_PRESENTATION_URL,
00063 CFG_SERVER_APPEND_PRESENTATION_URL_TO,
00064 CFG_SERVER_UDN,
00065 CFG_SERVER_HOME,
00066 CFG_SERVER_TMPDIR,
00067 CFG_SERVER_WEBROOT,
00068 CFG_SERVER_SERVEDIR,
00069 CFG_SERVER_ALIVE_INTERVAL,
00070 #ifdef EXTEND_PROTOCOLINFO
00071 CFG_SERVER_EXTEND_PROTOCOLINFO,
00072 #ifdef EXTERNAL_TRANSCODING
00073 CFG_SERVER_EXTEND_PROTOCOLINFO_CL_HACK,
00074 #endif
00075 #endif//EXTEND_PROTOCOLINFO
00076 CFG_SERVER_HIDE_PC_DIRECTORY,
00077 CFG_SERVER_BOOKMARK_FILE,
00078 CFG_SERVER_CUSTOM_HTTP_HEADERS,
00079 CFG_SERVER_UPNP_TITLE_AND_DESC_STRING_LIMIT,
00080 CFG_SERVER_UI_ENABLED,
00081 CFG_SERVER_UI_POLL_INTERVAL,
00082 CFG_SERVER_UI_POLL_WHEN_IDLE,
00083 CFG_SERVER_UI_ACCOUNTS_ENABLED,
00084 CFG_SERVER_UI_ACCOUNT_LIST,
00085 CFG_SERVER_UI_SESSION_TIMEOUT,
00086 CFG_SERVER_UI_DEFAULT_ITEMS_PER_PAGE,
00087 CFG_SERVER_UI_ITEMS_PER_PAGE_DROPDOWN,
00088 CFG_SERVER_UI_SHOW_TOOLTIPS,
00089 CFG_SERVER_STORAGE_DRIVER,
00090 CFG_SERVER_STORAGE_CACHING_ENABLED,
00091 #ifdef HAVE_SQLITE3
00092 CFG_SERVER_STORAGE_SQLITE_DATABASE_FILE,
00093 CFG_SERVER_STORAGE_SQLITE_SYNCHRONOUS,
00094 CFG_SERVER_STORAGE_SQLITE_RESTORE,
00095 CFG_SERVER_STORAGE_SQLITE_BACKUP_ENABLED,
00096 CFG_SERVER_STORAGE_SQLITE_BACKUP_INTERVAL,
00097 #endif
00098 #ifdef HAVE_MYSQL
00099 CFG_SERVER_STORAGE_MYSQL_HOST,
00100 CFG_SERVER_STORAGE_MYSQL_PORT,
00101 CFG_SERVER_STORAGE_MYSQL_USERNAME,
00102 CFG_SERVER_STORAGE_MYSQL_SOCKET,
00103 CFG_SERVER_STORAGE_MYSQL_PASSWORD,
00104 CFG_SERVER_STORAGE_MYSQL_DATABASE,
00105 #endif
00106 #if defined(HAVE_FFMPEG) && defined(HAVE_FFMPEGTHUMBNAILER)
00107 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_ENABLED,
00108 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_THUMBSIZE,
00109 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_SEEK_PERCENTAGE,
00110 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_FILMSTRIP_OVERLAY,
00111 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_WORKAROUND_BUGS,
00112 CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_IMAGE_QUALITY,
00113 #endif
00114 CFG_SERVER_EXTOPTS_MARK_PLAYED_ITEMS_ENABLED,
00115 CFG_SERVER_EXTOPTS_MARK_PLAYED_ITEMS_STRING_MODE_PREPEND,
00116 CFG_SERVER_EXTOPTS_MARK_PLAYED_ITEMS_STRING,
00117 CFG_SERVER_EXTOPTS_MARK_PLAYED_ITEMS_SUPPRESS_CDS_UPDATES,
00118 CFG_SERVER_EXTOPTS_MARK_PLAYED_ITEMS_CONTENT_LIST,
00119 #ifdef HAVE_LASTFMLIB
00120 CFG_SERVER_EXTOPTS_LASTFM_ENABLED,
00121 CFG_SERVER_EXTOPTS_LASTFM_USERNAME,
00122 CFG_SERVER_EXTOPTS_LASTFM_PASSWORD,
00123 #endif
00124 CFG_IMPORT_HIDDEN_FILES,
00125 CFG_IMPORT_FILESYSTEM_CHARSET,
00126 CFG_IMPORT_METADATA_CHARSET,
00127 CFG_IMPORT_PLAYLIST_CHARSET,
00128 #ifdef HAVE_JS
00129 CFG_IMPORT_SCRIPTING_CHARSET,
00130 CFG_IMPORT_SCRIPTING_COMMON_SCRIPT,
00131 CFG_IMPORT_SCRIPTING_PLAYLIST_SCRIPT,
00132 CFG_IMPORT_SCRIPTING_PLAYLIST_SCRIPT_LINK_OBJECTS,
00133 CFG_IMPORT_SCRIPTING_IMPORT_SCRIPT,
00134 #ifdef HAVE_LIBDVDNAV
00135 CFG_IMPORT_SCRIPTING_DVD_SCRIPT,
00136 #endif
00137 #endif // JS
00138 CFG_IMPORT_SCRIPTING_VIRTUAL_LAYOUT_TYPE,
00139 #ifdef HAVE_MAGIC
00140 CFG_IMPORT_MAGIC_FILE,
00141 #endif
00142 CFG_IMPORT_AUTOSCAN_TIMED_LIST,
00143 #ifdef HAVE_INOTIFY
00144 CFG_IMPORT_AUTOSCAN_USE_INOTIFY,
00145 CFG_IMPORT_AUTOSCAN_INOTIFY_LIST,
00146 #endif
00147 CFG_IMPORT_MAPPINGS_IGNORE_UNKNOWN_EXTENSIONS,
00148 CFG_IMPORT_MAPPINGS_EXTENSION_TO_MIMETYPE_CASE_SENSITIVE,
00149 CFG_IMPORT_MAPPINGS_EXTENSION_TO_MIMETYPE_LIST,
00150 CFG_IMPORT_MAPPINGS_MIMETYPE_TO_UPNP_CLASS_LIST,
00151 CFG_IMPORT_MAPPINGS_MIMETYPE_TO_CONTENTTYPE_LIST,
00152 #ifdef HAVE_LIBEXIF
00153 CFG_IMPORT_LIBOPTS_EXIF_AUXDATA_TAGS_LIST,
00154 #endif
00155 #ifdef HAVE_LIBEXTRACTOR
00156 CFG_IMPORT_LIBOPTS_EXTRACTOR_AUXDATA_TAGS_LIST,
00157 #endif
00158 #if defined(HAVE_ID3LIB) || defined(HAVE_TAGLIB)
00159 CFG_IMPORT_LIBOPTS_ID3_AUXDATA_TAGS_LIST,
00160 #endif
00161 #ifdef EXTERNAL_TRANSCODING
00162 CFG_TRANSCODING_PROFILE_LIST,
00163 #ifdef HAVE_CURL
00164 CFG_EXTERNAL_TRANSCODING_CURL_BUFFER_SIZE,
00165 CFG_EXTERNAL_TRANSCODING_CURL_FILL_SIZE,
00166 #endif//HAVE_CURL
00167 #endif//EXTERNAL_TRANSCODING
00168 #ifdef YOUTUBE
00169 CFG_ONLINE_CONTENT_YOUTUBE_ENABLED,
00170 CFG_ONLINE_CONTENT_YOUTUBE_FORMAT_MP4,
00171 CFG_ONLINE_CONTENT_YOUTUBE_PREFER_HD,
00172 CFG_ONLINE_CONTENT_YOUTUBE_RACY,
00173 CFG_ONLINE_CONTENT_YOUTUBE_REFRESH,
00174 CFG_ONLINE_CONTENT_YOUTUBE_UPDATE_AT_START,
00175 CFG_ONLINE_CONTENT_YOUTUBE_PURGE_AFTER,
00176 CFG_ONLINE_CONTENT_YOUTUBE_TASK_LIST,
00177 #endif
00178 #ifdef SOPCAST
00179 CFG_ONLINE_CONTENT_SOPCAST_ENABLED,
00180 CFG_ONLINE_CONTENT_SOPCAST_REFRESH,
00181 CFG_ONLINE_CONTENT_SOPCAST_UPDATE_AT_START,
00182 CFG_ONLINE_CONTENT_SOPCAST_PURGE_AFTER,
00183 #endif
00184 #ifdef WEBORAMA
00185 CFG_ONLINE_CONTENT_WEBORAMA_ENABLED,
00186 CFG_ONLINE_CONTENT_WEBORAMA_REFRESH,
00187 CFG_ONLINE_CONTENT_WEBORAMA_UPDATE_AT_START,
00188 CFG_ONLINE_CONTENT_WEBORAMA_PURGE_AFTER,
00189 CFG_ONLINE_CONTENT_WEBORAMA_TASK_LIST,
00190 #endif
00191 #ifdef ATRAILERS
00192 CFG_ONLINE_CONTENT_ATRAILERS_ENABLED,
00193 CFG_ONLINE_CONTENT_ATRAILERS_REFRESH,
00194 CFG_ONLINE_CONTENT_ATRAILERS_UPDATE_AT_START,
00195 CFG_ONLINE_CONTENT_ATRAILERS_PURGE_AFTER,
00196 CFG_ONLINE_CONTENT_ATRAILERS_RESOLUTION,
00197 #endif
00198 CFG_MAX
00199 } config_option_t;
00200
00201 class ConfigManager : public Singleton<ConfigManager>
00202 {
00203 public:
00204 ConfigManager();
00205
00206 virtual ~ConfigManager();
00207
00209 inline zmm::String getConfigFilename() { return filename; }
00210
00211 void load(zmm::String filename);
00212
00215 zmm::String getOption(config_option_t option);
00216
00219 int getIntOption(config_option_t option);
00220
00223 bool getBoolOption(config_option_t option);
00224
00227 zmm::Ref<Dictionary> getDictionaryOption(config_option_t option);
00228
00231 zmm::Ref<zmm::Array<zmm::StringBase> > getStringArrayOption(config_option_t option);
00232
00233 zmm::Ref<ObjectDictionary<zmm::Object> > getObjectDictionaryOption(config_option_t option);
00234 #ifdef ONLINE_SERVICES
00237 zmm::Ref<zmm::Array<zmm::Object> > getObjectArrayOption(config_option_t option);
00238 #endif
00239
00242 zmm::Ref<AutoscanList> getAutoscanListOption(config_option_t option);
00243
00244 #ifdef EXTERNAL_TRANSCODING
00247 zmm::Ref<TranscodingProfileList> getTranscodingProfileListOption(config_option_t option);
00248 #endif
00249
00252 static void setStaticArgs(zmm::String _filename, zmm::String _userhome,
00253 zmm::String _config_dir = _(DEFAULT_CONFIG_HOME),
00254 zmm::String _prefix_dir = _(PACKAGE_DATADIR),
00255 zmm::String _magic = nil,
00256 bool _debug_logging = false);
00257
00258 static bool isDebugLogging() { return debug_logging; };
00259
00262 void writeBookmark(zmm::String ip, zmm::String port);
00263
00264
00265 protected:
00266
00267 zmm::Ref<mxml::Element> map_from_to(zmm::String from, zmm::String to);
00268 zmm::Ref<mxml::Element> treat_as(zmm::String mimetype, zmm::String as);
00269 zmm::Ref<mxml::Element> renderTranscodingSection();
00270 zmm::Ref<mxml::Element> renderExtendedRuntimeSection();
00271 zmm::Ref<mxml::Element> renderOnlineSection();
00272
00273
00274 zmm::String createDefaultConfig(zmm::String userhome);
00275 void save();
00276 void save_text(zmm::String filename, zmm::String content);
00277 void migrate();
00278 void validate(zmm::String serverhome);
00279 void prepare_udn();
00280 zmm::String construct_path(zmm::String path);
00281 void prepare_path(zmm::String path, bool needDir = false, bool existenceUnneeded = false);
00282
00283 static zmm::String filename;
00284 static zmm::String userhome;
00285 static zmm::String config_dir;
00286 static zmm::String prefix_dir;
00287 static zmm::String magic;
00288 static bool debug_logging;
00289
00290 zmm::Ref<mxml::Document> rootDoc;
00291 zmm::Ref<mxml::Element> root;
00292
00293 zmm::Ref<Dictionary> mime_content;
00294
00295 zmm::Ref<zmm::Array<ConfigOption> > options;
00296
00305 zmm::String getOption(zmm::String xpath, zmm::String def);
00306
00308 int getIntOption(zmm::String xpath, int def);
00309
00317 zmm::String getOption(zmm::String xpath);
00318
00320 int getIntOption(zmm::String xpath);
00321
00327 zmm::Ref<mxml::Element> getElement(zmm::String xpath);
00328
00331 zmm::String checkOptionString(zmm::String xpath);
00332
00348 zmm::Ref<Dictionary> createDictionaryFromNodeset(zmm::Ref<mxml::Element> element, zmm::String nodeName, zmm::String keyAttr, zmm::String valAttr, bool tolower = false);
00349
00354 zmm::Ref<AutoscanList> createAutoscanListFromNodeset(zmm::Ref<mxml::Element> element, scan_mode_t scanmode);
00355
00356 #ifdef EXTERNAL_TRANSCODING
00360 zmm::Ref<TranscodingProfileList> createTranscodingProfileListFromNodeset(zmm::Ref<mxml::Element> element);
00361 #endif
00362
00376 zmm::Ref<zmm::Array<zmm::StringBase> > createArrayFromNodeset(zmm::Ref<mxml::Element> element, zmm::String nodeName, zmm::String attrName);
00377
00378 void dumpOptions();
00379
00380 #ifdef ONLINE_SERVICES
00391 zmm::Ref<zmm::Array<zmm::Object> > createServiceTaskList(service_type_t service, zmm::Ref<mxml::Element> element);
00392 #endif
00393
00394 };
00395
00396 #endif // __CONFIG_MANAGER_H__