From 63f3ada05b99ec1994ab72cb0c8c0f44cd0f33c7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Fri, 20 Jan 2006 20:05:27 +0000 Subject: [PATCH] converted comments to get caught by doxygen --- webcit/ChangeLog | 3 + webcit/Doxyfile | 1240 ++++++++++++++++++++++++++++++++++++ webcit/Makefile.in | 5 +- webcit/auth.c | 83 ++- webcit/autocompletion.c | 12 +- webcit/availability.c | 72 ++- webcit/calendar.c | 166 +++-- webcit/calendar_tools.c | 62 +- webcit/calendar_view.c | 154 +++-- webcit/context_loop.c | 117 ++-- webcit/cookie_conversion.c | 40 +- webcit/crypto.c | 140 ++-- webcit/debian/control | 2 +- webcit/event.c | 91 +-- webcit/floors.c | 9 +- webcit/gettext.c | 2 +- webcit/po/de.po | 4 +- 17 files changed, 1862 insertions(+), 340 deletions(-) create mode 100644 webcit/Doxyfile diff --git a/webcit/ChangeLog b/webcit/ChangeLog index 45dddfc9f..9e48525ef 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,5 +1,8 @@ $Id$ +Fri Jan 20 21:03:25 CET 2006 dothebart +* Started with doxygen style comments and doxygen config. + Thu Jan 19 23:18:01 EST 2006 ajc * Began adding the infrastructure to support wiki mode rooms. diff --git a/webcit/Doxyfile b/webcit/Doxyfile new file mode 100644 index 000000000..6248d9c53 --- /dev/null +++ b/webcit/Doxyfile @@ -0,0 +1,1240 @@ +# Doxyfile 1.4.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = webcit + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 6.70 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxygen + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = NO +#! +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = *.c and *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = webcit.h and messages.c and vcard.h and userlist.c +#!!!!!!!! for now + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = yes + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = no +#!yes + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = no + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = WEBCIT_WITH_CALENDAR_SERVICE HAVE_OPENSSL + + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = NO + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/webcit/Makefile.in b/webcit/Makefile.in index ea2d67378..b6cdbaa6d 100644 --- a/webcit/Makefile.in +++ b/webcit/Makefile.in @@ -24,7 +24,7 @@ SUBDIRS=$(LIB_SUBDIRS) $(PROG_SUBDIRS) all: all-progs-recursive webserver setup -.SUFFIXES: .c .o +.SUFFIXES: .cpp .c .o clean: rm -f *.o webcit webserver @@ -67,6 +67,9 @@ webserver: webserver.o context_loop.o tools.o ical_dezonify.o \ .c.o: $(CC) $(CFLAGS) $(DEFS) -c $(PTHREAD_DEFS) -DWEBCITDIR=\"$(prefix)\" -DLOCALEDIR=\"$(prefix)/locale\" $< +.cpp.o: + $(CC) $(CFLAGS) $(DEFS) -c $(PTHREAD_DEFS) -DWEBCITDIR=\"$(prefix)\" -DLOCALEDIR=\"$(prefix)/locale\" $< + Makefile: $(srcdir)/Makefile.in config.status CONFIG_FILES="Makefile" CONFIG_HEADERS= $(SHELL) ./config.status diff --git a/webcit/auth.c b/webcit/auth.c index 139ccda49..8ab372093 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -1,29 +1,40 @@ /* * $Id$ + */ +/** * - * Handles authentication of users to a Citadel server. + * \defgroup WebcitAuth WebcitAuth; Handles authentication of users to a Citadel server. * */ +/*@{*/ #include "webcit.h" -char *axdefs[7]; + + +/** + * \brief user states + * the plain text states of a user. filled in at \ function TODO initialize_ax_defs() + * due to NLS + */ +char *axdefs[7]; void initialize_axdefs(void) { - axdefs[0] = _("Deleted"); - axdefs[1] = _("New User"); - axdefs[2] = _("Problem User"); - axdefs[3] = _("Local User"); - axdefs[4] = _("Network User"); - axdefs[5] = _("Preferred User"); - axdefs[6] = _("Aide"); + axdefs[0] = _("Deleted"); /*!0: an erased user */ + axdefs[1] = _("New User"); /*!1: a new user */ + axdefs[2] = _("Problem User"); /*!2: a trouble maker */ + axdefs[3] = _("Local User"); /*!3: user with normal privileges */ + axdefs[4] = _("Network User"); /*!4: a user that may access network resources */ + axdefs[5] = _("Preferred User");/*!5: a moderator */ + axdefs[6] = _("Aide"); /*!6: chief */ } -/* - * Display the login screen +/** + * \brief Display the login screen + * \param mesg The error message if last attempt failed. */ void display_login(char *mesg) { @@ -73,12 +84,15 @@ void display_login(char *mesg) -/* +/** \brief Initialize the session * This function needs to get called whenever the session changes from * not-logged-in to logged-in, either by an explicit login by the user or * by a timed-out session automatically re-establishing with a little help * from the browser cookie. Either way, we need to load access controls and * preferences from the server. + * \param user the username + * \param pass his password + * \param serv_response where to put the response ???? */ void become_logged_in(char *user, char *pass, char *serv_response) { @@ -111,6 +125,10 @@ void become_logged_in(char *user, char *pass, char *serv_response) } +/** + * \brief Login Checks + * the logics to detect invalid passwords not to get on citservers nerves + */ void do_login(void) { char buf[SIZ]; @@ -170,6 +188,11 @@ void do_login(void) } +/** + * \brief display the user a welcome screen. + * if this is the first time login, and the web based setup is enabled, + * lead the user through the setup routines + */ void do_welcome(void) { char buf[SIZ]; @@ -177,7 +200,7 @@ void do_welcome(void) FILE *fp; int i; - /* + /** * See if we have to run the first-time setup wizard */ if (WC->is_aide) { @@ -198,7 +221,7 @@ void do_welcome(void) buf[strlen(buf)-1] = 0; fclose(fp); if (atoi(buf) == serv_info.serv_rev_level) { - setup_wizard = 1; /* already run */ + setup_wizard = 1; /**< already run */ } } } @@ -209,7 +232,7 @@ void do_welcome(void) } #endif - /* + /** * Go to the user's preferred start page */ get_preference("startpage", buf, sizeof buf); @@ -224,7 +247,7 @@ void do_welcome(void) } -/* +/** * Disconnect from the Citadel server, and end this WebCit session */ void end_webcit_session(void) { @@ -241,7 +264,9 @@ void end_webcit_session(void) { /* close() of citadel socket will be done by do_housekeeping() */ } - +/** + * execute the logout + */ void do_logout(void) { char buf[SIZ]; @@ -251,7 +276,7 @@ void do_logout(void) safestrncpy(WC->wc_roomname, "", sizeof WC->wc_roomname); safestrncpy(WC->wc_fullname, "", sizeof WC->wc_fullname); - /* Calling output_headers() this way causes the cookies to be un-set */ + /** Calling output_headers() this way causes the cookies to be un-set */ output_headers(1, 1, 0, 1, 0, 0); wprintf("
"); @@ -283,7 +308,7 @@ void do_logout(void) } -/* +/* * * validate new users */ void validate(void) @@ -300,7 +325,7 @@ void validate(void) wprintf(_("Validate new users")); wprintf("\n\n
\n"); - /* If the user just submitted a validation, process it... */ + /** If the user just submitted a validation, process it... */ safestrncpy(buf, bstr("user"), sizeof buf); if (strlen(buf) > 0) { if (strlen(bstr("axlevel")) > 0) { @@ -312,7 +337,7 @@ void validate(void) } } - /* Now see if any more users require validation. */ + /** Now see if any more users require validation. */ serv_puts("GNUR"); serv_getln(buf, sizeof buf); if (buf[0] == '2') { @@ -383,10 +408,11 @@ void validate(void) -/* - * Display form for registration. +/** + * \brief Display form for registration. * (Set during_login to 1 if this registration is being performed during * new user login and will require chaining to the proper screen.) + * \param during_login are we just in the login phase? */ void display_reg(int during_login) { @@ -417,7 +443,7 @@ void display_reg(int during_login) -/* +/** * display form for changing your password */ void display_changepw(void) @@ -474,8 +500,9 @@ void display_changepw(void) wDumpContent(1); } -/* - * change password +/** + * \brief change password + * if passwords match, propagate it to citserver. */ void changepw(void) { @@ -520,3 +547,7 @@ void changepw(void) display_changepw(); } } + + + +/** @} */ diff --git a/webcit/autocompletion.c b/webcit/autocompletion.c index 6d68edd43..bd053db91 100644 --- a/webcit/autocompletion.c +++ b/webcit/autocompletion.c @@ -1,13 +1,15 @@ /* * $Id$ - * - * ajax-powered autocompletion... + *//** + * \defgroup AjaxAutoCompletion ajax-powered autocompletion... */ +/*@{*/ #include "webcit.h" -/* - * Recipient autocompletion results +/** + * \brief Recipient autocompletion results + * \param partial the account to search for ?????? */ void recp_autocomplete(char *partial) { char buf[1024]; @@ -42,3 +44,5 @@ void recp_autocomplete(char *partial) { wDumpContent(0); } + +/** @} */ diff --git a/webcit/availability.c b/webcit/availability.c index eaf0c7dc0..f02fb325e 100644 --- a/webcit/availability.c +++ b/webcit/availability.c @@ -1,21 +1,27 @@ /* * $Id$ + */ +/** * - * Check attendee availability for scheduling a meeting. - * + * \defgroup CalendarAv Check attendee availability for scheduling a meeting. + * \todo why doesn't anything of the documentation apear? */ +/*@{*/ + #include "webcit.h" #include "webserver.h" - +/** only available if we have calendaring */ #ifdef WEBCIT_WITH_CALENDAR_SERVICE -/* +/** + * \brief verify users avaiability * Utility function to fetch a VFREEBUSY type of thing for * any specified user. + * \param who string of the user to search */ icalcomponent *get_freebusy_for_user(char *who) { char buf[SIZ]; @@ -44,10 +50,16 @@ icalcomponent *get_freebusy_for_user(char *who) { -/* - * Check to see if two events overlap. Returns nonzero if they do. +/** + * \brief Check if dates are overlapping + * Check to see if two events overlap. * (This function is used in both Citadel and WebCit. If you change it in * one place, change it in the other. Better yet, put it in a library.) + * \param t1start date one start + * \param t1end date one end + * \param t2start date one start + * \param t2end date two end + * \returns nonzero if they do. */ int ical_ctdl_is_overlap( struct icaltimetype t1start, @@ -59,7 +71,7 @@ int ical_ctdl_is_overlap( if (icaltime_is_null_time(t1start)) return(0); if (icaltime_is_null_time(t2start)) return(0); - /* First, check for all-day events */ + /** First, check for all-day events */ if (t1start.is_date) { if (!icaltime_compare_date_only(t1start, t2start)) { return(1); @@ -82,29 +94,34 @@ int ical_ctdl_is_overlap( } } - /* Now check for overlaps using date *and* time. */ + /** Now check for overlaps using date *and* time. */ - /* First, bail out if either event 1 or event 2 is missing end time. */ + /** First, bail out if either event 1 or event 2 is missing end time. */ if (icaltime_is_null_time(t1end)) return(0); if (icaltime_is_null_time(t2end)) return(0); - /* If event 1 ends before event 2 starts, we're in the clear. */ + /** If event 1 ends before event 2 starts, we're in the clear. */ if (icaltime_compare(t1end, t2start) <= 0) return(0); - /* If event 2 ends before event 1 starts, we're also ok. */ + /** If event 2 ends before event 1 starts, we're also ok. */ if (icaltime_compare(t2end, t1start) <= 0) return(0); - /* Otherwise, they overlap. */ + /** Otherwise, they overlap. */ return(1); } /* + * \brief dig availability on citserver * Back end function for check_attendee_availability() * This one checks an individual attendee against a supplied * event start and end time. All these fields have already been - * broken out. The result is placed in 'annotation'. + * broken out. + * \param attendee_string name of the attendee + * \param event_start starttime of the event to check + * \param event_end endtime of the event to check + * \return The result is placed in 'annotation'. */ void check_individual_attendee(char *attendee_string, struct icaltimetype event_start, @@ -116,7 +133,8 @@ void check_individual_attendee(char *attendee_string, icalproperty *thisfb = NULL; struct icalperiodtype period; - /* Set to 'unknown' right from the beginning. Unless we learn + /** + * Set to 'unknown' right from the beginning. Unless we learn * something else, that's what we'll go with. */ strcpy(annotation, _("availability unknown")); @@ -126,7 +144,8 @@ void check_individual_attendee(char *attendee_string, return; } - /* Make sure we're looking at a VFREEBUSY by itself. What we're probably + /** + * Make sure we're looking at a VFREEBUSY by itself. What we're probably * looking at initially is a VFREEBUSY encapsulated in a VCALENDAR. */ if (icalcomponent_isa(fbc) == ICAL_VCALENDAR_COMPONENT) { @@ -136,7 +155,7 @@ void check_individual_attendee(char *attendee_string, fb = fbc; } - /* Iterate through all FREEBUSY's looking for conflicts. */ + /** Iterate through all FREEBUSY's looking for conflicts. */ if (fb != NULL) { strcpy(annotation, _("free")); @@ -145,7 +164,7 @@ void check_individual_attendee(char *attendee_string, thisfb != NULL; thisfb = icalcomponent_get_next_property(fb, ICAL_FREEBUSY_PROPERTY) ) { - /* Do the check */ + /** Do the check */ period = icalproperty_get_freebusy(thisfb); if (ical_ctdl_is_overlap(period.start, period.end, event_start, event_end)) { @@ -161,9 +180,11 @@ void check_individual_attendee(char *attendee_string, -/* +/** + * \brief check attendees availability * Check the availability of all attendees for an event (when possible) * and annotate accordingly. + * \param vevent the event which should be compared with attendees calendar */ void check_attendee_availability(icalcomponent *vevent) { icalproperty *attendee = NULL; @@ -179,7 +200,8 @@ void check_attendee_availability(icalcomponent *vevent) { return; } - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VEVENT component, attempt to use the first * relevant VEVENT subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -195,9 +217,9 @@ void check_attendee_availability(icalcomponent *vevent) { return; } - ical_dezonify(vevent); /* Convert everything to UTC */ + ical_dezonify(vevent); /**< Convert everything to UTC */ - /* + /** * Learn the start and end times. */ dtstart_p = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY); @@ -206,7 +228,7 @@ void check_attendee_availability(icalcomponent *vevent) { dtend_p = icalcomponent_get_first_property(vevent, ICAL_DTEND_PROPERTY); if (dtend_p != NULL) dtend_t = icalproperty_get_dtend(dtend_p); - /* + /** * Iterate through attendees. */ for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); @@ -216,7 +238,7 @@ void check_attendee_availability(icalcomponent *vevent) { strcpy(attendee_string, icalproperty_get_attendee(attendee)); if (!strncasecmp(attendee_string, "MAILTO:", 7)) { - /* screen name or email address */ + /** screen name or email address */ strcpy(attendee_string, &attendee_string[7]); striplt(attendee_string); @@ -224,7 +246,7 @@ void check_attendee_availability(icalcomponent *vevent) { dtstart_t, dtend_t, annotation); - /* Replace the attendee name with an annotated one. */ + /** Replace the attendee name with an annotated one. */ snprintf(annotated_attendee_string, sizeof annotated_attendee_string, "MAILTO:%s (%s)", attendee_string, annotation); icalproperty_set_attendee(attendee, annotated_attendee_string); @@ -236,3 +258,5 @@ void check_attendee_availability(icalcomponent *vevent) { #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + +/** @} */ diff --git a/webcit/calendar.c b/webcit/calendar.c index b52ce7159..ea4896c7b 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,17 +1,23 @@ /* * $Id$ - * - * Functions which handle calendar objects and their processing/display. - * */ +/** + * \defgroup calav Functions which handle calendar objects and their processing/display. + * \todo parts aren't parsed by doxygen + */ +/* @{ */ #include "webcit.h" #include "webserver.h" #ifndef WEBCIT_WITH_CALENDAR_SERVICE -/* +/** + * \brief get around non existing types * Handler stubs for builds with no calendar library available + * \param part_source dummy pointer to the source + * \param msgnum number of the mesage in the db + * \param cal_partnum number of the calendar part */ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { @@ -24,6 +30,10 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { } +/** + * \brief say we can't display calendar items + * \param msgnum number of the mesage in our db + */ void display_calendar(long msgnum) { wprintf(_("" "Cannot display calendar item. You are seeing this error " @@ -32,6 +42,10 @@ void display_calendar(long msgnum) { "
\n")); } +/** + * \brief say we can't display task items + * \param msgnum number of the mesage in our db + */ void display_task(long msgnum) { wprintf(_("" "Cannot display to-do item. You are seeing this error " @@ -39,7 +53,7 @@ void display_task(long msgnum) { "calendar support. Please contact your system administrator." "
\n")); } - +/** ok, we have calendaring available */ #else /* WEBCIT_WITH_CALENDAR_SERVICE */ @@ -48,10 +62,13 @@ void display_task(long msgnum) { -/* - * Process a calendar object +/** + * \brief Process a calendar object * ...at this point it's already been deserialized by cal_process_attachment() - * + * \param cal teh calendar object + * \param recursion_level call stack depth ?????? + * \param msgnum number of the mesage in our db + * \param cal_partnum of the calendar object ???? */ void cal_process_object(icalcomponent *cal, int recursion_level, @@ -69,15 +86,15 @@ void cal_process_object(icalcomponent *cal, char conflict_message[256]; int is_update = 0; - /* Leading HTML for the display of this object */ + /** Leading HTML for the display of this object */ if (recursion_level == 0) { wprintf("
\n"); } - /* Look for a method */ + /** Look for a method */ method = icalcomponent_get_first_property(cal, ICAL_METHOD_PROPERTY); - /* See what we need to do with this */ + /** See what we need to do with this */ if (method != NULL) { the_method = icalproperty_get_method(method); switch(the_method) { @@ -134,7 +151,7 @@ void cal_process_object(icalcomponent *cal, wprintf("\n"); } - /* + /** * Only show start/end times if we're actually looking at the VEVENT * component. Otherwise it shows bogus dates for things like timezone. */ @@ -184,7 +201,7 @@ void cal_process_object(icalcomponent *cal, wprintf("\n"); } - /* If the component has attendees, iterate through them. */ + /** If the component has attendees, iterate through them. */ for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); (p != NULL); p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) { wprintf("\n"); } - /* If the component has subcomponents, recurse through them. */ + /** If the component has subcomponents, recurse through them. */ for (c = icalcomponent_get_first_component(cal, ICAL_ANY_COMPONENT); (c != 0); c = icalcomponent_get_next_component(cal, ICAL_ANY_COMPONENT)) { @@ -213,7 +230,7 @@ void cal_process_object(icalcomponent *cal, cal_process_object(c, recursion_level+1, msgnum, cal_partnum); } - /* If this is a REQUEST, display conflicts and buttons */ + /** If this is a REQUEST, display conflicts and buttons */ if (the_method == ICAL_METHOD_REQUEST) { /* Check for conflicts */ @@ -246,7 +263,7 @@ void cal_process_object(icalcomponent *cal, } lprintf(9, "...done.\n"); - /* Display the Accept/Decline buttons */ + /** Display the Accept/Decline buttons */ wprintf("" "
"); wprintf(_("Attendee:")); @@ -192,20 +209,20 @@ void cal_process_object(icalcomponent *cal, safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf); if (!strncasecmp(buf, "MAILTO:", 7)) { - /* screen name or email address */ + /** screen name or email address */ strcpy(buf, &buf[7]); striplt(buf); escputs(buf); wprintf(" "); - /* participant status */ + /** participant status */ partstat_as_string(buf, p); escputs(buf); } wprintf("
How would you like to respond to this invitation?" "%s" @@ -262,18 +279,17 @@ void cal_process_object(icalcomponent *cal, } - /* If this is a REPLY, display update button */ + /** If this is a REPLY, display update button */ if (the_method == ICAL_METHOD_REPLY) { - /*********** - * In the future, if we want to validate this object before + /** \todo In the future, if we want to validate this object before \ * continuing, we can do it this way: serv_printf("ICAL whatever|%ld|%s|", msgnum, cal_partnum); serv_getln(buf, sizeof buf); } ***********/ - /* Display the update buttons */ + /** Display the update buttons */ wprintf("
" "%s" "" @@ -289,7 +305,7 @@ void cal_process_object(icalcomponent *cal, } - /* Trailing HTML for the display of this object */ + /** Trailing HTML for the display of this object */ if (recursion_level == 0) { wprintf("
\n"); @@ -297,9 +313,13 @@ void cal_process_object(icalcomponent *cal, } -/* +/** + * \brief process calendar mail atachment * Deserialize a calendar object in a message so it can be processed. * (This is the main entry point for these things) + * \param part_source the part of the message we want to parse + * \param msgnum number of the mesage in our db + * \param cal_partnum the number of the calendar item */ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { icalcomponent *cal; @@ -322,7 +342,8 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { -/* +/** + * \brief accept/decline meeting * Respond to a meeting request */ void respond_to_request(void) { @@ -383,8 +404,8 @@ void respond_to_request(void) { -/* - * Handle an incoming RSVP +/** + * \brief Handle an incoming RSVP */ void handle_rsvp(void) { char buf[SIZ]; @@ -437,20 +458,26 @@ void handle_rsvp(void) { - -/*****************************************************************************/ +/*@}*/ +/*-----------------------------------------------------------------------**/ -/* - * Display handlers for message reading +/** + * \defgroup MsgDisplayHandlers Display handlers for message reading + * \todo why does doxygen not parse this? and generate another group? */ +/*@{*/ -/* + +/** + * \brief get items, keep them. * If we're reading calendar items, just store them for now. We have to * sort and re-output them later when we draw the calendar. + * \param cal Our calendar to process + * \param msgnum number of the mesage in our db */ void display_individual_cal(icalcomponent *cal, long msgnum) { @@ -466,8 +493,10 @@ void display_individual_cal(icalcomponent *cal, long msgnum) { /* + * \brief edit a task * Display a task by itself (for editing) - * + * \param supplied_vtodo the todo item we want to edit + * \param msgnum number of the mesage in our db */ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalcomponent *vtodo; @@ -481,7 +510,8 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, attempt to use the first * relevant VTODO subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -593,8 +623,9 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { } /* - * Save an edited task - * + * \brief Save an edited task + * \param supplied_vtodo the task to save + * \param msgnum number of the mesage in our db */ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { char buf[SIZ]; @@ -608,7 +639,8 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, attempt to use the first * relevant VTODO subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -631,7 +663,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { if (strlen(bstr("save_button")) > 0) { - /* Replace values in the component with ones from the form */ + /** Replace values in the component with ones from the form */ while (prop = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY), prop != NULL) { @@ -669,7 +701,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalproperty_new_due(t) ); - /* Give this task a UID if it doesn't have one. */ + /** Give this task a UID if it doesn't have one. */ lprintf(9, "Give this task a UID if it doesn't have one.\n"); if (icalcomponent_get_first_property(vtodo, ICAL_UID_PROPERTY) == NULL) { @@ -679,7 +711,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { ); } - /* Increment the sequence ID */ + /** Increment the sequence ID */ lprintf(9, "Increment the sequence ID\n"); while (prop = icalcomponent_get_first_property(vtodo, ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) { @@ -695,7 +727,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalproperty_new_sequence(sequence) ); - /* + /** * Encapsulate event into full VCALENDAR component. Clone it first, * for two reasons: one, it's easier to just free the whole thing * when we're done instead of unbundling, but more importantly, we @@ -714,7 +746,8 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { serv_puts(icalcomponent_as_ical_string(encaps)); serv_puts("000"); - /* Probably not necessary; the server will see the UID + /** + * Probably not necessary; the server will see the UID * of the object and delete the old one anyway, but * just in case... */ @@ -723,7 +756,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalcomponent_free(encaps); } - /* + /** * If the user clicked 'Delete' then explicitly delete the message. */ if (strlen(bstr("delete_button")) > 0) { @@ -739,17 +772,22 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalcomponent_free(vtodo); } - /* Go back to the task list */ + /** Go back to the task list */ readloop("readfwd"); } -/* +/** + * \brief generic item handler * Code common to all display handlers. Given a message number and a MIME * type, we load the message and hunt for that MIME type. If found, we load * the relevant part, deserialize it into a libical component, filter it for * the requested object type, and feed it to the specified handler. + * \param mimetype mimetyp of our object + * \param which_kind sort of ical type + * \param msgnum number of the mesage in our db + * \param callback a funcion \todo * */ void display_using_handler(long msgnum, @@ -796,12 +834,12 @@ void display_using_handler(long msgnum, ical_dezonify(cal); - /* Simple components of desired type */ + /** Simple components of desired type */ if (icalcomponent_isa(cal) == which_kind) { callback(cal, msgnum); } - /* Subcomponents of desired type */ + /** Subcomponents of desired type */ for (c = icalcomponent_get_first_component(cal, which_kind); (c != 0); @@ -817,39 +855,53 @@ void display_using_handler(long msgnum, } +/** + * \brief display whole calendar + * \param msgnum number of the mesage in our db + */ void display_calendar(long msgnum) { display_using_handler(msgnum, "text/calendar", ICAL_VEVENT_COMPONENT, display_individual_cal); } +/** + * \brief display whole taksview + * \param msgnum number of the mesage in our db + */ void display_task(long msgnum) { display_using_handler(msgnum, "text/calendar", ICAL_VTODO_COMPONENT, display_individual_cal); } +/** + * \brief display the editor component for a task + */ void display_edit_task(void) { long msgnum = 0L; - /* Force change the room if we have to */ + /** Force change the room if we have to */ if (strlen(bstr("taskrm")) > 0) { gotoroom(bstr("taskrm")); } msgnum = atol(bstr("msgnum")); if (msgnum > 0L) { - /* existing task */ + /** existing task */ display_using_handler(msgnum, "text/calendar", ICAL_VTODO_COMPONENT, display_edit_individual_task); } else { - /* new task */ + /** new task */ display_edit_individual_task(NULL, 0L); } } +/** + *\brief save an edited task + */ void save_task(void) { long msgnum = 0L; @@ -864,6 +916,9 @@ void save_task(void) { } } +/** + * \brief display the editor component for an event + */ void display_edit_event(void) { long msgnum = 0L; @@ -880,6 +935,9 @@ void display_edit_event(void) { } } +/** + * \brief save an edited event + */ void save_event(void) { long msgnum = 0L; @@ -899,8 +957,9 @@ void save_event(void) { -/* - * freebusy display (for client software) +/** + * \brief freebusy display (for client software) + * \param req dunno. ????? */ void do_freebusy(char *req) { char who[SIZ]; @@ -940,3 +999,6 @@ void do_freebusy(char *req) { #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + + +/*@}*/ diff --git a/webcit/calendar_tools.c b/webcit/calendar_tools.c index 3fbab7eec..be8e16f98 100644 --- a/webcit/calendar_tools.c +++ b/webcit/calendar_tools.c @@ -1,14 +1,16 @@ /* * $Id$ - * - * Miscellaneous functions which handle calendar components. */ - +/** + * \defgroup MiscCal Miscellaneous functions which handle calendar components. + */ +/*@{*/ #include "webcit.h" #include "webserver.h" -/* FIXME ... this needs to be internationalized */ -char *months[] = { +/* \todo FIXME ... this needs to be internationalized */ +/** Month Strings. */ +char *months[] = { "January", "February", "March", @@ -23,7 +25,8 @@ char *months[] = { "December" }; -char *days[] = { +/** Day Strings */ +char *days[] = { "Sunday", "Monday", "Tuesday", @@ -33,6 +36,7 @@ char *days[] = { "Saturday" }; +/** Hour strings */ char *hourname[] = { "12am", "1am", "2am", "3am", "4am", "5am", "6am", "7am", "8am", "9am", "10am", "11am", "12pm", @@ -42,7 +46,8 @@ char *hourname[] = { #ifdef WEBCIT_WITH_CALENDAR_SERVICE -/* +/** + * \brief display and edit date/time * The display_icaltimetype_as_webform() and icaltime_from_webform() functions * handle the display and editing of date/time properties in web pages. The * first one converts an icaltimetype into valid HTML markup -- a series of form @@ -53,10 +58,12 @@ char *hourname[] = { * property (for example, a start and end time) by ensuring the field names are * unique within the form. * - * NOTE: These functions assume that the icaltimetype being edited is in UTC, and + * \todo NOTE: These functions assume that the icaltimetype being edited is in UTC, and * will convert to/from local time for editing. "local" in this case is assumed * to be the time zone in which the WebCit server is running. A future improvement * might be to allow the user to specify his/her timezone. + * \param t the time we want to parse + * \param prefix ???? \todo */ @@ -159,7 +166,12 @@ void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix) { wprintf("\n"); } - +/** + *\brief Get time from form + * get the time back from the user and convert it into internal structs. + * \param t our time element + * \param prefix whats that\todo ???? + */ void icaltime_from_webform(struct icaltimetype *t, char *prefix) { char vname[32]; time_t tt; @@ -180,6 +192,12 @@ void icaltime_from_webform(struct icaltimetype *t, char *prefix) { memcpy(t, &t2, sizeof(struct icaltimetype)); } +/** + *\brief Get time from form + * get the time back from the user and convert it into internal structs. + * \param t our time element + * \param prefix whats that\todo ???? + */ void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) { char vname[32]; @@ -194,8 +212,11 @@ void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) { } -/* +/** + * \brief Render PAPSTAT * Render a PARTSTAT parameter as a string (and put it in parentheses) + * \param buf the string to put it to + * \param attendee the attendee to textify */ void partstat_as_string(char *buf, icalproperty *attendee) { icalparameter *partstat_param; @@ -244,8 +265,11 @@ void partstat_as_string(char *buf, icalproperty *attendee) { } -/* +/** + * \brief embedd * Utility function to encapsulate a subcomponent into a full VCALENDAR + * \param subcomp the component to encapsulate + * \returns the meta object ??? */ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { icalcomponent *encaps; @@ -257,14 +281,15 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { return NULL; } - /* If we're already looking at a full VCALENDAR component, + /** + * If we're already looking at a full VCALENDAR component, * don't bother ... just return itself. */ if (icalcomponent_isa(subcomp) == ICAL_VCALENDAR_COMPONENT) { return subcomp; } - /* Encapsulate the VEVENT component into a complete VCALENDAR */ + /** Encapsulate the VEVENT component into a complete VCALENDAR */ encaps = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); if (encaps == NULL) { lprintf(3, "%s:%d: Error - could not allocate component!\n", @@ -272,22 +297,22 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { return NULL; } - /* Set the Product ID */ + /** Set the Product ID */ icalcomponent_add_property(encaps, icalproperty_new_prodid(PRODID)); - /* Set the Version Number */ + /** Set the Version Number */ icalcomponent_add_property(encaps, icalproperty_new_version("2.0")); - /* Encapsulate the subcomponent inside */ + /** Encapsulate the subcomponent inside */ /* lprintf(9, "Doing the encapsulation\n"); */ icalcomponent_add_component(encaps, subcomp); - /* Convert all timestamps to UTC so we don't have to deal with + /** Convert all timestamps to UTC so we don't have to deal with * stupid VTIMEZONE crap. */ ical_dezonify(encaps); - /* Return the object we just created. */ + /** Return the object we just created. */ return(encaps); } @@ -295,3 +320,4 @@ icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) { #endif +/*@}*/ diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c index 0879948fb..92b6eaacb 100644 --- a/webcit/calendar_view.c +++ b/webcit/calendar_view.c @@ -1,21 +1,24 @@ /* * $Id$ - * - * Handles the HTML display of calendar items. */ - +/** + * \defgroup CalHtmlHandles Handles the HTML display of calendar items. + */ +/*@{*/ #include "webcit.h" #include "webserver.h" #ifndef WEBCIT_WITH_CALENDAR_SERVICE -void do_calendar_view(void) { /* stub for non-libical builds */ +/**\brief stub for non-libical builds */ +void do_calendar_view(void) { wprintf("
"); wprintf(_("The calendar view is not available.")); wprintf("

\n"); } -void do_tasks_view(void) { /* stub for non-libical builds */ +/**\brief stub for non-libical builds */ +void do_tasks_view(void) { wprintf("
"); wprintf(_("The tasks view is not available.")); wprintf("

\n"); @@ -25,7 +28,10 @@ void do_tasks_view(void) { /* stub for non-libical builds */ /****************************************************************************/ - +/** + * \brief Display a whole month view of a calendar + * \param thetime the month we want to see + */ void calendar_month_view_display_events(time_t thetime) { int i; time_t event_tt; @@ -104,7 +110,12 @@ void calendar_month_view_display_events(time_t thetime) { } - +/** + * \brief view one day + * \param year the year + * \param month the month + * \param day the actual day we want to see + */ void calendar_month_view(int year, int month, int day) { struct tm starting_tm; struct tm tm; @@ -113,7 +124,7 @@ void calendar_month_view(int year, int month, int day) { time_t previous_month; time_t next_month; - /* Determine what day to start. + /** Determine what day to start. * First, back up to the 1st of the month... */ memset(&starting_tm, 0, sizeof(struct tm)); @@ -128,18 +139,18 @@ void calendar_month_view(int year, int month, int day) { localtime_r(&thetime, &tm); } - /* Determine previous and next months ... for links */ + /** Determine previous and next months ... for links */ previous_month = thetime - (time_t)864000L; /* back 10 days */ next_month = thetime + (time_t)(31L * 86400L); /* ahead 31 days */ - /* Now back up until we're on a Sunday */ + /** Now back up until we're on a Sunday */ localtime_r(&thetime, &tm); while (tm.tm_wday != 0) { thetime = thetime - (time_t)86400; /* go back 24 hours */ localtime_r(&thetime, &tm); } - /* Outer table (to get the background color) */ + /** Outer table (to get the background color) */ wprintf("
" "
\n"); @@ -166,7 +177,7 @@ void calendar_month_view(int year, int month, int day) { wprintf("
\n"); - /* Inner table (the real one) */ + /** Inner table (the real one) */ wprintf(""); for (i=0; i<7; ++i) { @@ -175,7 +186,7 @@ void calendar_month_view(int year, int month, int day) { } wprintf("\n"); - /* Now do 35 days */ + /** Now do 35 days */ for (i = 0; i < 35; ++i) { localtime_r(&thetime, &tm); @@ -199,33 +210,45 @@ void calendar_month_view(int year, int month, int day) { tm.tm_mday, tm.tm_mday); - /* put the data here, stupid */ + /** put the data here, stupid */ calendar_month_view_display_events(thetime); wprintf(""); - /* After displaying Saturday, end the row */ + /** After displaying Saturday, end the row */ if ((i % 7) == 6) { wprintf("\n"); } - thetime += (time_t)86400; /* ahead 24 hours */ + thetime += (time_t)86400; /** ahead 24 hours */ } - wprintf("
" /* end of inner table */ - "" /* end of outer table */ + wprintf("" /** end of inner table */ + "" /** end of outer table */ "
\n"); } - +/** + * \brief view one week + * this should view just one week, but it's not here yet. + * \todo ny implemented + * \param year the year + * \param month the month + * \param day the day which we want to see the week around + */ void calendar_week_view(int year, int month, int day) { wprintf("
week view FIXME

\n"); } -/* +/** + * \brief display one day * Display events for a particular hour of a particular day. * (Specify hour < 0 to show "all day" events) + * \param year the year + * \param month the month + * \param day the day + * \param hour the hour we want to start displaying????? */ void calendar_day_view_display_events(int year, int month, int day, int hour) { @@ -237,7 +260,7 @@ void calendar_day_view_display_events(int year, int month, int all_day_event = 0; if (WC->num_cal == 0) { - // FIXME wprintf("


\n"); + // \todo FIXME wprintf("


\n"); return; } @@ -301,7 +324,12 @@ void calendar_day_view_display_events(int year, int month, } - +/** + * \brief view one day + * \param year the year + * \param month the month + * \param day the day we want to display + */ void calendar_day_view(int year, int month, int day) { int hour; struct icaltimetype today, yesterday, tomorrow; @@ -317,7 +345,7 @@ void calendar_day_view(int year, int month, int day) { if (strlen(dayend_str) > 0) dayend = atoi(dayend_str); - /* Figure out the dates for "yesterday" and "tomorrow" links */ + /** Figure out the dates for "yesterday" and "tomorrow" links */ memset(&today, 0, sizeof(struct icaltimetype)); today.year = year; @@ -334,21 +362,21 @@ void calendar_day_view(int year, int month, int day) { tomorrow = icaltime_normalize(tomorrow); - /* Outer table (to get the background color) */ + /** Outer table (to get the background color) */ wprintf("
" "
\n"); - /* Inner table (the real one) */ + /** Inner table (the real one) */ wprintf("\n"); - /* Innermost table (contains hours etc.) */ + /** Innermost table (contains hours etc.) */ wprintf("
" "\n"); - /* Display events before 8:00 (hour=-1 is all-day events) */ + /** Display events before 8:00 (hour=-1 is all-day events) */ wprintf("" "" "\n"); - /* Now the middle of the day... */ + /** Now the middle of the day... */ for (hour = daystart; hour <= dayend; ++hour) { /* could do HEIGHT=xx */ wprintf("\n"); } - /* Display events after 5:00... */ + /** Display events after 5:00... */ wprintf("" "" ""); /* end stuff-on-the-right */ + wprintf(""); /** end stuff-on-the-right */ - wprintf("
"); @@ -357,7 +385,7 @@ void calendar_day_view(int year, int month, int day) { } wprintf("
"); @@ -384,7 +412,7 @@ void calendar_day_view(int year, int month, int day) { wprintf("
"); @@ -401,19 +429,19 @@ void calendar_day_view(int year, int month, int day) { wprintf(""); /* begin stuff-on-the-right */ - /* Begin todays-date-with-left-and-right-arrows */ + /** Begin todays-date-with-left-and-right-arrows */ wprintf("\n"); wprintf(""); - /* Left arrow */ + /** Left arrow */ wprintf(""); - /* Today's date */ + /** Today's date */ wprintf(""); - /* Right arrow */ + /** Right arrow */ wprintf(""); wprintf("
"); wprintf("", yesterday.year, yesterday.month, yesterday.day); wprintf(""); wprintf(""); wprintf("%s
" "%d
" @@ -421,7 +449,7 @@ void calendar_day_view(int year, int month, int day) { months[month-1], day, year); wprintf("
"); wprintf("", tomorrow.year, tomorrow.month, tomorrow.day); @@ -430,26 +458,26 @@ void calendar_day_view(int year, int month, int day) { wprintf("
\n"); - /* End todays-date-with-left-and-right-arrows */ + /** End todays-date-with-left-and-right-arrows */ - /* In the future we might want to put a month-o-matic here */ + /** \todo In the future we might want to put a month-o-matic here */ wprintf("\n"); - wprintf("
" /* end of inner table */ - "
" /* end of outer table */ + wprintf("
" /** end of inner table */ + "
" /** end of outer table */ ); } -/* - * Display today's events. +/** + * \brief Display today's events. */ void calendar_summary_view(void) { int i; @@ -511,7 +539,10 @@ void calendar_summary_view(void) { } - +/** + * \brief clean up ical memory + * \todo this could get troubel with future ical versions + */ void free_calendar_buffer(void) { int i; if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) { @@ -524,26 +555,29 @@ void free_calendar_buffer(void) { - +/** + * \brief do the whole calendar page + * view any part of the calender. decide which way, etc. + */ void do_calendar_view(void) { time_t now; struct tm tm; int year, month, day; char calview[SIZ]; - /* In case no date was specified, go with today */ + /** In case no date was specified, go with today */ now = time(NULL); localtime_r(&now, &tm); year = tm.tm_year + 1900; month = tm.tm_mon + 1; day = tm.tm_mday; - /* Now see if a date was specified */ + /** Now see if a date was specified */ if (strlen(bstr("year")) > 0) year = atoi(bstr("year")); if (strlen(bstr("month")) > 0) month = atoi(bstr("month")); if (strlen(bstr("day")) > 0) day = atoi(bstr("day")); - /* How would you like that cooked? */ + /** How would you like that cooked? */ if (strlen(bstr("calview")) > 0) { strcpy(calview, bstr("calview")); } @@ -551,7 +585,7 @@ void do_calendar_view(void) { strcpy(calview, "month"); } - /* Display the selected view */ + /** Display the selected view */ if (!strcasecmp(calview, "day")) { calendar_day_view(year, month, day); } @@ -562,14 +596,17 @@ void do_calendar_view(void) { calendar_month_view(year, month, day); } - /* Free the calendar stuff */ + /** Free the calendar stuff */ free_calendar_buffer(); } -/* - * Helper function for do_tasks_view(). Returns the date/time due. +/** + * \brief get task due date + * Helper function for do_tasks_view(). + * \param vtodo a task to get the due date + * \return the date/time due. */ time_t get_task_due_date(icalcomponent *vtodo) { icalproperty *p; @@ -578,7 +615,8 @@ time_t get_task_due_date(icalcomponent *vtodo) { return(0L); } - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, recurse into the data * structure until we get a VTODO. */ @@ -600,8 +638,10 @@ time_t get_task_due_date(icalcomponent *vtodo) { } -/* - * Compare the due dates of two tasks (this is for sorting) +/** + * \brief Compare the due dates of two tasks (this is for sorting) + * \param task1 first task to compare + * \param task2 second task to compare */ int task_due_cmp(const void *task1, const void *task2) { time_t t1; @@ -618,7 +658,9 @@ int task_due_cmp(const void *task1, const void *task2) { - +/** + * \brief do the whole task view stuff + */ void do_tasks_view(void) { int i; time_t due; @@ -635,7 +677,7 @@ void do_tasks_view(void) { wprintf("\n" ); - /* Sort them if necessary */ + /** Sort them if necessary */ if (WC->num_cal > 1) { qsort(WC->disp_cal, WC->num_cal, @@ -676,9 +718,11 @@ void do_tasks_view(void) { wprintf("
\n"); - /* Free the list */ + /** Free the list */ free_calendar_buffer(); } #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + +/** @} */ diff --git a/webcit/context_loop.c b/webcit/context_loop.c index c013fe8e7..11a997c1b 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -1,24 +1,30 @@ /* * $Id$ - * + */ +/** + * \defgroup WebServerII some of the webserver stuff. * This is the other half of the webserver. It handles the task of hooking * up HTTP requests with the sessions they belong to, using HTTP cookies to * keep track of things. If the HTTP request doesn't belong to any currently * active session, a new session is started. * */ - +/*@{*/ #include "webcit.h" #include "webserver.h" -/* Only one thread may manipulate SessionList at a time... */ +/** Only one thread may manipulate SessionList at a time... */ pthread_mutex_t SessionListMutex; -struct wcsession *SessionList = NULL; +struct wcsession *SessionList = NULL; /**< our sessions ????*/ -pthread_key_t MyConKey; /* TSD key for MySession() */ +pthread_key_t MyConKey; /**< TSD key for MySession() */ +/** + * \brief free the memory used for viewing atachments + * \param sess the session object to destroy + */ void free_attachments(struct wcsession *sess) { struct wc_attachment *att; @@ -30,7 +36,9 @@ void free_attachments(struct wcsession *sess) { } } - +/** + * \brief what?????? + */ void do_housekeeping(void) { struct wcsession *sptr, *ss; @@ -38,7 +46,7 @@ void do_housekeeping(void) int num_sessions = 0; static int num_threads = MIN_WORKER_THREADS; - /* + /** * Lock the session list, moving any candidates for euthanasia into * a separate list. */ @@ -47,16 +55,16 @@ void do_housekeeping(void) for (sptr = SessionList; sptr != NULL; sptr = sptr->next) { ++num_sessions; - /* Kill idle sessions */ + /** Kill idle sessions */ if ((time(NULL) - (sptr->lastreq)) > (time_t) WEBCIT_TIMEOUT) { sptr->killthis = 1; } - /* Remove sessions flagged for kill */ + /** Remove sessions flagged for kill */ if (sptr->killthis) { - /* remove session from linked list */ + /** remove session from linked list */ if (sptr == SessionList) { SessionList = SessionList->next; } @@ -72,7 +80,7 @@ void do_housekeeping(void) } pthread_mutex_unlock(&SessionListMutex); - /* + /** * Now free up and destroy the culled sessions. */ while (sessions_to_kill != NULL) { @@ -94,7 +102,7 @@ void do_housekeeping(void) --num_sessions; } - /* + /** * If there are more sessions than threads, then we should spawn * more threads ... up to a predefined maximum. */ @@ -108,8 +116,8 @@ void do_housekeeping(void) } -/* - * Wake up occasionally and clean house +/** + * \brief Wake up occasionally and clean house */ void housekeeping_loop(void) { @@ -120,11 +128,12 @@ void housekeeping_loop(void) } -/* +/** + * \brief Create a Session id * Generate a unique WebCit session ID (which is not the same thing as the * Citadel session ID). * - * FIXME ... ensure that session number is truly unique + * \todo FIXME ... ensure that session number is truly unique * */ int GenerateSessionID(void) @@ -139,8 +148,11 @@ int GenerateSessionID(void) } -/* - * Collapse multiple cookies on one line +/** + * \brief Collapse multiple cookies on one line + * \param sock a socket? + * \param buf some bunch of chars? + * \param hold hold what? */ int req_gets(int sock, char *buf, char *hold) { @@ -169,7 +181,9 @@ int req_gets(int sock, char *buf, char *hold) return(0); } -/* +/** + * \brief close some fd for some reason??? + * \param fd the fd to close?????? * lingering_close() a`la Apache. see * http://www.apache.org/docs/misc/fin_wait_2.html for rationale */ @@ -208,11 +222,13 @@ int lingering_close(int fd) -/* +/** + * \brief sanity requests * Check for bogus requests coming from (for example) brain-dead * Windoze boxes that are infected with the latest worm-of-the-week. * If we detect one of these, bail out without bothering our Citadel * server. + * \param http_cmd the cmd to check */ int is_bogus(char *http_cmd) { @@ -225,7 +241,8 @@ int is_bogus(char *http_cmd) { -/* +/** + * \brief handle one request * This loop gets called once for every HTTP connection made to WebCit. At * this entry point we have an HTTP socket with a browser allegedly on the * other end, but we have not yet bound to a WebCit session. @@ -235,6 +252,7 @@ int is_bogus(char *http_cmd) { * transaction loop. Afterwards, we unbind from the session. When this * function returns, the worker thread is then free to handle another * transaction. + * \param sock the socket we will put our answer to */ void context_loop(int sock) { @@ -257,14 +275,14 @@ void context_loop(int sock) strcpy(httpauth_user, DEFAULT_HTTPAUTH_USER); strcpy(httpauth_pass, DEFAULT_HTTPAUTH_PASS); - /* + /** * Find out what it is that the web browser is asking for */ memset(hold, 0, sizeof(hold)); do { if (req_gets(sock, buf, hold) < 0) return; - /* + /** * Can we compress? */ if (!strncasecmp(buf, "Accept-encoding:", 16)) { @@ -273,7 +291,7 @@ void context_loop(int sock) } } - /* + /** * Browser-based sessions use cookies for session authentication */ if (!strncasecmp(buf, "Cookie: webcit=", 15)) { @@ -282,7 +300,7 @@ void context_loop(int sock) got_cookie = 1; } - /* + /** * GroupDAV-based sessions use HTTP authentication */ if (!strncasecmp(buf, "Authorization: Basic ", 21)) { @@ -299,7 +317,7 @@ void context_loop(int sock) safestrncpy(accept_language, &buf[17], sizeof accept_language); } - /* + /** * Read in the request */ hptr = (struct httprequest *) @@ -315,37 +333,37 @@ void context_loop(int sock) } while (strlen(buf) > 0); - /* + /** * If the request is prefixed by "/webcit" then chop that off. This * allows a front end web server to forward all /webcit requests to us * while still using the same web server port for other things. */ - ptr = strstr(req->line, " /webcit "); /* Handle "/webcit" */ + ptr = strstr(req->line, " /webcit "); /*< Handle "/webcit" */ if (ptr != NULL) { strcpy(ptr+2, ptr+8); } - ptr = strstr(req->line, " /webcit"); /* Handle "/webcit/" */ + ptr = strstr(req->line, " /webcit"); /*< Handle "/webcit/" */ if (ptr != NULL) { strcpy(ptr+1, ptr+8); } - /* Begin parsing the request. */ + /** Begin parsing the request. */ safestrncpy(buf, req->line, sizeof buf); lprintf(5, "HTTP: %s\n", buf); - /* Check for bogus requests */ + /** Check for bogus requests */ if (is_bogus(buf)) goto bail; - /* + /** * Strip out the method, leaving the URL up front... */ remove_token(buf, 0, ' '); if (buf[1]==' ') buf[1]=0; - /* + /** * While we're at it, gracefully handle requests for the * robots.txt and favicon.ico files. */ @@ -357,7 +375,8 @@ void context_loop(int sock) strcpy(req->line, "GET /static/favicon.ico"); } - /* These are the URL's which may be executed without a + /** + * These are the URL's which may be executed without a * session cookie already set. If it's not one of these, * force the session to close because cookies are * probably disabled on the client browser. @@ -374,7 +393,7 @@ void context_loop(int sock) "?force_close_session=yes HTTP/1.1"); } - /* + /** * See if there's an existing session open with the desired ID or user/pass */ TheSession = NULL; @@ -383,14 +402,14 @@ void context_loop(int sock) pthread_mutex_lock(&SessionListMutex); for (sptr = SessionList; sptr != NULL; sptr = sptr->next) { - /* If HTTP-AUTH, look for a session with matching credentials */ + /** If HTTP-AUTH, look for a session with matching credentials */ if ( (strlen(httpauth_user) > 0) &&(!strcasecmp(sptr->httpauth_user, httpauth_user)) &&(!strcasecmp(sptr->httpauth_pass, httpauth_pass)) ) { TheSession = sptr; } - /* If cookie-session, look for a session with matching session ID */ + /** If cookie-session, look for a session with matching session ID */ if ( (desired_session != 0) && (sptr->wc_session == desired_session)) { TheSession = sptr; } @@ -399,7 +418,7 @@ void context_loop(int sock) pthread_mutex_unlock(&SessionListMutex); } - /* + /** * Create a new session if we have to */ if (TheSession == NULL) { @@ -420,40 +439,42 @@ void context_loop(int sock) session_is_new = 1; } - /* + /** * A future improvement might be to check the session integrity * at this point before continuing. */ - /* + /** * Bind to the session and perform the transaction */ - pthread_mutex_lock(&TheSession->SessionMutex); /* bind */ + pthread_mutex_lock(&TheSession->SessionMutex); /*< bind */ pthread_setspecific(MyConKey, (void *)TheSession); TheSession->http_sock = sock; - TheSession->lastreq = time(NULL); /* log */ + TheSession->lastreq = time(NULL); /*< log */ TheSession->gzip_ok = gzip_ok; #ifdef ENABLE_NLS if (session_is_new) { httplang_to_locale(accept_language); } - go_selected_language(); /* set locale */ + go_selected_language(); /*< set locale */ #endif - session_loop(req); /* do transaction */ + session_loop(req); /*< do transaction */ #ifdef ENABLE_NLS - stop_selected_language(); /* unset locale */ + stop_selected_language(); /*< unset locale */ #endif - pthread_mutex_unlock(&TheSession->SessionMutex); /* unbind */ + pthread_mutex_unlock(&TheSession->SessionMutex); /*< unbind */ - /* Free the request buffer */ + /** Free the request buffer */ bail: while (req != NULL) { hptr = req->next; free(req); req = hptr; } - /* Free up any session-local substitution variables which + /** + * Free up any session-local substitution variables which * were set during this transaction */ clear_local_substs(); } +/*@}*/ diff --git a/webcit/cookie_conversion.c b/webcit/cookie_conversion.c index 599e20228..040eee612 100644 --- a/webcit/cookie_conversion.c +++ b/webcit/cookie_conversion.c @@ -1,20 +1,29 @@ /* * $Id$ - * + */ +/** + * \defgroup CookieConversion Grep Cookies * Utility functions which convert the HTTP cookie format we use to and * from user/password/room strings. * */ - +/*@{*/ #include "webcit.h" -#define TRUE 1 -#define FALSE 0 -typedef unsigned char byte; /* Byte type */ +#define TRUE 1 /**< for sure? */ +#define FALSE 0 /**< nope. */ -/* +typedef unsigned char byte; /**< Byte type */ + +/** + * \brief find cookie * Pack all session info into one easy-to-digest cookie. Healthy and delicious! + * \param cookie cookie string to create??? + * \param session the session we want to convert into a cookie + * \param user the user to be associated with the cookie + * \param pass his passphrase + * \param room the room he wants to enter */ void stuff_to_cookie(char *cookie, int session, char *user, char *pass, char *room) @@ -29,6 +38,12 @@ void stuff_to_cookie(char *cookie, int session, } } +/** + * \brief some bytefoo ???? + * \param in the string to chop + * \param len the length of the string + * \return the corrosponding integer value + */ int xtoi(char *in, size_t len) { int val = 0; @@ -42,8 +57,16 @@ int xtoi(char *in, size_t len) return val; } -/* - * Extract all that fun stuff out of the cookie. +/** + * \brief Extract all that fun stuff out of the cookie. + * \param cookie the cookie string + * \param session the corrosponding session to return + * \param user the user string + * \param user_len the user stringlength + * \param pass the passphrase + * \param pass_len length of the passphrase string + * \param room the room he is in + * \param room_len the length of the room string */ void cookie_to_stuff(char *cookie, int *session, char *user, size_t user_len, @@ -69,3 +92,4 @@ void cookie_to_stuff(char *cookie, int *session, if (room != NULL) extract_token(room, buf, 3, '|', room_len); } +/*@}*/ diff --git a/webcit/crypto.c b/webcit/crypto.c index d55d8791a..bee791d5c 100644 --- a/webcit/crypto.c +++ b/webcit/crypto.c @@ -1,31 +1,41 @@ /* * $Id$ - * - * Provides HTTPS, when the OpenSSL library is available. + */ +/** + * \defgroup https Provides HTTPS, when the OpenSSL library is available. */ +/*@{*/ #ifdef HAVE_OPENSSL #include "webcit.h" #include "webserver.h" - -#define CTDL_CRYPTO_DIR "./keys" -#define CTDL_KEY_PATH CTDL_CRYPTO_DIR "/citadel.key" -#define CTDL_CSR_PATH CTDL_CRYPTO_DIR "/citadel.csr" -#define CTDL_CER_PATH CTDL_CRYPTO_DIR "/citadel.cer" -#define SIGN_DAYS 365 - -SSL_CTX *ssl_ctx; /* SSL context */ -pthread_mutex_t **SSLCritters; /* Things needing locking */ - -pthread_key_t ThreadSSL; /* Per-thread SSL context */ - +/** \todo dirify */ +/** where to find the keys */ +#define CTDL_CRYPTO_DIR "./keys" +#define CTDL_KEY_PATH CTDL_CRYPTO_DIR "/citadel.key" /**< the key */ +#define CTDL_CSR_PATH CTDL_CRYPTO_DIR "/citadel.csr" /**< the csr file */ +#define CTDL_CER_PATH CTDL_CRYPTO_DIR "/citadel.cer" /**< the cer file */ +#define SIGN_DAYS 365 /**< how long our certificate should live */ + +SSL_CTX *ssl_ctx; /**< SSL context */ +pthread_mutex_t **SSLCritters; /**< Things needing locking */ + +pthread_key_t ThreadSSL; /**< Per-thread SSL context */ + +/** + * \brief what????? + * \return thread id??? + */ static unsigned long id_callback(void) { return (unsigned long) pthread_self(); } - +/** + * \brief initialize ssl engine + * load certs and initialize openssl internals + */ void init_ssl(void) { SSL_METHOD *ssl_method; @@ -60,14 +70,14 @@ void init_ssl(void) if (!SSLCritters[a]) { lprintf(1, "citserver: can't allocate memory!!\n"); - /* Nothing's been initialized, just die */ + /** Nothing's been initialized, just die */ exit(1); } pthread_mutex_init(SSLCritters[a], NULL); } } - /* + /** * Initialize SSL transport layer */ SSL_library_init(); @@ -82,18 +92,19 @@ void init_ssl(void) CRYPTO_set_locking_callback(ssl_lock); CRYPTO_set_id_callback(id_callback); - /* Get our certificates in order. + /** + * Get our certificates in order. \todo dirify. this is a setup job. * First, create the key/cert directory if it's not there already... */ mkdir(CTDL_CRYPTO_DIR, 0700); - /* + /** * Before attempting to generate keys/certificates, first try * link to them from the Citadel server if it's on the same host. * We ignore any error return because it either meant that there * was nothing in Citadel to link from (in which case we just * generate new files) or the target files already exist (which - * is not fatal either). + * is not fatal either). \todo dirify */ if (!strcasecmp(ctdlhost, "uds")) { sprintf(buf, "%s/keys/citadel.key", ctdlport); @@ -104,15 +115,15 @@ void init_ssl(void) symlink(buf, CTDL_CER_PATH); } - /* + /** * If we still don't have a private key, generate one. */ if (access(CTDL_KEY_PATH, R_OK) != 0) { lprintf(5, "Generating RSA key pair.\n"); - rsa = RSA_generate_key(1024, /* modulus size */ - 65537, /* exponent */ - NULL, /* no callback */ - NULL); /* no callback */ + rsa = RSA_generate_key(1024, /**< modulus size */ + 65537, /**< exponent */ + NULL, /**< no callback */ + NULL); /**< no callback */ if (rsa == NULL) { lprintf(3, "Key generation failed: %s\n", ERR_reason_error_string(ERR_get_error())); @@ -121,13 +132,13 @@ void init_ssl(void) fp = fopen(CTDL_KEY_PATH, "w"); if (fp != NULL) { chmod(CTDL_KEY_PATH, 0600); - if (PEM_write_RSAPrivateKey(fp, /* the file */ - rsa, /* the key */ - NULL, /* no enc */ - NULL, /* no passphr */ - 0, /* no passphr */ - NULL, /* no callbk */ - NULL /* no callbk */ + if (PEM_write_RSAPrivateKey(fp, /**< the file */ + rsa, /**< the key */ + NULL, /**< no enc */ + NULL, /**< no passphr */ + 0, /**< no passphr */ + NULL, /**< no callbk */ + NULL /**< no callbk */ ) != 1) { lprintf(3, "Cannot write key: %s\n", ERR_reason_error_string(ERR_get_error())); @@ -139,13 +150,13 @@ void init_ssl(void) } } - /* + /** * Generate a CSR if we don't have one. */ if (access(CTDL_CSR_PATH, R_OK) != 0) { lprintf(5, "Generating a certificate signing request.\n"); - /* + /** * Read our key from the file. No, we don't just keep this * in memory from the above key-generation function, because * there is the possibility that the key was already on disk @@ -159,20 +170,20 @@ void init_ssl(void) if (rsa) { - /* Create a public key from the private key */ + /** Create a public key from the private key */ if (pk=EVP_PKEY_new(), pk != NULL) { EVP_PKEY_assign_RSA(pk, rsa); if (req = X509_REQ_new(), req != NULL) { - /* Set the public key */ + /** Set the public key */ X509_REQ_set_pubkey(req, pk); X509_REQ_set_version(req, 0L); name = X509_REQ_get_subject_name(req); - /* Tell it who we are */ + /** Tell it who we are */ - /* + /* \todo whats this? X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "US", -1, -1, 0); @@ -194,12 +205,12 @@ void init_ssl(void) X509_REQ_set_subject_name(req, name); - /* Sign the CSR */ + /** Sign the CSR */ if (!X509_REQ_sign(req, pk, EVP_md5())) { lprintf(3, "X509_REQ_sign(): error\n"); } else { - /* Write it to disk. */ + /** Write it to disk. */ fp = fopen(CTDL_CSR_PATH, "w"); if (fp != NULL) { chmod(CTDL_CSR_PATH, 0600); @@ -222,13 +233,13 @@ void init_ssl(void) - /* + /** * Generate a self-signed certificate if we don't have one. */ if (access(CTDL_CER_PATH, R_OK) != 0) { lprintf(5, "Generating a self-signed certificate.\n"); - /* Same deal as before: always read the key from disk because + /** Same deal as before: always read the key from disk because * it may or may not have just been generated. */ fp = fopen(CTDL_KEY_PATH, "r"); @@ -237,7 +248,7 @@ void init_ssl(void) fclose(fp); } - /* This also holds true for the CSR. */ + /** This also holds true for the CSR. */ req = NULL; cer = NULL; pk = NULL; @@ -265,12 +276,12 @@ void init_ssl(void) X509_set_pubkey(cer, req_pkey); EVP_PKEY_free(req_pkey); - /* Sign the cert */ + /** Sign the cert */ if (!X509_sign(cer, pk, EVP_md5())) { lprintf(3, "X509_sign(): error\n"); } else { - /* Write it to disk. */ + /** Write it to disk. */ fp = fopen(CTDL_CER_PATH, "w"); if (fp != NULL) { chmod(CTDL_CER_PATH, 0600); @@ -286,7 +297,7 @@ void init_ssl(void) } } - /* + /** * Now try to bind to the key and certificate. * Note that we use SSL_CTX_use_certificate_chain_file() which allows * the certificate file to contain intermediate certificates. @@ -301,8 +312,10 @@ void init_ssl(void) } -/* - * starttls() starts SSL/TLS encryption for the current session. +/** + * \brief starts SSL/TLS encryption for the current session. + * \param sock the socket connection + * \return foo???? */ int starttls(int sock) { int retval, bits, alg_bits; @@ -326,7 +339,7 @@ int starttls(int sock) { } retval = SSL_accept(newssl); if (retval < 1) { - /* + /** * Can't notify the client of an error here; they will * discover the problem at the SSL layer and should * revert to unencrypted communications. @@ -355,8 +368,8 @@ int starttls(int sock) { -/* - * endtls() shuts down the TLS connection +/** + * \brief shuts down the TLS connection * * WARNING: This may make your session vulnerable to a known plaintext * attack in the current implmentation. @@ -372,8 +385,12 @@ void endtls(void) } -/* - * ssl_lock() callback for OpenSSL mutex locks +/** + * \brief callback for OpenSSL mutex locks + * \param mode which mode?????? + * \param n how many??? + * \param file which filename ??? + * \param line what line???? */ void ssl_lock(int mode, int n, const char *file, int line) { @@ -383,8 +400,10 @@ void ssl_lock(int mode, int n, const char *file, int line) pthread_mutex_unlock(SSLCritters[n]); } -/* - * client_write_ssl() Send binary data to the client encrypted. +/** + * \brief Send binary data to the client encrypted. + * \param buf chars to send to the client + * \param nbytes how many chars */ void client_write_ssl(char *buf, int nbytes) { @@ -425,8 +444,12 @@ void client_write_ssl(char *buf, int nbytes) } -/* - * client_read_ssl() - read data from the encrypted layer. +/** + * \brief read data from the encrypted layer. + * \param buf charbuffer to read to + * \param bytes how many + * \param timeout how long should we wait? + * \returns what??? */ int client_read_ssl(char *buf, int bytes, int timeout) { @@ -444,7 +467,7 @@ int client_read_ssl(char *buf, int bytes, int timeout) len = 0; while (len < bytes) { #if 0 - /* + /** * This code is disabled because we don't need it when * using blocking reads (which we are). -IO */ @@ -487,3 +510,4 @@ int client_read_ssl(char *buf, int bytes, int timeout) #endif /* HAVE_OPENSSL */ +/*@}*/ diff --git a/webcit/debian/control b/webcit/debian/control index dca2d215b..9ff8715a1 100644 --- a/webcit/debian/control +++ b/webcit/debian/control @@ -2,7 +2,7 @@ Source: webcit Section: unknown Priority: optional Maintainer: Wilfried Goesgens -Build-Depends: debhelper (>= 4.0.0) +Build-Depends: debhelper (>= 4.0.0), libical-dev Standards-Version: 3.6.1 Package: citadel-webcit diff --git a/webcit/event.c b/webcit/event.c index 15d56aeb3..4bfcb0a8a 100644 --- a/webcit/event.c +++ b/webcit/event.c @@ -1,18 +1,21 @@ /* * $Id$ - * - * Editing calendar events. + */ +/** + * \defgroup EditCal Editing calendar events. * */ - +/*@{*/ #include "webcit.h" #include "webserver.h" #ifdef WEBCIT_WITH_CALENDAR_SERVICE -/* - * Display an event by itself (for editing) +/** + * \brief Display an event by itself (for editing) + * \param supplied_vevent the event to edit + * \param msgnum reference on the citserver */ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) { icalcomponent *vevent; @@ -37,7 +40,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) if (supplied_vevent != NULL) { vevent = supplied_vevent; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VEVENT component, attempt to use the first * relevant VEVENT subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -58,13 +62,13 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) created_new_vevent = 1; } - /* Learn the sequence */ + /** Learn the sequence */ p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY); if (p != NULL) { sequence = icalproperty_get_sequence(p); } - /* Begin output */ + /** Begin output */ output_headers(1, 1, 2, 0, 0, 0); wprintf("
\n" "
" @@ -131,7 +135,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("\n", bstr("day")); - /* Put it in a borderless table so it lines up nicely */ + /** Put it in a borderless table so it lines up nicely */ wprintf("\n"); wprintf("\n"); - /* If this is an all-day-event, set the end time to be identical to + /** + * If this is an all-day-event, set the end time to be identical to * the start time (the hour/minute/second will be set to midnight). * Otherwise extract or create it. */ @@ -222,7 +227,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) t_end = icalproperty_get_dtend(p); } else { - /* If this is not an all-day event and there is no + /** + * If this is not an all-day event and there is no * end time specified, make the default one hour * from the start time. */ @@ -259,7 +265,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) ); } - /* Determine who is the organizer of this event. + /** + * Determine who is the organizer of this event. * We need to determine "me" or "not me." */ organizer = icalcomponent_get_first_property(vevent, @@ -289,7 +296,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("\n"); } - /* + /** * Transmit the organizer as a hidden field. We don't want the user * to be able to change it, but we do want it fed back to the server, * especially if this is a new event and there is no organizer already @@ -301,14 +308,14 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("\n"); - /* Transparency */ + /** Transparency */ wprintf("\n"); - /* Attendees */ + /** Attendees */ wprintf("\n"); - /* Done with properties. */ + /** Done with properties. */ wprintf("
"); @@ -205,7 +209,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("
"); wprintf(_("Show time as:")); wprintf(""); p = icalcomponent_get_first_property(vevent, ICAL_TRANSP_PROPERTY); if (p == NULL) { - /* No transparency found. Default to opaque (busy). */ + /** No transparency found. Default to opaque (busy). */ p = icalproperty_new_transp(ICAL_TRANSP_OPAQUE); if (p != NULL) { icalcomponent_add_property(vevent, p); @@ -336,7 +343,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("
"); wprintf(_("Attendees")); wprintf("
" @@ -354,21 +361,21 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) strcpy(attendee_string, icalproperty_get_attendee(attendee)); if (!strncasecmp(attendee_string, "MAILTO:", 7)) { - /* screen name or email address */ + /** screen name or email address */ strcpy(attendee_string, &attendee_string[7]); striplt(attendee_string); if (i++) wprintf("\n"); escputs(attendee_string); wprintf(" "); - /* participant status */ + /** participant status */ partstat_as_string(buf, attendee); escputs(buf); } } wprintf("
\n
" "" "  " @@ -399,9 +406,10 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) } } -/* - * Save an edited event - * +/** + * \brief Save an edited event + * \param supplied_vevent the event to save + * \param msgnum the index on the citserver */ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { char buf[SIZ]; @@ -421,7 +429,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { if (supplied_vevent != NULL) { vevent = supplied_vevent; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VEVENT component, attempt to use the first * relevant VEVENT subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -445,7 +454,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { if ( (strlen(bstr("save_button")) > 0) || (strlen(bstr("check_button")) > 0) ) { - /* Replace values in the component with ones from the form */ + /** Replace values in the component with ones from the form */ while (prop = icalcomponent_get_first_property(vevent, ICAL_SUMMARY_PROPERTY), prop != NULL) { @@ -491,7 +500,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { icaltime_from_webform(&event_start, "dtstart"); } - /* The following odd-looking snippet of code looks like it + /** + * The following odd-looking snippet of code looks like it * takes some unnecessary steps. It is done this way because * libical incorrectly turns an "all day event" into a normal * event starting at midnight (i.e. it serializes as date/time @@ -527,7 +537,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ); } - /* See if transparency is indicated */ + /** See if transparency is indicated */ if (strlen(bstr("transp")) > 0) { if (!strcasecmp(bstr("transp"), "opaque")) { formtransp = ICAL_TRANSP_OPAQUE; @@ -547,7 +557,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { lprintf(9, "...added it.\n"); } - /* Give this event a UID if it doesn't have one. */ + /** Give this event a UID if it doesn't have one. */ lprintf(9, "Give this event a UID if it doesn't have one.\n"); if (icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY) == NULL) { @@ -557,7 +567,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ); } - /* Increment the sequence ID */ + /** Increment the sequence ID */ lprintf(9, "Increment the sequence ID\n"); while (prop = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) { @@ -573,7 +583,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { icalproperty_new_sequence(sequence) ); - /* Set the organizer, only if one does not already exist *and* + /** + * Set the organizer, only if one does not already exist *and* * the form is supplying one */ lprintf(9, "Setting the organizer...\n"); @@ -582,7 +593,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ICAL_ORGANIZER_PROPERTY) == NULL) && (strlen(buf) > 0) ) { - /* set new organizer */ + /** set new organizer */ sprintf(organizer_string, "MAILTO:%s", buf); icalcomponent_add_property(vevent, icalproperty_new_organizer(organizer_string) @@ -590,7 +601,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { } - /* + /** * Add any new attendees listed in the web form */ lprintf(9, "Add any new attendees\n"); @@ -599,7 +610,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { strcpy(form_attendees, bstr("attendees")); stripout(form_attendees, '(', ')'); - /* Now iterate! */ + /** Now iterate! */ for (i=0; i 0) ) { - /* Call this function, which does the real work */ + /** Call this function, which does the real work */ check_attendee_availability(encaps); - /* This displays the form again, with our annotations */ + /** This displays the form again, with our annotations */ display_edit_individual_event(encaps, msgnum); icalcomponent_free(encaps); @@ -687,7 +698,7 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); } - /* + /** * If the user clicked 'Delete' then delete it. */ lprintf(9, "Checking to see if we have to delete an old event\n"); @@ -700,7 +711,7 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); icalcomponent_free(vevent); } - /* If this was a save or deelete, go back to the calendar view. */ + /** If this was a save or deelete, go back to the calendar view. */ if (strlen(bstr("check_button")) == 0) { readloop("readfwd"); } @@ -708,3 +719,5 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + +/*@}*/ diff --git a/webcit/floors.c b/webcit/floors.c index 7b210821c..3103a36f4 100644 --- a/webcit/floors.c +++ b/webcit/floors.c @@ -1,10 +1,11 @@ /* * $Id$ - * - * Administrative screens for floor maintenance + */ +/** + * \defgroup AdminFloor Administrative screens for floor maintenance * */ - +/*@{*/ #include "webcit.h" #include "webserver.h" @@ -13,8 +14,10 @@ /* + * \brief Display floor config * Display floor configuration. If prepend_html is not NULL, its contents * will be displayed at the top of the screen. + * \param prepend_html pagetitle to prepend */ void display_floorconfig(char *prepend_html) { diff --git a/webcit/gettext.c b/webcit/gettext.c index 36e7548b3..0243c7b70 100644 --- a/webcit/gettext.c +++ b/webcit/gettext.c @@ -89,7 +89,7 @@ void httplang_to_locale(char *LocaleString) for (j=0; jregion[j]); - ls->region[j]=(char)chars;/*todo ?! */ + ls->region[j]=(char)chars;/* \todo ?! */ } sprintf(&lbuf[0],"%s_%s",&ls->lang[0],&ls->region[0]); diff --git a/webcit/po/de.po b/webcit/po/de.po index 9bd2fc0f9..681118e07 100644 --- a/webcit/po/de.po +++ b/webcit/po/de.po @@ -2719,7 +2719,7 @@ msgstr "Raum" #: ../who.c:27 msgid "From host" -msgstr "Vom Knoten" +msgstr "Client DNS Name / IP" #: ../who.c:60 msgid "(kill)" @@ -2736,7 +2736,7 @@ msgstr "Wollen sie diese Sitzung wirklich beenden?" #: ../who.c:149 #, c-format msgid "Users currently on %s" -msgstr "Benutzer angemeldet auf %s" +msgstr "Angemeldete Benutzer auf %s" #: ../who.c:164 #, c-format -- 2.30.2