From Alexis La Goutte:
[obnox/wireshark/wip.git] / epan / prefs.h
1 /* prefs.h
2  * Definitions for preference handling routines
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 #ifndef __PREFS_H__
26 #define __PREFS_H__
27
28 #include <glib.h>
29
30 #include "color.h"
31
32 #include <epan/range.h>
33
34 #define PR_DEST_CMD  0
35 #define PR_DEST_FILE 1
36
37 #define DEF_WIDTH 750
38 #define DEF_HEIGHT 550
39
40 #define MAX_VAL_LEN  1024
41
42 #define RTP_PLAYER_DEFAULT_VISIBLE 4
43 #define TAP_UPDATE_DEFAULT_INTERVAL 3000
44
45 /*
46  * Convert a string listing name resolution types to a bitmask of
47  * those types.
48  *
49  * Set "*name_resolve" to the bitmask, and return '\0', on success;
50  * return the bad character in the string on error.
51  */
52 char string_to_name_resolve(char *string, guint32 *name_resolve);
53
54 /*
55  * Modes for the starting directory in File Open dialogs.
56  */
57 #define FO_STYLE_LAST_OPENED    0       /* start in last directory we looked at */
58 #define FO_STYLE_SPECIFIED      1       /* start in specified directory */
59
60 /*
61  * Toolbar styles.
62  */
63 #define TB_STYLE_ICONS          0
64 #define TB_STYLE_TEXT           1
65 #define TB_STYLE_BOTH           2
66
67 /*
68  * Types of layout of summary/details/hex panes.
69  */
70 typedef enum {
71     layout_unused,  /* entry currently unused */
72     layout_type_5,
73     layout_type_2,
74     layout_type_1,
75     layout_type_4,
76     layout_type_3,
77     layout_type_6,
78     layout_type_max
79 } layout_type_e;
80
81 /*
82  * Types of pane.
83  */
84 typedef enum {
85     layout_pane_content_none,
86     layout_pane_content_plist,
87     layout_pane_content_pdetails,
88     layout_pane_content_pbytes
89 } layout_pane_content_e;
90
91 /*
92  * open console behaviour (win32 only)
93  */
94 typedef enum {
95     console_open_never,
96     console_open_auto,
97     console_open_always
98 } console_open_e;
99
100
101 typedef struct _e_prefs {
102   gint     pr_format;
103   gint     pr_dest;
104   gchar   *pr_file;
105   gchar   *pr_cmd;
106   GList   *col_list;
107   gint     num_cols;
108   color_t  st_client_fg, st_client_bg, st_server_fg, st_server_bg;
109   gboolean gui_scrollbar_on_right;
110   gboolean gui_plist_sel_browse;
111   gboolean gui_ptree_sel_browse;
112   gboolean gui_altern_colors;
113   gboolean filter_toolbar_show_in_statusbar;
114   gint     gui_ptree_line_style;
115   gint     gui_ptree_expander_style;
116   gboolean gui_hex_dump_highlight_style;
117   gint     gui_toolbar_main_style;
118   gint     gui_toolbar_filter_style;
119   gchar   *gui_font_name;
120   color_t  gui_marked_fg;
121   color_t  gui_marked_bg;
122   color_t  gui_ignored_fg;
123   color_t  gui_ignored_bg;
124   gchar   *gui_colorized_fg;
125   gchar   *gui_colorized_bg;
126   gboolean gui_geometry_save_position;
127   gboolean gui_geometry_save_size;
128   gboolean gui_geometry_save_maximized;
129   gboolean gui_macosx_style;
130   console_open_e gui_console_open;
131   guint    gui_recent_df_entries_max;
132   guint    gui_recent_files_count_max;
133   guint    gui_fileopen_style;
134   gchar    *gui_fileopen_dir;
135   guint    gui_fileopen_preview;
136   gboolean gui_ask_unsaved;
137   gboolean gui_find_wrap;
138   gboolean gui_use_pref_save;
139   gchar   *gui_webbrowser;
140   gchar   *gui_window_title;
141   gchar   *gui_start_title;
142   gboolean gui_version_in_start_page;
143   layout_type_e gui_layout_type;
144   layout_pane_content_e gui_layout_content_1;
145   layout_pane_content_e gui_layout_content_2;
146   layout_pane_content_e gui_layout_content_3;
147   gint     console_log_level;
148   guint32  name_resolve;
149   gint     name_resolve_concurrency;
150   gboolean load_smi_modules;
151   gboolean suppress_smi_errors;
152   gchar   *capture_device;
153   gchar   *capture_devices_linktypes;
154   gchar   *capture_devices_descr;
155   gchar   *capture_devices_hide;
156   gchar   *capture_devices_monitor_mode;
157   gboolean capture_prom_mode;
158   gboolean capture_pcap_ng;
159   gboolean capture_real_time;
160   gboolean capture_auto_scroll;
161   gboolean capture_show_info;
162   guint    rtp_player_max_visible;
163   guint    tap_update_interval;
164   gboolean display_hidden_proto_items;
165 } e_prefs;
166
167 WS_VAR_IMPORT e_prefs prefs;
168
169 /*
170  * Routines to let modules that have preference settings register
171  * themselves by name, and to let them register preference settings
172  * by name.
173  */
174 struct pref_module;
175
176 typedef struct pref_module module_t;
177
178 /** Sets up memory used by proto routines. Called at program startup */
179 extern void prefs_init(void);
180
181 /** Reset preferences to default values.  Called at profile change */
182 extern void prefs_reset(void);
183
184 /** Frees memory used by proto routines. Called at program shutdown */
185 extern void prefs_cleanup(void);
186
187 /*
188  * Register a module that will have preferences.
189  * Specify the module under which to register it or NULL to register it
190  * at the top level, the name used for the module in the preferences file,
191  * the title used in the tab for it in a preferences dialog box, and a
192  * routine to call back when we apply the preferences.
193  *
194  * This should not be used for dissector preferences;
195  * "prefs_register_protocol()" should be used for that, so that the
196  * preferences go under the "Protocols" subtree, and so that the
197  * name is the protocol name specified at the "proto_register_protocol()"
198  * call so that the "Protocol Properties..." menu item works.
199  */
200 extern module_t *prefs_register_module(module_t *parent, const char *name,
201     const char *title, const char *description, void (*apply_cb)(void));
202
203 /*
204  * Register a subtree that will have modules under it.
205  * Specify the module under which to register it or NULL to register it
206  * at the top level and the title used in the tab for it in a preferences
207  * dialog box.
208  */
209 extern module_t *prefs_register_subtree(module_t *parent, const char *title,
210     const char *description);
211
212 /*
213  * Register that a protocol has preferences.
214  */
215 extern module_t *prefs_register_protocol(int id, void (*apply_cb)(void));
216
217 /*
218  * Register that a protocol has preferences and group it under a single
219  * subtree
220  */
221 #define PREFERENCE_GROUPING
222 extern module_t *prefs_register_protocol_subtree(const char *subtree, int id,
223                                                  void (*apply_cb)(void));
224
225 /*
226  * Register that a protocol used to have preferences but no longer does,
227  * by creating an "obsolete" module for it.
228  */
229 extern module_t *prefs_register_protocol_obsolete(int id);
230
231 /*
232  * Callback function for module list scanners.
233  */
234 typedef guint (*module_cb)(module_t *module, gpointer user_data);
235
236 /*
237  * Returns TRUE if module has any submodules
238  */
239 extern gboolean prefs_module_has_submodules(module_t *module);
240
241 /*
242  * Call a callback function, with a specified argument, for each module
243  * in the list of all modules.  (This list does not include subtrees.)
244  *
245  * Ignores "obsolete" modules; their sole purpose is to allow old
246  * preferences for dissectors that no longer have preferences to be
247  * silently ignored in preference files.
248  */
249 extern guint prefs_modules_foreach(module_cb callback, gpointer user_data);
250
251 /*
252  * Call a callback function, with a specified argument, for each submodule
253  * of specified modules.  If the module is NULL, goes through the top-level
254  * list in the display tree of modules.
255  *
256  * Ignores "obsolete" modules; their sole purpose is to allow old
257  * preferences for dissectors that no longer have preferences to be
258  * silently ignored in preference files.  Does not ignore subtrees,
259  * as this can be used when walking the display tree of modules.
260  */
261 extern guint prefs_modules_foreach_submodules(module_t *module, module_cb callback, gpointer user_data);
262
263 /*
264  * Call the "apply" callback function for each module if any of its
265  * preferences have changed, and then clear the flag saying its
266  * preferences have changed, as the module has been notified of that
267  * fact.
268  */
269 extern void prefs_apply_all(void);
270
271 /*
272  * Call the "apply" callback function for a specific module if any of
273  * its preferences have changed, and then clear the flag saying its
274  * preferences have changed, as the module has been notified of that
275  * fact.
276  */
277 extern void prefs_apply(module_t *module);
278
279
280 struct preference;
281
282 typedef struct preference pref_t;
283
284 /*
285  * Returns TRUE if the given protocol has registered preferences.
286  */
287 extern gboolean prefs_is_registered_protocol(const char *name);
288
289 /*
290  * Returns the module title of a registered protocol (or NULL if unknown).
291  */
292 extern const char *prefs_get_title_by_name(const char *name);
293
294 /** Given a module name, return a pointer to its pref_module struct,
295  * or NULL if it's not found.
296  *
297  * @param name The preference module name.  Usually the same as the protocol
298  * name, e.g. "tcp".
299  * @return A pointer to the corresponding preference module, or NULL if it
300  * wasn't found.
301  */
302 extern module_t *prefs_find_module(const char *name);
303
304 /** Given a module name, and a preference name return a pointer to the given
305  * module's given preference or NULL if it's not found.
306  *
307  * @param module The preference module name.  Usually the same as the protocol
308  * name, e.g. "tcp".
309  * @param pref The preference name, e.g. "desegment".
310  * @return A pointer to the corresponding preference, or NULL if it
311  * wasn't found.
312  */
313 extern pref_t *prefs_find_preference(module_t * module, const char *pref);
314
315 /*
316  * Register a preference with an unsigned integral value.
317  */
318 extern void prefs_register_uint_preference(module_t *module, const char *name,
319     const char *title, const char *description, guint base, guint *var);
320
321 /*
322  * Register a preference with an Boolean value.
323  * Note that the name must be in lowercase letters only (underscore allowed).
324  */
325 extern void prefs_register_bool_preference(module_t *module, const char *name,
326     const char *title, const char *description, gboolean *var);
327
328 /*
329  * Register a preference with an enumerated value.
330  */
331 typedef struct {
332         const char      *name;
333         const char      *description;
334         gint            value;
335 } enum_val_t;
336
337 extern void prefs_register_enum_preference(module_t *module, const char *name,
338     const char *title, const char *description, gint *var,
339     const enum_val_t *enumvals, gboolean radio_buttons);
340
341 /*
342  * Register a preference with a character-string value.
343  */
344 extern void prefs_register_string_preference(module_t *module, const char *name,
345     const char *title, const char *description, const char **var);
346
347 /*
348  * Register a preference with a ranged value.
349  */
350 extern void prefs_register_range_preference(module_t *module, const char *name,
351     const char *title, const char *description, range_t **var,
352     guint32 max_value);
353
354 /*
355  * Register a static text 'preference'. It can be used to add some info/explanation.
356  */
357 extern void prefs_register_static_text_preference(module_t *module, const char *name,
358     const char *title, const char *description);
359
360 /*
361  * Register a uat 'preference'. It adds a button that opens the uat's window in the
362  * preferences tab of the module.
363  */
364 extern void prefs_register_uat_preference(module_t *module,
365                                                                                   const char *name,
366                                                                                   const char* title,
367                                                                                   const char *description,
368                                                                                   void* uat);
369
370 /*
371  * Register a preference that used to be supported but no longer is.
372  */
373 extern void prefs_register_obsolete_preference(module_t *module,
374     const char *name);
375
376 typedef guint (*pref_cb)(pref_t *pref, gpointer user_data);
377
378 /*
379  * Call a callback function, with a specified argument, for each preference
380  * in a given module.
381  *
382  * If any of the callbacks return a non-zero value, stop and return that
383  * value, otherwise return 0.
384  */
385 extern guint prefs_pref_foreach(module_t *module, pref_cb callback,
386     gpointer user_data);
387
388 /* Parse through a list of comma-separated, possibly quoted strings.
389  *  Return a list of the string data.
390  */
391 extern GList *prefs_get_string_list(gchar *str);
392
393 /* Clear the given list of string data. */
394 extern void prefs_clear_string_list(GList *sl);
395
396 /*
397  * Register all non-dissector modules' preferences.
398  */
399 extern void prefs_register_modules(void);
400
401 /* Read the preferences file, fill in "prefs", and return a pointer to it.
402
403    If we got an error (other than "it doesn't exist") trying to read
404    the global preferences file, stuff the errno into "*gpf_errno_return"
405    on an open error and into "*gpf_read_errno_return" on a read error,
406    stuff a pointer to the path of the file into "*gpf_path_return", and
407    return NULL.
408
409    If we got an error (other than "it doesn't exist") trying to read
410    the user's preferences file, stuff the errno into "*pf_errno_return"
411    on an open error and into "*pf_read_errno_return" on a read error,
412    stuff a pointer to the path of the file into "*pf_path_return", and
413    return NULL. */
414 extern e_prefs *read_prefs(int *, int *, char **, int *, int *, char **);
415
416 /* Write out "prefs" to the user's preferences file, and return 0.
417
418    If we got an error, stuff a pointer to the path of the preferences file
419    into "*pf_path_return", and return the errno. */
420 extern int write_prefs(char **);
421
422 /* Copy a set of preferences. */
423 extern void copy_prefs(e_prefs *dest, e_prefs *src);
424
425 /* Free a set of preferences. */
426 extern void free_prefs(e_prefs *pr);
427
428 /*
429  * Given a string of the form "<pref name>:<pref value>", as might appear
430  * as an argument to a "-o" option, parse it and set the preference in
431  * question.  Return an indication of whether it succeeded or failed
432  * in some fashion.
433  *
434  * XXX - should supply, for syntax errors, a detailed explanation of
435  * the syntax error.
436  */
437 typedef enum {
438     PREFS_SET_OK,               /* succeeded */
439     PREFS_SET_SYNTAX_ERR,       /* syntax error in string */
440     PREFS_SET_NO_SUCH_PREF,     /* no such preference */
441     PREFS_SET_OBSOLETE          /* preference used to exist but no longer does */
442 } prefs_set_pref_e;
443
444 extern prefs_set_pref_e prefs_set_pref(char *prefarg);
445
446 /*
447  * Returns TRUE if the given device is hidden
448  */
449 extern gboolean prefs_is_capture_device_hidden(const char *name);
450
451 /*
452  * Returns TRUE if the given device should capture in monitor mode by default
453  */
454 extern gboolean prefs_capture_device_monitor_mode(const char *name);
455
456 #endif /* prefs.h */