diff options
| author | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:47 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:47 +0200 |
| commit | ee315a27b72dc967a8a90f132725b7c8e4fd9fba (patch) | |
| tree | 349db556063b17a3c84dc9348495bd11d73b0417 /src | |
| parent | 630af0ed6c0af69c7df2e45aef7a87722a3c00c0 (diff) | |
tagging ychat-0.7.5ychat-0.7.5
Diffstat (limited to 'src')
| -rw-r--r-- | src/CVS/Entries | 26 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/Makefile.in | 0 | ||||
| -rw-r--r-- | src/chat/CVS/Entries | 26 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/base.h | 182 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/base.tmpl | 70 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/chat.cpp | 498 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/chat.h | 97 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/gcol.cpp | 185 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/gcol.h | 55 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/perm.cpp | 93 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/perm.h | 69 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/room.cpp | 121 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/room.h | 131 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/sess.cpp | 49 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/sess.h | 46 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/sman.cpp | 150 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/sman.h | 54 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/user.cpp | 708 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/chat/user.h | 261 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/cli/cli.cpp | 526 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/cli/cli.h | 54 | ||||
| -rw-r--r-- | src/conf/CVS/Entries | 4 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/conf/conf.cpp | 227 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/conf/conf.h | 42 | ||||
| -rwxr-xr-x | src/configure | 312 | ||||
| -rw-r--r-- | src/contrib/crypt/md5.cpp | 357 | ||||
| -rw-r--r-- | src/contrib/crypt/md5.h | 39 | ||||
| -rw-r--r-- | src/contrib/crypt/md5crypt.cpp | 257 | ||||
| -rw-r--r-- | src/contrib/xml/tinyxml.cpp | 1703 | ||||
| -rw-r--r-- | src/contrib/xml/tinyxml.h | 2266 | ||||
| -rw-r--r-- | src/contrib/xml/tinyxmlerror.cpp | 68 | ||||
| -rw-r--r-- | src/contrib/xml/tinyxmlparser.cpp | 2708 | ||||
| -rw-r--r-- | src/data/CVS/Entries | 8 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/data/con.cpp | 50 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/data/con.h | 36 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/data/con_base.cpp | 24 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/data/con_base.h | 34 | ||||
| -rw-r--r-- | src/data/data.cpp | 161 | ||||
| -rw-r--r-- | src/data/data.h | 50 | ||||
| -rw-r--r-- | src/data/data_base.cpp | 148 | ||||
| -rw-r--r-- | src/data/data_base.h | 66 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/glob.h | 199 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/html.cpp | 184 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/html.h | 66 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/incl.h | 25 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/logd.cpp | 205 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/logd.h | 58 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/main.cpp | 238 | ||||
| -rw-r--r-- | src/maps/CVS/Entries | 18 | ||||
| -rw-r--r-- | src/maps/hmap.tmpl | 4 | ||||
| -rw-r--r-- | src/maps/mtools.h | 26 | ||||
| -rw-r--r-- | src/maps/mtools.tmpl | 29 | ||||
| -rw-r--r-- | src/maps/nmap.h | 3 | ||||
| -rw-r--r-- | src/maps/smap.h | 2 | ||||
| -rw-r--r-- | src/maps/smap.tmpl | 4 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/modl.cpp | 184 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/modl.h | 58 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/Makefile | 0 | ||||
| -rw-r--r-- | src/mods/commands/Makefile | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/Makefile.in | 2 | ||||
| -rw-r--r-- | src/mods/commands/yc_about.cpp | 98 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_all.cpp | 101 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_away.cpp | 150 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_col.cpp | 167 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_compopt.cpp | 45 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_exec.cpp | 108 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_fake.cpp | 67 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_getroom.cpp | 94 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_getrusage.cpp | 93 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_help.cpp | 105 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_invisible.cpp | 69 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_j.cpp | 203 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_ko.cpp | 112 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_m.cpp | 89 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_md5.cpp | 108 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_me.cpp | 77 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_morph.cpp | 101 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_msg.cpp | 128 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_q.cpp | 51 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_reload.cpp | 57 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_ren.cpp | 132 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_s.cpp | 105 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_set.cpp | 199 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_template.cpp | 51 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_time.cpp | 55 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_topic.cpp | 162 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_uptime.cpp | 55 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_users.cpp | 55 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/commands/yc_version.cpp | 45 | ||||
| -rw-r--r-- | src/mods/html/CVS/Entries | 12 | ||||
| -rw-r--r-- | src/mods/html/Makefile | 3 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/Makefile.in | 4 | ||||
| -rw-r--r-- | src/mods/html/yc_admin.cpp | 143 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/yc_colors.cpp | 76 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/yc_help.cpp | 100 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/yc_loggedin.cpp | 55 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/yc_options.cpp | 103 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/mods/html/yc_register.cpp | 189 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/msgs.h | 72 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/name.cpp | 54 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/name.h | 40 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/ncur/menu.cpp | 172 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/ncur/menu.h | 52 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/ncur/ncur.cpp | 391 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/ncur/ncur.h | 75 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/reqp.cpp | 532 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/reqp.h | 77 | ||||
| -rw-r--r-- | src/sock/CVS/Entries | 4 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/sock/sock.cpp | 609 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/sock/sock.h | 108 | ||||
| -rw-r--r-- | src/stats.cpp | 1 | ||||
| -rw-r--r-- | src/stats.h | 2 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/thrd/pool.cpp | 295 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/thrd/pool.h | 92 | ||||
| -rw-r--r-- | src/thrd/thro.cpp | 47 | ||||
| -rw-r--r-- | src/thrd/thro.h | 48 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/time/timo.cpp | 44 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/time/timo.h | 36 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/time/timr.cpp | 189 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/time/timr.h | 105 | ||||
| -rw-r--r-- | src/tool/dir.cpp | 68 | ||||
| -rw-r--r-- | src/tool/dir.h | 48 | ||||
| -rw-r--r-- | src/tool/tool.cpp | 280 | ||||
| -rw-r--r-- | src/tool/tool.h | 52 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/wrap.cpp | 157 | ||||
| -rwxr-xr-x[-rw-r--r--] | src/wrap.h | 142 |
126 files changed, 8594 insertions, 12037 deletions
diff --git a/src/CVS/Entries b/src/CVS/Entries index cda8aa6..7009aff 100644 --- a/src/CVS/Entries +++ b/src/CVS/Entries @@ -1,19 +1,19 @@ /Makefile.in/1.22/Tue Sep 7 17:14:39 2004// -/configure/1.34/Thu Feb 17 00:25:26 2005// -/glob.h/1.57/Wed Feb 16 23:46:56 2005// -/html.cpp/1.19/Wed Feb 16 21:28:55 2005// -/html.h/1.9/Wed Feb 16 21:28:55 2005// -/incl.h/1.5/Wed Feb 16 22:36:32 2005// -/logd.cpp/1.10/Wed Feb 16 21:28:55 2005// -/logd.h/1.8/Wed Feb 16 21:28:55 2005// -/main.cpp/1.32/Thu Feb 17 18:09:42 2005// -/modl.cpp/1.17/Wed Feb 16 22:51:13 2005// -/modl.h/1.9/Wed Feb 16 22:51:13 2005// -/msgs.h/1.170/Thu Feb 17 18:09:42 2005// +/configure/1.28/Fri Jan 7 21:00:19 2005// +/glob.h/1.51/Sun Feb 13 03:53:35 2005// +/html.cpp/1.18/Thu Feb 10 16:07:18 2005// +/html.h/1.8/Fri Jan 7 21:00:19 2005// +/incl.h/1.4/Fri Jan 7 21:00:19 2005// +/logd.cpp/1.9/Sun Feb 6 16:38:36 2005// +/logd.h/1.7/Sun Feb 6 16:38:36 2005// +/main.cpp/1.30/Thu Feb 10 19:55:24 2005// +/modl.cpp/1.16/Fri Jan 7 21:00:19 2005// +/modl.h/1.8/Thu Nov 18 13:41:47 2004// +/msgs.h/1.161/Mon Feb 14 20:09:50 2005// /name.cpp/1.7/Fri Jan 7 21:00:19 2005// /name.h/1.5/Fri Jan 7 21:00:19 2005// -/reqp.cpp/1.35/Wed Feb 16 21:28:55 2005// -/reqp.h/1.13/Wed Feb 16 21:28:55 2005// +/reqp.cpp/1.34/Thu Feb 10 16:07:18 2005// +/reqp.h/1.12/Sun Feb 6 16:38:36 2005// /stats.cpp/1.9/Fri Jan 7 21:00:19 2005// /stats.h/1.6/Fri Jan 7 21:00:19 2005// /wrap.cpp/1.15/Wed Feb 9 22:42:58 2005// diff --git a/src/Makefile.in b/src/Makefile.in index 0382389..0382389 100644..100755 --- a/src/Makefile.in +++ b/src/Makefile.in diff --git a/src/chat/CVS/Entries b/src/chat/CVS/Entries index 17e5803..8d2fcbd 100644 --- a/src/chat/CVS/Entries +++ b/src/chat/CVS/Entries @@ -1,17 +1,17 @@ -/base.h/1.6/Wed Feb 16 22:36:32 2005// -/base.tmpl/1.5/Wed Feb 16 22:36:32 2005// -/chat.cpp/1.17/Wed Feb 16 23:50:35 2005// -/chat.h/1.10/Wed Feb 16 22:36:32 2005// -/gcol.cpp/1.6/Wed Feb 16 23:16:58 2005// -/gcol.h/1.4/Wed Feb 16 22:51:13 2005// -/perm.cpp/1.9/Wed Feb 16 23:16:58 2005// -/perm.h/1.7/Wed Feb 16 23:16:58 2005// +/base.h/1.5/Fri Jan 7 21:00:19 2005// +/base.tmpl/1.4/Thu Nov 18 13:41:47 2004// +/chat.cpp/1.14/Fri Jan 7 21:00:19 2005// +/chat.h/1.8/Fri Jan 7 21:00:19 2005// +/gcol.cpp/1.4/Thu Nov 18 13:41:47 2004// +/gcol.h/1.3/Thu Nov 18 13:41:47 2004// +/perm.cpp/1.7/Thu Nov 18 13:41:47 2004// +/perm.h/1.5/Thu Nov 18 13:41:47 2004// /room.cpp/1.9/Sun Feb 6 16:38:36 2005// -/room.h/1.6/Wed Feb 16 22:36:32 2005// +/room.h/1.5/Sun Feb 6 16:38:36 2005// /sess.cpp/1.5/Tue Jan 4 18:31:35 2005// /sess.h/1.5/Tue Jan 4 18:31:35 2005// -/sman.cpp/1.10/Wed Feb 16 22:51:13 2005// -/sman.h/1.5/Wed Feb 16 22:51:13 2005// -/user.cpp/1.14/Wed Feb 16 22:51:13 2005// -/user.h/1.8/Wed Feb 16 23:59:16 2005// +/sman.cpp/1.9/Tue Jan 4 18:31:35 2005// +/sman.h/1.4/Tue Jan 4 18:31:35 2005// +/user.cpp/1.13/Mon Feb 14 20:09:50 2005// +/user.h/1.6/Fri Jan 7 21:00:19 2005// D diff --git a/src/chat/base.h b/src/chat/base.h index bfdd6f6..dc44c69 100644..100755 --- a/src/chat/base.h +++ b/src/chat/base.h @@ -1,117 +1,89 @@ -/*:* - *: File: ./src/chat/base.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - +// template class data declaration; #include "../incl.h" #ifndef BASE_H #define BASE_H -#include <map> -#include "../maps/nhashmap.h" +#include "../maps/smap.h" template<class type> -class base : public nhashmap<type*> +class base : public smap<type*,string> { -protected: - void dumpit(); - public: - base(); - ~base(); - - static string to_lower( string s ) - { - string s_tmp(""); - for(int i=0;i < s.size() ;i++) - s_tmp=s_tmp+(char)tolower(s.at(i)); - return s_tmp; - } - - virtual type* get_elem( string s_name, bool &b_found ); // get a element. - virtual type* get_elem( string s_name ); - virtual void add_elem( type* p_type ); // add a element. - - // chat::msg_post sends to all users of the system a message. - // room::msg_post sends to all users of the room a message. - // user::msg_post sends to the user a message. - virtual void msg_post( string *s_msg ) - { - nhashmap<type*>::run_func( &base<type>::msg_post_ , (void*)s_msg ); - } - - static void msg_post_( type* type_obj, void* v_arg ) - { - type_obj -> msg_post( (string*) v_arg ); - } - - virtual void check_timeout( int* i_timeout_settings ) - { - nhashmap<type*>::run_func( &base<type>::check_timeout_ , (void*)i_timeout_settings ); - } - - static void check_timeout_( type* type_obj, void* v_arg ) - { - type_obj -> check_timeout( (int*) v_arg ); - } - - virtual void reconf() - { - nhashmap<type*>::run_func( &base<type>::reconf_ ); - } - - static void reconf_ ( type* type_obj ) - { - type_obj -> reconf (); - } - - void get_data( map<string,string> *p_map_string ) - { - nhashmap<type*>::run_func( &base<type>::get_data_ , (void*)p_map_string ); - } - - static void get_data_( type* type_obj, void* v_arg ) - { - type_obj -> get_data ( (map<string,string>*) v_arg ); - } - - - // chat::get_user_list gets a list of all users of the system. - // room::get_user_list gets a list of all users of the room. - // user::get_user_list gets a "list" of a user <font color="usercolor">username</font>seperator - void get_user_list( string &s_list ) - { - container c; - c.elem[0] = (void*) &s_list; - - nhashmap<type*>::run_func( &base<type>::get_user_list_, (void*)&c ); - } - - static void get_user_list_( type* type_obj, void* v_arg ) - { - container *c = (container*) v_arg; - type_obj -> get_user_list( *((string*)c->elem[0]) ); - } + base(); + ~base(); + + static string to_lower( string s ) + { + string s_tmp(""); + for(int i=0;i < s.size() ;i++) + s_tmp=s_tmp+(char)tolower(s.at(i)); + return s_tmp; + } + + virtual type* get_elem( string s_name, bool &b_found ); // get a element. + virtual void add_elem( type* p_type ); // add a element. + + // chat::msg_post sends to all users of the system a message. + // room::msg_post sends to all users of the room a message. + // user::msg_post sends to the user a message. + virtual void msg_post( string *s_msg ) + { + smap<type*,string>::run_func( &base<type>::msg_post_ , (void*)s_msg ); + } + + static void msg_post_( type* type_obj, void* v_arg ) + { + type_obj -> msg_post( (string*) v_arg ); + } + + virtual void check_timeout( int* i_timeout_settings ) + { + smap<type*,string>::run_func( &base<type>::check_timeout_ , (void*)i_timeout_settings ); + } + + static void check_timeout_( type* type_obj, void* v_arg ) + { + type_obj -> check_timeout( (int*) v_arg ); + } + + virtual void reconf() + { + smap<type*,string>::run_func( &base<type>::reconf_ ); + } + + static void reconf_ ( type* type_obj ) + { + type_obj -> reconf (); + } + + void get_data( map<string,string> *p_map_string ) + { + smap<type*,string>::run_func( &base<type>::get_data_ , (void*)p_map_string ); + } + + static void get_data_( type* type_obj, void* v_arg ) + { + type_obj -> get_data ( (map<string,string>*) v_arg ); + } + + + // chat::get_user_list gets a list of all users of the system. + // room::get_user_list gets a list of all users of the room. + // user::get_user_list gets a "list" of a user <font color="usercolor">username</font>seperator + void get_user_list( string &s_list ) + { + container c; + c.elem[0] = (void*) &s_list; + + smap<type*,string>::run_func( &base<type>::get_user_list_, (void*)&c ); + } + + static void get_user_list_( type* type_obj, void* v_arg ) + { + container *c = (container*) v_arg; + type_obj -> get_user_list( *((string*)c->elem[0]) ); + } }; #include "base.tmpl" diff --git a/src/chat/base.tmpl b/src/chat/base.tmpl index c94ed44..53b609f 100644..100755 --- a/src/chat/base.tmpl +++ b/src/chat/base.tmpl @@ -1,85 +1,33 @@ -/*:* - *: File: ./src/chat/base.tmpl - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef BASE_CPP #define BASE_CPP #include "base.h" template<class type> -base<type>::base() -{} +base<type>::base() : smap<type*,string>::smap(HMAPOCC) +{ +} template<class type> base<type>::~base( ) -{} - -template<class type> -type* -base<type>::get_elem( string s_name, bool &b_found ) { - s_name = to_lower(s_name); - type* p_type = nhashmap<type*>::get_elem( s_name ); - b_found = p_type == NULL ? false : true; - return p_type; } template<class type> type* -base<type>::get_elem( string s_name) +base<type>::get_elem( string s_name, bool &b_found ) { - bool b; - return get_elem(s_name, b); + s_name = to_lower(s_name); + type* p_type = smap<type*,string>::get_elem( s_name ); + b_found = p_type == NULL ? false : true; + return p_type; } template<class type> void base<type>::add_elem( type* p_type ) { - nhashmap<type*>::add_elem(p_type, p_type->get_lowercase_name()); -} - -template<class type> -void -base<type>::dumpit() -{ - dumpable::add("[base]"); - vector<string>* p_vec = nhashmap<type*>::get_key_vector(); - - vector<string>::iterator iter; - for (iter = p_vec->begin(); iter != p_vec->end(); ++iter) - { - dumpable::add(*iter); - type* p_elem = get_elem(*iter); - if (p_elem) - { - dumpable::next_no_newline(); - dumpable::add(p_elem->dump(dumpable::get_level())); - } - } - - delete p_vec; + smap<type*,string>::add_elem(p_type, p_type->get_lowercase_name()); } #endif diff --git a/src/chat/chat.cpp b/src/chat/chat.cpp index 764da85..493c2a5 100644..100755 --- a/src/chat/chat.cpp +++ b/src/chat/chat.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/chat.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - // class chat implementation. #ifndef CHAT_CPP @@ -36,201 +12,190 @@ using namespace std; chat::chat( ) { - { // Set up replace strings; - wrap::system_message(CHATREP); - vector<string>* p_vec_keys = wrap::CONF->get_key_vector(); - - for (vector<string>::iterator iter = p_vec_keys->begin(); - iter != p_vec_keys->end(); - iter++ ) - { - if ( iter->length() >= 24 && iter->compare( 0, 22, "chat.html.replace.from" ) == 0 ) + { // Set up replace strings; + wrap::system_message(CHATREP); + vector<string>* p_vec_keys = wrap::CONF->get_key_vector(); + + for (vector<string>::iterator iter = p_vec_keys->begin(); + iter != p_vec_keys->end(); iter++ ) { + if ( iter->length() >= 24 && iter->compare( 0, 22, "chat.html.replace.from" ) == 0 ) + { string s_from = wrap::CONF->get_elem(*iter); map_replace_strings[s_from] = "chat.html.replace.into." + s_from; - vec_replace_keys.push_back(s_from); - } - } + vec_replace_keys.push_back(s_from); + } + } - sort(vec_replace_keys.begin(), vec_replace_keys.end()); - delete p_vec_keys; - } + sort(vec_replace_keys.begin(), vec_replace_keys.end()); + delete p_vec_keys; + } } chat::~chat( ) { - // Delete all room objects! - run_func( mtools<room*>::delete_obj ); + // Delete all room objects! + run_func( mtools<room*>::delete_obj ); } user* chat::get_user( string &s_user ) { - bool b_flag; - return get_user( s_user, b_flag ); + bool b_flag; + return get_user( s_user, b_flag ); } user* chat::get_user( string &s_user, bool &b_found ) { - container param; + container param; - param.elem[0] = (void*) &s_user ; - param.elem[1] = (void*) &b_found; + param.elem[0] = (void*) &s_user ; + param.elem[1] = (void*) &b_found; - b_found = false; + b_found = false; - base<room>::run_func( get_user_, (void*)¶m ); + smap<room*,string>::run_func( get_user_, (void*)¶m ); - if ( *( (bool*) param.elem[1] ) ) - return (user*) param.elem[2]; + if ( *( (bool*) param.elem[1] ) ) + return (user*) param.elem[2]; } void chat::get_user_( room *room_obj, void *v_arg ) { - container* param = (container*) v_arg; + container* param = (container*) v_arg; - if ( *((bool*)param->elem[1]) ) - return; + if ( *((bool*)param->elem[1]) ) + return; - param->elem[2] = (void*)room_obj->get_elem( *((string*)param->elem[0]), *((bool*)param->elem[1]) ); + param->elem[2] = (void*)room_obj->get_elem( *((string*)param->elem[0]), *((bool*)param->elem[1]) ); } void chat::login( map<string,string> &map_params ) { - string s_user = map_params["nick"]; - - // prove if nick is empty: - if ( s_user.empty() ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.nonick" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE0 ); - return; - } - - // prove if the nick is alphanumeric: - else if ( ! tool::is_alpha_numeric( s_user ) ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.alpnum" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE1 + s_user ); - return; - } - - // prove if the nick is too long: - else if ( s_user.length() > tool::string2int( wrap::CONF->get_elem("chat.maxlength.username") ) ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.nicklength" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE2 + s_user ); - return; - } - - // prove if the room name is too long: - else if ( map_params["room"].length() > tool::string2int( wrap::CONF->get_elem("chat.maxlength.roomname") ) ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.roomnamelength" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE3 + s_user + " / " + map_params["room"] ); - return; - } - - // prove if the room name is valid - else if ( map_params["room"].length() < 1 ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.noroom" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE3 + s_user + " / " + map_params["room"] ); - return; - } - - // prove if maxpoolsize (threads) allows this login - else if ( !wrap::POOL->allow_user_login() ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.maxuserlimit" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINE5 + s_user); - return; - } - - bool b_flag; - - // prove if nick is already online / logged in. - get_user( s_user, b_flag ); - - if ( b_flag ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.online" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); - - return; - } - - // Prove if user is recycleable from the garbage collector: - user *p_user = wrap::GCOL->get_user_from_garbage( s_user ); - - if ( p_user != NULL ) - { - // 1. possibility to prove the password at login! (using recycled user) - if ( p_user->get_pass() != map_params["password"] ) + string s_user = map_params["nick"]; + + // prove if nick is empty: + if ( s_user.empty() ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.nonick" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINE0 ); + return; + } + + // prove if the nick is alphanumeric: + else if ( ! tool::is_alpha_numeric( s_user ) ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.alpnum" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINE1 + s_user ); + return; + } + + // prove if the nick is too long: + else if ( s_user.length() > tool::string2int( wrap::CONF->get_elem("chat.maxlength.username") ) ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.nicklength" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINE2 + s_user ); + return; + } + + // prove if the room name is too long: + else if ( map_params["room"].length() > tool::string2int( wrap::CONF->get_elem("chat.maxlength.roomname") ) ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.roomnamelength" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINE3 + s_user + " / " + map_params["room"] ); + return; + } + + // prove if the room name is valid + else if ( map_params["room"].length() < 1 ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.noroom" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINE3 + s_user + " / " + map_params["room"] ); + return; + } + + bool b_flag; + + // prove if nick is already online / logged in. + get_user( s_user, b_flag ); + + if ( b_flag ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.online" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); + + return; + } + + // Prove if user is recycleable from the garbage collector: + user *p_user = wrap::GCOL->get_user_from_garbage( s_user ); + + if ( p_user != NULL ) { + // 1. possibility to prove the password at login! (using recycled user) + if ( p_user->get_pass() != map_params["password"] ) + { map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.wrongpassword" ); map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. wrap::system_message( LOGINER + s_user ); return; - } - if ( p_user->get_has_sess() ) - { + } + if ( p_user->get_has_sess() ) + { map_params["tmpid"] = p_user->get_tmpid(); - } - else - { + } + else + { sess* p_sess = wrap::SMAN->create_session(); + //p_sess->set_value( string("nick"), (void *) new string(s_user) ); p_sess->set_user(p_user); map_params["tmpid"] = p_sess->get_tmpid(); p_user->set_tmpid( map_params["tmpid"] ); p_user->set_has_sess( true ); + } } - } - else // if ( p_user == NULL ) // If not in garbage create a new user! - { - p_user = new user( s_user ); - // prove if nick is registered, else create a guest chatter. -#ifdef DATABASE + else // if ( p_user == NULL ) // If not in garbage create a new user! + { + p_user = new user( s_user ); - hashmap<string> map_results = wrap::DATA->select_user_data( tool::to_lower(s_user), "selectlogin"); + // prove if nick is registered, else create a guest chatter. +#ifdef DATABASE + map<string,string> map_results = wrap::DATA->select_user_data( tool::to_lower(s_user), "selectlogin"); - if ( map_results["nick"] == tool::to_lower(s_user) ) - { - p_user->set_is_reg( true ); + if ( map_results["nick"] == tool::to_lower(s_user) ) + { + p_user->set_is_reg( true ); // User exists in database, prove password: // 2. possibility to prove the password at login! (using new created user from database) if ( map_results["password"] != map_params["password"] ) { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.wrongpassword" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - wrap::system_message( LOGINER + s_user ); - return; + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.wrongpassword" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + wrap::system_message( LOGINER + s_user ); + return; } else { // If registered use saved options - map_params["registered"] = "yes"; - map_params["color1"] = map_results["color1"]; - map_params["color2"] = map_results["color2"]; - map_params["email"] = map_results["email"]; - map_params["status"] = map_results["status"]; + map_params["registered"] = "yes"; + map_params["color1"] = map_results["color1"]; + map_params["color2"] = map_results["color2"]; + map_params["email"] = map_results["email"]; + map_params["status"] = map_results["status"]; } - } - else + } + else #endif - - { // If not registered prove if guest chatting is enabled. - if (wrap::CONF->get_elem("chat.enableguest") != "true") - { + { // If not registered prove if guest chatting is enabled. + if (wrap::CONF->get_elem("chat.enableguest") != "true") { map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.noguest" ); map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. wrap::system_message( LOGINE4 + s_user ); @@ -241,154 +206,147 @@ chat::login( map<string,string> &map_params ) map_params["color1"] = wrap::CONF->get_elem( "chat.html.user.color1" ); map_params["color2"] = wrap::CONF->get_elem( "chat.html.user.color2" ); map_params["status"] = wrap::CONF->get_elem( "chat.defaultrang" ); - } - - sess* p_sess = wrap::SMAN->create_session(); - p_sess->set_user(p_user); - map_params["tmpid"] = p_sess->get_tmpid(); - p_user->set_tmpid( map_params["tmpid"] ); - p_user->set_col1( map_params["color1"] ); - p_user->set_col2( map_params["color2"] ); - p_user->set_status( tool::string2int(map_params["status"])); + } + + sess* p_sess = wrap::SMAN->create_session(); + p_sess->set_user(p_user); + map_params["tmpid"] = p_sess->get_tmpid(); + p_user->set_tmpid( map_params["tmpid"] ); + p_user->set_col1( map_params["color1"] ); + p_user->set_col2( map_params["color2"] ); + p_user->set_status( tool::string2int(map_params["status"])); // p_user->set_sess( p_sess ); - } - - // Prove if user is the default operator. - if ( tool::to_lower(wrap::CONF->get_elem("chat.defaultop")) == tool::to_lower(s_user) ) - { - wrap::system_message(CHATDOP); - p_user->set_status(0); - } + } - string s_room = map_params["room"]; - room* p_room = get_room( s_room , b_flag ); + // Prove if user is the default operator. + if ( tool::to_lower(wrap::CONF->get_elem("chat.defaultop")) == tool::to_lower(s_user) ) { + wrap::system_message(CHATDOP); + p_user->set_status(0); + } - // if room does not exist add room to list! - if ( ! b_flag ) - { - p_room = wrap::GCOL->get_room_from_garbage(); + string s_room = map_params["room"]; + room* p_room = get_room( s_room , b_flag ); - if ( p_room ) + // if room does not exist add room to list! + if ( ! b_flag ) { + p_room = wrap::GCOL->get_room_from_garbage(); + + if ( p_room ) + { p_room->set_name( s_room ); wrap::system_message( REUROOM + s_room ); - } - else - { + } + + else + { p_room = new room( s_room ); wrap::system_message( NEWROOM + s_room ); - } + } - add_elem( p_room ); - } + add_elem( p_room ); + } - // add user to the room. - p_room->add_user( p_user ); + // add user to the room. + p_room->add_user( p_user ); - wrap::system_message( NEWUSER + s_user ); + wrap::system_message( NEWUSER + s_user ); - // post "username enters the chat" into the room. - string s_msg = wrap::TIMR->get_time() + " " + p_user->get_colored_bold_name() + wrap::CONF->get_elem( "chat.msgs.userenterschat" ) + "<br>\n"; + // post "username enters the chat" into the room. + string s_msg = wrap::TIMR->get_time() + " " + p_user->get_colored_bold_name() + wrap::CONF->get_elem( "chat.msgs.userenterschat" ) + "<br>\n"; - // If created a new user from database while logging on (not a recycled user, they already have this set) - if ( map_params["registered"] == "yes" ) - { - p_user->set_email( map_params["email"] ); - p_user->set_pass( map_params["password"] ); - // Now we will store all wanted user data into MySQL after logging out! (recycled user already have this set) - p_user->set_changed_data_on(); - } - p_room->msg_post( &s_msg ); + // If created a new user from database while logging on (not a recycled user, they already have this set) + if ( map_params["registered"] == "yes" ) + { + p_user->set_email( map_params["email"] ); + p_user->set_pass( map_params["password"] ); + // Now we will store all wanted user data into MySQL after logging out! (recycled user already have this set) + p_user->set_changed_data_on(); + } + p_room->msg_post( &s_msg ); } void chat::post( user* p_user, map<string,string> &map_params ) { - p_user->renew_timeout(); + p_user->renew_timeout(); - string s_msg( map_params["message"] ); + string s_msg( map_params["message"] ); - if ( s_msg.empty() ) - return; + if ( s_msg.empty() ) + return; - int i_max_message_length = tool::string2int(wrap::CONF->get_elem( "chat.maxlength.message" )); - if ( s_msg.length() > i_max_message_length ) - { - s_msg = s_msg.substr( 0, i_max_message_length ); - string s_private = "<font color=\"" + wrap::CONF->get_elem( "chat.html.errorcolor" ) + "\">" + int i_max_message_length = tool::string2int(wrap::CONF->get_elem( "chat.maxlength.message" )); + if ( s_msg.length() > i_max_message_length ) + { + s_msg = s_msg.substr( 0, i_max_message_length ); + string s_private = "<font color=\"" + wrap::CONF->get_elem( "chat.html.errorcolor" ) + "\">" + wrap::CONF->get_elem( "chat.msgs.err.messagelength" ) + "</font><br>\n"; - p_user->msg_post( &s_private ); - } + p_user->msg_post( &s_private ); + } + + int i_max_word_length = tool::string2int(wrap::CONF->get_elem( "chat.maxlength.word" )); - int i_max_word_length = tool::string2int(wrap::CONF->get_elem( "chat.maxlength.word" )); + // Check max word length + list<string> list_msg = tool::split_string( s_msg, " "); + list<string>::iterator iter = list_msg.begin(); - // Check max word length - list<string> list_msg = tool::split_string( s_msg, " "); - list<string>::iterator iter = list_msg.begin(); - - for ( s_msg = ""; iter != list_msg.end(); ++iter ) - { - if ( iter->length() > i_max_word_length ) + for ( s_msg = ""; iter != list_msg.end(); ++iter ) { + if ( iter->length() > i_max_word_length ) + { string s_tmp[] = { iter->substr(0, i_max_word_length ), iter->substr(i_max_word_length) }; - iter = list_msg.erase( iter ); + iter = list_msg.erase( iter ); iter = list_msg.insert( iter, s_tmp[1] ); iter = list_msg.insert( iter, s_tmp[0] ); --iter; + } + else + { + s_msg.append(*iter + " "); + } } - else - { - s_msg.append(*iter + " "); - } - } - - if ( wrap::CONF->get_elem( "chat.html.tagsallow" ) != "true" ) - tool::strip_html( &s_msg ); - - unsigned i_pos = s_msg.find( "/" ); - if ( i_pos == 0 ) - return p_user->command( s_msg ); - - string_replacer(&s_msg); - string s_post; - - if ( wrap::CONF->get_elem( "chat.printalwaystime" ) == "true" ) - s_post.append( wrap::TIMR->get_time() + " " ); - - s_post.append( "<font color=\"#" ) - .append( p_user->get_col1() ) - .append( "\">" ) - .append( p_user->get_name() ) - .append( ":</font> <font color=\"#") - .append( p_user->get_col2() ) - .append( "\">" ) - .append( s_msg ) - .append( "</font><br>\n" ); - - p_user->get_room()->msg_post( &s_post ); + + if ( wrap::CONF->get_elem( "chat.html.tagsallow" ) != "true" ) + tool::strip_html( &s_msg ); + + unsigned i_pos = s_msg.find( "/" ); + if ( i_pos == 0 ) + return p_user->command( s_msg ); + + string_replacer(&s_msg); + string s_post; + + if ( wrap::CONF->get_elem( "chat.printalwaystime" ) == "true" ) + s_post.append( wrap::TIMR->get_time() + " " ); + + s_post.append( "<font color=\"#" ) + .append( p_user->get_col1() ) + .append( "\">" ) + .append( p_user->get_name() ) + .append( ":</font> <font color=\"#") + .append( p_user->get_col2() ) + .append( "\">" ) + .append( s_msg ) + .append( "</font><br>\n" ); + + p_user->get_room()->msg_post( &s_post ); } void chat::reconf() -{} - -void -chat::string_replacer(string *p_msg) { - if ( wrap::CONF->get_elem( "chat.html.replace.activate" ) == "true" ) - { - for (vector<string>::iterator iter = vec_replace_keys.end()-1; - iter != vec_replace_keys.begin(); - iter-- ) - *p_msg = tool::replace( *p_msg, *iter, wrap::CONF->get_elem(map_replace_strings[*iter]) ); - } } void -chat::dumpit() -{ - dumpable::add("[chat]"); - base<room>::dumpit(); +chat::string_replacer(string *p_msg) { + if ( wrap::CONF->get_elem( "chat.html.replace.activate" ) == "true" ) + { + for (vector<string>::iterator iter = vec_replace_keys.end()-1; + iter != vec_replace_keys.begin(); + iter-- ) + *p_msg = tool::replace( *p_msg, *iter, wrap::CONF->get_elem(map_replace_strings[*iter]) ); + } } #endif diff --git a/src/chat/chat.h b/src/chat/chat.h index b61ed95..86b7c0b 100644..100755 --- a/src/chat/chat.h +++ b/src/chat/chat.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/chat.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - // class chat declaration. class chat; @@ -37,51 +13,50 @@ class chat; #include "user.h" #include "sess.h" #include "../tool/tool.h" -#include "../maps/hashmap.h" using namespace std; + #undef chat class chat : public base<room>, public perm { private: - map<string,string> map_replace_strings; - vector<string> vec_replace_keys; - void dumpit(); + map<string,string> map_replace_strings; + vector<string> vec_replace_keys; public: - virtual room* get_room( string s_name ) - { - bool b_bool; - return get_room( s_name, b_bool ); - } - - virtual room* get_room( string &s_name, bool &b_found ) - { - return static_cast<room*>( get_elem( s_name, b_found ) ); - } - - // public methods: - explicit chat(); // a standard constructor. - ~chat(); // destructor. - - // get the object of a specific user. - user* get_user( string &s_nick ); - user* get_user( string &s_nick, bool &b_found ); - static void get_user_( room* room_obj, void *v_arg ); - - // will be called every time a user tries to login. - void login( map<string,string> &map_params ); - - // will be called if a user posts a message. - void post ( user* u_user, map<string,string> &map_params ); - - void del_elem( string s_name ) - { - base<room>::del_elem( s_name ); - } - - void reconf(); - void string_replacer(string *p_msg); + virtual room* get_room( string s_name ) + { + bool b_bool; + return get_room( s_name, b_bool ); + } + + virtual room* get_room( string &s_name, bool &b_found ) + { + return static_cast<room*>( get_elem( s_name, b_found ) ); + } + + // public methods: + explicit chat(); // a standard constructor. + ~chat(); // destructor. + + // get the object of a specific user. + user* get_user( string &s_nick ); + user* get_user( string &s_nick, bool &b_found ); + static void get_user_( room* room_obj, void *v_arg ); + + // will be called every time a user tries to login. + void login( map<string,string> &map_params ); + + // will be called if a user posts a message. + void post ( user* u_user, map<string,string> &map_params ); + + void del_elem( string s_name ) + { + smap<room*,string>::del_elem( s_name ); + } + + void reconf(); + void string_replacer(string *p_msg); }; #endif diff --git a/src/chat/gcol.cpp b/src/chat/gcol.cpp index 099f11e..2500b91 100644..100755 --- a/src/chat/gcol.cpp +++ b/src/chat/gcol.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/gcol.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef GCOL_CPP #define GCOL_CPP @@ -31,141 +7,130 @@ using namespace std; gcol::gcol() { - pthread_mutex_init( &mut_vec_rooms , NULL); + pthread_mutex_init( &mut_vec_rooms , NULL); - p_map_users = new shashmap<user*>; - wrap::system_message( GARBAGE ); + p_map_users = new smap<user*,string>(HMAPOCC); + wrap::system_message( GARBAGE ); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif } gcol::~gcol() { - remove_garbage(); - pthread_mutex_destroy( &mut_vec_rooms ); - delete p_map_users; + remove_garbage(); + pthread_mutex_destroy( &mut_vec_rooms ); + delete p_map_users; } void gcol::add_room_to_garbage( room* p_room ) -{ - pthread_mutex_lock ( &mut_vec_rooms ); - vec_rooms.push_back( p_room ); - pthread_mutex_unlock( &mut_vec_rooms ); - wrap::system_message( GARROOM + p_room->get_name() ); +{ + pthread_mutex_lock ( &mut_vec_rooms ); + vec_rooms.push_back( p_room ); + pthread_mutex_unlock( &mut_vec_rooms ); + wrap::system_message( GARROOM + p_room->get_name() ); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif } void gcol::add_user_to_garbage( user* p_user ) -{ - p_user->s_mess_delete(); - p_map_users->add_elem( p_user, tool::to_lower(p_user->get_name()) ); - wrap::system_message( GARUSER + p_user->get_name() ); - p_user->destroy_session(); - +{ + p_user->s_mess_delete(); + p_map_users->add_elem( p_user, tool::to_lower(p_user->get_name()) ); + wrap::system_message( GARUSER + p_user->get_name() ); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif } bool gcol::remove_garbage() { - bool b_empty; + bool b_empty; - pthread_mutex_lock ( &mut_vec_rooms ); - b_empty = ( vec_rooms.empty() && p_map_users->size() == 0); - pthread_mutex_unlock( &mut_vec_rooms ); + pthread_mutex_lock ( &mut_vec_rooms ); + b_empty = ( vec_rooms.empty() && p_map_users->get_size() == 0); + pthread_mutex_unlock( &mut_vec_rooms ); - if ( b_empty ) - return false; + if ( b_empty ) + return false; - wrap::system_message( GARBACT ); + wrap::system_message( GARBACT ); - pthread_mutex_lock ( &mut_vec_rooms ); - for ( vector<room*>::iterator iter = vec_rooms.begin(); - iter != vec_rooms.end(); iter++ ) - { - wrap::system_message( REMROOM + (*iter)->get_name() ); - delete *iter; - } - vec_rooms.clear(); - pthread_mutex_unlock( &mut_vec_rooms ); + pthread_mutex_lock ( &mut_vec_rooms ); + for ( vector<room*>::iterator iter = vec_rooms.begin(); + iter != vec_rooms.end(); iter++ ) + { + wrap::system_message( REMROOM + (*iter)->get_name() ); + delete *iter; + } + vec_rooms.clear(); + pthread_mutex_unlock( &mut_vec_rooms ); - p_map_users->run_func( delete_users_ ); - p_map_users->clear(); + p_map_users->run_func( delete_users_ ); + p_map_users->make_empty(); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif - - return true; + return true; } room* gcol::get_room_from_garbage() { - pthread_mutex_lock ( &mut_vec_rooms ); + pthread_mutex_lock ( &mut_vec_rooms ); - if ( vec_rooms.empty() ) - { - pthread_mutex_unlock( &mut_vec_rooms ); - return NULL; - } + if ( vec_rooms.empty() ) + { + pthread_mutex_unlock( &mut_vec_rooms ); + return NULL; + } - room* p_room = vec_rooms.back(); - vec_rooms.pop_back(); - pthread_mutex_unlock( &mut_vec_rooms ); + room* p_room = vec_rooms.back(); + vec_rooms.pop_back(); + pthread_mutex_unlock( &mut_vec_rooms ); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif - return p_room; + return p_room; } room* gcol::get_room_from_garbage_or_new( string s_room ) { - room* p_room = get_room_from_garbage(); - if ( p_room == NULL ) - return new room( s_room ); - p_room->set_name( s_room ); - return p_room; + room* p_room = get_room_from_garbage(); + if ( p_room == NULL ) + return new room( s_room ); + p_room->set_name( s_room ); + return p_room; } user* gcol::get_user_from_garbage( string s_user ) { - user* p_user = p_map_users->get_elem( tool::to_lower(s_user) ); - ; + user* p_user = p_map_users->get_elem( tool::to_lower(s_user) );; - if ( p_user != NULL ) + if ( p_user != NULL ) { - p_map_users->del_elem( tool::to_lower(s_user) ); - p_user->set_name( s_user ); - p_user->set_online( true ); - p_user->set_invisible( false ); - p_user->renew_timeout(); - wrap::system_message(GARUSE2 + p_user->get_name() ); + p_map_users->del_elem( tool::to_lower(s_user) ); + p_user->set_name( s_user ); + p_user->set_online( true ); + p_user->set_invisible( false ); + p_user->renew_timeout(); + wrap::system_message(GARUSE2 + p_user->get_name() ); #ifdef NCURSES - - print_garbage(); + print_garbage(); #endif - } return p_user; @@ -174,34 +139,34 @@ gcol::get_user_from_garbage( string s_user ) void gcol::delete_users_( user *user_obj ) { - wrap::system_message( REMUSER + user_obj->get_name() ); - user_obj->clean(); - delete user_obj; + wrap::system_message( REMUSER + user_obj->get_name() ); + user_obj->clean(); + delete user_obj; } void gcol::lock_mutex() { - pthread_mutex_lock ( &mut_vec_rooms ); + pthread_mutex_lock ( &mut_vec_rooms ); } void gcol::unlock_mutex() { - pthread_mutex_unlock ( &mut_vec_rooms ); + pthread_mutex_unlock ( &mut_vec_rooms ); } #ifdef NCURSES void gcol::print_garbage( ) { - if ( wrap::NCUR->is_ready() ) - { - pthread_mutex_lock ( &mut_vec_rooms ); - mvprintw( NCUR_GARBAGE_X,NCUR_GARBAGE_Y, "Garbage: %d ", p_map_users->size() + vec_rooms.size() ); - pthread_mutex_unlock( &mut_vec_rooms ); - refresh(); - } + if ( wrap::NCUR->is_ready() ) + { + pthread_mutex_lock ( &mut_vec_rooms ); + mvprintw( NCUR_GARBAGE_X,NCUR_GARBAGE_Y, "Garbage: %d ", p_map_users->get_size() + vec_rooms.size() ); + pthread_mutex_unlock( &mut_vec_rooms ); + refresh(); + } } #endif diff --git a/src/chat/gcol.h b/src/chat/gcol.h index ab84269..4936ded 100644..100755 --- a/src/chat/gcol.h +++ b/src/chat/gcol.h @@ -1,67 +1,42 @@ -/*:* - *: File: ./src/chat/gcol.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - -// garbage collector +// garbage collector #include "../incl.h" #ifndef GCOL_H #define GCOL_H -#include <vector> +#include <vector> #include "room.h" #include "user.h" -#include "../maps/shashmap.h" +#include "../maps/smap.h" using namespace std; class gcol { -private: - vector<room*> vec_rooms; - shashmap<user*>* p_map_users; + private: + vector<room*> vec_rooms; + smap<user*,string>* p_map_users; pthread_mutex_t mut_vec_rooms; static void delete_users_( user* user_obj ); #ifdef NCURSES - void print_garbage( ); #endif -public: + public: gcol(); ~gcol(); - bool remove_garbage(); - void add_room_to_garbage( room* p_room ); - void add_user_to_garbage( user* p_user ); - virtual room* get_room_from_garbage(); - virtual room* get_room_from_garbage_or_new( string s_room ); - user* get_user_from_garbage( string s_user ); - virtual void lock_mutex(); - virtual void unlock_mutex(); + bool remove_garbage(); + void add_room_to_garbage( room* p_room ); + void add_user_to_garbage( user* p_user ); + virtual room* get_room_from_garbage(); + virtual room* get_room_from_garbage_or_new( string s_room ); + user* get_user_from_garbage( string s_user ); + virtual void lock_mutex(); + virtual void unlock_mutex(); }; #endif diff --git a/src/chat/perm.cpp b/src/chat/perm.cpp index f84d4de..b862d43 100644..100755 --- a/src/chat/perm.cpp +++ b/src/chat/perm.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/perm.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef PERM_CPP #define PERM_CPP @@ -32,76 +8,73 @@ using namespace std; perm::perm() { - p_command_status = new shashmap< valwrap<int>* >; - p_command_disabled = new shashmap< valwrap<bool>* >; + p_command_status = new smap< valwrap<int>*, string>(HMAPOCC); + p_command_disabled = new smap< valwrap<bool>*, string>(HMAPOCC); - set_standard_command_permissions(); + set_standard_command_permissions(); } perm::~perm() { - p_command_status->run_func( &mtools< valwrap<int>* >::delete_obj ); - p_command_disabled->run_func( &mtools< valwrap<bool>* >::delete_obj ); + p_command_status->run_func( &mtools< valwrap<int>* >::delete_obj ); + p_command_disabled->run_func( &mtools< valwrap<bool>* >::delete_obj ); - delete p_command_status; - delete p_command_disabled; + delete p_command_status; + delete p_command_disabled; } int perm::get_command_status( string s_command ) { - if ( p_command_status->exists( s_command ) ) - return p_command_status->get_elem( s_command )->val; + if ( p_command_status->is_avail( s_command ) ) + return p_command_status->get_elem( s_command )->val; - return 0; + return 0; } void perm::set_command_status( string s_command, int i_int ) { - valwrap<int>* p_val = p_command_status->get_set_elem( new valwrap<int>(i_int), s_command ); + valwrap<int>* p_val = p_command_status->set_elem( new valwrap<int>(i_int), s_command ); - if ( p_val ) - delete p_val; + if ( p_val ) + delete p_val; } bool perm::get_command_disabled( string s_command ) { - if ( p_command_disabled->exists( s_command ) ) - return p_command_disabled->get_elem( s_command )->val; - return 0; + if ( p_command_disabled->is_avail( s_command ) ) + return p_command_disabled->get_elem( s_command )->val; + return 0; } void perm::set_command_disabled( string s_command, bool b_bool ) { - valwrap<bool>* p_val = p_command_disabled->get_set_elem( new valwrap<bool>(b_bool), s_command ); + valwrap<bool>* p_val = p_command_disabled->set_elem( new valwrap<bool>(b_bool), s_command ); - if ( p_val ) - delete p_val; + if ( p_val ) + delete p_val; } void perm::set_standard_command_permissions() { - wrap::system_message(PERMSTD); - - vector<string>* p_vec_keys = wrap::CONF->get_key_vector(); - - for (vector<string>::iterator iter = p_vec_keys-> - begin(); - iter != p_vec_keys->end(); - iter++ ) - { - if ( iter->length() > 17 && iter->compare( 0, 16, "chat.permissions" ) == 0 ) - { - valwrap<int>* p_val = new valwrap<int>( tool::string2int( wrap::CONF->get_elem(*iter) ) ); - p_command_status->add_elem( p_val, iter->substr(17) ); - } - } - - delete p_vec_keys; + wrap::system_message(PERMSTD); + + vector<string>* p_vec_keys = wrap::CONF->get_key_vector(); + + for (vector<string>::iterator iter = p_vec_keys->begin(); iter != p_vec_keys->end(); iter++ ) + { + if ( iter->length() > 17 && iter->compare( 0, 16, "chat.permissions" ) == 0 ) + { + valwrap<int>* p_val = new valwrap<int>( tool::string2int( wrap::CONF->get_elem(*iter) ) ); + p_command_status->add_elem( p_val, iter->substr(17) ); + } + } + + delete p_vec_keys; } #endif diff --git a/src/chat/perm.h b/src/chat/perm.h index 5fc34c3..8e08ba2 100644..100755 --- a/src/chat/perm.h +++ b/src/chat/perm.h @@ -1,29 +1,5 @@ -/*:* - *: File: ./src/chat/perm.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" -#include "../maps/shashmap.h" +#include "../maps/smap.h" #ifndef PERM_H #define PERM_H @@ -31,36 +7,35 @@ using namespace std; template<class type_> -struct valwrap -{ - type_ val; - valwrap(type_ i) - { - val = i; - } - - type_ get_val() - { - return val; - } +struct valwrap +{ + type_ val; + valwrap(type_ i) + { + val = i; + } + type_ get_val() + { + return val; + } }; class perm { private: - shashmap< valwrap<int>* >* p_command_status; - shashmap< valwrap<bool>* >* p_command_disabled; - - void set_standard_command_permissions(); + smap< valwrap<int>*, string>* p_command_status; + smap< valwrap<bool>*, string>* p_command_disabled; + void set_standard_command_permissions(); + public: - perm( ); - ~perm( ); + perm( ); + ~perm( ); - virtual int get_command_status( string s_command ); - virtual bool get_command_disabled( string s_command ); - virtual void set_command_status( string s_command, int i_int ); - virtual void set_command_disabled( string s_command, bool b_bool ); + virtual int get_command_status( string s_command ); + virtual bool get_command_disabled( string s_command ); + virtual void set_command_status( string s_command, int i_int ); + virtual void set_command_disabled( string s_command, bool b_bool ); }; #endif diff --git a/src/chat/room.cpp b/src/chat/room.cpp index 9ff5517..c21639a 100644..100755 --- a/src/chat/room.cpp +++ b/src/chat/room.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/room.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef ROOM_CPP #define ROOM_CPP @@ -32,107 +8,94 @@ using namespace std; room::room( string s_name ) : name( s_name ) { - pthread_mutex_init( &mut_s_topic, NULL ); + pthread_mutex_init( &mut_s_topic, NULL ); #ifdef LOGGING - - p_logd = new logd( wrap::CONF->get_elem("chat.logging.roomlogdir") + get_lowercase_name(), - wrap::CONF->get_elem("chat.logging.roomloglines") ); + p_logd = new logd( wrap::CONF->get_elem("chat.logging.roomlogdir") + get_lowercase_name(), + wrap::CONF->get_elem("chat.logging.roomloglines") ); #endif - - wrap::STAT->increment_num_rooms(); + wrap::STAT->increment_num_rooms(); } room::~room() { - wrap::STAT->decrement_num_rooms(); + wrap::STAT->decrement_num_rooms(); - // Delete all user objects - run_func( mtools<user*>::delete_obj ); + // Delete all user objects + run_func( mtools<user*>::delete_obj ); #ifdef LOGGING - - delete p_logd; + delete p_logd; #endif - pthread_mutex_destroy( &mut_s_topic ); - pthread_mutex_destroy( &mut_s_name ); + pthread_mutex_destroy( &mut_s_topic ); + pthread_mutex_destroy( &mut_s_name ); } string room::get_topic() { - string s_ret; - pthread_mutex_lock ( &mut_s_topic ); - s_ret = s_topic; - pthread_mutex_unlock( &mut_s_topic ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_topic ); + s_ret = s_topic; + pthread_mutex_unlock( &mut_s_topic ); + return s_ret; } void room::set_topic( string s_topic ) { - pthread_mutex_lock ( &mut_s_topic ); - if ( s_topic == "" ) - this->s_topic = ""; - else - this->s_topic = s_topic + "<br><br>"; - pthread_mutex_unlock( &mut_s_topic ); - reload_onlineframe(); + pthread_mutex_lock ( &mut_s_topic ); + if ( s_topic == "" ) + this->s_topic = ""; + else + this->s_topic = s_topic + "<br><br>"; + pthread_mutex_unlock( &mut_s_topic ); + reload_onlineframe(); } void room::set_topic( string s_topic, string s_color ) { - set_topic( "<font color=\"#" + s_color + "\">" + s_topic + "</font>"); + set_topic( "<font color=\"#" + s_color + "\">" + s_topic + "</font>"); } void room::clean_room() { - pthread_mutex_lock ( &mut_s_topic ); - this->s_topic = ""; - pthread_mutex_unlock( &mut_s_topic ); - wrap::CHAT->del_elem( get_lowercase_name() ); - wrap::GCOL->add_room_to_garbage( this ); + pthread_mutex_lock ( &mut_s_topic ); + this->s_topic = ""; + pthread_mutex_unlock( &mut_s_topic ); + wrap::CHAT->del_elem( get_lowercase_name() ); + wrap::GCOL->add_room_to_garbage( this ); } void room::reload_onlineframe() { - javascript_post("parent.online.location.reload();"); + string s_msg = "<script language=\"JavaScript\"> parent.online.location.reload(); </script>\n"; + msg_post( &s_msg ); } -void +void room::set_name( string s_name ) { - if ( tool::to_lower(s_name) == get_lowercase_name() ) - { - name::set_name( s_name ); - return; - } + if ( tool::to_lower(s_name) == get_lowercase_name() ) + { + name::set_name( s_name ); + return; + } #ifdef LOGGING - p_logd->flush_logs(); + p_logd->flush_logs(); #endif - if ( s_name == "" ) - return; + if ( s_name == "" ) + return; - name::set_name( s_name ); + name::set_name( s_name ); #ifdef LOGGING - - p_logd->set_logfile( wrap::CONF->get_elem("chat.logging.roomlogdir"), get_lowercase_name() ); + p_logd->set_logfile( wrap::CONF->get_elem("chat.logging.roomlogdir"), get_lowercase_name() ); #endif -} - -void -room::dumpit() -{ - dumpable::add("[room]"); - dumpable::add("Name: "+get_name()); - dumpable::add("Topic: "+get_topic()); - base<user>::dumpit(); -} - +} #endif diff --git a/src/chat/room.h b/src/chat/room.h index 8f673f5..255f90e 100644..100755 --- a/src/chat/room.h +++ b/src/chat/room.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/room.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - // class room declaration. #include "../incl.h" @@ -41,76 +17,63 @@ using namespace std; class room : public base<user>, public name { private: - string s_topic; - pthread_mutex_t mut_s_topic; + string s_topic; + pthread_mutex_t mut_s_topic; #ifdef LOGGING - - logd* p_logd; + logd* p_logd; #endif - - void dumpit(); public: - room( string s_name ); - ~room(); - - virtual void reload_onlineframe(); - - void add_user( user* p_user ) - { - add_elem( p_user ); - p_user->set_p_room( this ); - reload_onlineframe(); - } - - user* get_user( string &s_name, bool &b_found ) - { - return static_cast<user*>( get_elem( s_name, b_found ) ); - } - - void del_elem( string &s_name ) - { - base<user>::del_elem( s_name ); - - if ( base<user>::size() == 0 ) + room( string s_name ); + ~room(); + + virtual void reload_onlineframe(); + + void add_user( user* p_user ) + { + add_elem( p_user ); + p_user->set_p_room( this ); + reload_onlineframe(); + } + + user* get_user( string &s_name, bool &b_found ) + { + return static_cast<user*>( get_elem( s_name, b_found ) ); + } + + void del_elem( string &s_name ) + { + smap<user*,string>::del_elem( s_name ); + if ( smap<user*,string>::get_size() == 0 ) clean_room(); - - else - reload_onlineframe(); - } - - void msg_post( string s_msg ) - { - msg_post( &s_msg ); - } - - void msg_post( string *p_msg ) - { + else + reload_onlineframe(); + } + + void msg_post( string s_msg ) + { + msg_post( &s_msg ); + } + void msg_post( string *p_msg ) + { #ifdef LOGGING - p_logd->log_simple_line( logd::remove_html_tags(*p_msg) ); + p_logd->log_simple_line( logd::remove_html_tags(*p_msg) ); #endif + base<user>::msg_post( p_msg ); + } - base<user>::msg_post( p_msg ); - } - - void javascript_post( string s_msg ) - { - string s_js = "<script language=\"JavaScript\">"+s_msg+"</script>\n"; - base<user>::msg_post( &s_js ); - } - - string get_bold_name() - { - return "<b>" + get_name() + "</b>"; - } - - virtual void set_name( string s_name ); - string get_topic(); - void set_topic( string s_topic ); - void set_topic( string s_topic, string s_color ); - void clean_room(); + string get_bold_name() + { + return "<b>" + get_name() + "</b>"; + } + virtual void set_name( string s_name ); + string get_topic(); + void set_topic( string s_topic ); + void set_topic( string s_topic, string s_color ); + void clean_room(); + }; diff --git a/src/chat/sess.cpp b/src/chat/sess.cpp index 485b643..801a6bf 100644..100755 --- a/src/chat/sess.cpp +++ b/src/chat/sess.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/sess.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef SESS_CPP #define SESS_CPP @@ -29,52 +5,53 @@ sess::sess( string s_tmpid ) { - this->p_user = NULL; - this->s_tmpid = s_tmpid; + this->p_user = NULL; + this->s_tmpid = s_tmpid; } sess::~sess() -{} +{ +} string sess::get_tmpid() { - return s_tmpid; + return s_tmpid; } string sess::get_name() { - if ( p_user = NULL ) - return ""; + if ( p_user = NULL ) + return ""; - return p_user->get_name(); + return p_user->get_name(); } void sess::set_name(string s_name) { - if ( p_user != NULL ) - p_user->set_name(s_name); + if ( p_user != NULL ) + p_user->set_name(s_name); } user* sess::get_user() { - return p_user; + return p_user; } void sess::set_user(user* p_user) { - this->p_user = p_user; + this->p_user = p_user; } void sess::invalidate() { - this->s_tmpid = "0"; + this->s_tmpid = "0"; } #endif diff --git a/src/chat/sess.h b/src/chat/sess.h index f008ea2..033e954 100644..100755 --- a/src/chat/sess.h +++ b/src/chat/sess.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/sess.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef SESS_H @@ -34,22 +10,22 @@ class cont; using namespace std; -class sess +class sess { private: - string s_tmpid; - user *p_user; + string s_tmpid; + user *p_user; public: - sess(string s_tmpid); - ~sess(); + sess(string s_tmpid); + ~sess(); - string get_tmpid(); + string get_tmpid(); - void set_user(user* p_user); - user* get_user(); - void set_name(string s_name); - string get_name(); - void invalidate(); + void set_user(user* p_user); + user* get_user(); + void set_name(string s_name); + string get_name(); + void invalidate(); }; #endif diff --git a/src/chat/sman.cpp b/src/chat/sman.cpp index 661085f..6ae665f 100644..100755 --- a/src/chat/sman.cpp +++ b/src/chat/sman.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/sman.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef SMAN_CPP #define SMAN_CPP @@ -30,123 +6,109 @@ #include "../maps/mtools.h" #include "../contrib/crypt/md5.h" -sman::sman() +sman::sman() : smap<sess*,string>::smap(HMAPOCC) { - i_session_count = 0; - pthread_mutex_init( &mut_i_session_count, NULL ); + i_session_count = 0; + pthread_mutex_init( &mut_i_session_count, NULL ); } sman::~sman() { - // Delete each session object of the shashmap! - shashmap<sess*>::run_func( mtools<sess*>::delete_obj ); - pthread_mutex_destroy( &mut_i_session_count ); + // Delete each session object of the smap! + smap<sess*,string>::run_func( mtools<sess*>::delete_obj ); + pthread_mutex_destroy( &mut_i_session_count ); } string sman::generate_id( int i_len ) { - string s_valid = wrap::CONF->get_elem("chat.session.validchars"); - string s_ret = ""; - - srand(time(0)+tool::string2int(wrap::CONF->get_elem("chat.session.kloakkey"))); - int i_char; - - - for (int i = 0; i < i_len; i++) - { - i_char = rand() % s_valid.length(); - s_ret += s_valid[i_char]; - } - - if ( wrap::CONF->get_elem("chat.session.md5hash") == "true" ) - { - string s_salt = wrap::CONF->get_elem("chat.session.md5salt"); - string s_hash(md5::MD5Crypt(s_ret.c_str(), s_salt.c_str())); - s_ret.append(s_hash.substr(s_ret.find(s_salt) + s_salt.length() + 3)); - } - - // Prove, if the TempID already exists - sess* p_sess = get_elem(s_ret); - - if (p_sess) - { - wrap::system_message(SESSEXI); - return generate_id(i_len); - } - - return s_ret; + string valid_chars = wrap::CONF->get_elem("chat.session.validchars"); + string s_ret = ""; + + srand(time(0)+tool::string2int(wrap::CONF->get_elem("chat.session.kloakkey"))); + int i_char; + + for (int i = 0; i < i_len; i++) + { + i_char = rand() % 64; + s_ret += valid_chars[i_char]; + } + + if ( wrap::CONF->get_elem("chat.session.md5hash") == "true" ) + { + string s_salt = wrap::CONF->get_elem("chat.session.md5salt"); + s_ret = string(md5::MD5Crypt(s_ret.c_str(), s_salt.c_str())); + return s_ret.substr(s_ret.find(s_salt) + s_salt.length() + 3); + } + + return s_ret; } sess *sman::create_session( ) { - string s_tmpid = generate_id( tool::string2int( wrap::CONF->get_elem( "chat.session.length" ) ) ); + string s_tmpid = generate_id( tool::string2int( wrap::CONF->get_elem( "chat.session.length" ) ) ); - sess* p_sess = new sess( s_tmpid ); + sess* p_sess = new sess( s_tmpid ); - pthread_mutex_lock( &mut_i_session_count ); - i_session_count++; + pthread_mutex_lock( &mut_i_session_count ); + i_session_count++; #ifdef NCURSES - - print_sessions(); + print_sessions(); #endif + pthread_mutex_unlock( &mut_i_session_count ); - pthread_mutex_unlock( &mut_i_session_count ); + //???? + add_elem( p_sess, s_tmpid ); - //???? - add_elem( p_sess, s_tmpid ); - - return p_sess; + return p_sess; } sess *sman::get_session( string s_id ) { - return get_elem( s_id ); + return get_elem( s_id ); } void sman::destroy_session( string s_id ) { - pthread_mutex_lock( &mut_i_session_count ); - i_session_count--; + pthread_mutex_lock( &mut_i_session_count ); + i_session_count--; #ifdef NCURSES - - print_sessions(); + print_sessions(); #endif + pthread_mutex_unlock( &mut_i_session_count ); - pthread_mutex_unlock( &mut_i_session_count ); - - sess* p_sess = get_elem( s_id ); - del_elem( s_id ); - delete p_sess; + sess* p_sess = get_elem( s_id ); + del_elem( s_id ); + delete p_sess; } #ifdef NCURSES void sman::print_sessions() { - if ( wrap::NCUR->is_ready() ) - { - mvprintw( NCUR_SESSION_X,NCUR_SESSION_Y, "Sessions: %d ", i_session_count); - refresh(); - } + if ( wrap::NCUR->is_ready() ) + { + mvprintw( NCUR_SESSION_X,NCUR_SESSION_Y, "Sessions: %d ", i_session_count); + refresh(); + } } #ifdef NCURSES void sman::print_init_ncurses() { - pthread_mutex_lock( &mut_i_session_count ); - print_sessions(); - pthread_mutex_unlock( &mut_i_session_count ); + pthread_mutex_lock( &mut_i_session_count ); + print_sessions(); + pthread_mutex_unlock( &mut_i_session_count ); } #endif int sman::get_session_count() { - int i_ret; - pthread_mutex_lock( &mut_i_session_count ); - i_ret = i_session_count; - pthread_mutex_unlock( &mut_i_session_count ); - return i_ret; + int i_ret; + pthread_mutex_lock( &mut_i_session_count ); + i_ret = i_session_count; + pthread_mutex_unlock( &mut_i_session_count ); + return i_ret; } #endif diff --git a/src/chat/sman.h b/src/chat/sman.h index 5211fbd..20b1a76 100644..100755 --- a/src/chat/sman.h +++ b/src/chat/sman.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/sman.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef SMAN_H @@ -30,35 +6,31 @@ #include <cstdlib> #include "sess.h" -#include "../maps/shashmap.h" -#include "../monitor/dump.h" +#include "../maps/smap.h" using namespace std; -class sman : public shashmap<sess*> +class sman : private smap<sess*,string> { private: - string generate_id( int i_len ); - int i_session_count; + string generate_id( int i_len ); + int i_session_count; - pthread_mutex_t mut_i_session_count; + pthread_mutex_t mut_i_session_count; #ifdef NCURSES - - void print_sessions(); + void print_sessions(); #endif public: - sman(); - ~sman(); - sess *get_session( string s_tmpid ); - int get_session_count( ); - sess *create_session( ); - void destroy_session( string s_tmpid ); + sman(); + ~sman(); + sess *get_session( string s_tmpid ); + int get_session_count( ); + sess *create_session( ); + void destroy_session( string s_tmpid ); #ifdef NCURSES - - void print_init_ncurses(); + void print_init_ncurses(); #endif - }; diff --git a/src/chat/user.cpp b/src/chat/user.cpp index 5fa4ccb..b292a11 100644..100755 --- a/src/chat/user.cpp +++ b/src/chat/user.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/chat/user.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef USER_CPP #define USER_CPP @@ -32,588 +8,574 @@ using namespace std; user::user() : name( "" ) { - initialize(); + initialize(); } user::user( string s_name ) : name( s_name ) { - initialize(); + initialize(); } user::~user() { - // pthread_mutex_destroy( & mut_map_mods ); - pthread_mutex_destroy( & mut_away ); - pthread_mutex_destroy( & mut_b_online ); - pthread_mutex_destroy( & mut_b_fake ); - pthread_mutex_destroy( & mut_b_invisible ); - pthread_mutex_destroy( & mut_b_has_sess ); - pthread_mutex_destroy( & mut_b_is_reg ); - pthread_mutex_destroy( & mut_s_mess ); - pthread_mutex_destroy( & mut_s_pass ); - pthread_mutex_destroy( & mut_p_room ); - pthread_mutex_destroy( & mut_s_col1 ); - pthread_mutex_destroy( & mut_s_col2 ); - pthread_mutex_destroy( & mut_s_email ); - pthread_mutex_destroy( & mut_s_tmpid ); - pthread_mutex_destroy( & mut_i_status ); - pthread_mutex_destroy( & mut_map_changed_data ); - pthread_cond_destroy ( &cond_message ); - pthread_mutex_destroy( &mut_message ); +// pthread_mutex_destroy( & mut_map_mods ); + pthread_mutex_destroy( & mut_away ); + pthread_mutex_destroy( & mut_b_online ); + pthread_mutex_destroy( & mut_b_fake ); + pthread_mutex_destroy( & mut_b_invisible ); + pthread_mutex_destroy( & mut_b_has_sess ); + pthread_mutex_destroy( & mut_b_is_reg ); + pthread_mutex_destroy( & mut_s_mess ); + pthread_mutex_destroy( & mut_s_pass ); + pthread_mutex_destroy( & mut_p_room ); + pthread_mutex_destroy( & mut_s_col1 ); + pthread_mutex_destroy( & mut_s_col2 ); + pthread_mutex_destroy( & mut_s_email ); + pthread_mutex_destroy( & mut_s_tmpid ); + pthread_mutex_destroy( & mut_i_status ); + pthread_mutex_destroy( & mut_map_changed_data ); + pthread_cond_destroy ( &cond_message ); + pthread_mutex_destroy( &mut_message ); } void user::initialize() { - this -> b_is_reg = false; - this -> b_set_changed_data = false; - this -> b_away = false; - this -> b_fake = false; - this -> b_invisible = false; - this -> s_col1 = wrap::CONF->get_elem( "chat.html.user.color1" ); - this -> s_col2 = wrap::CONF->get_elem( "chat.html.user.color2" ); - - // pthread_mutex_init( & mut_map_mods , NULL ); - pthread_mutex_init( & mut_away , NULL ); - pthread_mutex_init( & mut_b_online , NULL ); - pthread_mutex_init( & mut_b_fake , NULL ); - pthread_mutex_init( & mut_b_invisible , NULL ); - pthread_mutex_init( & mut_b_has_sess , NULL ); - pthread_mutex_init( & mut_b_is_reg , NULL ); - pthread_mutex_init( & mut_s_mess , NULL ); - pthread_mutex_init( & mut_s_pass , NULL ); - pthread_mutex_init( & mut_p_room , NULL ); - pthread_mutex_init( & mut_s_col1 , NULL ); - pthread_mutex_init( & mut_s_col2 , NULL ); - pthread_mutex_init( & mut_s_email , NULL ); - pthread_mutex_init( & mut_s_tmpid , NULL ); - pthread_mutex_init( & mut_i_status , NULL ); - pthread_mutex_init( & mut_map_changed_data , NULL ); - pthread_cond_init ( &cond_message, NULL); - pthread_mutex_init( &mut_message , NULL); - renew_timeout(); + this -> b_is_reg = false; + this -> b_set_changed_data = false; + this -> b_away = false; + this -> b_fake = false; + this -> b_invisible = false; + this -> s_col1 = wrap::CONF->get_elem( "chat.html.user.color1" ); + this -> s_col2 = wrap::CONF->get_elem( "chat.html.user.color2" ); + //map_mods = new smap<dynmod*,string>(HMAPOCC); + + // pthread_mutex_init( & mut_map_mods , NULL ); + pthread_mutex_init( & mut_away , NULL ); + pthread_mutex_init( & mut_b_online , NULL ); + pthread_mutex_init( & mut_b_fake , NULL ); + pthread_mutex_init( & mut_b_invisible , NULL ); + pthread_mutex_init( & mut_b_has_sess , NULL ); + pthread_mutex_init( & mut_b_is_reg , NULL ); + pthread_mutex_init( & mut_s_mess , NULL ); + pthread_mutex_init( & mut_s_pass , NULL ); + pthread_mutex_init( & mut_p_room , NULL ); + pthread_mutex_init( & mut_s_col1 , NULL ); + pthread_mutex_init( & mut_s_col2 , NULL ); + pthread_mutex_init( & mut_s_email , NULL ); + pthread_mutex_init( & mut_s_tmpid , NULL ); + pthread_mutex_init( & mut_i_status , NULL ); + pthread_mutex_init( & mut_map_changed_data , NULL ); + pthread_cond_init ( &cond_message, NULL); + pthread_mutex_init( &mut_message , NULL); + renew_timeout(); } void user::clean() { - destroy_session(); - set_fake( false ); - set_invisible( false ); - set_away( false, "" ); -} - -void -user::destroy_session() -{ - if ( !get_has_sess() ) - return; - + // If this user has a session + if ( get_has_sess() ) + { #ifdef DATABASE - // Store all changed data into the mysql table if this user is registered: - if ( b_is_reg ) - wrap::DATA->update_user_data( get_name(), "savechangednick", map_changed_data ); + // Store all changed data into the mysql table if this user is registered: + if ( b_is_reg ) + wrap::DATA->update_user_data( get_name(), "savechangednick", map_changed_data ); + wrap::SMAN->destroy_session( get_tmpid() ); #endif + // wrap::system_message( SESSION + tool::int2string( wrap::SMAN->get_session_count() ) ); + } - set_has_sess(false); - wrap::SMAN->destroy_session(get_tmpid()); - set_tmpid(""); + set_fake( false ); + set_invisible( false ); } string user::get_colored_name() { - return "<font color=\"#" + get_col1() + "\">" + get_name() + "</font>"; + return "<font color=\"#" + get_col1() + "\">" + get_name() + "</font>"; } void user::get_data( map<string,string> *p_map_data ) { - string s_req = (*p_map_data)["!get"]; + string s_req = (*p_map_data)["!get"]; - // get the nick and the color of the user. - if ( s_req == "nick" ) - (*p_map_data)[get_name()] = get_col1(); + // get the nick and the color of the user. + if ( s_req == "nick" ) + (*p_map_data)[get_name()] = get_col1(); } string user::get_mess( ) { - pthread_mutex_lock ( &mut_s_mess ); - string s_ret = s_mess; - s_mess = ""; - pthread_mutex_unlock( &mut_s_mess ); - return s_ret; + pthread_mutex_lock ( &mut_s_mess ); + string s_ret = s_mess; + s_mess = ""; + pthread_mutex_unlock( &mut_s_mess ); + return s_ret; } bool user::get_online( ) { - bool b_ret; - pthread_mutex_lock ( &mut_b_online ); - b_ret = b_online; - pthread_mutex_unlock( &mut_b_online ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_b_online ); + b_ret = b_online; + pthread_mutex_unlock( &mut_b_online ); + return b_ret; } bool user::get_fake( ) { - bool b_ret; - pthread_mutex_lock ( &mut_b_fake ); - b_ret = b_fake; - pthread_mutex_unlock( &mut_b_fake ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_b_fake ); + b_ret = b_fake; + pthread_mutex_unlock( &mut_b_fake ); + return b_ret; } bool user::get_invisible( ) { - bool b_ret; - pthread_mutex_lock ( &mut_b_invisible ); - b_ret = b_invisible; - pthread_mutex_unlock( &mut_b_invisible ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_b_invisible ); + b_ret = b_invisible; + pthread_mutex_unlock( &mut_b_invisible ); + return b_ret; } bool user::get_has_sess( ) { - bool b_ret; - pthread_mutex_lock ( &mut_b_has_sess ); - b_ret = b_has_sess; - pthread_mutex_unlock( &mut_b_has_sess ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_b_has_sess ); + b_ret = b_has_sess; + pthread_mutex_unlock( &mut_b_has_sess ); + return b_ret; } void user::set_has_sess( bool b_has_sess ) { - pthread_mutex_lock ( &mut_b_has_sess ); - this->b_has_sess = b_has_sess; - pthread_mutex_unlock( &mut_b_has_sess ); + pthread_mutex_lock ( &mut_b_has_sess ); + this->b_has_sess = b_has_sess; + pthread_mutex_unlock( &mut_b_has_sess ); } bool user::get_is_reg( ) { - bool b_ret; - b_ret = b_is_reg; - return b_ret; + bool b_ret; + b_ret = b_is_reg; + return b_ret; } void user::set_is_reg( bool b_is_reg ) { - this -> b_is_reg = b_is_reg; + this -> b_is_reg = b_is_reg; } void user::set_online( bool b_online ) { - pthread_mutex_lock ( &mut_b_online ); - this -> b_online = b_online; - pthread_mutex_unlock( &mut_b_online ); + pthread_mutex_lock ( &mut_b_online ); + this -> b_online = b_online; + pthread_mutex_unlock( &mut_b_online ); } void user::set_fake( bool b_fake ) { - pthread_mutex_lock ( &mut_b_fake ); - this -> b_fake = b_fake; - pthread_mutex_unlock( &mut_b_fake ); + pthread_mutex_lock ( &mut_b_fake ); + this -> b_fake = b_fake; + pthread_mutex_unlock( &mut_b_fake ); } void user::set_invisible( bool b_invisible ) { - pthread_mutex_lock ( &mut_b_invisible ); - this -> b_invisible = b_invisible; - pthread_mutex_unlock( &mut_b_invisible ); + pthread_mutex_lock ( &mut_b_invisible ); + this -> b_invisible = b_invisible; + pthread_mutex_unlock( &mut_b_invisible ); } bool user::get_away() { - bool b_ret; - pthread_mutex_lock ( &mut_away ); - b_ret = b_away; - pthread_mutex_unlock( &mut_away ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_away ); + b_ret = b_away; + pthread_mutex_unlock( &mut_away ); + return b_ret; } string user::get_away_msg() { - string s_ret; - pthread_mutex_lock ( &mut_away ); - s_ret = s_away; - pthread_mutex_unlock( &mut_away ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_away ); + s_ret = s_away; + pthread_mutex_unlock( &mut_away ); + return s_ret; } void user::set_away( bool b_away, string s_away ) { - pthread_mutex_lock ( &mut_away ); - this -> b_away = b_away; - this -> s_away = s_away; - pthread_mutex_unlock( &mut_away ); + pthread_mutex_lock ( &mut_away ); + this -> b_away = b_away; + this -> s_away = s_away; + pthread_mutex_unlock( &mut_away ); } void user::set_away( bool b_away ) { - pthread_mutex_lock ( &mut_away ); - this -> b_away = b_away; - pthread_mutex_unlock( &mut_away ); + pthread_mutex_lock ( &mut_away ); + this -> b_away = b_away; + pthread_mutex_unlock( &mut_away ); } room* user::get_room( ) { - room* p_return; - pthread_mutex_lock ( &mut_p_room ); - p_return = p_room; - pthread_mutex_unlock( &mut_p_room ); - return p_return; + room* p_return; + pthread_mutex_lock ( &mut_p_room ); + p_return = p_room; + pthread_mutex_unlock( &mut_p_room ); + return p_return; } void user::set_p_room( room* p_room ) { - pthread_mutex_lock ( &mut_p_room ); - this -> p_room = p_room; - pthread_mutex_unlock( &mut_p_room ); + pthread_mutex_lock ( &mut_p_room ); + this -> p_room = p_room; + pthread_mutex_unlock( &mut_p_room ); } string user::get_pass() { - string s_ret; - pthread_mutex_lock ( &mut_s_pass ); - s_ret = s_pass; - pthread_mutex_unlock( &mut_s_pass ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_pass ); + s_ret = s_pass; + pthread_mutex_unlock( &mut_s_pass ); + return s_ret; } string user::get_col1() { - string s_ret; - pthread_mutex_lock ( &mut_s_col1 ); - s_ret = s_col1; - pthread_mutex_unlock( &mut_s_col1 ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_col1 ); + s_ret = s_col1; + pthread_mutex_unlock( &mut_s_col1 ); + return s_ret; } string user::get_col2() { - string s_ret; - pthread_mutex_lock ( &mut_s_col2 ); - s_ret = s_col2; - pthread_mutex_unlock( &mut_s_col2 ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_col2 ); + s_ret = s_col2; + pthread_mutex_unlock( &mut_s_col2 ); + return s_ret; } string user::get_email() { - string s_ret; - pthread_mutex_lock ( &mut_s_email ); - s_ret = s_email; - pthread_mutex_unlock( &mut_s_email ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_email ); + s_ret = s_email; + pthread_mutex_unlock( &mut_s_email ); + return s_ret; } string user::get_tmpid() { - string s_ret; - pthread_mutex_lock ( &mut_s_tmpid ); - s_ret = s_tmpid; - pthread_mutex_unlock( &mut_s_tmpid ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_tmpid ); + s_ret = s_tmpid; + pthread_mutex_unlock( &mut_s_tmpid ); + return s_ret; } void user::set_tmpid ( string s_tmpid ) { - pthread_mutex_lock ( &mut_s_tmpid ); - this -> s_tmpid = s_tmpid; - pthread_mutex_unlock( &mut_s_tmpid ); + pthread_mutex_lock ( &mut_s_tmpid ); + this -> s_tmpid = s_tmpid; + pthread_mutex_unlock( &mut_s_tmpid ); } void user::set_pass ( string s_pass ) { - set_changed_data( "password", s_pass ); - pthread_mutex_lock ( &mut_s_pass ); - this -> s_pass = s_pass; - pthread_mutex_unlock( &mut_s_pass ); + set_changed_data( "password", s_pass ); + pthread_mutex_lock ( &mut_s_pass ); + this -> s_pass = s_pass; + pthread_mutex_unlock( &mut_s_pass ); } void user::set_col1 ( string s_col1 ) { - set_changed_data( "color1", s_col1 ); - pthread_mutex_lock ( &mut_s_col1 ); - this -> s_col1 = s_col1; - pthread_mutex_unlock( &mut_s_col1 ); + set_changed_data( "color1", s_col1 ); + pthread_mutex_lock ( &mut_s_col1 ); + this -> s_col1 = s_col1; + pthread_mutex_unlock( &mut_s_col1 ); } void user::set_col2 ( string s_col2 ) { - set_changed_data( "color2", s_col2 ); - pthread_mutex_lock ( &mut_s_col2 ); - this -> s_col2 = s_col2; - pthread_mutex_unlock( &mut_s_col2 ); + set_changed_data( "color2", s_col2 ); + pthread_mutex_lock ( &mut_s_col2 ); + this -> s_col2 = s_col2; + pthread_mutex_unlock( &mut_s_col2 ); } void user::set_email ( string s_email ) { - set_changed_data( "email", s_email ); - pthread_mutex_lock ( &mut_s_email ); - this -> s_email = s_email; - pthread_mutex_unlock( &mut_s_email ); + set_changed_data( "email", s_email ); + pthread_mutex_lock ( &mut_s_email ); + this -> s_email = s_email; + pthread_mutex_unlock( &mut_s_email ); } int user::get_status ( ) { - int r_ret; - pthread_mutex_lock ( &mut_i_status ); - r_ret = i_status; - pthread_mutex_unlock(&mut_i_status ); - return r_ret; + int r_ret; + pthread_mutex_lock ( &mut_i_status ); + r_ret = i_status; + pthread_mutex_unlock(&mut_i_status ); + return r_ret; } void user::set_status ( int i_status ) { - set_changed_data( "status", tool::int2string(i_status)); - pthread_mutex_lock ( &mut_i_status ); - i_old_status = this -> i_status; - this -> i_status = i_status; - pthread_mutex_unlock( &mut_i_status ); + set_changed_data( "status", tool::int2string(i_status)); + pthread_mutex_lock ( &mut_i_status ); + i_old_status = this -> i_status; + this -> i_status = i_status; + pthread_mutex_unlock( &mut_i_status ); } void user::set_changed_data( string s_varname, string s_value ) { - if ( b_set_changed_data ) - { - pthread_mutex_lock ( &mut_map_changed_data ); - map_changed_data[s_varname] = s_value; - pthread_mutex_unlock( &mut_map_changed_data ); - } + if ( b_set_changed_data ) + { + pthread_mutex_lock ( &mut_map_changed_data ); + map_changed_data[s_varname] = s_value; + pthread_mutex_unlock( &mut_map_changed_data ); + } } bool user::new_msgs ( ) { - pthread_mutex_lock ( &mut_s_mess ); - return s_mess.empty(); - pthread_mutex_unlock( &mut_s_mess ); + pthread_mutex_lock ( &mut_s_mess ); + return s_mess.empty(); + pthread_mutex_unlock( &mut_s_mess ); } void user::command( string &s_command ) { - check_restore_away(); - - unsigned pos = s_command.find( "/" ); - unsigned pos2 = s_command.find( " " ); - if( pos != string::npos ) - { - s_command.replace( pos, 1, "" ); - } - else - return; - - if (pos2 == string::npos) - pos2 = s_command.size() + 1; - - string s_mod( wrap::CONF->get_elem("httpd.modules.commandsdir") + "yc_" ); - string s_command2 = s_command.substr(0, pos2-1); - s_mod.append( s_command2 ).append( ".so" ); - - dynmod *mod = wrap::MODL->get_module( s_mod, get_name() ); - - if ( mod == NULL || - wrap::CHAT->get_command_disabled( s_command2 ) || - get_status() > wrap::CHAT->get_command_status( s_command2 ) ) - { - string s_msg = "<font color=\"" + wrap::CONF->get_elem("chat.html.errorcolor") + "\">" - + wrap::CONF->get_elem( "chat.msgs.err.findingcommand" ) - + "</font>\n"; - msg_post( &s_msg ); - return; - } - - vector<string> params; - - // execute the module. - if (s_command.find(" ") != string::npos) - { - s_command = s_command.substr(s_command2.size()+1); - pos = s_command.find(" "); - pos2 = 0; - - while (pos != string::npos) + check_restore_away(); + + unsigned pos = s_command.find( "/" ); + unsigned pos2 = s_command.find( " " ); + if( pos != string::npos ) { - string sParam = s_command.substr(pos2, pos - pos2); - params.push_back(sParam); - pos2 = pos + 1; - pos = s_command.find(" ", pos2); + s_command.replace( pos, 1, "" ); } + else + return; + + if (pos2 == string::npos) + pos2 = s_command.size() + 1; + + string s_mod( wrap::CONF->get_elem("httpd.modules.commandsdir") + "yc_" ); + string s_command2 = s_command.substr(0, pos2-1); + s_mod.append( s_command2 ).append( ".so" ); + + dynmod *mod = wrap::MODL->get_module( s_mod ); + + if ( mod == NULL || + wrap::CHAT->get_command_disabled( s_command2 ) || + get_status() > wrap::CHAT->get_command_status( s_command2 ) ) + { + string s_msg = "<font color=\"" + wrap::CONF->get_elem("chat.html.errorcolor") + "\">" + + wrap::CONF->get_elem( "chat.msgs.err.findingcommand" ) + + "</font>\n"; + msg_post( &s_msg ); + return; + } + + vector<string> params; - if (pos2 < s_command.size()) + // execute the module. + if (s_command.find(" ") != string::npos) { - params.push_back(s_command.substr(pos2, s_command.size()-pos2)); - } + s_command = s_command.substr(s_command2.size()+1); + pos = s_command.find(" "); + pos2 = 0; + + while (pos != string::npos) + { + string sParam = s_command.substr(pos2, pos - pos2); + params.push_back(sParam); + pos2 = pos + 1; + pos = s_command.find(" ", pos2); + } + + if (pos2 < s_command.size()) + { + params.push_back(s_command.substr(pos2, s_command.size()-pos2)); + } - } + } - container* c = new container; - //c->elem[0]=(void*) unreserved - c->elem[1] = (void*) this; - c->elem[2] = (void*) ¶ms; - c->elem[3] = (void*) wrap::WRAP; + container* c = new container; + //c->elem[0]=(void*) unreserved + c->elem[1] = (void*) this; + c->elem[2] = (void*) ¶ms; + c->elem[3] = (void*) wrap::WRAP; - ( *(mod->the_func) ) ( static_cast<void*>(c) ); + ( *(mod->the_func) ) ( (void*) c ); - delete c; + delete c; } void user::s_mess_delete( ) { - pthread_mutex_lock ( &mut_s_mess ); - s_mess = ""; - pthread_mutex_unlock( &mut_s_mess ); + pthread_mutex_lock ( &mut_s_mess ); + s_mess = ""; + pthread_mutex_unlock( &mut_s_mess ); } void user::msg_post( string *p_msg ) { - pthread_mutex_lock ( &mut_s_mess ); - s_mess.append( *p_msg ); - pthread_mutex_unlock( &mut_s_mess ); + pthread_mutex_lock ( &mut_s_mess ); + s_mess.append( *p_msg ); + pthread_mutex_unlock( &mut_s_mess ); - pthread_cond_signal( &cond_message ); + pthread_cond_signal( &cond_message ); } void user::check_timeout( int* i_idle_timeout ) { - int i_user_timeout = (int) get_last_activity(); + int i_user_timeout = (int) get_last_activity(); - if ( get_away() ? i_idle_timeout[1] <= i_user_timeout : i_idle_timeout[0] <= i_user_timeout ) - { - wrap::system_message( string(TIMERTO) + "(" + get_name() + "," + tool::int2string(i_user_timeout) + ")"); - string s_quit = "<script language=JavaScript>top.location.href='/" - + wrap::CONF->get_elem("httpd.startsite") - + "';</script>"; - msg_post( &s_quit ); - set_online( false ); + if ( get_away() ? i_idle_timeout[1] <= i_user_timeout : i_idle_timeout[0] <= i_user_timeout ) + { + wrap::system_message( string(TIMERTO) + "(" + get_name() + "," + tool::int2string(i_user_timeout) + ")"); + string s_quit = "<script language=JavaScript>top.location.href='/" + + wrap::CONF->get_elem("httpd.startsite") + + "';</script>"; + msg_post( &s_quit ); + set_online( false ); - pthread_cond_signal( &cond_message ); - } - else if ( ! get_away() && i_idle_timeout[2] <= i_user_timeout ) - { - wrap::system_message( string(TIMERAT) + "(" + get_name() + "," + tool::int2string(i_user_timeout) + ")"); - string s_msg = wrap::CONF->get_elem("chat.msgs.userautoawaytimeout"); - set_away( true, s_msg ); - string s_msg2 = wrap::TIMR->get_time() + " <b>" + get_colored_name()+ "</b>" + s_msg + "<br>\n"; - get_room()->msg_post( &s_msg2 ); - get_room()->reload_onlineframe(); - } + pthread_cond_signal( &cond_message ); + } + + else if ( ! get_away() && i_idle_timeout[2] <= i_user_timeout ) + { + wrap::system_message( string(TIMERAT) + "(" + get_name() + "," + tool::int2string(i_user_timeout) + ")"); + string s_msg = wrap::CONF->get_elem("chat.msgs.userautoawaytimeout"); + set_away( true, s_msg ); + string s_msg2 = wrap::TIMR->get_time() + " <b>" + get_colored_name()+ "</b>" + s_msg + "<br>\n"; + get_room()->msg_post( &s_msg2 ); + get_room()->reload_onlineframe(); + } } void user::get_user_list( string &s_list ) { - if ( get_invisible() ) - return; - - s_list.append( wrap::CONF->get_elem("chat.html.onlinebefore") ); - - if ( get_away() ) - { - s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location")+ "away.gif\"" ) - .append( " alt='" ) - .append( get_away_msg() ) - .append( "' title='" ) - .append( get_away_msg() ) - .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); - } - else if ( ! get_is_reg() ) - { - string s_msgs = wrap::CONF->get_elem("chat.msgs.guest"); - s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location")+ "guest.png\"" ) - .append( " alt='" ) - .append( s_msgs ) - .append( "' title='" ) - .append( s_msgs ) - .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); - } - else if ( get_status() != tool::string2int( wrap::CONF->get_elem("chat.defaultrang") ) && ! get_fake() ) - { - string s_status = "rang" + tool::int2string( get_status() ); - string s_msgs = wrap::CONF->get_elem( "chat.msgs." + s_status ); - s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location") + tool::to_lower(s_status) + ".png\"" ) - .append( " alt='" ) - .append( s_msgs ) - .append( "' title='" ) - .append( s_msgs ) - .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); - } - else - { - s_list.append("<img src=\"images/blank.gif\"" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> "); - } - - s_list.append( get_colored_name() ); - s_list.append( wrap::CONF->get_elem("chat.html.onlinebehind") ); - s_list.append( "\n" ); + if ( get_invisible() ) + return; + + s_list.append( wrap::CONF->get_elem("chat.html.onlinebefore") ); + + if ( get_away() ) + { + s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location")+ "away.gif\"" ) + .append( " alt='" ) + .append( get_away_msg() ) + .append( "' title='" ) + .append( get_away_msg() ) + .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); + } + else if ( ! get_is_reg() ) + { + string s_msgs = wrap::CONF->get_elem("chat.msgs.guest"); + s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location")+ "guest.png\"" ) + .append( " alt='" ) + .append( s_msgs ) + .append( "' title='" ) + .append( s_msgs ) + .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); + } + else if ( get_status() != tool::string2int( wrap::CONF->get_elem("chat.defaultrang") ) && ! get_fake() ) + { + string s_status = "rang" + tool::int2string( get_status() ); + string s_msgs = wrap::CONF->get_elem( "chat.msgs." + s_status ); + s_list.append("<img src=\"" + wrap::CONF->get_elem("chat.html.rangimages.location") + tool::to_lower(s_status) + ".png\"" ) + .append( " alt='" ) + .append( s_msgs ) + .append( "' title='" ) + .append( s_msgs ) + .append( "'" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> " ); + } + + else + { + s_list.append("<img src=\"images/blank.gif\"" + wrap::CONF->get_elem("chat.html.rangimages.options") + "> "); + } + + s_list.append( get_colored_name() ); + s_list.append( wrap::CONF->get_elem("chat.html.onlinebehind") ); + s_list.append( "\n" ); } void user::check_restore_away() { - if ( get_away() ) - { - get_room()->msg_post( - new string( - wrap::TIMR->get_time() - + " <b>" + get_colored_name() - + "</b> " + wrap::CONF->get_elem( "chat.msgs.unsetmodeaway" ) - + "( <font color=" + get_col2() + ">" - + get_away_msg() + "</font>)<br>\n" - ) - ); - set_away( false ); - get_room()->reload_onlineframe(); - } + if ( get_away() ) + { + get_room()->msg_post( + new string( + wrap::TIMR->get_time() + + " <b>" + get_colored_name() + + "</b> " + wrap::CONF->get_elem( "chat.msgs.unsetmodeaway" ) + + "( <font color=" + get_col2() + ">" + + get_away_msg() + "</font>)<br>\n" + ) + ); + set_away( false ); + get_room()->reload_onlineframe(); + } } void user::reconf() -{} - -void -user::dumpit() { - dumpable::add("[user]"); - dumpable::add("Name: " + get_name() + - "; Room: " + get_room()->get_name() + - "; Status: " + tool::int2string(get_status())); - dumpable::add("TempID: " + get_tmpid()); } - #endif diff --git a/src/chat/user.h b/src/chat/user.h index c5535a5..4acb8f0 100644..100755 --- a/src/chat/user.h +++ b/src/chat/user.h @@ -1,163 +1,134 @@ -/*:* - *: File: ./src/chat/user.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef USER_H #define USER_H +#include "../maps/smap.h" #include "../name.h" #include "../time/timo.h" -#include "../monitor/dump.h" class room; using namespace std; -class user : public name, public timo, public dumpable +class user : public name, public timo { private: - // private members: - bool b_online; // true if user is online. - bool b_has_sess; // true if user already has a session! - bool b_is_reg; // true if user is registered - bool b_away; // true if user is away. - bool b_fake; // true if user hides his status logo (does not work for guest) - bool b_invisible; // true if user hides his status logo (does not work for guest) - int i_status; // user's rang ( see enum rang @ globals.h ). - int i_old_status; // user's previous status. - string s_tmpid; - string s_agnt; // user's http user agent. - string s_away; // user's last away message. - string s_col1; // user's nick color. - string s_col2; // user's text color. - string s_email; // user's email addres - string s_mess; // message string which has to be sent to the user. - string s_pass; // password - room* p_room; // pointer to the user's room. - - hashmap<string> map_changed_data; // Needed to tell yChat which data to change after user is removed! - bool b_set_changed_data; // Only set change data if required! - - // Modules which are allowed to be executed by the user. - - pthread_mutex_t mut_away; - pthread_mutex_t mut_b_online; - pthread_mutex_t mut_b_fake; - pthread_mutex_t mut_b_invisible; - pthread_mutex_t mut_b_has_sess; - pthread_mutex_t mut_b_is_reg; - pthread_mutex_t mut_s_mess; - pthread_mutex_t mut_s_pass; - pthread_mutex_t mut_p_room; - pthread_mutex_t mut_s_col1; - pthread_mutex_t mut_s_col2; - pthread_mutex_t mut_s_email; - pthread_mutex_t mut_s_tmpid; - pthread_mutex_t mut_i_status; - pthread_mutex_t mut_map_changed_data; - - void initialize(); - void set_changed_data( string s_varname, string s_value ); - void dumpit(); - -public: - pthread_cond_t cond_message; - pthread_mutex_t mut_message; - - user(); - user(string s_name); - ~user(); - - void clean(); - void destroy_session(); - - // gets specific data of this user und stores it in - // (*p_map<string,string>)["nick"]. this method will be used - // every time data has to be got from every user of a room - // or even of the system. - void get_data( map<string,string> *p_map_data ); - - string get_colored_name(); - string get_colored_bold_name() - { - return "<b>" + get_colored_name() + "</b>"; - } - bool get_online(); - bool get_fake(); - bool get_invisible(); - bool get_has_sess(); - bool get_is_reg(); - void set_online( bool b_online ); - void set_fake( bool b_fake ); - void set_invisible( bool b_invisible ); - void set_has_sess( bool b_has_sess ); - void set_is_reg( bool b_is_reg ); - void set_changed_data_on() - { - b_set_changed_data = 1; - } - bool get_away( ); - string get_away_msg( ); - void set_away( bool b_away, string s_away ); - void set_away( bool b_away ); - room* get_room(); - void set_p_room( room* p_room ); - string get_pass(); - string get_col1(); - string get_col2(); - string get_email(); - string get_tmpid(); - void set_tmpid( string s_tmpid ); - void set_pass( string s_col1 ); - void set_col1( string s_col1 ); - void set_col2( string s_col2 ); - void set_email( string s_email ); - int get_status( ); - void set_status( int i_status ); - bool new_msgs ( ); - void check_timeout( int* i_idle_timeout ); - - // executes a command. - void command( string &s_command ); - - // gets the message and clears s_mess; - string get_mess(); - - - // Here are starting methods which are mainly needed by the data<type> class. - // appends a string to s_mess including br. - void msg_post( string s_msg ) - { - msg_post( &s_msg ); - } - void msg_post( string *p_msg ); - void s_mess_delete( ); - void get_user_list( string &s_list ); - void check_restore_away(); - void reconf(); + // private members: + bool b_online; // true if user is online. + bool b_has_sess; // true if user already has a session! + bool b_is_reg; // true if user is registered + bool b_away; // true if user is away. + bool b_fake; // true if user hides his status logo (does not work for guest) + bool b_invisible; // true if user hides his status logo (does not work for guest) + int i_status; // user's rang ( see enum rang @ globals.h ). + int i_old_status; // user's previous status. + string s_tmpid; + string s_agnt; // user's http user agent. + string s_away; // user's last away message. + string s_col1; // user's nick color. + string s_col2; // user's text color. + string s_email; // user's email addres + string s_mess; // message string which has to be sent to the user. + string s_pass; // password + room* p_room; // pointer to the user's room. + + map<string,string> map_changed_data; // Needed to tell yChat which data to change after user is removed! + bool b_set_changed_data; // Only set change data if required! + + // Modules which are allowed to be executed by the user. + + // smap<dynmod*,string>* map_mods; + + // pthread_mutex_t mut_map_mods; + pthread_mutex_t mut_away; + pthread_mutex_t mut_b_online; + pthread_mutex_t mut_b_fake; + pthread_mutex_t mut_b_invisible; + pthread_mutex_t mut_b_has_sess; + pthread_mutex_t mut_b_is_reg; + pthread_mutex_t mut_s_mess; + pthread_mutex_t mut_s_pass; + pthread_mutex_t mut_p_room; + pthread_mutex_t mut_s_col1; + pthread_mutex_t mut_s_col2; + pthread_mutex_t mut_s_email; + pthread_mutex_t mut_s_tmpid; + pthread_mutex_t mut_i_status; + pthread_mutex_t mut_map_changed_data; + + void initialize(); + void set_changed_data( string s_varname, string s_value ); + + public: + pthread_cond_t cond_message; + pthread_mutex_t mut_message; + + user(); + user(string s_name); + ~user(); + + void clean(); + + // gets specific data of this user und stores it in + // (*p_map<string,string>)["nick"]. this method will be used + // every time data has to be got from every user of a room + // or even of the system. + void get_data( map<string,string> *p_map_data ); + + string get_colored_name(); + string get_colored_bold_name() + { + return "<b>" + get_colored_name() + "</b>"; + } + bool get_online(); + bool get_fake(); + bool get_invisible(); + bool get_has_sess(); + bool get_is_reg(); + void set_online( bool b_online ); + void set_fake( bool b_fake ); + void set_invisible( bool b_invisible ); + void set_has_sess( bool b_has_sess ); + void set_is_reg( bool b_is_reg ); + void set_changed_data_on() { b_set_changed_data = 1; } + bool get_away( ); + string get_away_msg( ); + void set_away( bool b_away, string s_away ); + void set_away( bool b_away ); + room* get_room(); + void set_p_room( room* p_room ); + string get_pass(); + string get_col1(); + string get_col2(); + string get_email(); + string get_tmpid(); + void set_tmpid( string s_tmpid ); + void set_pass( string s_col1 ); + void set_col1( string s_col1 ); + void set_col2( string s_col2 ); + void set_email( string s_email ); + int get_status( ); + void set_status( int i_status ); + bool new_msgs ( ); + void check_timeout( int* i_idle_timeout ); + + // executes a command. + void command( string &s_command ); + + // gets the message and clears s_mess; + string get_mess(); + + + // Here are starting methods which are mainly needed by the data<type> class. + // appends a string to s_mess including br. + void msg_post( string s_msg ) { msg_post( &s_msg ); } + void msg_post( string *p_msg ); + void s_mess_delete( ); + void get_user_list( string &s_list ); + void check_restore_away(); + void reconf(); }; #endif diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index e730130..e39275a 100644..100755 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/cli/cli.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef CLI_CPP #define CLI_CPP @@ -33,342 +9,296 @@ using namespace std; cli::cli( ) { #ifdef NCURSES - start(); + start(); #endif } cli::~cli() -{} +{ +} int cli::parse_input( string s_input ) { - string s_param = ""; - unsigned i_pos; - - // Check for empty string or ignore leading whitespaces - while(1) - { - if (s_input.empty()) - { - cout << CLIPRMI; - return 1; - } - - i_pos = s_input.find_first_of(" "); - - if (i_pos != 0) - break; - s_input.erase(s_input.begin()); - } - - if ( i_pos != string::npos ) - { - s_param = s_input.substr(i_pos+1); - s_input = s_input.substr(0, i_pos); - } - - if ( s_input.compare("help") == 0 || s_input.compare("h") == 0) - { - cout << CLIPRMO << "COMMAND LINE INTERFACE HELP MENU" << endl - << CLIPRMO << " !command - Uses system to run a command" << endl; + string s_param = ""; + unsigned i_pos = s_input.find_first_of(" "); + + if ( i_pos != string::npos ) { + s_param = s_input.substr(i_pos+1); + s_input = s_input.substr(0, i_pos); + } + + if ( s_input.compare("help") == 0 || s_input.compare("h") == 0) + { + cout << CLIPRMO << "COMMAND LINE INTERFACE HELP MENU" << endl; + cout << CLIPRMO << " !command - Uses system to run a command" << endl; #ifdef DEBUG - - cout << CLIPRMO << " (d)ebug - Starts debug routine (cli.cpp)" << endl; + cout << CLIPRMO << " (d)ebug - Starts debug routine (cli.cpp)" << endl; #endif - - cout << CLIPRMO << " (du)mp [part] - Prints out a dump of the data structure" << endl; - cout << CLIPRMO << " (Run without part to list all possibilities)" << endl; - cout << CLIPRMO << " (e)cho VAR - Prints out configuration value of VAR" << endl; - cout << CLIPRMO << " Wildcards can be used too, example: echo http*" << endl; + cout << CLIPRMO << " (e)cho VAR - Prints out configuration value of VAR" << endl + << CLIPRMO << " Wildcards can be used too, example: echo http*" << endl; #ifdef NCURSES - - cout << CLIPRMO << " (ex)it - Quits CLI mode and respawns ncurses mode" << endl; + cout << CLIPRMO << " (ex)it - Quits CLI mode and respawns ncurses mode" << endl; #endif - - cout << CLIPRMO << " (h)elp - Prints out this help!" << endl; - //<<* - cout << CLIPRMO << " (m)ysql - Runs MySQL client on yChat DB" << endl - << CLIPRMO << " (rel)oad - Reloads all modules" << endl; - //*>> + cout << CLIPRMO << " (h)elp - Prints out this help!" << endl; + //<<* + cout << CLIPRMO << " (m)ysql - Runs MySQL client on yChat DB" << endl + << CLIPRMO << " (rel)oad - Reloads all modules" << endl; + //*>> #ifdef EXPERIM + cout << CLIPRMO << " (re)conf - Reloads configuration (EXPERIMENTAL)" << endl; +#endif + cout << CLIPRMO << " (r)usage - Shows current resource usage" << endl + << CLIPRMO << " (ru)sageh - Shows resource usage history (yChat needs to run > 1 day)" << endl + << CLIPRMO << " (set) VAR VAL - Sets configuration value VAR to VAL" << endl + << CLIPRMO << " (sh)ell - Runs a system shell" << endl + << CLIPRMO << " (s)hutdown - Shuts down the whole server" << endl + << CLIPRMO << " (t)ime - Prints out time and uptime" << endl; + cout << CLIPRMO << " (unl)oad - Unloads all loaded modules" << endl;//<< + cout << CLIPRMO << " (u)nset VAR - Deletes configuration value VAR" << endl + << CLIPRMO << " (v)ersion - Prints out version" << endl; + cout << CLIPRMI; + } - cout << CLIPRMO << " (re)conf - Reloads configuration (EXPERIMENTAL)" << endl; + else if( s_input.at(0) == '!' ) + { + system( s_input.substr(1).c_str() ); + cout << CLIPRMI; + } +#ifdef DEBUG + else if( s_input.compare("d") == 0 || s_input.compare("debug") == 0 ) + { + debug_routine(); + cout << CLIPRMI; + } #endif + else if( s_input.compare("echo") == 0 || s_input.compare("e") == 0 ) + { + string s_val; + + // Check wildcards + unsigned i_pos = s_param.find("*"); + if ( i_pos != string::npos ) + { + s_param = s_param.substr( 0, i_pos ); + vector<string>* p_vec = wrap::CONF->get_key_vector(); + sort(p_vec->begin(), p_vec->end()); + vector<string>::iterator iter; + + for ( iter = p_vec->begin(); iter != p_vec->end(); iter++ ) + if ( iter->find(s_param) == 0 ) + s_val.append( *iter + " := " + wrap::CONF->get_elem(*iter) + "\n" + CLIPRMO ); + delete p_vec; + } + + else + { + s_val = wrap::CONF->get_elem(s_param); + } + + if( s_val.empty() ) + s_val = "Value not set"; + + cout << CLIPRMO << s_val << endl; + cout << CLIPRMI; + } + + //<<* + else if( s_input.compare("mysql") == 0 || s_input.compare("m") == 0 ) + { + cout << CLIPRMO << CLIMSQL << endl; + + system((wrap::CONF->get_elem("chat.system.mysqlclient") + " -p -h " + + wrap::CONF->get_elem("chat.database.serverhost") + " -u " + + wrap::CONF->get_elem("chat.database.user") ).c_str()); - cout << CLIPRMO << " (r)usage - Shows current resource usage" << endl - << CLIPRMO << " (ru)sageh - Shows resource usage history (yChat needs to run > 1 day)" << endl - << CLIPRMO << " (set) VAR VAL - Sets configuration value VAR to VAL" << endl - << CLIPRMO << " (sh)ell - Runs a system shell" << endl - << CLIPRMO << " (s)hutdown - Shuts down the whole server" << endl - << CLIPRMO << " (t)ime - Prints out time and uptime" << endl; - cout << CLIPRMO << " (unl)oad - Unloads all loaded modules" << endl;//<< - cout << CLIPRMO << " (u)nset VAR - Deletes configuration value VAR" << endl - << CLIPRMO << " (v)ersion - Prints out version" << endl; - cout << CLIPRMI; - } - else if( s_input.at(0) == '!' ) - { - system( s_input.substr(1).c_str() ); - cout << CLIPRMI; - } + cout << CLIPRMO << CLIWELC << endl; + cout << CLIPRMI; + } + //*>> -#ifdef DEBUG - else if ( s_input.compare("d") == 0 || s_input.compare("debug") == 0 ) - { - debug_routine(); - cout << CLIPRMI; - } +#ifdef NCURSES + else if( s_input.compare("exit") == 0 || s_input.compare("ex") == 0 ) + { + return 0; + } #endif - else if ( s_input.compare("du") == 0 || s_input.compare("dump") == 0 ) - { - dump d(vectorize(s_param)); - cout << CLIPRMI; - } - else if( s_input.compare("echo") == 0 || s_input.compare("e") == 0 ) - { - string s_val; - - // Check wildcards - unsigned i_pos = s_param.find("*"); - if ( i_pos != string::npos ) - { - s_param = s_param.substr( 0, i_pos ); - vector<string>* p_vec = wrap::CONF->get_key_vector(); - sort(p_vec->begin(), p_vec->end()); - vector<string>::iterator iter; - - for ( iter = p_vec->begin(); iter != p_vec->end(); iter++ ) - if ( iter->find(s_param) == 0 ) - s_val.append( *iter + " := " + wrap::CONF->get_elem(*iter) + "\n" + CLIPRMO ); - delete p_vec; - } - else - { - s_val = wrap::CONF->get_elem(s_param); - } - if( s_val.empty() ) - s_val = "Value not set"; + //<<* + else if( s_input.compare("reload") == 0 || s_input.compare("rel") == 0 ) + { + cout << CLIPRMO; + wrap::MODL->reload_modules(); + cout << CLIPRMI; + } + //*>> - cout << CLIPRMO << s_val << endl; - cout << CLIPRMI; - } +#ifdef EXPERIM + else if( s_input.compare("reconf") == 0 || s_input.compare("re") == 0 ) + { + wrap::CHAT->reconf(); + cout << CLIPRMI; + } +#endif - //<<* - else if( s_input.compare("mysql") == 0 || s_input.compare("m") == 0 ) - { - cout << CLIPRMO << CLIMSQL << endl; + else if( s_input.compare("rusage") == 0 || s_input.compare("r") == 0 ) + { + print_rusage(); + cout << CLIPRMI; + } - system((wrap::CONF->get_elem("chat.system.mysqlclient") + " -p -h " + - wrap::CONF->get_elem("chat.database.serverhost") + " -u " + - wrap::CONF->get_elem("chat.database.user") ).c_str()); + else if( s_input.compare("ru") == 0 || s_input.compare("rusageh") == 0 ) + { + cout << wrap::STAT->get_rusage_history( "ru_maxrss", string(CLIPRMO) + " " ); + cout << CLIPRMI; + } - cout << CLIPRMO << CLIWELC << endl; - cout << CLIPRMI; - } - //*>> + else if( s_input.compare("set") == 0 ) + { + string s_varname = ""; + i_pos = s_param.find_first_of(" "); -#ifdef NCURSES - else if( s_input.compare("exit") == 0 || s_input.compare("ex") == 0 ) - { - return 0; - } -#endif + if ( i_pos != string::npos ) { + s_varname = s_param.substr(0, i_pos); - //<<* - else if( s_input.compare("reload") == 0 || s_input.compare("rel") == 0 ) - { - cout << CLIPRMO; - wrap::MODL->reload_modules(); - cout << MODRELO << endl; - cout << CLIPRMI; - } - //*>> + if ( s_param.length() > i_pos+1 ) + s_param = s_param.substr(i_pos+1); -#ifdef EXPERIM - else if( s_input.compare("reconf") == 0 || s_input.compare("re") == 0 ) - { - wrap::CHAT->reconf(); - cout << CLIPRMI; + else + s_param = ""; } -#endif - else if( s_input.compare("rusage") == 0 || s_input.compare("r") == 0 ) - { - print_rusage(); - cout << CLIPRMI; - } - else if( s_input.compare("ru") == 0 || s_input.compare("rusageh") == 0 ) + string s_old_val = wrap::CONF->get_elem(s_varname); + + if ( !s_old_val.empty() ) { - cout << wrap::STAT->get_rusage_history( "ru_maxrss", string(CLIPRMO) + " " ); - cout << CLIPRMI; + cout << CLIPRMO << "Old value: " << s_old_val << endl; + wrap::CONF->del_elem(s_varname); } - else if( s_input.compare("set") == 0 ) - { - string s_varname = ""; - i_pos = s_param.find_first_of(" "); - if ( i_pos != string::npos ) - { - s_varname = s_param.substr(0, i_pos); + wrap::CONF->add_elem(s_param, s_varname); + cout << CLIPRMO << "New value: " << s_param << endl; + cout << CLIPRMI; + } - if ( s_param.length() > i_pos+1 ) - s_param = s_param.substr(i_pos+1); + else if( s_input.compare("shell") == 0 || s_input.compare("sh") == 0 ) + { + cout << CLIPRMO << CLISHEL << endl; + system(wrap::CONF->get_elem("httpd.system.shell").c_str()); + cout << CLIPRMO << CLIWELC << endl; + cout << CLIPRMI; + } - else - s_param = ""; - } + else if( s_input.compare("shutdown") == 0 || s_input.compare("s") == 0 ) + { + exit(0); + } - string s_old_val = wrap::CONF->get_elem(s_varname); + else if( s_input.compare("t") == 0 || s_input.compare("time") == 0 ) { + cout << CLIPRMO << "Time: " << wrap::TIMR->get_time() << endl + << CLIPRMO << "Uptime: " << wrap::TIMR->get_uptime() << endl; + cout << CLIPRMI; + } - if ( !s_old_val.empty() ) - { - cout << CLIPRMO << "Old value: " << s_old_val << endl; - wrap::CONF->del_elem(s_varname); - } + //<<* + else if( s_input.compare("unl") == 0 || s_input.compare("unload") == 0 ) { + cout << CLIPRMO; + wrap::MODL->unload_modules(); + cout << CLIPRMI; + } + //*>> - wrap::CONF->add_elem(s_param, s_varname); - cout << CLIPRMO << "New value: " << s_param << endl; - cout << CLIPRMI; - } - else if( s_input.compare("shell") == 0 || s_input.compare("sh") == 0 ) - { - cout << CLIPRMO << CLISHEL << endl; - system(wrap::CONF->get_elem("httpd.system.shell").c_str()); - cout << CLIPRMO << CLIWELC << endl; - cout << CLIPRMI; - } - else if( s_input.compare("shutdown") == 0 || s_input.compare("s") == 0 ) - { - exit(0); - } - else if( s_input.compare("t") == 0 || s_input.compare("time") == 0 ) + else if( s_input.compare("u") == 0 || s_input.compare("unset") == 0 ) + { + if (!s_param.empty()) { - cout << CLIPRMO << "Time: " << wrap::TIMR->get_time() << endl - << CLIPRMO << "Uptime: " << wrap::TIMR->get_uptime() << endl; - cout << CLIPRMI; + string s_old_val = wrap::CONF->get_elem(s_param); + if ( !s_old_val.empty() ) + { + cout << CLIPRMO << "Deleted variable " << s_param << " with value: " << s_old_val << endl; + wrap::CONF->del_elem(s_param); + } + else + { + cout << CLIPRMO << "Variable " << s_param << " was not set" << endl; + } + cout << CLIPRMI; } + } - //<<* - else if( s_input.compare("unl") == 0 || s_input.compare("unload") == 0 ) - { - cout << CLIPRMO; - wrap::MODL->unload_modules(); - cout << MODUNLO << endl; - cout << CLIPRMI; - } - //*>> + else if( s_input.compare("v") == 0 || s_input.compare("version") == 0 ) + { + cout << CLIPRMO << tool::ychat_version() << " " << UNAME << endl; + cout << CLIPRMI; + } - else if( s_input.compare("u") == 0 || s_input.compare("unset") == 0 ) - { - if (!s_param.empty()) - { - string s_old_val = wrap::CONF->get_elem(s_param); - if ( !s_old_val.empty() ) - { - cout << CLIPRMO << "Deleted variable " << s_param << " with value: " << s_old_val << endl; - wrap::CONF->del_elem(s_param); - } - else - { - cout << CLIPRMO << "Variable " << s_param << " was not set" << endl; - } - cout << CLIPRMI; - } - } - else if( s_input.compare("v") == 0 || s_input.compare("version") == 0 ) - { - cout << CLIPRMO << tool::ychat_version() << " " << UNAME << endl; - cout << CLIPRMI; - } - else - { - cout << CLIPRMO << CLIHELP << "\"" << s_input << "\"" << endl; - cout << CLIPRMI; - } + else + { + cout << CLIPRMO << CLIHELP << "\"" << s_input << "\"" << endl; + cout << CLIPRMI; + } - return 1; + return 1; } void #ifndef NCURSES cli::start(void* p_void) #else -cli::start() +cli::start() #endif { - cout << CLIPRMO << CLIWELC << endl; + cout << CLIPRMO << CLIWELC << endl; - string s_input; - cout << CLIPRMI; + string s_input; + cout << CLIPRMI; - do - { - getline(cin, s_input); - } - while( parse_input(s_input) ); + do + { + getline(cin, s_input); + } + while( parse_input(s_input) ); } void cli::print_rusage() { - rusage* p_rusage = new rusage; - getrusage( RUSAGE_SELF, p_rusage ); - - cout << CLIPRMO << "ru_maxrss: " << p_rusage->ru_maxrss << "\t(max resident set size)" << endl - << CLIPRMO << "ru_ixrss: " << p_rusage->ru_ixrss << "\t(integral shared text memory size)" << endl - << CLIPRMO << "ru_idrss: " << p_rusage->ru_idrss << "\t(integral unshared data size)" << endl - << CLIPRMO << "ru_isrss: " << p_rusage->ru_isrss << "\t(integral unshared stack size)" << endl - << CLIPRMO << "ru_minflt: " << p_rusage->ru_minflt << "\t(page reclaims)" << endl - << CLIPRMO << "ru_majflt: " << p_rusage->ru_majflt << "\t(page faults)" << endl - << CLIPRMO << "ru_nswap: " << p_rusage->ru_nswap << "\t(swaps)" << endl - << CLIPRMO << "ru_inblock: " << p_rusage->ru_inblock << "\t(block input operations)" << endl - << CLIPRMO << "ru_oublock: " << p_rusage->ru_oublock << "\t(block output operations)" << endl - << CLIPRMO << "ru_msgsnd: " << p_rusage->ru_msgsnd << "\t(messages sent)" << endl - << CLIPRMO << "ru_msgrcv: " << p_rusage->ru_msgrcv << "\t(messages received)" << endl - << CLIPRMO << "ru_nsignals: " << p_rusage->ru_nsignals << "\t(signals received)" << endl - << CLIPRMO << "ru_nvcsw: " << p_rusage->ru_nvcsw << "\t(voluntary context switches)" << endl - << CLIPRMO << "ru_nivcsw: " << p_rusage->ru_nivcsw << "\t(involuntary context switches)" << endl; - - delete p_rusage; -} - -vector<string> -cli::vectorize(string s_param) -{ - vector<string> vec_ret; - unsigned i_pos; - - for (i_pos = s_param.find(" "); - i_pos != string::npos; - i_pos = s_param.find(" ")) - { - vec_ret.push_back(s_param.substr(0, i_pos)); - s_param = s_param.substr(i_pos+1); - } - - if (!s_param.empty()) - vec_ret.push_back(s_param); - - return vec_ret; + rusage* p_rusage = new rusage; + getrusage( RUSAGE_SELF, p_rusage ); + + cout << CLIPRMO << "ru_maxrss: " << p_rusage->ru_maxrss << "\t(max resident set size)" << endl + << CLIPRMO << "ru_ixrss: " << p_rusage->ru_ixrss << "\t(integral shared text memory size)" << endl + << CLIPRMO << "ru_idrss: " << p_rusage->ru_idrss << "\t(integral unshared data size)" << endl + << CLIPRMO << "ru_isrss: " << p_rusage->ru_isrss << "\t(integral unshared stack size)" << endl + << CLIPRMO << "ru_minflt: " << p_rusage->ru_minflt << "\t(page reclaims)" << endl + << CLIPRMO << "ru_majflt: " << p_rusage->ru_majflt << "\t(page faults)" << endl + << CLIPRMO << "ru_nswap: " << p_rusage->ru_nswap << "\t(swaps)" << endl + << CLIPRMO << "ru_inblock: " << p_rusage->ru_inblock << "\t(block input operations)" << endl + << CLIPRMO << "ru_oublock: " << p_rusage->ru_oublock << "\t(block output operations)" << endl + << CLIPRMO << "ru_msgsnd: " << p_rusage->ru_msgsnd << "\t(messages sent)" << endl + << CLIPRMO << "ru_msgrcv: " << p_rusage->ru_msgrcv << "\t(messages received)" << endl + << CLIPRMO << "ru_nsignals: " << p_rusage->ru_nsignals << "\t(signals received)" << endl + << CLIPRMO << "ru_nvcsw: " << p_rusage->ru_nvcsw << "\t(voluntary context switches)" << endl + << CLIPRMO << "ru_nivcsw: " << p_rusage->ru_nivcsw << "\t(involuntary context switches)" << endl; + + delete p_rusage; } #ifdef DEBUG void cli::debug_routine() { - rusage* p_rusage = new rusage; - for(;;) - { - /* - ossl *p_tmp = new ossl; - getrusage( RUSAGE_SELF, p_rusage ); - cout << CLIPRMO << "ru_maxrss: " << p_rusage->ru_maxrss << "\t(max resident set size)" << endl; - delete p_tmp; - */ - } - delete p_rusage; + rusage* p_rusage = new rusage; + for(;;) + { +/* + ossl *p_tmp = new ossl; + getrusage( RUSAGE_SELF, p_rusage ); + cout << CLIPRMO << "ru_maxrss: " << p_rusage->ru_maxrss << "\t(max resident set size)" << endl; + delete p_tmp; + */ + } + delete p_rusage; } #endif diff --git a/src/cli/cli.h b/src/cli/cli.h index df3d33b..cc5a5fc 100644..100755 --- a/src/cli/cli.h +++ b/src/cli/cli.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/cli/cli.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <stdio.h> #include <sys/types.h> #include <sys/time.h> @@ -46,38 +22,30 @@ #include "../thrd/thro.h" #endif -#include "../monitor/dump.h" - using namespace std; +class cli #ifndef NCURSES -class cli : public thro -{ -#else -class cli -{ +: public thro #endif +{ private: - int parse_input(string s_input); - vector<string> vectorize(string s_param); - + int parse_input(string s_input); + public: -cli( ); -~cli( ); + cli( ); + ~cli( ); #ifdef DEBUG - -void debug_routine(); + void debug_routine(); #endif -void print_rusage(); + void print_rusage(); #ifndef NCURSES - -void start(void* p_void); + void start(void* p_void); #else - -void start(); + void start(); #endif }; diff --git a/src/conf/CVS/Entries b/src/conf/CVS/Entries index 0d65323..68ec4ab 100644 --- a/src/conf/CVS/Entries +++ b/src/conf/CVS/Entries @@ -1,3 +1,3 @@ -/conf.cpp/1.12/Wed Feb 16 21:28:55 2005// -/conf.h/1.8/Wed Feb 16 21:28:55 2005// +/conf.cpp/1.11/Fri Jan 7 21:00:19 2005// +/conf.h/1.7/Fri Jan 7 21:00:19 2005// D diff --git a/src/conf/conf.cpp b/src/conf/conf.cpp index a8b8410..e54cbd4 100644..100755 --- a/src/conf/conf.cpp +++ b/src/conf/conf.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/conf/conf.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef CONF_CPP #define CONF_CPP @@ -30,147 +6,136 @@ using namespace std; -conf::conf( string s_conf, map<string,string>* p_start_params ) : name::name( s_conf ) +conf::conf( string s_conf, map<string,string>* p_start_params ) : nmap<string,string>::nmap(HMAPOCC), name::name( s_conf ) { - string s_check[] = { - get_name(), - string(getenv("HOME"))+string("/.ychat/") + get_name(), - string("./etc/") + get_name(), - string("/etc/") + get_name(), - string(PREFIX+string("etc/")+get_name()) }; + string s_check[] = { + get_name(), + string(getenv("HOME"))+string("/.ychat/") + get_name(), + string("./etc/") + get_name(), + string("/etc/") + get_name(), + string(PREFIX+string("etc/")+get_name()) }; - string s_config; + string s_config; - for ( int i = 0; i < 4; ++i ) - { - cout << "Checking for " << s_check[i]; - ifstream if_check( s_check[i].c_str() ); - if( if_check ) + for ( int i = 0; i < 4; ++i ) { - s_config = s_check[i]; - if_check.close(); - cout << "... ok!" << endl; - break; + cout << "Checking for " << s_check[i]; + ifstream if_check( s_check[i].c_str() ); + if( if_check ) + { + s_config = s_check[i]; + if_check.close(); + cout << "... ok!" << endl; + break; + } + cout << "... not ok!" << endl; } - cout << "... not ok!" << endl; - } - - if ( s_config.empty() ) - { - cout << CFILEFA << endl; - exit(1); - } - - else - { - cout << CFILEOK << "..." << endl; - } - p_xml = new TiXmlDocument(s_config.c_str()); - TiXmlBase::SetCondenseWhiteSpace( false ); + if ( s_config.empty() ) + { + cout << CFILEFA << endl; + exit(1); + } - if ( !p_xml->LoadFile() ) - { - cout << XMLER1 << endl; - exit(1); - } + else + { + cout << CFILEOK << "..." << endl; + } - vector<string> vec_string; - parse_xml(p_xml, &vec_string); + p_xml = new TiXmlDocument(s_config.c_str()); + TiXmlBase::SetCondenseWhiteSpace( false ); + + if ( !p_xml->LoadFile() ) + { + cout << XMLER1 << endl; + exit(1); + } - shashmap<string>::add_elem_insecure(tool::ychat_version(), "ychat.version"); + vector<string> vec_string; + parse_xml(p_xml, &vec_string); - // Overrides ychat.conf values with command line options (ychat -o key1 value1 -o key2 value2 ...) - map<string,string>::iterator iter; - for ( iter = p_start_params->begin(); iter != p_start_params->end(); iter++ ) - { - shashmap<string>::del_elem_insecure(iter->first); - shashmap<string>::add_elem_insecure(iter->second, iter->first); - } + nmap<string,string>::add_elem_insecure(tool::ychat_version(), "ychat.version"); + + // Overrides ychat.conf values with command line options (ychat -o key1 value1 -o key2 value2 ...) + map<string,string>::iterator iter; + for ( iter = p_start_params->begin(); iter != p_start_params->end(); iter++ ) + { + nmap<string,string>::del_elem_insecure(iter->first); + nmap<string,string>::add_elem_insecure(iter->second, iter->first); + } - delete p_xml; + delete p_xml; } void conf::parse_xml(TiXmlNode* p_node, vector<string>* p_vec) { if ( p_node->NoChildren() ) - return; + return; for ( TiXmlNode* p_child = p_node->FirstChild(); p_child; p_child = p_child->NextSibling() ) { - //cout << p_vec->size() << ": (Value:" << p_child->Value() << ") (Type:" << p_child->Type() << ")" << endl; + //cout << p_vec->size() << ": (Value:" << p_child->Value() << ") (Type:" << p_child->Type() << ")" << endl; - if ( strcmp(p_child->Value(),"config") == 0 ) - { - parse_xml(p_child, p_vec); - } + if ( strcmp(p_child->Value(),"category") == 0 ) + { + p_vec->push_back(p_child->ToElement()->Attribute("name")); + parse_xml(p_child, p_vec); + p_vec->pop_back(); + } - else if ( strcmp(p_child->Value(),"category") == 0 ) - { - p_vec->push_back(p_child->ToElement()->Attribute("name")); - parse_xml(p_child, p_vec); - p_vec->pop_back(); - } - - else if ( strcmp(p_child->Value(),"option") == 0 ) - { - string s_option_name = ""; + else if ( strcmp(p_child->Value(),"option") == 0 ) + { + string s_option_name = ""; - for ( vector<string>::iterator iter = p_vec-> - begin(); - iter != p_vec->end(); - ++iter ) - s_option_name.append(*iter + "."); + for ( vector<string>::iterator iter = p_vec->begin(); iter != p_vec->end(); ++iter ) + s_option_name.append(*iter + "."); - TiXmlElement* p_element = p_child->ToElement(); - exit_if_xml_error(); + TiXmlElement* p_element = p_child->ToElement(); + exit_if_xml_error(); - s_option_name.append(p_element->Attribute("name")); + s_option_name.append(p_element->Attribute("name")); #ifdef VERBOSE - cout << XMLREAD << s_option_name; + cout << XMLREAD << s_option_name; #endif - TiXmlNode *p_node_value = p_element->FirstChild("value"); - TiXmlNode *p_node_descr = p_element->FirstChild("descr"); + TiXmlNode *p_node_value = p_element->FirstChild("value"); + TiXmlNode *p_node_descr = p_element->FirstChild("descr"); - TiXmlText* p_text_value = NULL; - TiXmlText* p_text_descr = NULL; + TiXmlText* p_text_value = NULL; + TiXmlText* p_text_descr = NULL; - if ( p_node_value && p_node_value->FirstChild() - ) - p_text_value = p_node_value->FirstChild()->ToText(); + if ( p_node_value && p_node_value->FirstChild() ) + p_text_value = p_node_value->FirstChild()->ToText(); - if ( p_node_descr && p_node_descr->FirstChild() - ) - p_text_descr = p_node_descr->FirstChild()->ToText(); + if ( p_node_descr && p_node_descr->FirstChild() ) + p_text_descr = p_node_descr->FirstChild()->ToText(); - if ( !p_text_value ) - continue; + if ( !p_text_value ) + continue; #ifdef VERBOSE - cout << " := " << p_text_value->Value() << endl; + cout << " := " << p_text_value->Value() << endl; #endif - shashmap<string>::add_elem_insecure(p_text_value->Value(), s_option_name); + nmap<string,string>::add_elem_insecure(p_text_value->Value(), s_option_name); - if ( !p_text_descr ) - continue; + if ( !p_text_descr ) + continue; - s_option_name.append(".descr"); + s_option_name.append(".descr"); #ifdef VERBOSE - cout << XMLREAD << s_option_name << endl; + cout << XMLREAD << s_option_name << endl; #endif - shashmap<string>::add_elem_insecure(p_text_descr->Value(), s_option_name); - } + nmap<string,string>::add_elem_insecure(p_text_descr->Value(), s_option_name); + } } - exit_if_xml_error() - ; + exit_if_xml_error(); } -conf::~conf() +conf::~conf() { delete p_xml; } @@ -178,27 +143,21 @@ conf::~conf() void conf::exit_if_xml_error() const { - if ( p_xml->Error() ) - { - cout << XMLERR << p_xml->ErrorDesc() << endl; - exit(1); - } + if ( p_xml->Error() ) + { + cout << XMLERR << p_xml->ErrorDesc() << endl; + exit(1); + } } //<<* string conf::colored_error_msg(string s_key) { - return "<font color=\"#" - + shashmap<string>::get_elem("chat.html.errorcolor") - + "\">" + shashmap<string>::get_elem(s_key) + "</font><br>\n"; + return "<font color=\"#" + + nmap<string,string>::get_elem("chat.html.errorcolor") + + "\">" + nmap<string,string>::get_elem(s_key) + "</font><br>\n"; } //*>> -int -conf::get_int(string s_key) -{ - return tool::string2int(get_elem(s_key)); -} - #endif diff --git a/src/conf/conf.h b/src/conf/conf.h index 2353422..3a7d0c6 100644..100755 --- a/src/conf/conf.h +++ b/src/conf/conf.h @@ -1,53 +1,27 @@ -/*:* - *: File: ./src/conf/conf.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef CONF_H #define CONF_H class conf; // Predefine for nmap.tmpl -#include <map> #include "../incl.h" -#include "../maps/shashmap.h" +#include "../maps/nmap.h" #include "../name.h" #include "../contrib/xml/tinyxml.h" using namespace std; -class conf : public shashmap<string>, name +class conf : public nmap<string,string>, name { private: - TiXmlDocument* p_xml; - void exit_if_xml_error() const; - void parse_xml( TiXmlNode* p_node, vector<string>* p_vec); + TiXmlDocument* p_xml; + void exit_if_xml_error() const; + void parse_xml( TiXmlNode* p_node, vector<string>* p_vec); public: - conf(string s_conf, map<string,string>* p_start_params); - ~conf(); + conf(string s_conf, map<string,string>* p_start_params); + ~conf(); - string colored_error_msg(string s_key); //<< - int get_int(string s_key); + string colored_error_msg( string s_key ); //<< }; #endif diff --git a/src/configure b/src/configure index 125890c..64cc404 100755 --- a/src/configure +++ b/src/configure @@ -1,11 +1,11 @@ #!/bin/sh - # -# The yChat Project (2003 - 2005) +# The yChat Project (2003 - 2004) # -if ! ../scripts/checkperl.sh +if ! which perl >/dev/null then + echo You need to have Perl in your PATH exit 1 fi @@ -29,8 +29,7 @@ perl -e ' "mysql/mysql.h", #//<< Not needed for yhttpd "netinet/in.h", "time.h", - "ncurses.h", - "::test::ext/hash_map" + "ncurses.h" ); my @libs = ( @@ -38,13 +37,44 @@ perl -e ' "libncurses.so" ); + sub remove_from_array + { + my $elem = shift; + my $array = shift; + + for ( my $i = 0; $i <= $#$array; ++$i ) + { + if ( $$array[$i] eq $elem ) + { + splice(@$array,$i,1); + last; + } + } + } + + open FILE, "glob.h" or die "glob.h: $!\n"; + while(<FILE>) + { + if ( /\/\/#define DATABASE/ ) + { + remove_from_array("mysql/mysql.h",\@headers); + remove_from_array("libmysqlclient.so",\@libs); + } + + elsif ( /\/\/#define NCURSES/ ) + { + remove_from_array("ncurses.h",\@headers); + remove_from_array("libncurses.so",\@libs); + } + } + close FILE; + my @headerpaths = ( $ENV{HOME}."/include", $ENV{HOME}."/usr/include", "/include", "/usr/include", "/usr/local/include", - "/usr/lib/", "/usr/pkg/include", "/opt/include", "/opt/local/include" @@ -61,53 +91,89 @@ perl -e ' "/opt/local/lib" ); - open FILE, "glob.h" or die "glob.h: $!\n"; - while(<FILE>) - { - if ( /\/\/#define DATABASE/ ) - { - remove_from_array("mysql/mysql.h",\@headers); - remove_from_array("libmysqlclient.so",\@libs); - } - - if ( /\/\/#define NCURSES/ ) - { - remove_from_array("ncurses.h",\@headers); - remove_from_array("libncurses.so",\@libs); - } - } - close FILE; - - if ( defined $ENV{YCHATHEADERPATHS} ) - { + if ( defined $ENV{YCHATHEADERPATHS} ) { map { print "Adding $_...\n"; - unshift @headerpaths, $_ } split /:/, $ENV{YCHATHEADERPATHS}; + unshift @headerpaths, $_ } split /:/, $ENV{YCHATHEADERPATHS}; } - if ( defined $ENV{YCHATLIBPATHS} ) - { + if ( defined $ENV{YCHATLIBPATHS} ) { map { print "Adding $_...\n"; - unshift @libpaths, $_ } split /:/, $ENV{YCHATLIBPATHS}; + unshift @libpaths, $_ } split /:/, $ENV{YCHATLIBPATHS}; } + sub check { + my $deep = shift; + + if ($deep == 0) { + print "Looking too deep! ($deepness)\n"; + exit(1); + } + + my $check = shift; + my $print = 1; + if ( $_[-1] eq "subsearch" ) { + $print = 0; + pop(@_); + } + + print "Checking for $check... " if $print; + foreach (@_) { + if ( -f "$_/$check" ) { + print "OK\n"; + return "" if $_ eq "/usr/lib" or $_ eq "/usr/include"; + return $_; + } + } + + foreach (@_) { + next unless -d $_; + opendir D, $_ or warn "$_: $!\n"; my @dir = readdir(D); + closedir D; + foreach my $dir ( @dir ) { + next if $dir =~ /^\.+$/ or !-d "$_/$dir"; + my $path = &check($deep-1, $check, "$_/$dir", "subsearch"); + return $path if $path ne ""; + } + } - print "Headers:\n"; + if ($print) { + print "NOT OK\n"; + print "Please make sure that you have the needed software installed!\n"; + print "If you have a special path for your includes then edit src/configure!\n"; + print "Or set the environment variables YCHATHEADERPATHS and YCHATLIBPATHS.\n"; + print " Example: setenv YCHATHEADERPATHS \"/your/header/includes:/a/includes\"\n"; + print "(The environment variables have to be seperated by an :)\n"; + exit(1); + } + `touch ../err`; + return ""; + } - my $testit = 0; map { $incadd{&check($deepness, $_, @headerpaths)}++ } @headers; - $testit = 0; - print "Libraries:\n"; map { $libadd{&check($deepness, $_, @libpaths)}++ } @libs; - my $incadd = &make_add("-I", \%incadd); - my $libadd = &make_add("-L", \%libadd); + sub makeadd { + my $flag = shift; + my $add = shift; + my $ret = ""; + + foreach (keys %$add) { + next unless /.+/; + $ret .= "$flag$_ "; + } + return $ret; + } + + my $incadd = &makeadd("-I", \%incadd); + my $libadd = &makeadd("-L", \%libadd); - for ( @libs ) + foreach ( @libs ) { - $libadd .= "-l$_ " if s/^lib// and s/\.so$//; + $libadd .= "-l$_ " + if s/^lib// and s/\.so$//; } print "Incadd: $incadd\n"; @@ -118,7 +184,6 @@ perl -e ' print "Creating new base Makefile...\n"; unlink("Makefile") if -f "Makefile"; - unlink("../err") if -f "../err"; open Fin, "Makefile.in" or die "Makefile.in: $!\n"; open Fout, ">Makefile" or die "Makefile: $!\n"; @@ -127,16 +192,12 @@ perl -e ' my $version = `tail -n 2 ../g++.version | head -n 1`; my $uname = `uname -srm`; my $compopt = join "; ", split /\n/, `cat ../g++.version`; - chomp $uname; chomp $compopt; - print "Configuring for $uname...\n"; chomp $cpp; chomp $version; - - while (<Fin>) - { + while (<Fin>) { s/^(CC=).*\n/$1$compiler/; s/^(SRCS=).*/$1$cpp/; s/ -frepo//; # unless $version =~ /3\.4/; @@ -150,29 +211,19 @@ perl -e ' my $args = join(" -",@ARGV); $args = "-".$args unless $args eq ""; - for my $cppfile (split / /, $cpp) - { + foreach my $cppfile (split / /, $cpp) { my $ofile = $cppfile; $ofile =~ s/\.cpp/\.o/; print Fout "../obj/$ofile: $cppfile\n"; print Fout "\t\@if ! test -d `dirname ../obj/$ofile`; then mkdir -p `dirname ../obj/$ofile`; fi\n"; - my $class = $ofile; - $class =~ s/\.o//; - - my $text; - if ( $class =~ /contrib\/.+/ ) - { - my $dirname = `dirname $class`; - $text = "\t\@echo -n \"Contributed class $class \"\n"; + if ( $ofile =~ /contrib\/.+/ ) { + my $dirname = `dirname $ofile`; + print Fout "\t\@echo -n \"Compiling contributed class $ofile \"\n"; + } else { + print Fout "\t\@echo -n \"Compiling base class $ofile \"\n"; } - - else - { - $text = "\t\@echo -n \"Base class $class \"\n"; - } - print Fout "\t\@\$(CC) \$(CFLAGS) \$(INCLUDES) $args -c -o ../obj/$ofile $cppfile\n"; - print Fout $text."\t\@du -hc ../obj/$ofile | tail -n 1 | sed s/total// | sed \"s/ //g\"\n"; + print Fout "\t\@du -hc ../obj/$ofile | tail -n 1 | sed s/total// | sed \"s/ //g\"\n"; } close Fout; @@ -182,153 +233,24 @@ perl -e ' close F; unlink("msgs.h"); open F, ">msgs.h" or die "msgs.h: $!\n"; - - for (@msgs) - { + foreach (@msgs) { s/(UNAME)(.+)$/UNAME "$uname"/; s/(COMPOPT)(.+)$/COMPOPT "$compopt"/; print F; } close F; - if ( -d "mods" ) - { + if ( -d "mods" ) { chdir("mods"); my $cflags = "-fno-inline -fno-default-inline"; - - $cflags .= " -nostdlib" if $uname =~ /FreeBSD/i && `uname -r` =~ /^4\./; - + $cflags .= " -nostdlib" + if $uname =~ /FreeBSD/i + && `uname -r` =~ /^4\./; system("echo $cflags > cflags.add"); system("./configure"); chdir(".."); } - sub remove_from_array - { - my $elem = shift; - my $array = shift; - - for ( my $i = 0; $i <= $#$array; ++$i ) - { - if ( $$array[$i] eq $elem ) - { - splice(@$array,$i,1); - last; - } - } # for - } - - sub check { - my $deep = shift; - - if ($deep == 0) { - print "Looking too deep! ($deepness)\n"; - exit(1); - } - - my $check = shift; - $testit = 1 if $check =~ s/::test:://; - - my $print = 1; - if ( $_[-1] eq "subsearch" ) { - $print = 0; - pop(@_); - } - - if ($print) - { - print "Checking for $check..."; - print "\n" if $testit; - } - - for (@_) - { - if ( -f "$_/$check" ) - { - if ($testit) - { - return $_ if test_include($_, $check); - return ""; - } - - else - { - print "OK\n"; - return "" if $_ eq "/usr/lib" or $_ eq "/usr/include"; - return $_; - } - } - } - - for (@_) - { - next unless -d $_; - opendir D, $_ or warn "$_: $!\n"; - my @dir = readdir(D); - closedir D; - - for my $dir ( @dir ) - { - next if $dir =~ /^\.+$/ or !-d "$_/$dir"; - my $path = &check($deep-1, $check, "$_/$dir", "subsearch"); - return $path if $path ne ""; - } - } - - if ($print) - { - print "NOT OK\n"; - print "Please make sure that you have the needed software installed!\n"; - print "If you have a special path for your includes then edit src/configure!\n"; - print "Or set the environment variables YCHATHEADERPATHS and YCHATLIBPATHS.\n"; - print " Example: setenv YCHATHEADERPATHS \"/your/header/includes:/a/includes\"\n"; - print "(The environment variables have to be seperated by an :)\n"; - print "PS: You may use the locate and/or find command to search for files.\n"; - exit(1); - } - - `touch ../err`; - return ""; - } - - sub make_add { - my $flag = shift; - my $add = shift; - my $ret = ""; - - for (reverse keys %$add) { - next unless /.+/; - $ret .= "$flag$_ "; - } - return $ret; - } - - sub test_include - { - my $shift = shift; - my $check = shift; - my $return = 0; - print "Testing $shift/$check..."; - - `echo "\#include \\"maps/hashmap.h\\"" > __test.cpp`; - `echo "int main(void){return 0;}" >> __test.cpp`; - my $cmd = "`tail -n 1 ../g++.version` -I$shift __test.cpp -o /dev/null 2>/dev/null"; - system $cmd; - - unless ($?) - { - print "OK\n"; - $return = 1; - } - - else - { - print "Not OK\n"; - } - - unlink "__test.cpp" if -f "__test.cpp"; - return $return; - } - exit(0); + ' `echo "$*" | sed "s/-//g"` diff --git a/src/contrib/crypt/md5.cpp b/src/contrib/crypt/md5.cpp index 390c42d..7023956 100644 --- a/src/contrib/crypt/md5.cpp +++ b/src/contrib/crypt/md5.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/contrib/crypt/md5.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was @@ -42,8 +18,7 @@ #include <string.h> /* for memcpy() */ #include "md5.h" -namespace md5 -{ +namespace md5 { #ifndef HIGHFIRST #define byteReverse(buf, len) /* Nothing */ @@ -52,20 +27,18 @@ void byteReverse(unsigned char *buf, unsigned longs); #ifndef ASM_MD5 /* -* Note: this code is harmless on little-endian machines. -*/ + * Note: this code is harmless on little-endian machines. + */ void byteReverse(unsigned char *buf, unsigned longs) { - uint32 t; - do - { - t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(uint32 *) buf = t; - buf += 4; - } - while (--longs); + uint32 t; + do { + t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32 *) buf = t; + buf += 4; + } while (--longs); } #endif #endif @@ -77,13 +50,13 @@ byteReverse(unsigned char *buf, unsigned longs) void MD5Init(struct MD5Context *ctx) { - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; - ctx->bits[0] = 0; - ctx->bits[1] = 0; + ctx->bits[0] = 0; + ctx->bits[1] = 0; } /* @@ -93,49 +66,46 @@ MD5Init(struct MD5Context *ctx) void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { - uint32 t; + uint32 t; - /* Update bitcount */ + /* Update bitcount */ - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - /* Handle any leading odd-sized chunks */ + /* Handle any leading odd-sized chunks */ - if (t) - { - unsigned char *p = (unsigned char *) ctx->in + t; + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; - t = 64 - t; - if (len < t) - { - memcpy(p, buf, len); - return; + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += 64; + len -= 64; } - memcpy(p, buf, t); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32 *) ctx->in); - buf += t; - len -= t; - } - /* Process data in 64-byte chunks */ - - while (len >= 64) - { - memcpy(ctx->in, buf, 64); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32 *) ctx->in); - buf += 64; - len -= 64; - } - /* Handle any remaining bytes of data. */ + /* Handle any remaining bytes of data. */ - memcpy(ctx->in, buf, len); + memcpy(ctx->in, buf, len); } /* @@ -145,46 +115,43 @@ MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) - { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32 *) ctx->in); + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (uint32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } - else - { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - byteReverse(ctx->in, 14); - - /* Append length in bits and transform */ - ((uint32 *) ctx->in)[14] = ctx->bits[0]; - ((uint32 *) ctx->in)[15] = ctx->bits[1]; - - MD5Transform(ctx->buf, (uint32 *) ctx->in); - byteReverse((unsigned char *) ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - memset((char *) ctx, 0, sizeof(ctx)); /* In case it's sensitive */ + /* Append length in bits and transform */ + ((uint32 *) ctx->in)[14] = ctx->bits[0]; + ((uint32 *) ctx->in)[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (uint32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset((char *) ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } #ifndef ASM_MD5 @@ -209,85 +176,85 @@ MD5Final(unsigned char digest[16], struct MD5Context *ctx) void MD5Transform(uint32 buf[4], uint32 const in[16]) { - register uint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; + register uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; } #endif diff --git a/src/contrib/crypt/md5.h b/src/contrib/crypt/md5.h index 49bbd94..0b9d532 100644 --- a/src/contrib/crypt/md5.h +++ b/src/contrib/crypt/md5.h @@ -1,49 +1,22 @@ -/*:* - *: File: ./src/contrib/crypt/md5.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef MD5_H #define MD5_H -namespace md5 -{ +namespace md5 { #ifdef __alpha typedef unsigned int uint32; #else - typedef unsigned long uint32; #endif -struct MD5Context -{ - uint32 buf[4]; - uint32 bits[2]; - unsigned char in[64]; +struct MD5Context { + uint32 buf[4]; + uint32 bits[2]; + unsigned char in[64]; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, unsigned char const *buf, - unsigned len); + unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); void MD5Transform(uint32 buf[4], uint32 const in[16]); diff --git a/src/contrib/crypt/md5crypt.cpp b/src/contrib/crypt/md5crypt.cpp index 39aa4dd..16b0235 100644 --- a/src/contrib/crypt/md5crypt.cpp +++ b/src/contrib/crypt/md5crypt.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/contrib/crypt/md5crypt.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): @@ -40,20 +16,18 @@ #include <string.h> #include "md5.h" -namespace md5 -{ +namespace md5 { static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; static void to64(char *s, unsigned long v, int n) { - while (--n >= 0) - { - *s++ = itoa64[v&0x3f]; - v >>= 6; - } + while (--n >= 0) { + *s++ = itoa64[v&0x3f]; + v >>= 6; + } } /* @@ -65,122 +39,109 @@ to64(char *s, unsigned long v, int n) char * MD5Crypt(const char *pw, const char *salt) { - static char *magic = "$1$"; /* - * This string is magic for - * this algorithm. Having - * it this way, we can get - * get better later on - */ - static char passwd[120], *p; - static const char *sp,*ep; - unsigned char final[16]; - int sl,pl,i,j; - MD5_CTX ctx,ctx1; - unsigned long l; - - /* Refine the Salt first */ - sp = salt; - - /* If it starts with the magic string, then skip that */ - if(!strncmp(sp,magic,strlen(magic))) - sp += strlen(magic); - - /* It stops at the first '$', max 8 chars */ - for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) - continue; - - /* get the length of the true salt */ - sl = ep - sp; - - MD5Init(&ctx); - - /* The password first, since that is what is most unknown */ - MD5Update(&ctx,(const unsigned char*)pw,strlen(pw)); - - /* Then our magic string */ - MD5Update(&ctx,(const unsigned char*)magic,strlen(magic)); - - /* Then the raw salt */ - MD5Update(&ctx,(const unsigned char*)sp,sl); - - /* Then just as many characters of the MD5(pw,salt,pw) */ - MD5Init(&ctx1); - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Update(&ctx1,(const unsigned char*)sp,sl); - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Final(final,&ctx1); - for(pl = strlen(pw); pl > 0; pl -= 16) - MD5Update(&ctx,final,pl>16 ? 16 : pl); - - /* Don't leave anything around in vm they could use. */ - memset(final,0,sizeof final); - - /* Then something really weird... */ - for (j=0,i = strlen(pw); i ; i >>= 1) - if(i&1) - MD5Update(&ctx, final+j, 1); - else - MD5Update(&ctx, (const unsigned char*)pw+j, 1); - - /* Now make the output string */ - strcpy(passwd,magic); - strncat(passwd,sp,sl); - strcat(passwd,"$"); - - MD5Final(final,&ctx); - - /* - * and now, just to make sure things don't run too fast - * On a 60 Mhz Pentium this takes 34 msec, so you would - * need 30 seconds to build a 1000 entry dictionary... - */ - for(i=0;i<1000;i++) - { - MD5Init(&ctx1); - if(i & 1) - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - else - MD5Update(&ctx1,final,16); - - if(i % 3) - MD5Update(&ctx1,(const unsigned char*)sp,sl); - - if(i % 7) - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - - if(i & 1) - MD5Update(&ctx1,final,16); - else - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Final(final,&ctx1); - } - - p = passwd + strlen(passwd); - - l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; - to64(p,l,4); - p += 4; - l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; - to64(p,l,4); - p += 4; - l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; - to64(p,l,4); - p += 4; - l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; - to64(p,l,4); - p += 4; - l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; - to64(p,l,4); - p += 4; - l = final[11] ; - to64(p,l,2); - p += 2; - *p = '\0'; - - /* Don't leave anything around in vm they could use. */ - memset(final,0,sizeof final); - - return passwd; + static char *magic = "$1$"; /* + * This string is magic for + * this algorithm. Having + * it this way, we can get + * get better later on + */ + static char passwd[120], *p; + static const char *sp,*ep; + unsigned char final[16]; + int sl,pl,i,j; + MD5_CTX ctx,ctx1; + unsigned long l; + + /* Refine the Salt first */ + sp = salt; + + /* If it starts with the magic string, then skip that */ + if(!strncmp(sp,magic,strlen(magic))) + sp += strlen(magic); + + /* It stops at the first '$', max 8 chars */ + for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) + continue; + + /* get the length of the true salt */ + sl = ep - sp; + + MD5Init(&ctx); + + /* The password first, since that is what is most unknown */ + MD5Update(&ctx,(const unsigned char*)pw,strlen(pw)); + + /* Then our magic string */ + MD5Update(&ctx,(const unsigned char*)magic,strlen(magic)); + + /* Then the raw salt */ + MD5Update(&ctx,(const unsigned char*)sp,sl); + + /* Then just as many characters of the MD5(pw,salt,pw) */ + MD5Init(&ctx1); + MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); + MD5Update(&ctx1,(const unsigned char*)sp,sl); + MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); + MD5Final(final,&ctx1); + for(pl = strlen(pw); pl > 0; pl -= 16) + MD5Update(&ctx,final,pl>16 ? 16 : pl); + + /* Don't leave anything around in vm they could use. */ + memset(final,0,sizeof final); + + /* Then something really weird... */ + for (j=0,i = strlen(pw); i ; i >>= 1) + if(i&1) + MD5Update(&ctx, final+j, 1); + else + MD5Update(&ctx, (const unsigned char*)pw+j, 1); + + /* Now make the output string */ + strcpy(passwd,magic); + strncat(passwd,sp,sl); + strcat(passwd,"$"); + + MD5Final(final,&ctx); + + /* + * and now, just to make sure things don't run too fast + * On a 60 Mhz Pentium this takes 34 msec, so you would + * need 30 seconds to build a 1000 entry dictionary... + */ + for(i=0;i<1000;i++) { + MD5Init(&ctx1); + if(i & 1) + MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); + else + MD5Update(&ctx1,final,16); + + if(i % 3) + MD5Update(&ctx1,(const unsigned char*)sp,sl); + + if(i % 7) + MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); + + if(i & 1) + MD5Update(&ctx1,final,16); + else + MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); + MD5Final(final,&ctx1); + } + + p = passwd + strlen(passwd); + + l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p,l,4); p += 4; + l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p,l,4); p += 4; + l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p,l,4); p += 4; + l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p,l,4); p += 4; + l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p,l,4); p += 4; + l = final[11] ; to64(p,l,2); p += 2; + *p = '\0'; + + /* Don't leave anything around in vm they could use. */ + memset(final,0,sizeof final); + + return passwd; } } diff --git a/src/contrib/xml/tinyxml.cpp b/src/contrib/xml/tinyxml.cpp index 0670645..dd1f471 100644 --- a/src/contrib/xml/tinyxml.cpp +++ b/src/contrib/xml/tinyxml.cpp @@ -1,47 +1,23 @@ -/*:* - *: File: ./src/contrib/xml/tinyxml.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - + This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - + Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - + 3. This notice may not be removed or altered from any source distribution. */ @@ -58,1395 +34,1394 @@ bool TiXmlBase::condenseWhiteSpace = true; void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) { - TIXML_STRING buffer; - PutString( str, &buffer ); - (*stream) << buffer; + TIXML_STRING buffer; + PutString( str, &buffer ); + (*stream) << buffer; } void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) { - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - outString->append( buf, strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } + int i=0; + + while( i<(int)str.length() ) + { + unsigned char c = (unsigned char) str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + // + // The -1 is a bug fix from Rob Laveaux. It keeps + // an overflow from happening if there is no ';'. + // There are actually 2 ways to exit this loop - + // while fails (error case) and break (semicolon found). + // However, there is no mechanism (currently) for + // this function to return an error. + while ( i<(int)str.length()-1 ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 ) + { + // Easy pass at non-alpha/numeric/symbol + // Below 32 is symbolic. + char buf[ 32 ]; + sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); + outString->append( buf, strlen( buf ) ); + ++i; + } + else + { + //char realc = (char) c; + //outString->append( &realc, 1 ); + *outString += (char) c; // somewhat more efficient function call. + ++i; + } + } } // <-- Strange class for a bug fix. Search for STL_STRING_BUG TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) { - buffer = new char[ str.length()+1 ]; - if ( buffer ) - { - strcpy( buffer, str.c_str() ); - } + buffer = new char[ str.length()+1 ]; + if ( buffer ) + { + strcpy( buffer, str.c_str() ); + } } TiXmlBase::StringToBuffer::~StringToBuffer() { - delete [] buffer; + delete [] buffer; } // End strange bug fix. --> TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() { - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; } TiXmlNode::~TiXmlNode() { - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } } void TiXmlNode::CopyTo( TiXmlNode* target ) const { - target->SetValue (value.c_str() ); - target->userData = userData; + target->SetValue (value.c_str() ); + target->userData = userData; } void TiXmlNode::Clear() { - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } - firstChild = 0; - lastChild = 0; + firstChild = 0; + lastChild = 0; } TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) { - node->parent = this; + node->parent = this; - node->prev = lastChild; - node->next = 0; + node->prev = lastChild; + node->next = 0; - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. - lastChild = node; - return node; + lastChild = node; + return node; } TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; - return LinkEndChild( node ); + return LinkEndChild( node ); } TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; +{ + if ( !beforeThis || beforeThis->parent != this ) + return 0; + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; } TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) { - if ( !afterThis || afterThis->parent != this ) - return 0; + if ( !afterThis || afterThis->parent != this ) + return 0; - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; } TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) { - if ( replaceThis->parent != this ) - return 0; + if ( replaceThis->parent != this ) + return 0; - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; - node->next = replaceThis->next; - node->prev = replaceThis->prev; + node->next = replaceThis->next; + node->prev = replaceThis->prev; - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; - delete replaceThis; - node->parent = this; - return node; + delete replaceThis; + node->parent = this; + return node; } bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) { - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; - delete removeThis; - return true; + delete removeThis; + return true; } TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const { - TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == TIXML_STRING( _value )) - return node; - } - return 0; + TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( node->SValue() == TIXML_STRING( _value )) + return node; + } + return 0; } TiXmlNode* TiXmlNode::LastChild( const char * _value ) const { - TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == TIXML_STRING (_value)) - return node; - } - return 0; + TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; } TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const { - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } } TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) const { - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } } TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const { - TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == TIXML_STRING (_value)) - return node; - } - return 0; + TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; } TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const { - TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == TIXML_STRING (_value)) - return node; - } - return 0; + TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; } void TiXmlElement::RemoveAttribute( const char * name ) { - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } } TiXmlElement* TiXmlNode::FirstChildElement() const { - TiXmlNode* node; + TiXmlNode* node; - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; } TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const { - TiXmlNode* node; + TiXmlNode* node; - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; } TiXmlElement* TiXmlNode::NextSiblingElement() const { - TiXmlNode* node; + TiXmlNode* node; - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; } TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const { - TiXmlNode* node; + TiXmlNode* node; - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; } TiXmlDocument* TiXmlNode::GetDocument() const { - const TiXmlNode* node; + const TiXmlNode* node; - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; } TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) + : TiXmlNode( TiXmlNode::ELEMENT ) { - firstChild = lastChild = 0; - value = _value; + firstChild = lastChild = 0; + value = _value; } #ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) +TiXmlElement::TiXmlElement( const std::string& _value ) + : TiXmlNode( TiXmlNode::ELEMENT ) { - firstChild = lastChild = 0; - value = _value; + firstChild = lastChild = 0; + value = _value; } #endif TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) + : TiXmlNode( TiXmlNode::ELEMENT ) { - firstChild = lastChild = 0; - copy.CopyTo( this ); + firstChild = lastChild = 0; + copy.CopyTo( this ); } void TiXmlElement::operator=( const TiXmlElement& base ) { - ClearThis(); - base.CopyTo( this ); + ClearThis(); + base.CopyTo( this ); } TiXmlElement::~TiXmlElement() { - ClearThis(); + ClearThis(); } void TiXmlElement::ClearThis() { - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } + Clear(); + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } } const char * TiXmlElement::Attribute( const char * name ) const { - TiXmlAttribute* node = attributeSet.Find( name ); + TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - return node->Value(); + if ( node ) + return node->Value(); - return 0; + return 0; } const char * TiXmlElement::Attribute( const char * name, int* i ) const { - const char * s = Attribute( name ); - if ( i ) - { - if ( s ) - *i = atoi( s ); - else - *i = 0; - } - return s; + const char * s = Attribute( name ); + if ( i ) + { + if ( s ) + *i = atoi( s ); + else + *i = 0; + } + return s; } const char * TiXmlElement::Attribute( const char * name, double* d ) const { - const char * s = Attribute( name ); - if ( d ) - { - if ( s ) - *d = atof( s ); - else - *d = 0; - } - return s; + const char * s = Attribute( name ); + if ( d ) + { + if ( s ) + *d = atof( s ); + else + *d = 0; + } + return s; } int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const { - TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; - return node->QueryIntValue( ival ); + return node->QueryIntValue( ival ); } int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const { - TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; - return node->QueryDoubleValue( dval ); + return node->QueryDoubleValue( dval ); } void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - sprintf( buf, "%d", val ); - SetAttribute( name, buf ); +{ + char buf[64]; + sprintf( buf, "%d", val ); + SetAttribute( name, buf ); } void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[128]; - sprintf( buf, "%f", val ); - SetAttribute( name, buf ); +{ + char buf[128]; + sprintf( buf, "%f", val ); + SetAttribute( name, buf ); } void TiXmlElement::SetAttribute( const char * name, const char * _value ) { - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } } void TiXmlElement::Print( FILE* cfile, int depth ) const { - int i; - for ( i=0; i<depth; i++ ) - { - fprintf( cfile, " " ); - } - - fprintf( cfile, "<%s", value.c_str() ); - - TiXmlAttribute* attrib; - for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a <foo /> node - // 2) An element with only a text child is printed as <foo> text </foo> - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "</%s>", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i<depth; ++i ) - fprintf( cfile, " " ); - fprintf( cfile, "</%s>", value.c_str() ); - } + int i; + for ( i=0; i<depth; i++ ) + { + fprintf( cfile, " " ); + } + + fprintf( cfile, "<%s", value.c_str() ); + + TiXmlAttribute* attrib; + for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a <foo /> node + // 2) An element with only a text child is printed as <foo> text </foo> + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "</%s>", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i<depth; ++i ) + fprintf( cfile, " " ); + fprintf( cfile, "</%s>", value.c_str() ); + } } void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const { - (*stream) << "<" << value; + (*stream) << "<" << value; - TiXmlAttribute* attrib; - for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) - { - (*stream) << " "; - attrib->StreamOut( stream ); - } + TiXmlAttribute* attrib; + for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) + { + (*stream) << " "; + attrib->StreamOut( stream ); + } - // If this node has children, give it a closing tag. Else - // make it an empty tag. - TiXmlNode* node; - if ( firstChild ) - { - (*stream) << ">"; + // If this node has children, give it a closing tag. Else + // make it an empty tag. + TiXmlNode* node; + if ( firstChild ) + { + (*stream) << ">"; - for ( node = firstChild; node; node=node->NextSibling() ) - { - node->StreamOut( stream ); - } - (*stream) << "</" << value << ">"; - } - else - { - (*stream) << " />"; - } + for ( node = firstChild; node; node=node->NextSibling() ) + { + node->StreamOut( stream ); + } + (*stream) << "</" << value << ">"; + } + else + { + (*stream) << " />"; + } } void TiXmlElement::CopyTo( TiXmlElement* target ) const { - // superclass: - TiXmlNode::CopyTo( target ); + // superclass: + TiXmlNode::CopyTo( target ); - // Element class: - // Clone the attributes, then clone the children. - TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } + // Element class: + // Clone the attributes, then clone the children. + TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + target->SetAttribute( attribute->Name(), attribute->Value() ); + } - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } } TiXmlNode* TiXmlElement::Clone() const { - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; + TiXmlElement* clone = new TiXmlElement( Value() ); + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) { - tabsize = 4; - ClearError(); + tabsize = 4; + ClearError(); } TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) { - tabsize = 4; - value = documentName; - ClearError(); + tabsize = 4; + value = documentName; + ClearError(); } #ifdef TIXML_USE_STL TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) { - tabsize = 4; - value = documentName; - ClearError(); + tabsize = 4; + value = documentName; + ClearError(); } #endif TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) { - copy.CopyTo( this ); + copy.CopyTo( this ); } void TiXmlDocument::operator=( const TiXmlDocument& copy ) { - Clear(); - copy.CopyTo( this ); + Clear(); + copy.CopyTo( this ); } bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) { - // See STL_STRING_BUG below. - StringToBuffer buf( value ); + // See STL_STRING_BUG below. + StringToBuffer buf( value ); - if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) - return true; + if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) + return true; - return false; + return false; } bool TiXmlDocument::SaveFile() const { - // See STL_STRING_BUG below. - StringToBuffer buf( value ); + // See STL_STRING_BUG below. + StringToBuffer buf( value ); - if ( buf.buffer && SaveFile( buf.buffer ) ) - return true; + if ( buf.buffer && SaveFile( buf.buffer ) ) + return true; - return false; + return false; } bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding ) { - // Delete the existing data: - Clear(); - location.Clear(); - - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // See STL_STRING_BUG above. - // Fixed with the StringToBuffer class. - value = filename; - - FILE* file = fopen( value.c_str (), "r" ); - - if ( file ) - { - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length == 0 ) - { - fclose( file ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - const int BUF_SIZE = 2048; - char buf[BUF_SIZE]; - - while( fgets( buf, BUF_SIZE, file ) ) - { - data += buf; - } - fclose( file ); - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; - } - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; + // Delete the existing data: + Clear(); + location.Clear(); + + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::string to + // be called. What is strange, is that the std::string had the same + // address as it's c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // See STL_STRING_BUG above. + // Fixed with the StringToBuffer class. + value = filename; + + FILE* file = fopen( value.c_str (), "r" ); + + if ( file ) + { + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length == 0 ) + { + fclose( file ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXML_STRING data; + data.reserve( length ); + + const int BUF_SIZE = 2048; + char buf[BUF_SIZE]; + + while( fgets( buf, BUF_SIZE, file ) ) + { + data += buf; + } + fclose( file ); + + Parse( data.c_str(), 0, encoding ); + + if ( Error() ) + return false; + else + return true; + } + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; } bool TiXmlDocument::SaveFile( const char * filename ) const { - // The old c stuff lives on... - FILE* fp = fopen( filename, "w" ); - if ( fp ) - { - Print( fp, 0 ); - fclose( fp ); - return true; - } - return false; + // The old c stuff lives on... + FILE* fp = fopen( filename, "w" ); + if ( fp ) + { + Print( fp, 0 ); + fclose( fp ); + return true; + } + return false; } void TiXmlDocument::CopyTo( TiXmlDocument* target ) const { - TiXmlNode::CopyTo( target ); + TiXmlNode::CopyTo( target ); - target->error = error; - target->errorDesc = errorDesc.c_str (); + target->error = error; + target->errorDesc = errorDesc.c_str (); - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } } TiXmlNode* TiXmlDocument::Clone() const { - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; + TiXmlDocument* clone = new TiXmlDocument(); + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } void TiXmlDocument::Print( FILE* cfile, int depth ) const { - TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } } void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const { - TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->StreamOut( out ); + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->StreamOut( out ); - // Special rule for streams: stop after the root element. - // The stream in code will only read one element, so don't - // write more than one. - if ( node->ToElement() ) - break; - } + // Special rule for streams: stop after the root element. + // The stream in code will only read one element, so don't + // write more than one. + if ( node->ToElement() ) + break; + } } TiXmlAttribute* TiXmlAttribute::Next() const { - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; } TiXmlAttribute* TiXmlAttribute::Previous() const { - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; } void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const { - TIXML_STRING n, v; + TIXML_STRING n, v; - PutString( name, &n ); - PutString( value, &v ); + PutString( name, &n ); + PutString( value, &v ); - if (value.find ('\"') == TIXML_STRING::npos) - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - else - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); + if (value.find ('\"') == TIXML_STRING::npos) + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + else + fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); } void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const { - if (value.find( '\"' ) != TIXML_STRING::npos) - { - PutString( name, stream ); - (*stream) << "=" << "'"; - PutString( value, stream ); - (*stream) << "'"; - } - else - { - PutString( name, stream ); - (*stream) << "=" << "\""; - PutString( value, stream ); - (*stream) << "\""; - } + if (value.find( '\"' ) != TIXML_STRING::npos) + { + PutString( name, stream ); + (*stream) << "=" << "'"; + PutString( value, stream ); + (*stream) << "'"; + } + else + { + PutString( name, stream ); + (*stream) << "=" << "\""; + PutString( value, stream ); + (*stream) << "\""; + } } int TiXmlAttribute::QueryIntValue( int* ival ) const { - if ( sscanf( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; + if ( sscanf( value.c_str(), "%d", ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; } int TiXmlAttribute::QueryDoubleValue( double* dval ) const { - if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; + if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; } void TiXmlAttribute::SetIntValue( int _value ) { - char buf [64]; - sprintf (buf, "%d", _value); - SetValue (buf); + char buf [64]; + sprintf (buf, "%d", _value); + SetValue (buf); } void TiXmlAttribute::SetDoubleValue( double _value ) { - char buf [64]; - sprintf (buf, "%lf", _value); - SetValue (buf); + char buf [64]; + sprintf (buf, "%lf", _value); + SetValue (buf); } const int TiXmlAttribute::IntValue() const { - return atoi (value.c_str ()); + return atoi (value.c_str ()); } const double TiXmlAttribute::DoubleValue() const { - return atof (value.c_str ()); + return atof (value.c_str ()); } TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) { - copy.CopyTo( this ); + copy.CopyTo( this ); } void TiXmlComment::operator=( const TiXmlComment& base ) { - Clear(); - base.CopyTo( this ); + Clear(); + base.CopyTo( this ); } void TiXmlComment::Print( FILE* cfile, int depth ) const { - for ( int i=0; i<depth; i++ ) - { - fputs( " ", cfile ); - } - fprintf( cfile, "<!--%s-->", value.c_str() ); + for ( int i=0; i<depth; i++ ) + { + fputs( " ", cfile ); + } + fprintf( cfile, "<!--%s-->", value.c_str() ); } void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const { - (*stream) << "<!--"; - //PutString( value, stream ); - (*stream) << value; - (*stream) << "-->"; + (*stream) << "<!--"; + //PutString( value, stream ); + (*stream) << value; + (*stream) << "-->"; } void TiXmlComment::CopyTo( TiXmlComment* target ) const { - TiXmlNode::CopyTo( target ); + TiXmlNode::CopyTo( target ); } TiXmlNode* TiXmlComment::Clone() const { - TiXmlComment* clone = new TiXmlComment(); + TiXmlComment* clone = new TiXmlComment(); - if ( !clone ) - return 0; + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const { - TIXML_STRING buffer; - PutString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); + TIXML_STRING buffer; + PutString( value, &buffer ); + fprintf( cfile, "%s", buffer.c_str() ); } void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const { - PutString( value, stream ); + PutString( value, stream ); } void TiXmlText::CopyTo( TiXmlText* target ) const { - TiXmlNode::CopyTo( target ); + TiXmlNode::CopyTo( target ); } TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); +{ + TiXmlText* clone = 0; + clone = new TiXmlText( "" ); - if ( !clone ) - return 0; + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) + const char * _encoding, + const char * _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) { - version = _version; - encoding = _encoding; - standalone = _standalone; + version = _version; + encoding = _encoding; + standalone = _standalone; } #ifdef TIXML_USE_STL TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) { - version = _version; - encoding = _encoding; - standalone = _standalone; + version = _version; + encoding = _encoding; + standalone = _standalone; } #endif TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) + : TiXmlNode( TiXmlNode::DECLARATION ) { - copy.CopyTo( this ); + copy.CopyTo( this ); } void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { - Clear(); - copy.CopyTo( this ); + Clear(); + copy.CopyTo( this ); } void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const { - fprintf (cfile, "<?xml "); + fprintf (cfile, "<?xml "); - if ( !version.empty() ) - fprintf (cfile, "version=\"%s\" ", version.c_str ()); - if ( !encoding.empty() ) - fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ()); - if ( !standalone.empty() ) - fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ()); - fprintf (cfile, "?>"); + if ( !version.empty() ) + fprintf (cfile, "version=\"%s\" ", version.c_str ()); + if ( !encoding.empty() ) + fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ()); + if ( !standalone.empty() ) + fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ()); + fprintf (cfile, "?>"); } void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const { - (*stream) << "<?xml "; - - if ( !version.empty() ) - { - (*stream) << "version=\""; - PutString( version, stream ); - (*stream) << "\" "; - } - if ( !encoding.empty() ) - { - (*stream) << "encoding=\""; - PutString( encoding, stream ); - (*stream ) << "\" "; - } - if ( !standalone.empty() ) - { - (*stream) << "standalone=\""; - PutString( standalone, stream ); - (*stream) << "\" "; - } - (*stream) << "?>"; + (*stream) << "<?xml "; + + if ( !version.empty() ) + { + (*stream) << "version=\""; + PutString( version, stream ); + (*stream) << "\" "; + } + if ( !encoding.empty() ) + { + (*stream) << "encoding=\""; + PutString( encoding, stream ); + (*stream ) << "\" "; + } + if ( !standalone.empty() ) + { + (*stream) << "standalone=\""; + PutString( standalone, stream ); + (*stream) << "\" "; + } + (*stream) << "?>"; } void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const { - TiXmlNode::CopyTo( target ); + TiXmlNode::CopyTo( target ); - target->version = version; - target->encoding = encoding; - target->standalone = standalone; + target->version = version; + target->encoding = encoding; + target->standalone = standalone; } TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); +{ + TiXmlDeclaration* clone = new TiXmlDeclaration(); - if ( !clone ) - return 0; + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } void TiXmlUnknown::Print( FILE* cfile, int depth ) const { - for ( int i=0; i<depth; i++ ) - fprintf( cfile, " " ); - fprintf( cfile, "<%s>", value.c_str() ); + for ( int i=0; i<depth; i++ ) + fprintf( cfile, " " ); + fprintf( cfile, "<%s>", value.c_str() ); } void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const { - (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. + (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. } void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const { - TiXmlNode::CopyTo( target ); + TiXmlNode::CopyTo( target ); } TiXmlNode* TiXmlUnknown::Clone() const { - TiXmlUnknown* clone = new TiXmlUnknown(); + TiXmlUnknown* clone = new TiXmlUnknown(); - if ( !clone ) - return 0; + if ( !clone ) + return 0; - CopyTo( clone ); - return clone; + CopyTo( clone ); + return clone; } TiXmlAttributeSet::TiXmlAttributeSet() { - sentinel.next = &sentinel; - sentinel.prev = &sentinel; + sentinel.next = &sentinel; + sentinel.prev = &sentinel; } TiXmlAttributeSet::~TiXmlAttributeSet() { - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); } void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) { - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - addMe->next = &sentinel; - addMe->prev = sentinel.prev; + addMe->next = &sentinel; + addMe->prev = sentinel.prev; - sentinel.prev->next = addMe; - sentinel.prev = addMe; + sentinel.prev->next = addMe; + sentinel.prev = addMe; } void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) { - TiXmlAttribute* node; + TiXmlAttribute* node; - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. } TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const { - TiXmlAttribute* node; + TiXmlAttribute* node; - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; } -#ifdef TIXML_USE_STL +#ifdef TIXML_USE_STL TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) { - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); + TIXML_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; + base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); + return in; } #endif TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) { - base.StreamOut (& out); - return out; + base.StreamOut (& out); + return out; } -#ifdef TIXML_USE_STL +#ifdef TIXML_USE_STL std::string & operator<< (std::string& out, const TiXmlNode& base ) { - std::ostringstream os_stream( std::ostringstream::out ); - base.StreamOut( &os_stream ); - - out.append( os_stream.str() ); - return out; + std::ostringstream os_stream( std::ostringstream::out ); + base.StreamOut( &os_stream ); + + out.append( os_stream.str() ); + return out; } #endif TiXmlHandle TiXmlHandle::FirstChild() const { - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + TiXmlNode* child = node->FirstChild(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const { - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + TiXmlNode* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement() const { - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + TiXmlElement* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const { - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + TiXmlElement* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( int count ) const { - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && i<count; - child = child->NextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild(); + for ( i=0; + child && i<count; + child = child->NextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const { - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && i<count; - child = child->NextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild( value ); + for ( i=0; + child && i<count; + child = child->NextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( int count ) const { - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && i<count; - child = child->NextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement(); + for ( i=0; + child && i<count; + child = child->NextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const { - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && i<count; - child = child->NextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement( value ); + for ( i=0; + child && i<count; + child = child->NextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); } diff --git a/src/contrib/xml/tinyxml.h b/src/contrib/xml/tinyxml.h index 3066a40..678bdb9 100644 --- a/src/contrib/xml/tinyxml.h +++ b/src/contrib/xml/tinyxml.h @@ -1,50 +1,26 @@ -/*:* - *: File: ./src/contrib/xml/tinyxml.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - + This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - + Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - + 3. This notice may not be removed or altered from any source distribution. */ @@ -95,40 +71,34 @@ const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 3; const int TIXML_PATCH_VERSION = 2; -/* Internal structure for tracking location of items +/* Internal structure for tracking location of items in the XML file. */ struct TiXmlCursor { - TiXmlCursor() - { - Clear(); - } - void Clear() - { - row = col = -1; - } - - int row; // 0 based. - int col; // 0 based. + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. }; // Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE }; // Used by the parsing routines. enum TiXmlEncoding { - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY + TIXML_ENCODING_UNKNOWN, + TIXML_ENCODING_UTF8, + TIXML_ENCODING_LEGACY }; const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; @@ -136,263 +106,241 @@ const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; /** TiXmlBase is a base class for every class in TinyXml. It does little except to establish that TinyXml classes can be printed and provide some utility functions. - + In XML, the document and elements can contain other elements and other types of nodes. - + @verbatim A Document can contain: Element (container or leaf) Comment (leaf) Unknown (leaf) Declaration( leaf ) - + An Element can contain: Element (container or leaf) Text (leaf) Attributes (not on tree) Comment (leaf) Unknown (leaf) - + A Decleration contains: Attributes (not on tree) @endverbatim */ class TiXmlBase { - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; public: - TiXmlBase() : userData(0) - {} - virtual ~TiXmlBase() - {} - - /** All TinyXml classes can print themselves to a filestream. - This is a formatted print, and will insert tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - values is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) - { - condenseWhiteSpace = condense; - } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() - { - return condenseWhiteSpace; - } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const - { - return location.row + 1; - } - int Column() const - { - return location.col + 1; - } ///< See Row() - - void SetUserData( void* user ) - { - userData = user; - } - void* GetUserData() - { - return userData; - } - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; + TiXmlBase() : userData(0) {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream. + This is a formatted print, and will insert tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + values is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + + void SetUserData( void* user ) { userData = user; } + void* GetUserData() { return userData; } + + // Table that returs, for a given lead byte, the total number of bytes + // in the UTF-8 sequence. + static const int utf8ByteTable[256]; + + virtual const char* Parse( const char* p, + TiXmlParsingData* data, + TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; protected: - // See STL_STRING_BUG - // Utility class to overcome a bug. - class StringToBuffer - { - public: - StringToBuffer( const TIXML_STRING& str ); - ~StringToBuffer(); - char* buffer; - }; + // See STL_STRING_BUG + // Utility class to overcome a bug. + class StringToBuffer + { + public: + StringToBuffer( const TIXML_STRING& str ); + ~StringToBuffer(); + char* buffer; + }; + + static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + } + + virtual void StreamOut (TIXML_OSTREAM *) const = 0; + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); + static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXML_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase, // whether to ignore case in the end tag + TiXmlEncoding encoding ); // the current encoding + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); + + // Get a character, while interpreting entities. + // The length can be from 0 to 4 bytes. + inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) + { + assert( p ); + if ( encoding == TIXML_ENCODING_UTF8 ) + { + *length = utf8ByteTable[ *((unsigned char*)p) ]; + assert( *length >= 0 && *length < 5 ); + } + else + { + *length = 1; + } - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } + if ( *length == 1 ) + { + if ( *p == '&' ) + return GetEntity( p, _value, length, encoding ); + *_value = *p; + return p+1; + } + else if ( *length ) + { + strncpy( _value, p, *length ); + return p + (*length); + } + else + { + // Not valid text. + return 0; + } + } - virtual void StreamOut (TIXML_OSTREAM *) const = 0; + // Puts a string to a stream, expanding entities as it goes. + // Note this should not contian the '<', '>', etc, or they will be transformed into entities! + static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); -#ifdef TIXML_USE_STL + static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); - static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); - static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); -#endif + // Return true if the next characters in the stream are any of the endTag sequences. + // Ignore case only works for english, and should only be relied on when comparing + // to Engilish words: StringEqual( p, "version", true ) is fine. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase, + TiXmlEncoding encoding ); - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - strncpy( _value, p, *length ); - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Puts a string to a stream, expanding entities as it goes. - // Note this should not contian the '<', '>', etc, or they will be transformed into entities! - static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); - - static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to Engilish words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - - TIXML_ERROR_STRING_COUNT - }; - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) - return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_OUT_OF_MEMORY, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + TIXML_ERROR_EMBEDDED_NULL, + + TIXML_ERROR_STRING_COUNT + }; + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + + /// Field containing a generic user pointer + void* userData; + + // None of these methods are reliable for any language except English. + // Good for approximation, not great for accuracy. + static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); + static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); + inline static int ToLower( int v, TiXmlEncoding encoding ) + { + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( v < 128 ) return tolower( v ); + return v; + } + else + { + return tolower( v ); + } + } + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; + TiXmlBase( const TiXmlBase& ); // not implemented. + void operator=( const TiXmlBase& base ); // not allowed. + + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; }; @@ -404,481 +352,383 @@ private: */ class TiXmlNode : public TiXmlBase { - friend class TiXmlDocument; - friend class TiXmlElement; + friend class TiXmlDocument; + friend class TiXmlElement; public: -#ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - -#else - // Used internally, not part of the public API. - friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); -#endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char * Value() const - { - return value.c_str (); - } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) - { - value = _value; - } - -#ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "" ); - } -#endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() const - { - return parent; - } - - TiXmlNode* FirstChild() const - { - return firstChild; - } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - - TiXmlNode* LastChild() const - { - return lastChild; - } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - -#ifdef TIXML_USE_STL - - TiXmlNode* FirstChild( const std::string& _value ) const - { - return FirstChild (_value.c_str ()); - } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) const - { - return LastChild (_value.c_str ()); - } ///< STL std::string form. -#endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - TiXmlNode* IterateChildren( TiXmlNode* previous ) const; - - /// This flavor of IterateChildren searches for children with a particular 'value' - TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const; - -#ifdef TIXML_USE_STL - - TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) const - { - return IterateChildren (_value.c_str (), previous); - } ///< STL std::string form. -#endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - TiXmlNode* PreviousSibling() const - { - return prev; - } - - /// Navigate to a sibling node. - TiXmlNode* PreviousSibling( const char * ) const; - -#ifdef TIXML_USE_STL - - TiXmlNode* PreviousSibling( const std::string& _value ) const - { - return PreviousSibling (_value.c_str ()); - } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) const - { - return NextSibling (_value.c_str ()); - } ///< STL std::string form. -#endif - - /// Navigate to a sibling node. - TiXmlNode* NextSibling() const - { - return next; - } - - /// Navigate to a sibling node with the given 'value'. - TiXmlNode* NextSibling( const char * ) const; - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - TiXmlElement* NextSiblingElement() const; - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - TiXmlElement* NextSiblingElement( const char * ) const; - -#ifdef TIXML_USE_STL - - TiXmlElement* NextSiblingElement( const std::string& _value) const - { - return NextSiblingElement (_value.c_str ()); - } ///< STL std::string form. -#endif - - /// Convenience function to get through elements. - TiXmlElement* FirstChildElement() const; - - /// Convenience function to get through elements. - TiXmlElement* FirstChildElement( const char * value ) const; + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNode& base ); + + #else + // Used internally, not part of the public API. + friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const char * Value() const { return value.c_str (); } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : "" ); + } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() const { return parent; } + + TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + + TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + + #ifdef TIXML_USE_STL + TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + TiXmlNode* IterateChildren( TiXmlNode* previous ) const; + + /// This flavor of IterateChildren searches for children with a particular 'value' + TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling() const { return prev; } + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling( const char * ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + TiXmlNode* NextSibling() const { return next; } + + /// Navigate to a sibling node with the given 'value'. + TiXmlNode* NextSibling( const char * ) const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement() const; -#ifdef TIXML_USE_STL + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement( const char * ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement() const; + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement( const char * value ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: DOCUMENT, ELEMENT, COMMENT, + UNKNOWN, TEXT, and DECLARATION. + */ + virtual int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + TiXmlDocument* GetDocument() const; + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } - TiXmlElement* FirstChildElement( const std::string& _value ) const - { - return FirstChildElement (_value.c_str ()); - } ///< STL std::string form. -#endif + TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlText* ToText() const { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - virtual int Type() const - { - return type; - } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - TiXmlDocument* GetDocument() const; - - /// Returns true if this node has no children. - bool NoChildren() const - { - return !firstChild; - } - - TiXmlDocument* ToDocument() const - { - return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlElement* ToElement() const - { - return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlComment* ToComment() const - { - return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlUnknown* ToUnknown() const - { - return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlText* ToText() const - { - return ( this && type == TEXT ) ? (TiXmlText*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlDeclaration* ToDeclaration() const - { - return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; - } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; + /** Create an exact duplicate of this node and return it. The memory must be deleted + by the caller. + */ + virtual TiXmlNode* Clone() const = 0; protected: - TiXmlNode( NodeType _type ); + TiXmlNode( NodeType _type ); - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; + // Copy to the allocated object. Shared functionality between Clone, Copy constructor, + // and the assignment operator. + void CopyTo( TiXmlNode* target ) const; -#ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; -#endif + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; + #endif - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - // Internal Value function returning a TIXML_STRING - const TIXML_STRING& SValue() const - { - return value ; - } + // Internal Value function returning a TIXML_STRING + const TIXML_STRING& SValue() const { return value ; } - TiXmlNode* parent; - NodeType type; + TiXmlNode* parent; + NodeType type; - TiXmlNode* firstChild; - TiXmlNode* lastChild; + TiXmlNode* firstChild; + TiXmlNode* lastChild; - TIXML_STRING value; + TIXML_STRING value; - TiXmlNode* prev; - TiXmlNode* next; + TiXmlNode* prev; + TiXmlNode* next; private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. + TiXmlNode( const TiXmlNode& ); // not implemented. + void operator=( const TiXmlNode& base ); // not allowed. }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. - + @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. */ class TiXmlAttribute : public TiXmlBase { - friend class TiXmlAttributeSet; + friend class TiXmlAttributeSet; public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } + /// Construct an empty attribute. + TiXmlAttribute() : TiXmlBase() + { + document = 0; + prev = next = 0; + } -#ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } -#endif + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlAttribute( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const - { - return name.c_str (); - } ///< Return the name of this attribute. - const char* Value() const - { - return value.c_str (); - } ///< Return the value of this attribute. - const int IntValue() const; ///< Return the value of this attribute, converted to an integer. - const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* value ) const; - - void SetName( const char* _name ) - { - name = _name; - } ///< Set the name of this attribute. - void SetValue( const char* _value ) - { - value = _value; - } ///< Set the value. - - void SetIntValue( int value ); ///< Set the value from an integer. - void SetDoubleValue( double value ); ///< Set the value from a double. + /// Construct an attribute with a name and value. + TiXmlAttribute( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } -#ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) - { - StringToBuffer buf( _name ); - SetName ( buf.buffer ? buf.buffer : "error" ); - } - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "error" ); - } -#endif + const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. + const int IntValue() const; ///< Return the value of this attribute, converted to an integer. + const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int value ); ///< Set the value from an integer. + void SetDoubleValue( double value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) + { + StringToBuffer buf( _name ); + SetName ( buf.buffer ? buf.buffer : "error" ); + } + /// STL std::string form. + void SetValue( const std::string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : "error" ); + } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + TiXmlAttribute* Next() const; + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + TiXmlAttribute* Previous() const; + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* Attribute parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + // Prints this Attribute to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; - /// Get the next sibling attribute in the DOM. Returns null at end. - TiXmlAttribute* Next() const; - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - TiXmlAttribute* Previous() const; - - bool operator==( const TiXmlAttribute& rhs ) const - { - return rhs.name == name; - } - bool operator<( const TiXmlAttribute& rhs ) const - { - return name < rhs.name; - } - bool operator>( const TiXmlAttribute& rhs ) const - { - return name > rhs.name; - } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual void StreamOut( TIXML_OSTREAM * out ) const; - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) - { - document = doc; - } + virtual void StreamOut( TIXML_OSTREAM * out ) const; + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; + TiXmlAttribute( const TiXmlAttribute& ); // not implemented. + void operator=( const TiXmlAttribute& base ); // not allowed. + + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; }; @@ -889,7 +739,7 @@ private: classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. - + This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. @@ -897,24 +747,18 @@ private: class TiXmlAttributeSet { public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - TiXmlAttribute* First() const - { - return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; - } - TiXmlAttribute* Last() const - { - return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; - } - TiXmlAttribute* Find( const char * name ) const; + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Find( const char * name ) const; private: - TiXmlAttribute sentinel; + TiXmlAttribute sentinel; }; @@ -925,159 +769,131 @@ private: class TiXmlElement : public TiXmlNode { public: - /// Construct an element. - TiXmlElement (const char * in_value); - -#ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); -#endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - int QueryIntAttribute( const char* name, int* value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* value ) const; - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * value ); - -#ifdef TIXML_USE_STL - - const char* Attribute( const std::string& name ) const - { - return Attribute( name.c_str() ); - } - const char* Attribute( const std::string& name, int* i ) const - { - return Attribute( name.c_str(), i ); - } - const char* Attribute( const std::string& name, double* d ) const - { - return Attribute( name.c_str(), d ); - } - int QueryIntAttribute( const std::string& name, int* value ) const - { - return QueryIntAttribute( name.c_str(), value ); - } - int QueryDoubleAttribute( const std::string& name, double* value ) const - { - return QueryDoubleAttribute( name.c_str(), value ); - } - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ) - { - StringToBuffer n( name ); - StringToBuffer v( _value ); - if ( n.buffer && v.buffer ) - SetAttribute (n.buffer, v.buffer ); - } - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ) - { - StringToBuffer n( name ); - if ( n.buffer ) - SetAttribute (n.buffer, _value); - } -#endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); -#ifdef TIXML_USE_STL - - void RemoveAttribute( const std::string& name ) - { - RemoveAttribute (name.c_str ()); - } ///< STL std::string form. -#endif - - TiXmlAttribute* FirstAttribute() const - { - return attributeSet.First(); - } ///< Access the first attribute in this element. - TiXmlAttribute* LastAttribute() const - { - return attributeSet.Last(); - } ///< Access the last attribute in this element. - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + /// Construct an element. + TiXmlElement (const char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::string& _value ); + #endif + + TiXmlElement( const TiXmlElement& ); + + void operator=( const TiXmlElement& base ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* value ) const; + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * value ); + + #ifdef TIXML_USE_STL + const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } + const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } + const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); } + int QueryIntAttribute( const std::string& name, int* value ) const { return QueryIntAttribute( name.c_str(), value ); } + int QueryDoubleAttribute( const std::string& name, double* value ) const { return QueryDoubleAttribute( name.c_str(), value ); } + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ) + { + StringToBuffer n( name ); + StringToBuffer v( _value ); + if ( n.buffer && v.buffer ) + SetAttribute (n.buffer, v.buffer ); + } + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ) + { + StringToBuffer n( name ); + if ( n.buffer ) + SetAttribute (n.buffer, _value); + } + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetDoubleAttribute( const char * name, double value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + + /// Creates a new Element and returns it - the returned element is a copy. + virtual TiXmlNode* Clone() const; + // Print the Element to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well + void CopyTo( TiXmlElement* target ) const; + void ClearThis(); // like clear, but initializes 'this' object as well - // Used to be public [internal use] -#ifdef TIXML_USE_STL - - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut( TIXML_OSTREAM * out ) const; - virtual void StreamOut( TIXML_OSTREAM * out ) const; - - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); private: - TiXmlAttributeSet attributeSet; + TiXmlAttributeSet attributeSet; }; @@ -1086,35 +902,31 @@ private: class TiXmlComment : public TiXmlNode { public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) - {} - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} + TiXmlComment( const TiXmlComment& ); + void operator=( const TiXmlComment& base ); - virtual ~TiXmlComment() - {} + virtual ~TiXmlComment() {} - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - /// Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; + /// Returns a copy of this Comment. + virtual TiXmlNode* Clone() const; + /// Write this Comment to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + /* Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public -#ifdef TIXML_USE_STL + void CopyTo( TiXmlComment* target ) const; - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif - - virtual void StreamOut( TIXML_OSTREAM * out ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut( TIXML_OSTREAM * out ) const; private: @@ -1125,50 +937,42 @@ private: */ class TiXmlText : public TiXmlNode { - friend class TiXmlElement; + friend class TiXmlElement; public: - /// Constructor. - TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - virtual ~TiXmlText() - {} + /// Constructor. + TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + } + virtual ~TiXmlText() {} -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } -#endif + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + } + #endif - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) - { - copy.CopyTo( this ); - } - void operator=( const TiXmlText& base ) - { - base.CopyTo( this ); - } + TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } + void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - /// Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; + /// Write this text object to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - bool Blank() const; // returns true if all white space and new lines - // [internal use] -#ifdef TIXML_USE_STL + /// [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + void CopyTo( TiXmlText* target ) const; - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif + virtual void StreamOut ( TIXML_OSTREAM * out ) const; + bool Blank() const; // returns true if all white space and new lines + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif private: }; @@ -1178,11 +982,11 @@ private: @verbatim <?xml version="1.0" standalone="yes"?> @endverbatim - + TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. - + Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. @@ -1190,66 +994,53 @@ private: class TiXmlDeclaration : public TiXmlNode { public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) - {} + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); + /// Constructor. + TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ); #endif - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() - {} - - /// Version. Will return an empty string if none was found. - const char *Version() const - { - return version.c_str (); - } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const - { - return encoding.c_str (); - } - /// Is this a standalone document? - const char *Standalone() const - { - return standalone.c_str (); - } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - /// Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public -#ifdef TIXML_USE_STL + TiXmlDeclaration( const TiXmlDeclaration& copy ); + void operator=( const TiXmlDeclaration& copy ); - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif + virtual ~TiXmlDeclaration() {} - virtual void StreamOut ( TIXML_OSTREAM * out) const; + /// Version. Will return an empty string if none was found. + const char *Version() const { return version.c_str (); } + /// Encoding. Will return an empty string if none was found. + const char *Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char *Standalone() const { return standalone.c_str (); } + + /// Creates a copy of this Declaration and returns it. + virtual TiXmlNode* Clone() const; + /// Print this declaration to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + +protected: + void CopyTo( TiXmlDeclaration* target ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut ( TIXML_OSTREAM * out) const; private: - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; }; @@ -1257,42 +1048,32 @@ private: unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. - + DTD tags get thrown into TiXmlUnknowns. */ class TiXmlUnknown : public TiXmlNode { public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) - {} - virtual ~TiXmlUnknown() - {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) - { - copy.CopyTo( this ); - } - void operator=( const TiXmlUnknown& copy ) - { - copy.CopyTo( this ); - } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - /// Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} + virtual ~TiXmlUnknown() {} -protected: - void CopyTo( TiXmlUnknown* target ) const; + TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } + void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } -#ifdef TIXML_USE_STL + /// Creates a copy of this Unknown and returns it. + virtual TiXmlNode* Clone() const; + /// Print this Unknown to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - virtual void StreamOut ( TIXML_OSTREAM * out ) const; +protected: + void CopyTo( TiXmlUnknown* target ) const; + + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut ( TIXML_OSTREAM * out ) const; private: @@ -1306,173 +1087,141 @@ private: class TiXmlDocument : public TiXmlNode { public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); -#endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() - {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - -#ifdef TIXML_USE_STL - - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && LoadFile( f.buffer, encoding )); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && SaveFile( f.buffer )); - } -#endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - TiXmlElement* RootElement() const - { - return FirstChildElement(); - } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const - { - return error; - } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const - { - return errorDesc.c_str (); - } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - const int ErrorId() const - { - return errorId; - } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() - { - return errorLocation.row+1; - } - int ErrorCol() - { - return errorLocation.col+1; - } ///< The column where the error occured. See ErrorRow() - - /** By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) - { - tabsize = _tabsize; - } - - int TabSize() const - { - return tabsize; - } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() - { - error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Dump the document to standard out. */ - void Print() const - { - Print( stdout, 0 ); - } - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::string& documentName ); + #endif + + TiXmlDocument( const TiXmlDocument& copy ); + void operator=( const TiXmlDocument& copy ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. + { + StringToBuffer f( filename ); + return ( f.buffer && LoadFile( f.buffer, encoding )); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { + StringToBuffer f( filename ); + return ( f.buffer && SaveFile( f.buffer )); + } + #endif + + /** Parse the given null terminated block of xml data. Passing in an encoding to this + method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml + to use that encoding, regardless of what TinyXml might otherwise try to detect. + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + TiXmlElement* RootElement() const { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + const int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() { return errorLocation.row+1; } + int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Dump the document to standard out. */ + void Print() const { Print( stdout, 0 ); } + + /// Print this Document to a FILE stream. + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); protected : - virtual void StreamOut ( TIXML_OSTREAM * out) const; - // [internal use] - virtual TiXmlNode* Clone() const; -#ifdef TIXML_USE_STL - - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); -#endif + virtual void StreamOut ( TIXML_OSTREAM * out) const; + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif private: - void CopyTo( TiXmlDocument* target ) const; + void CopyTo( TiXmlDocument* target ) const; - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; }; @@ -1480,7 +1229,7 @@ private: A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class. - + Take an example: @verbatim <Document> @@ -1490,10 +1239,10 @@ private: </Element> <Document> @endverbatim - + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: - + @verbatim TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) @@ -1509,11 +1258,11 @@ private: { // Finally do something useful. @endverbatim - + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: - + @verbatim TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); @@ -1521,16 +1270,16 @@ private: { // do something useful @endverbatim - + Which is MUCH more concise and useful. - + It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim TiXmlHandle handleCopy = handle; @endverbatim - + What they should not be used for is iteration: - + @verbatim int i=0; while ( true ) @@ -1542,14 +1291,14 @@ private: ++i; } @endverbatim - + It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: - + @verbatim TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); - + for( child; child; child=child->NextSiblingElement() ) { // do something @@ -1559,94 +1308,59 @@ private: class TiXmlHandle { public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* node ) - { - this->node = node; - } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) - { - this->node = ref.node; - } - TiXmlHandle operator=( const TiXmlHandle& ref ) - { - this->node = ref.node; - return *this; - } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - -#ifdef TIXML_USE_STL - - TiXmlHandle FirstChild( const std::string& _value ) const - { - return FirstChild( _value.c_str() ); - } - TiXmlHandle FirstChildElement( const std::string& _value ) const - { - return FirstChildElement( _value.c_str() ); - } - - TiXmlHandle Child( const std::string& _value, int index ) const - { - return Child( _value.c_str(), index ); - } - TiXmlHandle ChildElement( const std::string& _value, int index ) const - { - return ChildElement( _value.c_str(), index ); - } -#endif - - /// Return the handle as a TiXmlNode. This may return null. - TiXmlNode* Node() const - { - return node; - } - /// Return the handle as a TiXmlElement. This may return null. - TiXmlElement* Element() const - { - return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); - } - /// Return the handle as a TiXmlText. This may return null. - TiXmlText* Text() const - { - return ( ( node && node->ToText() ) ? node->ToText() : 0 ); - } - /// Return the handle as a TiXmlUnknown. This may return null; - TiXmlUnknown* Unknown() const - { - return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); - } + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* node ) { this->node = node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /// Return the handle as a TiXmlNode. This may return null. + TiXmlNode* Node() const { return node; } + /// Return the handle as a TiXmlElement. This may return null. + TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /// Return the handle as a TiXmlText. This may return null. + TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + /// Return the handle as a TiXmlUnknown. This may return null; + TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } private: - TiXmlNode* node; + TiXmlNode* node; }; diff --git a/src/contrib/xml/tinyxmlerror.cpp b/src/contrib/xml/tinyxmlerror.cpp index e2cff82..b04add7 100644 --- a/src/contrib/xml/tinyxmlerror.cpp +++ b/src/contrib/xml/tinyxmlerror.cpp @@ -1,47 +1,23 @@ -/*:* - *: File: ./src/contrib/xml/tinyxmlerror.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - + This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - + Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - + 3. This notice may not be removed or altered from any source distribution. */ @@ -56,20 +32,20 @@ distribution. // const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = - { - "No error", - "Error", - "Failed to open file", - "Memory allocation failed.", - "Error parsing Element.", - "Failed to read Element name", - "Error reading Element value.", - "Error reading Attributes.", - "Error: empty tag.", - "Error reading end tag.", - "Error parsing Unknown.", - "Error parsing Comment.", - "Error parsing Declaration.", - "Error document empty.", - "Error null (0) or unexpected EOF found in input stream.", - }; +{ + "No error", + "Error", + "Failed to open file", + "Memory allocation failed.", + "Error parsing Element.", + "Failed to read Element name", + "Error reading Element value.", + "Error reading Attributes.", + "Error: empty tag.", + "Error reading end tag.", + "Error parsing Unknown.", + "Error parsing Comment.", + "Error parsing Declaration.", + "Error document empty.", + "Error null (0) or unexpected EOF found in input stream.", +}; diff --git a/src/contrib/xml/tinyxmlparser.cpp b/src/contrib/xml/tinyxmlparser.cpp index 5a7a322..f06d1cd 100644 --- a/src/contrib/xml/tinyxmlparser.cpp +++ b/src/contrib/xml/tinyxmlparser.cpp @@ -1,47 +1,23 @@ -/*:* - *: File: ./src/contrib/xml/tinyxmlparser.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - + This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - + Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - + 3. This notice may not be removed or altered from any source distribution. */ @@ -53,1525 +29,1465 @@ distribution. // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = - { - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } - }; +// or order will break putstring. +TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // Including the basic of this table, which determines the #bytes in the // sequence from the lead byte. 1 placed for invalid sequences -- // although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: +// Beware of the non-characters in UTF-8: // ef bb bf (Microsoft "lead bytes") // ef bf be -// ef bf bf - - - -const int TiXmlBase::utf8ByteTable[256] = - { - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid - }; +// ef bf bf + + + +const int TiXmlBase::utf8ByteTable[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid +}; void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = - { - 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC - }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { - *length = 0; - return; - } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) + *length = 1; + else if ( input < 0x800 ) + *length = 2; + else if ( input < 0x10000 ) + *length = 3; + else if ( input < 0x200000 ) + *length = 4; + else + { *length = 0; return; } // This code won't covert this correctly anyway. + + output += *length; + + // Scary scary fall throughs. + switch (*length) + { + case 4: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 3: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 2: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 1: + --output; + *output = (char)(input | FIRST_BYTE_MARK[*length]); + } } /*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ) { - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - - // if ( encoding == TIXML_ENCODING_UTF8 ) - // { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. - // } - // else - // { - // return isalpha( anyByte ); - // } + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalpha( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalpha( anyByte ); +// } } /*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ) { - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - - // if ( encoding == TIXML_ENCODING_UTF8 ) - // { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. - // } - // else - // { - // return isalnum( anyByte ); - // } + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalnum( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalnum( anyByte ); +// } } class TiXmlParsingData { - friend class TiXmlDocument; -public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() - { - return cursor; - } - -private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; + friend class TiXmlDocument; + public: + void Stamp( const char* now, TiXmlEncoding encoding ); + + const TiXmlCursor& Cursor() { return cursor; } + + private: + // Only used by the document! + TiXmlParsingData( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const char* stamp; + int tabsize; }; void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) { - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*p) - { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') - { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') - { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case (char)(0xef): - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(p+1)==(char)(0xbb) && *(p+2)==(char)(0xbf) ) - p += 3; - else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbe) ) - p += 3; - else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbf) ) - p += 3; - else - { - p +=3; - ++col; - } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const char* p = stamp; + assert( p ); + + while ( p < now ) + { + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*p) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + case (char)(0xef): + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( *(p+1) && *(p+2) ) + { + // In these cases, don't advance the column. These are + // 0-width spaces. + if ( *(p+1)==(char)(0xbb) && *(p+2)==(char)(0xbf) ) + p += 3; + else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbe) ) + p += 3; + else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbf) ) + p += 3; + else + { p +=3; ++col; } // A normal character. + } + } + else + { + ++p; + ++col; + } + break; + + default: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // Eat the 1 to 4 byte utf8 character. + int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; + if ( step == 0 ) + step = 1; // Error case from bad encoding, but handle gracefully. + p += step; + + // Just advance one column, of course. + ++col; + } + else + { + ++p; + ++col; + } + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); } const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) { - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(p+0)==(char) 0xef - && *(p+1)==(char) 0xbb - && *(p+2)==(char) 0xbf ) - { - p += 3; - continue; - } - else if(*(p+0)==(char) 0xef - && *(p+1)==(char) 0xbf - && *(p+2)==(char) 0xbe ) - { - p += 3; - continue; - } - else if(*(p+0)==(char) 0xef - && *(p+1)==(char) 0xbf - && *(p+2)==(char) 0xbf ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; + if ( !p || !*p ) + { + return 0; + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + while ( *p ) + { + // Skip the stupid Microsoft UTF-8 Byte order marks + if ( *(p+0)==(char) 0xef + && *(p+1)==(char) 0xbb + && *(p+2)==(char) 0xbf ) + { + p += 3; + continue; + } + else if(*(p+0)==(char) 0xef + && *(p+1)==(char) 0xbf + && *(p+2)==(char) 0xbe ) + { + p += 3; + continue; + } + else if(*(p+0)==(char) 0xef + && *(p+1)==(char) 0xbf + && *(p+2)==(char) 0xbf ) + { + p += 3; + continue; + } + + if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + } + else + { + while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) + ++p; + } + + return p; } #ifdef TIXML_USE_STL /*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - for( ;; ) - { - if ( !in->good() ) - return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get - (); - } + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + // At this scope, we can't get to a document. So fail silently. + if ( !IsWhiteSpace( c ) || c <= 0 ) + return true; + + *tag += (char) in->get(); + } } /*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) { - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get - (); - *tag += (char) c; - } - return false; + //assert( character > 0 && character < 128 ); // else it won't work in utf-8 + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + if ( c <= 0 ) // Silent failure: can't get document at this scope + return false; + + in->get(); + *tag += (char) c; + } + return false; } #endif const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) { - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - (*name) += *p; - ++p; - } - return p; - } - return 0; + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // Of course, in unicode, tinyxml has no idea what a letter *is*. The + // algorithm is generous. + // + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) + { + while( p && *p + && ( IsAlphaNum( (unsigned char ) *p, encoding ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + (*name) += *p; + ++p; + } + return p; + } + return 0; } const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) { - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - unsigned delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) - return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) - return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) - return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) - return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; i<NUM_ENTITY; ++i ) - { - if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 ) - { - assert( strlen( entity[i].str ) == entity[i].strLength ); - *value = entity[i].chr; - *length = 1; - return ( p + entity[i].strLength ); - } - } - - // So it wasn't an entity, its unrecognized, or something like that. - *value = *p; // Don't put back the last one, since we return it! - return p+1; + // Presume an entity, and pull it out. + TIXML_STRING ent; + int i; + *length = 0; + + if ( *(p+1) && *(p+1) == '#' && *(p+2) ) + { + unsigned long ucs = 0; + unsigned delta = 0; + unsigned mult = 1; + + if ( *(p+2) == 'x' ) + { + // Hexadecimal. + if ( !*(p+3) ) return 0; + + const char* q = p+3; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != 'x' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else if ( *q >= 'a' && *q <= 'f' ) + ucs += mult * (*q - 'a' + 10); + else if ( *q >= 'A' && *q <= 'F' ) + ucs += mult * (*q - 'A' + 10 ); + else + return 0; + mult *= 16; + --q; + } + } + else + { + // Decimal. + if ( !*(p+2) ) return 0; + + const char* q = p+2; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != '#' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else + return 0; + mult *= 10; + --q; + } + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + } + else + { + *value = (char)ucs; + *length = 1; + } + return p + delta + 1; + } + + // Now try to match it. + for( i=0; i<NUM_ENTITY; ++i ) + { + if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 ) + { + assert( strlen( entity[i].str ) == entity[i].strLength ); + *value = entity[i].chr; + *length = 1; + return ( p + entity[i].strLength ); + } + } + + // So it wasn't an entity, its unrecognized, or something like that. + *value = *p; // Don't put back the last one, since we return it! + return p+1; } bool TiXmlBase::StringEqual( const char* p, - const char* tag, - bool ignoreCase, - TiXmlEncoding encoding ) + const char* tag, + bool ignoreCase, + TiXmlEncoding encoding ) { - assert( p ); - assert( tag ); - if ( !p || !*p ) - { - assert( 0 ); - return false; - } - - const char* q = p; - - if ( ignoreCase ) - { - while ( *q && *tag && ToLower( *q, encoding ) == ToLower( *tag, encoding ) ) - { - ++q; - ++tag; - } - - if ( *tag == 0 ) - return true; - } - else - { - while ( *q && *tag && *q == *tag ) - { - ++q; - ++tag; - } - - if ( *tag == 0 ) // Have we found the end of the tag, and everything equal? - return true; - } - return false; + assert( p ); + assert( tag ); + if ( !p || !*p ) + { + assert( 0 ); + return false; + } + + const char* q = p; + + if ( ignoreCase ) + { + while ( *q && *tag && ToLower( *q, encoding ) == ToLower( *tag, encoding ) ) + { + ++q; + ++tag; + } + + if ( *tag == 0 ) + return true; + } + else + { + while ( *q && *tag && *q == *tag ) + { + ++q; + ++tag; + } + + if ( *tag == 0 ) // Have we found the end of the tag, and everything equal? + return true; + } + return false; } -const char* TiXmlBase::ReadText( const char* p, - TIXML_STRING * text, - bool trimWhiteSpace, - const char* endTag, - bool caseInsensitive, - TiXmlEncoding encoding ) +const char* TiXmlBase::ReadText( const char* p, + TIXML_STRING * text, + bool trimWhiteSpace, + const char* endTag, + bool caseInsensitive, + TiXmlEncoding encoding ) { - *text = ""; - if ( !trimWhiteSpace // certain tags always keep whitespace - || !condenseWhiteSpace ) // if true, whitespace is always kept - { - // Keep all the white space. - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) - ) - { - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - text->append( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - return p + strlen( endTag ); + *text = ""; + if ( !trimWhiteSpace // certain tags always keep whitespace + || !condenseWhiteSpace ) // if true, whitespace is always kept + { + // Keep all the white space. + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive, encoding ) + ) + { + int len; + char cArr[4] = { 0, 0, 0, 0 }; + p = GetChar( p, cArr, &len, encoding ); + text->append( cArr, len ); + } + } + else + { + bool whitespace = false; + + // Remove leading white space: + p = SkipWhiteSpace( p, encoding ); + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive, encoding ) ) + { + if ( *p == '\r' || *p == '\n' ) + { + whitespace = true; + ++p; + } + else if ( IsWhiteSpace( *p ) ) + { + whitespace = true; + ++p; + } + else + { + // If we've found whitespace, add it before the + // new character. Any whitespace just becomes a space. + if ( whitespace ) + { + (*text) += ' '; + whitespace = false; + } + int len; + char cArr[4] = { 0, 0, 0, 0 }; + p = GetChar( p, cArr, &len, encoding ); + if ( len == 1 ) + (*text) += cArr[0]; // more efficient + else + text->append( cArr, len ); + } + } + } + return p + strlen( endTag ); } #ifdef TIXML_USE_STL void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get - (); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); + // The basic issue with a document is that we don't know what we're + // streaming. Read something presumed to be a tag (and hope), then + // identify it, and call the appropriate stream method on the tag. + // + // This "pre-streaming" will never read the closing ">" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + while ( in->good() ) + { + int tagIndex = (int) tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + if ( c <= 0 ) + { + SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + break; + } + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); } #endif const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) { - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - if ( *(p+0) && *(p+0) == (char)(0xef) - && *(p+1) && *(p+1) == (char)(0xbb) - && *(p+2) && *(p+2) == (char)(0xbf) ) - { - encoding = TIXML_ENCODING_UTF8; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingData data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + if ( encoding == TIXML_ENCODING_UNKNOWN ) + { + // Check for the Microsoft UTF-8 lead bytes. + if ( *(p+0) && *(p+0) == (char)(0xef) + && *(p+1) && *(p+1) == (char)(0xbb) + && *(p+2) && *(p+2) == (char)(0xbf) ) + { + encoding = TIXML_ENCODING_UTF8; + } + } p = SkipWhiteSpace( p, encoding ); - } - - // All is well. - return p; + if ( !p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p, encoding ); + if ( node ) + { + p = node->Parse( p, &data, encoding ); + LinkEndChild( node ); + } + else + { + break; + } + + // Did we get encoding info? + if ( encoding == TIXML_ENCODING_UNKNOWN + && node->ToDeclaration() ) + { + TiXmlDeclaration* dec = node->ToDeclaration(); + const char* enc = dec->Encoding(); + assert( enc ); + + if ( *enc == 0 ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice + else + encoding = TIXML_ENCODING_LEGACY; + } + + p = SkipWhiteSpace( p, encoding ); + } + + // All is well. + return p; } void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - //TiXmlParsingData data( pError, prevData ); - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + //TiXmlParsingData data( pError, prevData ); + data->Stamp( pError, encoding ); + errorLocation = data->Cursor(); + } } TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) { - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: <!-- - // - Decleration: <?xml - // - Everthing else is unknown to tinyxml. - // - - const char* xmlHeader = - { "<?xml" - }; - const char* commentHeader = - { "<!--" - }; - const char* dtdHeader = - { "<!" - }; - - if ( StringEqual( p, xmlHeader, true, encoding ) ) - { -#ifdef DEBUG_PARSER - TIXML_LOG( "XML parsing Declaration\n" ); -#endif - - returnNode = new TiXmlDeclaration(); - } - else if ( StringEqual( p, commentHeader, false, encoding ) ) - { -#ifdef DEBUG_PARSER - TIXML_LOG( "XML parsing Comment\n" ); -#endif - - returnNode = new TiXmlComment(); - } - else if ( StringEqual( p, dtdHeader, false, encoding ) ) - { -#ifdef DEBUG_PARSER - TIXML_LOG( "XML parsing Unknown(1)\n" ); -#endif - - returnNode = new TiXmlUnknown(); - } - else if ( IsAlpha( *(p+1), encoding ) - || *(p+1) == '_' ) - { -#ifdef DEBUG_PARSER - TIXML_LOG( "XML parsing Element\n" ); -#endif - - returnNode = new TiXmlElement( "" ); - } - else - { -#ifdef DEBUG_PARSER - TIXML_LOG( "XML parsing Unknown(2)\n" ); -#endif - - returnNode = new TiXmlUnknown(); - } - - if ( returnNode ) - { - // Set the parent, so it can report errors - returnNode->parent = this; - } - else - { - if ( doc ) - doc->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } - return returnNode; + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p, encoding ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocument* doc = GetDocument(); + p = SkipWhiteSpace( p, encoding ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: <!-- + // - Decleration: <?xml + // - Everthing else is unknown to tinyxml. + // + + const char* xmlHeader = { "<?xml" }; + const char* commentHeader = { "<!--" }; + const char* dtdHeader = { "<!" }; + + if ( StringEqual( p, xmlHeader, true, encoding ) ) + { + #ifdef DEBUG_PARSER + TIXML_LOG( "XML parsing Declaration\n" ); + #endif + returnNode = new TiXmlDeclaration(); + } + else if ( StringEqual( p, commentHeader, false, encoding ) ) + { + #ifdef DEBUG_PARSER + TIXML_LOG( "XML parsing Comment\n" ); + #endif + returnNode = new TiXmlComment(); + } + else if ( StringEqual( p, dtdHeader, false, encoding ) ) + { + #ifdef DEBUG_PARSER + TIXML_LOG( "XML parsing Unknown(1)\n" ); + #endif + returnNode = new TiXmlUnknown(); + } + else if ( IsAlpha( *(p+1), encoding ) + || *(p+1) == '_' ) + { + #ifdef DEBUG_PARSER + TIXML_LOG( "XML parsing Element\n" ); + #endif + returnNode = new TiXmlElement( "" ); + } + else + { + #ifdef DEBUG_PARSER + TIXML_LOG( "XML parsing Unknown(2)\n" ); + #endif + returnNode = new TiXmlUnknown(); + } + + if ( returnNode ) + { + // Set the parent, so it can report errors + returnNode->parent = this; + } + else + { + if ( doc ) + doc->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } + return returnNode; } #ifdef TIXML_USE_STL void TiXmlElement::StreamIn (TIXML_ISTREAM * in, TIXML_STRING * tag) { - // We're called with some amount of pre-parsing. That is, some of "this" - // element is in "tag". Go ahead and stream to the closing ">" - while( in->good() ) - { - int c = in->get - (); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c ; - - if ( c == '>' ) - break; - } - - if ( tag->length() < 3 ) - return; - - // Okay...if we are a "/>" tag, then we're done. We've read a complete tag. - // If not, identify and stream. - - if ( tag->at( tag->length() - 1 ) == '>' - && tag->at( tag->length() - 2 ) == '/' ) - { - // All good! - return; - } - else if ( tag->at( tag->length() - 1 ) == '>' ) - { - // There is more. Could be: - // text - // closing tag - // another node. - for ( ;; ) - { - StreamWhiteSpace( in, tag ); - - // Do we have text? - if ( in->good() && in->peek() != '<' ) - { - // Yep, text. - TiXmlText text( "" ); - text.StreamIn( in, tag ); - - // What follows text is a closing tag or another node. - // Go around again and figure it out. - continue; - } - - // We now have either a closing tag...or another node. - // We should be at a "<", regardless. - if ( !in->good() ) - return; - assert( in->peek() == '<' ); - int tagIndex = tag->length(); - - bool closingTag = false; - bool firstCharFound = false; - - for( ;; ) - { - if ( !in->good() ) - return; - - int c = in->peek(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - if ( c == '>' ) - break; - - *tag += (char) c; - in->get - (); - - if ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) ) - { - firstCharFound = true; - if ( c == '/' ) - closingTag = true; - } - } - // If it was a closing tag, then read in the closing '>' to clean up the input stream. - // If it was not, the streaming will be done by the tag. - if ( closingTag ) - { - if ( !in->good() ) - return; - - int c = in->get - (); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - assert( c == '>' ); - *tag += (char) c; - - // We are done, once we've found our closing tag. - return; - } - else - { - // If not a closing tag, id it, and stream. - const char* tagloc = tag->c_str() + tagIndex; - TiXmlNode* node = Identify( tagloc, TIXML_DEFAULT_ENCODING ); - if ( !node ) - return; - node->StreamIn( in, tag ); - delete node; - node = 0; - - // No return: go around from the beginning: text, closing tag, or node. - } - } - } + // We're called with some amount of pre-parsing. That is, some of "this" + // element is in "tag". Go ahead and stream to the closing ">" + while( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c ; + + if ( c == '>' ) + break; + } + + if ( tag->length() < 3 ) return; + + // Okay...if we are a "/>" tag, then we're done. We've read a complete tag. + // If not, identify and stream. + + if ( tag->at( tag->length() - 1 ) == '>' + && tag->at( tag->length() - 2 ) == '/' ) + { + // All good! + return; + } + else if ( tag->at( tag->length() - 1 ) == '>' ) + { + // There is more. Could be: + // text + // closing tag + // another node. + for ( ;; ) + { + StreamWhiteSpace( in, tag ); + + // Do we have text? + if ( in->good() && in->peek() != '<' ) + { + // Yep, text. + TiXmlText text( "" ); + text.StreamIn( in, tag ); + + // What follows text is a closing tag or another node. + // Go around again and figure it out. + continue; + } + + // We now have either a closing tag...or another node. + // We should be at a "<", regardless. + if ( !in->good() ) return; + assert( in->peek() == '<' ); + int tagIndex = tag->length(); + + bool closingTag = false; + bool firstCharFound = false; + + for( ;; ) + { + if ( !in->good() ) + return; + + int c = in->peek(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + if ( c == '>' ) + break; + + *tag += (char) c; + in->get(); + + if ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) ) + { + firstCharFound = true; + if ( c == '/' ) + closingTag = true; + } + } + // If it was a closing tag, then read in the closing '>' to clean up the input stream. + // If it was not, the streaming will be done by the tag. + if ( closingTag ) + { + if ( !in->good() ) + return; + + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + assert( c == '>' ); + *tag += (char) c; + + // We are done, once we've found our closing tag. + return; + } + else + { + // If not a closing tag, id it, and stream. + const char* tagloc = tag->c_str() + tagIndex; + TiXmlNode* node = Identify( tagloc, TIXML_DEFAULT_ENCODING ); + if ( !node ) + return; + node->StreamIn( in, tag ); + delete node; + node = 0; + + // No return: go around from the beginning: text, closing tag, or node. + } + } + } } #endif const char* TiXmlElement::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - p = SkipWhiteSpace( p, encoding ); - TiXmlDocument* document = GetDocument(); - - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_ELEMENT, 0, 0, encoding ); - return 0; - } - - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - - if ( *p != '<' ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_ELEMENT, p, data, encoding ); - return 0; - } - - p = SkipWhiteSpace( p+1, encoding ); - - // Read the name. - const char* pErr = p; - - p = ReadName( p, &value, encoding ); - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, pErr, data, encoding ); - return 0; - } - - TIXML_STRING endTag ("</"); - endTag += value; - endTag += ">"; - - // Check for and read attributes. Also look for an empty - // tag or an end tag. - while ( p && *p ) - { - pErr = p; - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - if ( *p == '/' ) - { - ++p; - // Empty tag. - if ( *p != '>' ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_EMPTY, p, data, encoding ); - return 0; - } - return (p+1); - } - else if ( *p == '>' ) - { - // Done with attributes (if there were any.) - // Read the value -- which can include other - // elements -- read the end tag, and return. - ++p; - p = ReadValue( p, data, encoding ); // Note this is an Element method, and will set the error if one happens. - if ( !p || !*p ) - return 0; - - // We should find the end tag now - if ( StringEqual( p, endTag.c_str(), false, encoding ) ) - { - p += endTag.length(); - return p; - } - else - { - if ( document ) - document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding ); - return 0; - } - } - else - { - // Try to read an attribute: - TiXmlAttribute* attrib = new TiXmlAttribute(); - if ( !attrib ) - { - if ( document ) - document->SetError( TIXML_ERROR_OUT_OF_MEMORY, pErr, data, encoding ); - return 0; - } - - attrib->SetDocument( document ); - const char* pErr = p; - p = attrib->Parse( p, data, encoding ); - - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding ); - delete attrib; - return 0; - } - - // Handle the strange case of double attributes: - TiXmlAttribute* node = attributeSet.Find( attrib->Name() ); - if ( node ) - { - node->SetValue( attrib->Value() ); - delete attrib; - return 0; - } - - attributeSet.Add( attrib ); - } - } - return p; + p = SkipWhiteSpace( p, encoding ); + TiXmlDocument* document = GetDocument(); + + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, 0, 0, encoding ); + return 0; + } + +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + + if ( *p != '<' ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, p, data, encoding ); + return 0; + } + + p = SkipWhiteSpace( p+1, encoding ); + + // Read the name. + const char* pErr = p; + + p = ReadName( p, &value, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, pErr, data, encoding ); + return 0; + } + + TIXML_STRING endTag ("</"); + endTag += value; + endTag += ">"; + + // Check for and read attributes. Also look for an empty + // tag or an end tag. + while ( p && *p ) + { + pErr = p; + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); + return 0; + } + if ( *p == '/' ) + { + ++p; + // Empty tag. + if ( *p != '>' ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY, p, data, encoding ); + return 0; + } + return (p+1); + } + else if ( *p == '>' ) + { + // Done with attributes (if there were any.) + // Read the value -- which can include other + // elements -- read the end tag, and return. + ++p; + p = ReadValue( p, data, encoding ); // Note this is an Element method, and will set the error if one happens. + if ( !p || !*p ) + return 0; + + // We should find the end tag now + if ( StringEqual( p, endTag.c_str(), false, encoding ) ) + { + p += endTag.length(); + return p; + } + else + { + if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding ); + return 0; + } + } + else + { + // Try to read an attribute: + TiXmlAttribute* attrib = new TiXmlAttribute(); + if ( !attrib ) + { + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, pErr, data, encoding ); + return 0; + } + + attrib->SetDocument( document ); + const char* pErr = p; + p = attrib->Parse( p, data, encoding ); + + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding ); + delete attrib; + return 0; + } + + // Handle the strange case of double attributes: + TiXmlAttribute* node = attributeSet.Find( attrib->Name() ); + if ( node ) + { + node->SetValue( attrib->Value() ); + delete attrib; + return 0; + } + + attributeSet.Add( attrib ); + } + } + return p; } const char* TiXmlElement::ReadValue( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - TiXmlDocument* document = GetDocument(); - - const char* pWithWhiteSpace = p; - // Read in text and elements in any order. - p = SkipWhiteSpace( p, encoding ); - while ( p && *p ) - { - if ( *p != '<' ) - { - // Take what we have, make a text element. - TiXmlText* textNode = new TiXmlText( "" ); - - if ( !textNode ) - { - if ( document ) - document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, encoding ); - return 0; - } - - if ( TiXmlBase::IsWhiteSpaceCondensed() ) - { - p = textNode->Parse( p, data, encoding ); - } - else - { - // Special case: we want to keep the white space - // so that leading spaces aren't removed. - p = textNode->Parse( pWithWhiteSpace, data, encoding ); - } - - if ( !textNode->Blank() ) - LinkEndChild( textNode ); - else - delete textNode; - } - else - { - // We hit a '<' - // Have we hit a new element or an end tag? - if ( StringEqual( p, "</", false, encoding ) ) - { - return p; - } - else - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, data, encoding ); - LinkEndChild( node ); - } - else - { - return 0; - } - } - } - p = SkipWhiteSpace( p, encoding ); - } - - if ( !p ) - { - if ( document ) - document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE, 0, 0, encoding ); - } - return p; + TiXmlDocument* document = GetDocument(); + + const char* pWithWhiteSpace = p; + // Read in text and elements in any order. + p = SkipWhiteSpace( p, encoding ); + while ( p && *p ) + { + if ( *p != '<' ) + { + // Take what we have, make a text element. + TiXmlText* textNode = new TiXmlText( "" ); + + if ( !textNode ) + { + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, encoding ); + return 0; + } + + if ( TiXmlBase::IsWhiteSpaceCondensed() ) + { + p = textNode->Parse( p, data, encoding ); + } + else + { + // Special case: we want to keep the white space + // so that leading spaces aren't removed. + p = textNode->Parse( pWithWhiteSpace, data, encoding ); + } + + if ( !textNode->Blank() ) + LinkEndChild( textNode ); + else + delete textNode; + } + else + { + // We hit a '<' + // Have we hit a new element or an end tag? + if ( StringEqual( p, "</", false, encoding ) ) + { + return p; + } + else + { + TiXmlNode* node = Identify( p, encoding ); + if ( node ) + { + p = node->Parse( p, data, encoding ); + LinkEndChild( node ); + } + else + { + return 0; + } + } + } + p = SkipWhiteSpace( p, encoding ); + } + + if ( !p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE, 0, 0, encoding ); + } + return p; } #ifdef TIXML_USE_STL void TiXmlUnknown::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - while ( in->good() ) - { - int c = in->get - (); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c; + + if ( c == '>' ) + { + // All is well. + return; + } + } } #endif const char* TiXmlUnknown::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - TiXmlDocument* document = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - if ( !p || !*p || *p != '<' ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_UNKNOWN, p, data, encoding ); - return 0; - } - ++p; - value = ""; - - while ( p && *p && *p != '>' ) - { - value += *p; - ++p; - } - - if ( !p ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding ); - } - if ( *p == '>' ) - return p+1; - return p; + TiXmlDocument* document = GetDocument(); + p = SkipWhiteSpace( p, encoding ); + +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + if ( !p || !*p || *p != '<' ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, p, data, encoding ); + return 0; + } + ++p; + value = ""; + + while ( p && *p && *p != '>' ) + { + value += *p; + ++p; + } + + if ( !p ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding ); + } + if ( *p == '>' ) + return p+1; + return p; } #ifdef TIXML_USE_STL void TiXmlComment::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - while ( in->good() ) - { - int c = in->get - (); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - - if ( c == '>' - && tag->at( tag->length() - 2 ) == '-' - && tag->at( tag->length() - 3 ) == '-' ) - { - // All is well. - return; - } - } + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + (*tag) += (char) c; + + if ( c == '>' + && tag->at( tag->length() - 2 ) == '-' + && tag->at( tag->length() - 3 ) == '-' ) + { + // All is well. + return; + } + } } #endif const char* TiXmlComment::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - TiXmlDocument* document = GetDocument(); - value = ""; - - p = SkipWhiteSpace( p, encoding ); - - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - const char* startTag = "<!--"; - const char* endTag = "-->"; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - p = ReadText( p, &value, false, endTag, false, encoding ); - return p; + TiXmlDocument* document = GetDocument(); + value = ""; + + p = SkipWhiteSpace( p, encoding ); + +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + const char* startTag = "<!--"; + const char* endTag = "-->"; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + p = ReadText( p, &value, false, endTag, false, encoding ); + return p; } const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - return 0; - - int tabsize = 4; - if ( document ) - tabsize = document->TabSize(); - - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) - document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) - document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - - if ( *p == '\'' ) - { - ++p; - end = "\'"; - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == '"' ) - { - ++p; - end = "\""; - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - value += *p; - ++p; - } - } - return p; + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) return 0; + + int tabsize = 4; + if ( document ) + tabsize = document->TabSize(); + +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const char* pErr = p; + p = ReadName( p, &name, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); + return 0; + } + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + const char* end; + + if ( *p == '\'' ) + { + ++p; + end = "\'"; + p = ReadText( p, &value, false, end, false, encoding ); + } + else if ( *p == '"' ) + { + ++p; + end = "\""; + p = ReadText( p, &value, false, end, false, encoding ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + value += *p; + ++p; + } + } + return p; } #ifdef TIXML_USE_STL void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - while ( in->good() ) - { - int c = in->peek(); - if ( c == '<' ) - return; - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get - (); - } + while ( in->good() ) + { + int c = in->peek(); + if ( c == '<' ) + return; + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + (*tag) += (char) c; + in->get(); + } } #endif const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { - value = ""; - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; + value = ""; +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + bool ignoreWhite = true; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false, encoding ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; } #ifdef TIXML_USE_STL void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { - while ( in->good() ) - { - int c = in->get - (); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c; + + if ( c == '>' ) + { + // All is well. + return; + } + } } #endif const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) { - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "<?xml", true, _encoding ) ) - { - if ( document ) - document->SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } - // TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; + p = SkipWhiteSpace( p, _encoding ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "<?xml", true, _encoding ) ) + { + if ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); + return 0; + } +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p, _encoding ); + location = data->Cursor(); + } + p += 5; + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p, _encoding ); + if ( StringEqual( p, "version", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) + ++p; + } + } + return 0; } bool TiXmlText::Blank() const { - for ( unsigned i=0; i<value.length(); i++ ) - if ( !IsWhiteSpace( value[i] ) ) - return false; - return true; + for ( unsigned i=0; i<value.length(); i++ ) + if ( !IsWhiteSpace( value[i] ) ) + return false; + return true; } diff --git a/src/data/CVS/Entries b/src/data/CVS/Entries index a7202aa..848bb28 100644 --- a/src/data/CVS/Entries +++ b/src/data/CVS/Entries @@ -3,8 +3,8 @@ /con.h/1.6/Fri Jan 7 21:17:53 2005// /con_base.cpp/1.7/Fri Jan 7 21:17:53 2005// /con_base.h/1.7/Fri Jan 7 21:17:53 2005// -/data.cpp/1.11/Wed Feb 16 23:46:56 2005// -/data.h/1.8/Wed Feb 16 23:46:56 2005// -/data_base.cpp/1.13/Wed Feb 16 23:46:56 2005// -/data_base.h/1.10/Wed Feb 16 23:46:56 2005// +/data.cpp/1.10/Fri Jan 7 21:17:53 2005// +/data.h/1.7/Fri Jan 7 21:17:53 2005// +/data_base.cpp/1.12/Fri Jan 7 21:17:53 2005// +/data_base.h/1.9/Fri Jan 7 21:17:53 2005// D diff --git a/src/data/con.cpp b/src/data/con.cpp index e6943fe..316776b 100644..100755 --- a/src/data/con.cpp +++ b/src/data/con.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/con.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "con.h" using namespace std; @@ -35,11 +11,11 @@ con::con() p_mysql = mysql_init(NULL); while ( !p_mysql ) - { - wrap::system_message( MYSQLE1 ); - usleep( 30000000 ); - mysql_init(p_mysql); - } + { + wrap::system_message( MYSQLE1 ); + usleep( 30000000 ); + mysql_init(p_mysql); + } while ( mysql_real_connect( p_mysql, @@ -49,19 +25,19 @@ con::con() (const char*)wrap::CONF->get_elem("chat.database.dbname").c_str(), tool::string2int(wrap::CONF->get_elem("chat.database.port")), NULL, 0 ) == NULL ) - { - wrap::system_message( MYSQLQU + string( mysql_error(p_mysql) ) ); - usleep( 30000000 ); - } + { + wrap::system_message( MYSQLQU + string( mysql_error(p_mysql) ) ); + usleep( 30000000 ); + } } con::~con() { if ( p_mysql ) - { - if (mysql_ping( p_mysql ) != 0) - mysql_close( p_mysql ); - } + { + if (mysql_ping( p_mysql ) != 0) + mysql_close( p_mysql ); + } } #endif diff --git a/src/data/con.h b/src/data/con.h index 298249d..5c454f8 100644..100755 --- a/src/data/con.h +++ b/src/data/con.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/con.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef DATABASE @@ -35,12 +11,12 @@ using namespace std; class con : public con_base -{ -public: - MYSQL* p_mysql; - con( ); - ~con( ); -}; + { + public: + MYSQL* p_mysql; + con( ); + ~con( ); + }; #endif #endif diff --git a/src/data/con_base.cpp b/src/data/con_base.cpp index 7e89577..003a376 100644..100755 --- a/src/data/con_base.cpp +++ b/src/data/con_base.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/con_base.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "con_base.h" #ifdef DATABASE diff --git a/src/data/con_base.h b/src/data/con_base.h index 1b2853a..16086db 100644..100755 --- a/src/data/con_base.h +++ b/src/data/con_base.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/con_base.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef DATABASE @@ -33,11 +9,11 @@ using namespace std; class con_base : public timo -{ -public: - con_base( ); - ~con_base( ); -}; + { + public: + con_base( ); + ~con_base( ); + }; #endif #endif diff --git a/src/data/data.cpp b/src/data/data.cpp index c4bae2e..340883e 100644 --- a/src/data/data.cpp +++ b/src/data/data.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/data.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "data.h" #ifdef DATABASE @@ -36,7 +12,7 @@ data::data() data::~data() {} -hashmap<string> +map<string,string> data::select_user_data( string s_user, string s_query) { string s_where_rule = " WHERE nick = \"" + s_user + "\""; @@ -58,11 +34,11 @@ data::select_query( string s_query, string s_where_rule, vector<string>& vec_ele iter++; while ( iter != vec_elements.end() ) - { - s_mysql_query.append( secure_query(*iter) ); - if ( ++iter != vec_elements.end() ) - s_mysql_query.append( ", " ); - } + { + s_mysql_query.append( secure_query(*iter) ); + if ( ++iter != vec_elements.end() ) + s_mysql_query.append( ", " ); + } s_mysql_query.append(" FROM " + s_table + s_where_rule ); print_query( MYSQLQU + s_mysql_query ); @@ -70,36 +46,37 @@ data::select_query( string s_query, string s_where_rule, vector<string>& vec_ele MYSQL_RES* p_result = NULL; if ( 0 == mysql_query( p_con->p_mysql, (const char*)s_mysql_query.c_str() ) ) - { - p_result = mysql_store_result( p_con->p_mysql ); - push_con( p_con ); - } + { + p_result = mysql_store_result( p_con->p_mysql ); + push_con( p_con ); + } + else - { - wrap::system_message( MYSQLQU + string( mysql_error(p_con->p_mysql) ) ); - if (p_con != NULL) - delete p_con; - } + { + wrap::system_message( MYSQLQU + string( mysql_error(p_con->p_mysql) ) ); + if (p_con != NULL) + delete p_con; + } return p_result; } -hashmap<string> +map<string,string> data::parse_result( MYSQL_RES* p_result, vector<string>& vec_elements ) { - hashmap<string> map_ret; + map<string,string> map_ret; if ( p_result != NULL ) - { - MYSQL_ROW row; - vector<string>::iterator vec_iter = vec_elements.begin(); - vec_iter++; + { + MYSQL_ROW row; + vector<string>::iterator vec_iter = vec_elements.begin(); + vec_iter++; - while( (row = mysql_fetch_row(p_result)) ) - for ( int i=0; i < mysql_num_fields(p_result); i++, vec_iter++ ) - map_ret[*vec_iter] = string(row[i]); + while( (row = mysql_fetch_row(p_result)) ) + for ( int i=0; i < mysql_num_fields(p_result); i++, vec_iter++ ) + map_ret[*vec_iter] = string(row[i]); - mysql_free_result( p_result ); - } + mysql_free_result( p_result ); + } return map_ret; } @@ -120,26 +97,26 @@ data::insert_query( string s_query, map<string,string> map_insert ) string s_mysql_query = "INSERT INTO " + s_table + " ("; while ( iter != vec_elements.end() ) - { - s_mysql_query.append( *iter ); + { + s_mysql_query.append( *iter ); - if ( ++iter != vec_elements.end() ) - s_mysql_query.append( ", " ); - else - s_mysql_query.append( ") VALUES(" ); - } + if ( ++iter != vec_elements.end() ) + s_mysql_query.append( ", " ); + else + s_mysql_query.append( ") VALUES(" ); + } iter = vec_elements.begin(); iter++; while ( iter != vec_elements.end() ) - { - s_mysql_query.append( "\"" + secure_query(map_insert[*iter]) + "\"" ); - if ( ++iter != vec_elements.end() ) - s_mysql_query.append( ", " ); - else - s_mysql_query.append( ")" ); - } + { + s_mysql_query.append( "\"" + secure_query(map_insert[*iter]) + "\"" ); + if ( ++iter != vec_elements.end() ) + s_mysql_query.append( ", " ); + else + s_mysql_query.append( ")" ); + } print_query( MYSQLQU + s_mysql_query ); @@ -154,7 +131,7 @@ data::insert_query( string s_query, map<string,string> map_insert ) } void -data::update_user_data( string s_user, string s_query, hashmap<string> update_map ) +data::update_user_data( string s_user, string s_query, map<string,string> update_map ) { vector<string> vec_elements = map_queries[s_query]; @@ -171,33 +148,33 @@ data::update_user_data( string s_user, string s_query, hashmap<string> update_ma bool b_flag = 0; while ( iter != vec_elements.end() ) - { - if ( update_map[*iter] == "" ) // Dont update data if it has not been changed / if its empty! { - iter++; - continue; - } + if ( update_map[*iter] == "" ) // Dont update data if it has not been changed / if its empty! + { + iter++; + continue; + } - if ( iter != iter_second && b_flag ) - s_mysql_query.append( ", " ); + if ( iter != iter_second && b_flag ) + s_mysql_query.append( ", " ); - s_mysql_query.append( *iter + "=\"" + secure_query(update_map[*iter]) + "\"" ); - b_flag = 1; - iter++; - } + s_mysql_query.append( *iter + "=\"" + secure_query(update_map[*iter]) + "\"" ); + b_flag = 1; + iter++; + } if ( b_flag ) - { - s_mysql_query.append( " WHERE nick=\"" + tool::to_lower(s_user) + "\"" ); + { + s_mysql_query.append( " WHERE nick=\"" + tool::to_lower(s_user) + "\"" ); - con* p_con = get_con(); - print_query( MYSQLQU + s_mysql_query ); + con* p_con = get_con(); + print_query( MYSQLQU + s_mysql_query ); - if ( 0 != mysql_query( p_con->p_mysql, (const char*)s_mysql_query.c_str() ) ) - wrap::system_message( MYSQLQU + string( mysql_error(p_con->p_mysql) ) ); + if ( 0 != mysql_query( p_con->p_mysql, (const char*)s_mysql_query.c_str() ) ) + wrap::system_message( MYSQLQU + string( mysql_error(p_con->p_mysql) ) ); - push_con( p_con ); - } + push_con( p_con ); + } } string @@ -207,18 +184,18 @@ data::secure_query( string s_mysql_query ) unsigned i_pos = s_mysql_query.find("\\"); while ( i_pos != string::npos ) - { - s_mysql_query.replace( i_pos, 1, "/" ); - i_pos = s_mysql_query.find("\\"); - } + { + s_mysql_query.replace( i_pos, 1, "/" ); + i_pos = s_mysql_query.find("\\"); + } i_pos = s_mysql_query.find("\""); while ( i_pos != string::npos ) - { - s_mysql_query.replace( i_pos, 1, "'" ); - i_pos = s_mysql_query.find("\""); - } + { + s_mysql_query.replace( i_pos, 1, "'" ); + i_pos = s_mysql_query.find("\""); + } return s_mysql_query; } diff --git a/src/data/data.h b/src/data/data.h index a452c86..21c03d2 100644 --- a/src/data/data.h +++ b/src/data/data.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/data.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef DATABASE @@ -34,20 +10,20 @@ using namespace std; class data : public data_base // data implementation used in data.h -{ -private: - MYSQL_RES* select_query( string s_query, string s_where_rule, vector<string>& vec_elements ); - hashmap<string> parse_result( MYSQL_RES* p_result, vector<string>& vec_elements ); - void insert_query( string s_query, map<string,string> map_insert ); - string secure_query( string s_mysql_query ); -public: - data( ); - ~data( ); + { + private: + MYSQL_RES* select_query( string s_query, string s_where_rule, vector<string>& vec_elements ); + map<string,string> parse_result( MYSQL_RES* p_result, vector<string>& vec_elements ); + void insert_query( string s_query, map<string,string> map_insert ); + string secure_query( string s_mysql_query ); + public: + data( ); + ~data( ); - hashmap<string> select_user_data( string s_user, string s_query ); - void insert_user_data( string s_user, string s_query, map<string,string> insert_map ); - void update_user_data( string s_user, string s_query, hashmap<string> update_map ); -}; + map<string,string> select_user_data( string s_user, string s_query ); + void insert_user_data( string s_user, string s_query, map<string,string> insert_map ); + void update_user_data( string s_user, string s_query, map<string,string> update_map ); + }; #endif #endif diff --git a/src/data/data_base.cpp b/src/data/data_base.cpp index b8e79b4..2cbe070 100644 --- a/src/data/data_base.cpp +++ b/src/data/data_base.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/data_base.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "data_base.h" #ifdef DATABASE @@ -39,39 +15,40 @@ data_base::data_base( ) // Reads all DATA_ elements of conf.txt! for ( iter = vec_keys.begin(); iter != vec_keys.end(); iter++ ) - { - if ( iter->length() > 20 - && iter->compare(0, 19, "chat.database.mysql") == 0 - && iter->find(".descr") == string::npos ) { - vector<string> vec_tokens; - string s_element = wrap::CONF->get_elem(*iter); - unsigned i_pos = 0; - - for ( bool b_find = 1; b_find; ) - { - i_pos = s_element.find_first_of( " ", 0 ); - - if ( i_pos != string::npos ) - { - vec_tokens.push_back( s_element.substr(0, i_pos) ); - s_element = s_element.substr( i_pos+1 ); - } - else + if ( iter->length() > 20 + && iter->compare(0, 19, "chat.database.mysql") == 0 + && iter->find(".descr") == string::npos ) { - vec_tokens.push_back( s_element ); - b_find = 0; + vector<string> vec_tokens; + string s_element = wrap::CONF->get_elem(*iter); + unsigned i_pos = 0; + + for ( bool b_find = 1; b_find; ) + { + i_pos = s_element.find_first_of( " ", 0 ); + + if ( i_pos != string::npos ) + { + vec_tokens.push_back( s_element.substr(0, i_pos) ); + s_element = s_element.substr( i_pos+1 ); + } + + else + { + vec_tokens.push_back( s_element ); + b_find = 0; + } + } + + string s_mysqlquery = iter->substr(20); + wrap::system_message(MYSQLQ2 + s_mysqlquery); + map_queries[s_mysqlquery] = vec_tokens; } - } - - string s_mysqlquery = iter->substr(20); - wrap::system_message(MYSQLQ2 + s_mysqlquery); - map_queries[s_mysqlquery] = vec_tokens; } - } } -void data_base::init_connections() +void data_base::initialize_connections() { int i_min_con = tool::string2int( wrap::CONF->get_elem("chat.database.mincon") ), i_max_con = tool::string2int( wrap::CONF->get_elem("chat.database.maxcon") ); @@ -93,23 +70,23 @@ data_base::~data_base() pthread_mutex_destroy ( &mut_con ); } -hashmap<string> +map<string,string> data_base::select_user_data( string s_user, string s_query) { print_query( DATAQUE + s_query ); - hashmap<string> map_ret; + map<string,string> map_ret; return map_ret; } void -data_base::insert_user_data( string s_user, string s_query, hashmap<string> insert_map ) +data_base::insert_user_data( string s_user, string s_query, map<string,string> insert_map ) { print_query( DATAQUE + s_query ); } void -data_base::update_user_data( string s_user, string s_query, hashmap<string> update_map ) +data_base::update_user_data( string s_user, string s_query, map<string,string> update_map ) { print_query( DATAQUE + s_query ); } @@ -136,18 +113,19 @@ data_base::get_con() pthread_mutex_lock( &mut_con ); if ( empty() ) - { - wrap::system_message( DATANEW + string("(") + tool::int2string(size()+1) + ")" ); - pthread_mutex_unlock( &mut_con ); - return new con; - } + { + wrap::system_message( DATANEW + string("(") + tool::int2string(size()+1) + ")" ); + pthread_mutex_unlock( &mut_con ); + return new con; + } + else if ( size() > i_max_con-1 ) - { - wrap::system_message( DATAMAX + string("(") + tool::int2string(i_max_con) + ")" ); - usleep( 5000000 ); - pthread_mutex_unlock( &mut_con ); - return get_con(); - } + { + wrap::system_message( DATAMAX + string("(") + tool::int2string(i_max_con) + ")" ); + usleep( 5000000 ); + pthread_mutex_unlock( &mut_con ); + return get_con(); + } con* p_con = *begin(); @@ -184,10 +162,10 @@ void data_base::print_queue_size() { if ( wrap::NCUR->is_ready() ) - { - mvprintw( NCUR_CON_QUEUE_X,NCUR_CON_QUEUE_Y, "Con. queue: %d ", size()); - refresh(); - } + { + mvprintw( NCUR_CON_QUEUE_X,NCUR_CON_QUEUE_Y, "Con. queue: %d ", size()); + refresh(); + } } #endif @@ -198,11 +176,11 @@ data_base::disconnect_all_connections() pthread_mutex_lock( &mut_con ); while ( !empty() ) - { - con* p_con = *begin(); - pop_front(); - delete p_con; - } + { + con* p_con = *begin(); + pop_front(); + delete p_con; + } pthread_mutex_unlock( &mut_con ); #ifdef NCURSES @@ -222,18 +200,18 @@ data_base::check_data_con_timeout() list< list<con*>::iterator > erase_list; for ( list<con*>::iterator iter = begin(); iter != end(); iter++ ) - { - i_last_activity = (int) (*iter)->get_last_activity(); - if ( i_timeout_time <= i_last_activity ) { - con* p_con = *iter; - erase_list.push_back(iter); - delete p_con; - wrap::system_message(DATADI2 + tool::int2string(size()-erase_list.size()+1) + "," - + tool::int2string(i_timeout_time) + "," - + tool::int2string(i_last_activity) + ")"); + i_last_activity = (int) (*iter)->get_last_activity(); + if ( i_timeout_time <= i_last_activity ) + { + con* p_con = *iter; + erase_list.push_back(iter); + delete p_con; + wrap::system_message(DATADI2 + tool::int2string(size()-erase_list.size()+1) + "," + + tool::int2string(i_timeout_time) + "," + + tool::int2string(i_last_activity) + ")"); + } } - } for ( list< list<con*>::iterator >::iterator erase_iter = erase_list.begin(); erase_iter != erase_list.end(); erase_iter++ ) erase( *erase_iter ); diff --git a/src/data/data_base.h b/src/data/data_base.h index 8aece61..97ad31e 100644 --- a/src/data/data_base.h +++ b/src/data/data_base.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/data/data_base.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef DATABASE @@ -35,38 +11,38 @@ using namespace std; class data_base : protected list<con*> -{ -private: - pthread_mutex_t mut_con; - int i_max_con; + { + private: + pthread_mutex_t mut_con; + int i_max_con; #ifdef NCURSES - void print_queue_size(); + void print_queue_size(); #endif -protected: - hashmap< vector<string> > map_queries; - void print_query( string s_query ); + protected: + map< string, vector<string> > map_queries; + void print_query( string s_query ); #ifdef DATA_PRINT_QUERIES - virtual void print_query_( string s_query ); + virtual void print_query_( string s_query ); #endif - con* get_con(); - void push_con( con* p_con ); + con* get_con(); + void push_con( con* p_con ); -public: - data_base(); - ~data_base(); + public: + data_base(); + ~data_base(); - void init_connections(); - virtual hashmap<string> select_user_data( string s_user, string s_query ); - virtual void insert_user_data( string s_user, string s_query, hashmap<string> insert_map ); - virtual void update_user_data( string s_user, string s_query, hashmap<string> update_map ); - void disconnect_all_connections(); - void check_data_con_timeout(); -}; + void initialize_connections(); + virtual map<string,string> select_user_data( string s_user, string s_query ); + virtual void insert_user_data( string s_user, string s_query, map<string,string> insert_map ); + virtual void update_user_data( string s_user, string s_query, map<string,string> update_map ); + void disconnect_all_connections(); + void check_data_con_timeout(); + }; #endif #endif diff --git a/src/glob.h b/src/glob.h index 66cada0..99954b0 100644..100755 --- a/src/glob.h +++ b/src/glob.h @@ -1,35 +1,11 @@ -/*:* - *: File: ./src/glob.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - /* Notice: - + All #defines which start with an CONFIG can be edited through gmake config in the main directory! */ -#include "maps/hashmap.h" +#include <map> // global variables. #ifndef GLOB_H @@ -39,51 +15,79 @@ #define true 1 #define false 0 -//<<* -/* FIRST THE YCHAT ONLY OPTIONS */ +/* - CONFIG - + What should be the name of the config file? +*/ +#define CONFILE "ychat.conf" /* - CONFIG - + In which prefix should yChat be installed if typing gmake inst- + all? +*/ +#define PREFIX "/usr/local" + +//<<* +/* - CONFIG - Should yChat get compiled with database support? Currently MyS- QL only is a supported database. */ -//#define DATABASE +#define DATABASE #ifdef DATABASE -#define USE_MYSQL -/* - CONFIG - +/* - CONFIG - Should all database queries printed out at the admin interface? (This option wont take action if database support has not been chosen) */ #define DATA_PRINT_QUERIES + +#define USE_MYSQL #endif +//*>> /* - CONFIG - - Defines the amount of newlines which have to be sent to the clie- - nt's chat stream after the first log-in. It prevents a white scr- - een because of browser buffers or proxies. + Please enter the highest networking port which is allowed to be + used. If yChat is unable to create the server socket on a cert- + ain port, it will increment the port number and retries to cre- + ate another socket on the incremented port number. This proced- + ure will continue until MAXPORT has been reached. */ -#define PUSHSTR 500 +#define MAXPORT 65535 -/* AFTERWARDS THE YCHAT AND YHTTPD OPTIONS */ -//*>> +/* - CONFIG - + Please specify the maximum length of a line read from a socket + or a file. ( config-file, html-template ) +*/ +#define READSOCK 2048 -/* - CONFIG - - Should yChat get compiled with comand line interface support? +/* - CONFIG - + Please specify the size of a temporary buffer. (Will be used f- + or different tasks) */ -#define CLI +#define READBUF 2048 -/* - CONFIG - - What should be the name of the config file? +/* - CONFIG - + Please specify the maximum length of a HTTP post request. */ -#define CONFILE "ychat.conf" +#define POSTBUF 512 -/* - DISABLED - - Enable debugging options. +/* - CONFIG - + Please specify the maximum occupancy of the internal hash-map + data structures given in percentage. 0.9 means 90% iccupancy. */ -//#define DEBUG +#define HMAPOCC .9 -/* - DISABLED - +/* - CONFIG - + Please chose if you want to use verbose server outputs or not. + The verbose messages will appear in the ncurses menu if ncurses + is enabled or in the server-window if yChat has been compiled + without ncurses support. This option shows you all incoming + requests with the client IP and port numbers. You probably want + this to be turned off if you have heavy server load. +*/ +//#define VERBOSE + +/* - CONFIG - If you want to enable EXPERIMENTAL features, then set this val- ue to true. Else use false which is recommended! All experimen- al features are marked inside of the running yChat! @@ -92,55 +96,19 @@ /* - CONFIG - Should yChat get compiled with logging support? -*/ +*/ #define LOGGING /* - CONFIG - - Please enter the highest networking port which is allowed to be - used. If yChat is unable to create the server socket on a cert- - ain port, it will increment the port number and retries to cre- - ate another socket on the incremented port number. This proced- - ure will continue until MAXPORT has been reached. -*/ -#define MAXPORT 65535 - -/* Specifies the max amount of lines to read from a HTTP request - header -*/ -#define MAXLINES 30 - -/* Specifies the max length of a lines to read from a HTTP request - header -*/ -#define MAXLENGTH 1024 - -/* - CONFIG - Should yChat get compiled with ncurses support? -*/ +*/ #define NCURSES /* - CONFIG - - Please specify the maximum length of a HTTP post request. -*/ -#define POSTBUF 512 - -/* - CONFIG - - Please specify the size of a temporary buffer. (Will be used f- - or different tasks) -*/ -#define READBUF 2048 - -/* - CONFIG - - Please specify the maximum length of a line read from a socket - or a file. ( config-file, html-template ) + Should yChat get compiled with comand line interface support? */ -#define READSOCK 2048 +#define CLI -/* - CONFIG - - In which prefix should yChat be installed if typing gmake inst- - all? -*/ -#define PREFIX "/usr/local" /* - CONFIG - DO NOT USE TOGETHER WITH NCURSES! Displays important server mes- @@ -150,65 +118,58 @@ */ //#define SERVMSG -/* - CONFIG - - Set to true if you want yChat to catch the SIGSEGV signal. yChat - will print a warning message into the system messages and will - not core dump if an error occurs. -*/ -//#define CTCSEGV +// Enables debugging options +//#define DEBUG +//<<* /* - CONFIG - - Please chose if you want to use verbose server outputs or not. - The verbose messages will appear in the ncurses menu if ncurses - is enabled or in the server-window if yChat has been compiled - without ncurses support. This option shows you all incoming - requests with the client IP and port numbers. You probably want - this to be turned off if you have heavy server load. + Defines the amount of newlines which have to be sent to the clie- + nt's chat stream after the first log-in. It prevents a white scr- + een because of browser buffers or proxies. */ -//#define VERBOSE - - +#define PUSHSTR 500 +//*>> // The following values define the positions of the data stats in the NCURSES interface. #ifdef NCURSES #define NCUR_SERVER_HEADER_X 21 -#define NCUR_SERVER_HEADER_Y 2 +#define NCUR_SERVER_HEADER_Y 2 #define NCUR_PORT_X 22 #define NCUR_PORT_Y 2 #define NCUR_HITS_X 23 #define NCUR_HITS_Y 2 #define NCUR_POOL_HEADER_X 21 -#define NCUR_POOL_HEADER_Y 16 -#define NCUR_POOL_WAIT_X 22 -#define NCUR_POOL_WAIT_Y 16 +#define NCUR_POOL_HEADER_Y 18 +#define NCUR_POOL_SIZE_X 22 +#define NCUR_POOL_SIZE_Y 18 #define NCUR_POOL_RUNNING_X 23 -#define NCUR_POOL_RUNNING_Y 16 +#define NCUR_POOL_RUNNING_Y 18 #define NCUR_DATA_HEADER_X 21 -#define NCUR_DATA_HEADER_Y 35 +#define NCUR_DATA_HEADER_Y 35 #define NCUR_GARBAGE_X 22 #define NCUR_GARBAGE_Y 35 -#define NCUR_CON_QUEUE_X 23 +#define NCUR_CON_QUEUE_X 23 #define NCUR_CON_QUEUE_Y 35 #define NCUR_CHAT_HEADER_X 21 #define NCUR_CHAT_HEADER_Y 52 #define NCUR_NUM_ROOMS_X 22 -#define NCUR_NUM_ROOMS_Y 52 +#define NCUR_NUM_ROOMS_Y 52 #define NCUR_SESSION_X 23 -#define NCUR_SESSION_Y 52 +#define NCUR_SESSION_Y 52 #define NCUR_CACHED_HEADER_X 21 -#define NCUR_CACHED_HEADER_Y 68 +#define NCUR_CACHED_HEADER_Y 68 #define NCUR_CACHED_DOCS_X 22 -#define NCUR_CACHED_DOCS_Y 68 -#define NCUR_CACHED_MODS_X 23 -#define NCUR_CACHED_MODS_Y 68 +#define NCUR_CACHED_DOCS_Y 68 +#define NCUR_CACHED_MODS_X 23 +#define NCUR_CACHED_MODS_Y 68 #define NCUR_MENU_CHAR_X 0 -#define NCUR_MENU_CHAR_Y 33 +#define NCUR_MENU_CHAR_Y 33 #define NCUR_UPTIME_X 0 #define NCUR_UPTIME_Y 44 #define NCUR_TIME_X 0 @@ -226,13 +187,13 @@ typedef int function( void *v_arg ); struct container { - void* elem[4]; + void* elem[4]; }; struct dynmod { - function *the_func ; - void *the_module; + function *the_func ; + void *the_module; }; typedef enum method_ { diff --git a/src/html.cpp b/src/html.cpp index 52225b0..3b5f6b0 100644..100755 --- a/src/html.cpp +++ b/src/html.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/html.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef HTML_CPP #define HTML_CPP @@ -30,129 +6,129 @@ using namespace std; -html::html( ) +html::html( ) : smap<string,string>::smap(HMAPOCC) { - set_name( wrap::CONF->get_elem( "httpd.templatedir" ) ); + set_name( wrap::CONF->get_elem( "httpd.templatedir" ) ); } html::~html( ) -{} +{ +} void html::clear_cache( ) { - clear(); - wrap::system_message( CLRHTML ); - -#ifdef NCURSES + make_empty(); + wrap::system_message( CLRHTML ); - print_cached( 0 ); +#ifdef NCURSES + print_cached( 0 ); #endif } string html::parse( map<string,string> &map_params ) { - string s_file = map_params["request"]; - - // check if s_file is in the container. - string s_templ; + string s_file = map_params["request"]; - // if not, read file. - if ( ! shashmap<string>::exists( s_file ) ) - { - string s_path = get_name(); - ifstream if_templ( s_path.append( s_file ).c_str(), ios::binary ); + // check if s_file is in the container. + string s_templ; - if ( ! if_templ ) + // if not, read file. + if ( ! smap<string,string>::is_avail( s_file ) ) { - wrap::system_message( OFFFOUND + s_path ); - if(map_params["request"] == wrap::CONF->get_elem( "httpd.html.notfound" )) - return ""; + string s_path = get_name(); + ifstream if_templ( s_path.append( s_file ).c_str(), ios::binary ); - map_params["request"] = wrap::CONF->get_elem( "httpd.html.notfound" ); - return parse( map_params ); - } + if ( ! if_templ ) + { + wrap::system_message( OFFFOUND + s_path ); + if(map_params["request"]== wrap::CONF->get_elem( "httpd.html.notfound" )) + return ""; - char c_buf; - while( !if_templ.eof() ) - { - if_templ.get( c_buf ); - s_templ += c_buf; - } + map_params["request"] = wrap::CONF->get_elem( "httpd.html.notfound" ); + return parse( map_params ); - if ( map_params["content-type"].compare(0,5,"text/") == 0 ) - s_templ.erase(s_templ.end()-1); + } - if_templ.close(); + char c_buf; + while( !if_templ.eof() ) + { + if_templ.get( c_buf ); + s_templ += c_buf; + } - wrap::system_message( TECACHE + s_path ); + if ( map_params["content-type"].compare(0,5,"text/") == 0 ) + s_templ.erase(s_templ.end()-1); - // cache file. - shashmap<string>::add_elem(s_templ, s_file); -#ifdef NCURSES + if_templ.close(); - print_cached( shashmap<string>::size() ); -#endif + wrap::system_message( TECACHE + s_path ); - } - else - { - s_templ = shashmap<string>::get_elem( s_file ); - } + // cache file. + smap<string,string>::add_elem( s_templ, s_file ); +#ifdef NCURSES + print_cached( smap<string,string>::get_size() ); +#endif + } - // find %%KEY%% token and substituate those. - unsigned pos[2]; - pos[0] = pos[1] = 0; + else + { + s_templ = smap<string,string>::get_elem( s_file ); + } - for(;;) - { - pos[0] = s_templ.find( "%%", pos[1] ); + // find %%KEY%% token and substituate those. + unsigned pos[2]; + pos[0] = pos[1] = 0; - if ( pos[0] == string::npos ) - break; + for(;;) + { + pos[0] = s_templ.find( "%%", pos[1] ); - pos[0] += 2; - pos[1] = s_templ.find( "%%", pos[0] ); + if ( pos[0] == string::npos ) + break; - if ( pos[0] == string::npos ) - break; + pos[0] += 2; + pos[1] = s_templ.find( "%%", pos[0] ); - // get key and val. - string s_key = s_templ.substr( pos[0], pos[1]-pos[0] ); - string s_val = wrap::CONF->get_elem( s_key ); + if ( pos[0] == string::npos ) + break; - // if s_val is empty use map_params. - if ( s_val.empty() ) - s_val = map_params[ s_key ]; + // get key and val. + string s_key = s_templ.substr( pos[0], pos[1]-pos[0] ); + string s_val = wrap::CONF->get_elem( s_key ); - // substituate key with val. - s_templ.replace( pos[0]-2, pos[1]-pos[0]+4, s_val ); + // if s_val is empty use map_params. + if ( s_val.empty() ) + s_val = map_params[ s_key ]; + + // substituate key with val. + s_templ.replace( pos[0]-2, pos[1]-pos[0]+4, s_val ); - // calculate the string displacement. - int i_diff = s_val.length() - ( pos[1] - pos[0] + 4); + // calculate the string displacement. + int i_diff = s_val.length() - ( pos[1] - pos[0] + 4); - pos[1] += 2 + i_diff; + pos[1] += 2 + i_diff; - }; + }; - return s_templ; + return s_templ; } //<<* void html::online_list( user *p_user, map<string,string> &map_params ) { - // prepare user_list. - string s_list; + // prepare user_list. + string s_list; - room* p_room = p_user->get_room(); + room* p_room = p_user->get_room(); - p_room->get_user_list( s_list ); + p_room->get_user_list( s_list ); - map_params["room"] = p_room->get_name(); - map_params["topic"] = p_room->get_topic(); - map_params["userlist"] = s_list; + map_params["ROOMNAME"] = p_room->get_name(); + map_params["ROOMTOPIC"] = p_room->get_topic(); + map_params["USERLIST"] = s_list; } //*>> @@ -160,11 +136,11 @@ html::online_list( user *p_user, map<string,string> &map_params ) void html::print_cached( int i_docs ) { - if ( !wrap::NCUR->is_ready() ) - return; + if ( !wrap::NCUR->is_ready() ) + return; - mvprintw( NCUR_CACHED_DOCS_X, NCUR_CACHED_DOCS_Y, "Docs: %d ", i_docs); - refresh(); + mvprintw( NCUR_CACHED_DOCS_X, NCUR_CACHED_DOCS_Y, "Docs: %d ", i_docs); + refresh(); } #endif diff --git a/src/html.h b/src/html.h index 3f55ba8..1bb486a 100644..100755 --- a/src/html.h +++ b/src/html.h @@ -1,64 +1,38 @@ -/*:* - *: File: ./src/html.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - // class html declaration. this class manages the html-template files. #include "incl.h" #ifndef HTML_H #define HTML_H -#include "maps/shashmap.h" +#include "maps/smap.h" #include "chat/user.h" #include "name.h" using namespace std; -class html : public shashmap<string>, name +class html : public smap<string, string>, name { public: - html( ); - ~html( ); - - // Clears the template cache so that new html templates will be read - // from hard disk. This method is needed after changeing s.t. on - // the html-template files. - void clear_cache( ); - - // Returns a parsed html-template. this method will check first if the - // required html-template exists inside the classes template cache. if not - // then the file will be read from file and added to the cache. - // afterwards the html-template will be parsed and returned. - // map_params contains the client request parameters which also will be - // used for string substituation. - string parse( map<string,string> &map_params ); - - void online_list( user *p_user, map<string,string> &map_params ); //<< + html( ); + ~html( ); + + // Clears the template cache so that new html templates will be read + // from hard disk. This method is needed after changeing s.t. on + // the html-template files. + void clear_cache( ); + + // Returns a parsed html-template. this method will check first if the + // required html-template exists inside the classes template cache. if not + // then the file will be read from file and added to the cache. + // afterwards the html-template will be parsed and returned. + // map_params contains the client request parameters which also will be + // used for string substituation. + string parse( map<string,string> &map_params ); + + void online_list( user *p_user, map<string,string> &map_params ); //<< #ifdef NCURSES - - void print_cached( int i_docs ); + void print_cached( int i_docs ); #endif - }; #endif diff --git a/src/incl.h b/src/incl.h index dc6c363..e7e9413 100644..100755 --- a/src/incl.h +++ b/src/incl.h @@ -1,31 +1,6 @@ -/*:* - *: File: ./src/incl.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <pthread.h> #include <iostream> #include <string> -#include <map> #include "glob.h" diff --git a/src/logd.cpp b/src/logd.cpp index 8ab6891..fd78ea2 100644..100755 --- a/src/logd.cpp +++ b/src/logd.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/logd.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef LOGD_CPP #define LOGD_CPP @@ -34,166 +10,163 @@ logd::logd( string s_filename, string s_log_lines ) { - initialize( s_filename, tool::string2int(s_log_lines) ); + initialize( s_filename, tool::string2int(s_log_lines) ); } logd::logd( string s_filename, int i_log_lines ) { - initialize( s_filename, i_log_lines ); + initialize( s_filename, i_log_lines ); } logd::~logd() { - flush_logs(); - pthread_mutex_destroy( &mut_s_logging ); + flush(); + pthread_mutex_destroy( &mut_s_logging ); } void logd::initialize( string s_filename, int i_log_lines ) { - pthread_mutex_init( &mut_s_logging, NULL ); + pthread_mutex_init( &mut_s_logging, NULL ); - if( s_filename.empty() ) - { - wrap::system_message( LOGERR2 ); - exit(1); - } + if( s_filename.empty() ) + { + wrap::system_message( LOGERR2 ); + exit(1); + } - //if (wrap::NCUR->is_ready()) - // wrap::system_message(LOGGINI+s_filename); - - s_logfile = s_filename; - i_lines = i_log_lines; + s_logfile = s_filename; + i_lines = i_log_lines; } string logd::get_time_string() { - struct tm *t_m; - time_t t_cur = time(NULL); - t_m = gmtime(&t_cur); + struct tm *t_m; + time_t t_cur = time(NULL); + t_m = gmtime(&t_cur); - char c_buf[100]; - c_buf[99] = '\0'; - strftime(c_buf, 100, "[%d/%b/%Y:%H:%M:%S %z]", t_m); + char c_buf[100]; + c_buf[99] = '\0'; + strftime(c_buf, 100, "[%d/%b/%Y:%H:%M:%S %z]", t_m); - return string(c_buf); + return string(c_buf); } -void +void logd::flush() { - ofstream of_output; - of_output.open(s_logfile.c_str(), ios::app); - - if( of_output == NULL ) - { - wrap::system_message( LOGERR1 + s_logfile ); - exit(1); - } - - while( ! s_queue.empty() ) - { - string s_l=s_queue.front(); - s_queue.pop(); - of_output.write( s_l.c_str(), s_l.size() ); - } - - of_output.close(); + ofstream of_output; + + of_output.open(s_logfile.c_str(), ios::app); + + if( of_output == NULL ) + { + wrap::system_message( LOGERR1 + s_logfile ); + exit(1); + } + + while( ! s_queue.empty() ) + { + string s_l=s_queue.front(); + s_queue.pop(); + of_output.write( s_l.c_str(), s_l.size() ); + } + + of_output.close(); } void -logd::log_access( map<string,string> &map_request ) +logd::log_access( map<string,string> request ) { - //static int i_access_lines = wrap::CONF->get_elem("httpd.logging.accesslines"); - - string s_time = get_time_string(); - string s_logstr = map_request["REMOTE_ADDR"] + " - - "+s_time+" \"" + map_request["QUERY_STRING"]+"\" 200 0 \""+map_request["request"]+"\" \""+map_request["User-Agent"]+"\"\n"; + string s_time = get_time_string(); + string s_logstr = request["REMOTE_ADDR"] + " - - "+s_time+" \"" + request["QUERY_STRING"]+"\" 200 0 \""+request["request"]+"\" \""+request["User-Agent"]+"\"\n"; - pthread_mutex_lock ( &mut_s_logging ); - s_queue.push(s_logstr); + pthread_mutex_lock ( &mut_s_logging ); + s_queue.push(s_logstr); - if ( s_queue.size() > i_lines ) - flush(); + if ( s_queue.size() > i_lines ) + flush(); - pthread_mutex_unlock( &mut_s_logging ); + pthread_mutex_unlock( &mut_s_logging ); } void logd::log_simple_line( string s_line ) { - // Dont log empty lines! - if (s_line.empty()) - return; + // Dont log empty lines! + if (s_line.empty()) + return; - string s_time = get_time_string(); - string s_logstr = s_time + " " + s_line; + string s_time = get_time_string(); + string s_logstr = s_time + " " + s_line; - pthread_mutex_lock ( &mut_s_logging ); - s_queue.push(s_logstr); + pthread_mutex_lock ( &mut_s_logging ); + s_queue.push(s_logstr); - if ( s_queue.size() > i_lines ) - flush(); + if ( s_queue.size() > i_lines ) + flush(); - pthread_mutex_unlock( &mut_s_logging ); + pthread_mutex_unlock( &mut_s_logging ); } void logd::set_logfile( string s_path, string s_filename ) { - // Remove "/" from filename! - unsigned i_pos = s_filename.find( "/" ); - while ( i_pos != string::npos ) - { - s_filename.replace( i_pos, 1, "SLASH" ); - i_pos = s_filename.find( "/" ); - } - - // Remove "\" from filename (for non unix systems)! - i_pos = s_filename.find( "\\" ); - while ( i_pos != string::npos ) - { - s_filename.replace( i_pos, 1, "BACKSLASH" ); + // Remove "/" from filename! + unsigned i_pos = s_filename.find( "/" ); + while ( i_pos != string::npos ) + { + s_filename.replace( i_pos, 1, "SLASH" ); + i_pos = s_filename.find( "/" ); + } + + // Remove "\" from filename (for non unix systems)! i_pos = s_filename.find( "\\" ); - } - - pthread_mutex_lock ( &mut_s_logging ); - this->s_logfile = s_path + s_filename; - pthread_mutex_unlock( &mut_s_logging ); + while ( i_pos != string::npos ) + { + s_filename.replace( i_pos, 1, "BACKSLASH" ); + i_pos = s_filename.find( "\\" ); + } + + pthread_mutex_lock ( &mut_s_logging ); + this->s_logfile = s_path + s_filename; + pthread_mutex_unlock( &mut_s_logging ); } void logd::flush_logs() { - pthread_mutex_lock ( &mut_s_logging ); - flush(); - pthread_mutex_unlock( &mut_s_logging ); + pthread_mutex_lock ( &mut_s_logging ); + flush(); + pthread_mutex_unlock( &mut_s_logging ); } string logd::remove_html_tags( string s_logs ) { - unsigned pos[2]; + unsigned pos[2]; - while ( (pos[0] = s_logs.find("<")) != string::npos ) - { - if ( (pos[1] = s_logs.find(">", pos[0])) != string::npos ) - s_logs.replace( pos[0], pos[1]-pos[0]+1, ""); - else + while ( (pos[0] = s_logs.find("<")) != string::npos ) + { + if ( (pos[1] = s_logs.find(">", pos[0])) != string::npos ) + s_logs.replace( pos[0], pos[1]-pos[0]+1, ""); + else break; - } + } - if ( s_logs == "\n" ) - return ""; + if ( s_logs == "\n" ) + return ""; - return s_logs; + return s_logs; } void logd::set_lines( const int i_lines ) { - this->i_lines = i_lines; + this->i_lines = i_lines; } #endif + #endif diff --git a/src/logd.h b/src/logd.h index 8c7dff8..f799d21 100644..100755 --- a/src/logd.h +++ b/src/logd.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/logd.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "incl.h" #ifdef LOGGING @@ -34,26 +10,26 @@ class logd { private: - string s_logfile; - queue<string> s_queue; - pthread_mutex_t mut_s_logging; - int i_lines; + string s_logfile; + queue<string> s_queue; + pthread_mutex_t mut_s_logging; + int i_lines; - void initialize( string s_filename, int i_log_lines ); - void flush(); - void set_lines( const int i_lines ); - string get_time_string(); + void initialize( string s_filename, int i_log_lines ); + void flush(); + void set_lines( const int i_lines ); + string get_time_string(); public: - logd( string s_filename, string s_log_lines ); - logd( string s_filename, int i_log_lines ); - ~logd(); - - void set_logfile( string s_path, string s_filename ); - void log_access( map<string,string> &map_request ); - void log_simple_line( string s_line ); - void flush_logs(); - static string remove_html_tags( string s_log ); + logd( string s_filename, string s_log_lines ); + logd( string s_filename, int i_log_lines ); + ~logd(); + + void set_logfile( string s_path, string s_filename ); + void log_access( map<string,string> request ); + void log_simple_line( string s_line ); + void flush_logs(); + static string remove_html_tags( string s_log ); }; #endif diff --git a/src/main.cpp b/src/main.cpp index 7705313..26f11c9 100644..100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,107 +1,193 @@ -/*:* - *: File: ./src/main.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - +/* + * yChat++; Contact: www.yChat.org; Mail@yChat.org + * Copyright (C) 2003 Paul C. Buetow, Volker Richter + * Copyright (C) 2004, 2005 Paul C. Buetow + * ----------------------------------------------------------------- + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef MAIN_CPP +#define MAIN_CPP + +#include <unistd.h> +#include <signal.h> #include "incl.h" -#include "sign.h" -#include "maps/hashmap.h" +#ifndef NCURSES +#ifdef CLI +#include "cli/cli.h" +#endif +#endif using namespace std; map<string,string>* parse_argc( int argc, char* argv[] ) { - map<string,string>* start_params = new map<string,string>; + map<string,string>* start_params = new map<string,string>; - string s_output = ""; + string s_output = ""; - // Set to 1 if a config option key has to be read - // ( ./ychat -o key1 value1 -o key2 value2 ... ); - bool b_conf = 0; + // Set to 1 if a config option key has to be read + // ( ./ychat -o key1 value1 -o key2 value2 ... ); + bool b_conf = 0; - // Will store the key of an additional option value (see also b_conf) - string s_key; + // Will store the key of an additional option value (see also b_conf) + string s_key; - for (int i=1; argv[i] != 0; i++) + for (int i=1; argv[i] != 0; i++) + { + if ( !s_key.empty() ) { - if ( !s_key.empty() ) - { - (*start_params)[s_key] = string(argv[i]); - s_key.clear(); - } - else if ( b_conf ) - { - s_key = string(argv[i]); - b_conf = 0; - } - else - { - if ( string(argv[i]).find("v") != string::npos ) - s_output.append(tool::ychat_version()+"\n"); - - if ( string(argv[i]).find("h") != string::npos ) - s_output.append( YCUSAGE ); - - if ( string(argv[i]).find("o") != string::npos ) - b_conf = 1; - } + (*start_params)[s_key] = string(argv[i]); + s_key.clear(); } - if ( !s_output.empty() ) + else if ( b_conf ) { - cout << s_output; - delete start_params; - exit(1); + s_key = string(argv[i]); + b_conf = 0; } - return start_params; + else + { + if ( string(argv[i]).find("v") != string::npos ) + s_output.append(tool::ychat_version()+"\n"); + + if ( string(argv[i]).find("h") != string::npos ) + s_output.append( YCUSAGE ); + + if ( string(argv[i]).find("o") != string::npos ) + b_conf = 1; + } + } + + if ( !s_output.empty() ) + { + cout << s_output; + delete start_params; + exit(1); + } + + return start_params; } int main(int argc, char* argv[]) { - cout << tool::ychat_version() << endl - << DESCRIP << endl - << DESCRI2 << endl - << CONTACT << endl - << SEPERAT << endl; + map<string,string>* p_start_params = parse_argc( argc, argv ); + + cout << tool::ychat_version() << endl + << DESCRIP << endl + << DESCRI2 << endl + << CONTACT << endl + << SEPERAT << endl; + + // ignore SIGPIPE. otherwise the server will shut down with "Broken pipe" if + // a client unexpected disconnects himself from a SOCK_STREAM. + signal( SIGPIPE, SIG_IGN ); + + // all the static data classes have to be initialized once. otherwise they will + // contain only empty pointers and the chat server won't work correctly. + // the order of the initializations is very importand. for example the s_html::init() + // invokations assumes an initialized s_conf class. + // begin to draw the ncurses amdin interface in a new pthread. + + // init the dynamic wrapper (is needed to pass all wrapped objects through a single pointer). + wrap::WRAP = new dynamic_wrap; + + // init the config manager. + wrap::WRAP->CONF = wrap::CONF = new conf( CONFILE, p_start_params ); + delete p_start_params, + + + // init the statistic manager. + wrap::WRAP->STAT = wrap::STAT = new stats; + + // init the html-template manager. + wrap::WRAP->HTML = wrap::HTML = new html; - wrap::init_wrapper(parse_argc(argc, argv)); +#ifdef LOGGING + // init the system message logd + wrap::WRAP->LOGD = wrap::LOGD = new logd( wrap::CONF->get_elem("httpd.logging.systemfile"), + wrap::CONF->get_elem("httpd.logging.systemlines") ); +#endif + //<<* + // init the session manager. + wrap::WRAP->SMAN = wrap::SMAN = new sman; + //*>> + + + // init the socket manager. + wrap::WRAP->SOCK = wrap::SOCK = new sock; + +#ifdef NCURSES + wrap::WRAP->NCUR = wrap::NCUR = new ncur; // init the ncurses admin interface. + wrap::NCUR->run(); // run the thread + + // wait until ncurses interface has been initialized. + while ( ! wrap::NCUR->is_ready() ) + usleep(1000); + + wrap::HTML->print_cached(0); +#endif + + //<<* + // init the chat manager. + wrap::WRAP->CHAT = wrap::CHAT = new chat; + //*>> + + // init the system timer. + wrap::WRAP->TIMR = wrap::TIMR = new timr; + wrap::TIMR->run(); // run the thread + + //<<* + // init the module-loader manager. + wrap::WRAP->MODL = wrap::MODL = new modl; - //<<* - // Initialize database connection queue + // init the garbage collector + wrap::WRAP->GCOL = wrap::GCOL = new gcol; + + // init the data manager. #ifdef DATABASE - wrap::DATA->init_connections(); + wrap::WRAP->DATA = wrap::DATA = new data; +#endif + //*>> + +#ifndef NCURSES +#ifdef CLI + cli* p_cli = new cli; + p_cli->run(); +#endif #endif - //*>> - sign::init_signal_handlers(); + //<<* + // Initialize database connection queue +#ifdef DATABASE + wrap::DATA->initialize_connections(); +#endif + //*>> - // start the socket manager. this one will listen for incoming http requests and will - // forward them to the specified routines which will generate a http response. - wrap::SOCK->start(); + // start the socket manager. this one will listen for incoming http requests and will + // forward them to the specified routines which will generate a http response. + wrap::SOCK->start(); - cout << DOWNMSG << endl; - return 0; + cout << DOWNMSG << endl; + return 0; } + +#endif diff --git a/src/maps/CVS/Entries b/src/maps/CVS/Entries index f7c7407..b0587e6 100644 --- a/src/maps/CVS/Entries +++ b/src/maps/CVS/Entries @@ -1,11 +1,9 @@ -/hash.cpp/1.1/Wed Feb 16 21:28:55 2005// -/hash.h/1.1/Wed Feb 16 21:28:55 2005// -/hashmap.h/1.7/Thu Feb 17 00:29:37 2005// -/hashmap.tmpl/1.3/Wed Feb 16 23:16:58 2005// -/mtools.h/1.6/Wed Feb 16 23:16:58 2005// -/mtools.tmpl/1.5/Wed Feb 16 23:16:58 2005// -/nhashmap.h/1.1/Wed Feb 16 22:36:32 2005// -/nhashmap.tmpl/1.1/Wed Feb 16 22:36:32 2005// -/shashmap.h/1.3/Wed Feb 16 23:16:58 2005// -/shashmap.tmpl/1.3/Wed Feb 16 23:16:58 2005// +/hmap.h/1.7/Thu Nov 18 13:41:47 2004// +/hmap.tmpl/1.7/Fri Jan 7 21:00:19 2005// +/mtools.h/1.4/Fri Jan 7 21:00:19 2005// +/mtools.tmpl/1.3/Thu Nov 18 13:41:47 2004// +/nmap.h/1.4/Fri Jan 7 21:00:19 2005// +/nmap.tmpl/1.3/Thu Nov 18 13:41:47 2004// +/smap.h/1.9/Fri Jan 7 21:00:19 2005// +/smap.tmpl/1.8/Fri Jan 7 21:00:19 2005// D diff --git a/src/maps/hmap.tmpl b/src/maps/hmap.tmpl index dcd0426..cc2ec24 100644 --- a/src/maps/hmap.tmpl +++ b/src/maps/hmap.tmpl @@ -286,8 +286,4 @@ hmap<obj_type, key_type>::get_size() return size; } - - - #endif - diff --git a/src/maps/mtools.h b/src/maps/mtools.h index c506674..6062191 100644 --- a/src/maps/mtools.h +++ b/src/maps/mtools.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/maps/mtools.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef MTOOLS_H #define MTOOLS_H @@ -32,4 +8,4 @@ struct mtools }; #include "mtools.tmpl" -#endif +#endif diff --git a/src/maps/mtools.tmpl b/src/maps/mtools.tmpl index 3fb4a5f..dd3f89e 100644 --- a/src/maps/mtools.tmpl +++ b/src/maps/mtools.tmpl @@ -1,36 +1,11 @@ -/*:* - *: File: ./src/maps/mtools.tmpl - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef MTOOLS_TMPL #define MTOOLS_TMPL template <class type_> void -mtools<type_>::delete_obj( type_ type_obj ) -{ +mtools<type_>::delete_obj( type_ type_obj ) { if ( type_obj ) - delete type_obj; + delete type_obj; } #endif diff --git a/src/maps/nmap.h b/src/maps/nmap.h index 56d30f5..e29da3b 100644 --- a/src/maps/nmap.h +++ b/src/maps/nmap.h @@ -19,7 +19,4 @@ class nmap : public smap<obj_type, key_type> }; #include "nmap.tmpl" - #endif - - diff --git a/src/maps/smap.h b/src/maps/smap.h index 2096139..a3ee89d 100644 --- a/src/maps/smap.h +++ b/src/maps/smap.h @@ -13,7 +13,6 @@ template <class obj_type, class key_type> class smap : public hmap<obj_type, key_type> { - private: pthread_mutex_t mut_smap; @@ -53,5 +52,4 @@ class smap : public hmap<obj_type, key_type> }; #include "smap.tmpl" - #endif diff --git a/src/maps/smap.tmpl b/src/maps/smap.tmpl index 5ec7d38..670b84d 100644 --- a/src/maps/smap.tmpl +++ b/src/maps/smap.tmpl @@ -15,7 +15,6 @@ smap<obj_type, key_type>::~smap() pthread_mutex_destroy( &mut_smap ); } - template <class obj_type, class key_type> void smap<obj_type, key_type>::lock_mutex() { pthread_mutex_lock( &mut_smap ); @@ -165,7 +164,6 @@ void smap<obj_type, key_type>::make_empty_insecure( void (*func)(key_type) ) hmap<obj_type,key_type>::make_empty( func ); } - template <class obj_type, class key_type> void smap<obj_type, key_type>::add_elem_insecure( const obj_type &x, const key_type &k ) { @@ -214,6 +212,4 @@ smap<obj_type, key_type>::get_key_vector_insecure() return hmap<obj_type,key_type>::get_key_vector(); } - #endif - diff --git a/src/modl.cpp b/src/modl.cpp index 284154f..77e645c 100644..100755 --- a/src/modl.cpp +++ b/src/modl.cpp @@ -1,28 +1,4 @@ -/*:* - *: File: ./src/modl.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - -#ifndef MODL_CPP +#ifndef MODL_CPP #define MODL_CPP #include <limits.h> @@ -35,160 +11,150 @@ using namespace std; -modl::modl() +modl::modl() : smap<dynmod*,string>(HMAPOCC) { #ifdef NCURSES - print_cached( 0 ); + print_cached( 0 ); #endif - if ( wrap::CONF->get_elem( "httpd.modules.preloadcommands" ).compare( "true" ) == 0 ) - preload_modules( wrap::CONF->get_elem("httpd.modules.commandsdir") ); + if ( wrap::CONF->get_elem( "httpd.modules.preloadcommands" ).compare( "true" ) == 0 ) + preload_modules( wrap::CONF->get_elem("httpd.modules.commandsdir") ); - if ( wrap::CONF->get_elem( "httpd.modules.preloadhtml" ).compare( "true" ) == 0 ) - preload_modules( wrap::CONF->get_elem("httpd.modules.htmldir") ); + if ( wrap::CONF->get_elem( "httpd.modules.preloadhtml" ).compare( "true" ) == 0 ) + preload_modules( wrap::CONF->get_elem("httpd.modules.htmldir") ); } modl::~modl() { - // dlclose all the_module's first! - run_func( &modl::dlclose_ ); + // dlclose all the_module's first! + run_func( &modl::dlclose_ ); - // then clean the hash map. - unload_modules(); + // then clean the hash map. + unload_modules(); } void modl::preload_modules( string s_path ) { - dir* p_dir = new dir(); - p_dir->open_dir( s_path ); + dir* p_dir = new dir(); + p_dir->open_dir( s_path ); - p_dir->read_dir(); + p_dir->read_dir(); + + vector<string> dir_vec = p_dir->get_dir_vec(); - vector<string> dir_vec = p_dir->get_dir_vec(); + if ( ! dir_vec.empty() ) + { + vector<string>::iterator iter = dir_vec.begin(); - if ( ! dir_vec.empty() ) + do { - vector<string>::iterator iter = dir_vec.begin(); - - do - { - if ( iter->length() >= 3 && iter->compare( iter->length()-3, 3, ".so" ) == 0 ) - cache_module( s_path + *iter, false ); - } - while ( ++iter != dir_vec.end() ); + if ( iter->length() >= 3 && iter->compare( iter->length()-3, 3, ".so" ) == 0 ) + cache_module( s_path + *iter, false ); } + while ( ++iter != dir_vec.end() ); + } - dir_vec.clear(); + dir_vec.clear(); - // This also closes the dir. - delete p_dir; + // This also closes the dir. + delete p_dir; } void modl::dlclose_( dynmod* mod ) { - dlclose( mod->the_module ); - free ( mod ); + dlclose( mod->the_module ); + free ( mod ); } dynmod* modl::cache_module( string s_name, bool b_print_sys_msg ) { - void *the_module = NULL; - function *the_func = NULL; + void *the_module = NULL; + function *the_func = NULL; - the_module = dlopen( s_name.c_str(), RTLD_LAZY ); - //the_module = dlopen( s_name.c_str(), RTLD_NOW ); + the_module = dlopen( s_name.c_str(), RTLD_LAZY ); + //the_module = dlopen( s_name.c_str(), RTLD_NOW ); - if ( the_module == NULL ) - { - wrap::system_message( dlerror() ); - return NULL; - } + if ( the_module == NULL ) + { + wrap::system_message( dlerror() ); + return NULL; + } - the_func = (function*) dlsym( the_module, "extern_function" ); + the_func = (function*) dlsym( the_module, "extern_function" ); - if ( the_func == NULL ) - { - wrap::system_message( dlerror() ); - return NULL; - } + if ( the_func == NULL ) + { + wrap::system_message( dlerror() ); + return NULL; + } - if ( b_print_sys_msg ) - wrap::system_message( MODULEC + s_name.substr( s_name.find_last_of("/")+1 ) ); + if ( b_print_sys_msg ) + wrap::system_message( MODULEC + s_name.substr( s_name.find_last_of("/")+1 ) ); - dynmod *mod = new dynmod; // encapsulates the function and module handler. - mod->the_func = the_func ; // the function to execute - mod->the_module = the_module; // the module handler to close if function + dynmod *mod = new dynmod; // encapsulates the function and module handler. + mod->the_func = the_func ; // the function to execute + mod->the_module = the_module; // the module handler to close if function - // is not needed anymore. - add_elem( mod, s_name ); + // is not needed anymore. + add_elem( mod, s_name ); - // DO NOT CLOSE AS LONG THERE EXIST A POINTER TO THE FUNCTION - // dlclose( module ); will be called in modl::~modl()! + // DO NOT CLOSE AS LONG THERE EXIST A POINTER TO THE FUNCTION + // dlclose( module ); will be called in modl::~modl()! #ifdef NCURSES - - print_cached( size() ); + print_cached( get_size() ); #endif - - return mod; -} - -dynmod* -modl::get_module( string s_name, string s_user ) -{ - wrap::system_message( MODULER + s_name.substr( s_name.find_last_of("/")+1 ) + " (" + s_user + ")"); - dynmod* mod = get_elem( s_name ); - return ! mod ? cache_module( s_name, true ) : mod; + + return mod; } dynmod* modl::get_module( string s_name ) { - wrap::system_message( MODULER + s_name.substr( s_name.find_last_of("/")+1 ) ); - dynmod* mod = get_elem( s_name ); - return ! mod ? cache_module( s_name, true ) : mod; + wrap::system_message( MODULER + s_name.substr( s_name.find_last_of("/")+1 ) ); + dynmod* mod = get_elem( s_name ); + return ! mod ? cache_module( s_name, true ) : mod; } void modl::unload_modules() { - wrap::system_message( MODUNLO ); - - // dlclose all the_module's first! - run_func( &modl::dlclose_ ); + wrap::system_message( MODUNLO ); - // then clean the hash map. - shashmap<dynmod*>::clear(); + // dlclose all the_module's first! + run_func( &modl::dlclose_ ); + + // then clean the hash map. + make_empty(); #ifdef NCURSES - - print_cached( size() ); + print_cached( get_size() ); #endif - + } void modl::reload_modules() { - unload_modules(); + unload_modules(); - wrap::system_message( MODRELO ); - preload_modules( wrap::CONF->get_elem("httpd.modules.commandsdir") ); - preload_modules( wrap::CONF->get_elem("httpd.modules.htmldir") ); + wrap::system_message( MODRELO ); + preload_modules( wrap::CONF->get_elem("httpd.modules.commandsdir") ); + preload_modules( wrap::CONF->get_elem("httpd.modules.htmldir") ); } #ifdef NCURSES void modl::print_cached( int i_mods ) { - if ( !wrap::NCUR->is_ready() ) - return; + if ( !wrap::NCUR->is_ready() ) + return; - mvprintw( NCUR_CACHED_MODS_X, NCUR_CACHED_MODS_Y, "Mods: %d ", i_mods); - refresh(); + mvprintw( NCUR_CACHED_MODS_X, NCUR_CACHED_MODS_Y, "Mods: %d ", i_mods); + refresh(); } #endif diff --git a/src/modl.h b/src/modl.h index 618c9a3..a65077d 100644..100755 --- a/src/modl.h +++ b/src/modl.h @@ -1,63 +1,37 @@ -/*:* - *: File: ./src/modl.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "incl.h" #ifndef MODL_H #define MODL_H -#include "maps/shashmap.h" +#include "maps/smap.h" using namespace std; -class modl : public shashmap<dynmod*> +class modl : private smap<dynmod*,string> { private: - static void dlclose_( dynmod* mod ); - dynmod* cache_module ( string s_name, bool b_print_sys_msg ); - void preload_modules( string s_path ); + static void dlclose_( dynmod* mod ); + dynmod* cache_module ( string s_name, bool b_print_sys_msg ); + void preload_modules( string s_path ); #ifdef NCURSES - - void print_cached( int i_mods ); + void print_cached( int i_mods ); #endif public: - modl(); - ~modl(); + modl(); + ~modl(); - dynmod* get_module( string s_name ); - dynmod* get_module( string s_name, string s_user ); + dynmod* get_module( string s_name ); - vector<string>* get_mod_vector() - { - vector<string>* p_ret = get_key_vector(); - return p_ret; - } + vector<string>* get_mod_vector() + { + vector<string>* p_ret = get_key_vector(); + return p_ret; + } - void unload_modules(); - void reload_modules(); + void unload_modules(); + void reload_modules(); }; #endif diff --git a/src/mods/Makefile b/src/mods/Makefile index 1b0712b..1b0712b 100644..100755 --- a/src/mods/Makefile +++ b/src/mods/Makefile diff --git a/src/mods/commands/Makefile b/src/mods/commands/Makefile index 27da7a3..6aec38d 100644 --- a/src/mods/commands/Makefile +++ b/src/mods/commands/Makefile @@ -1,4 +1,4 @@ -SRCS=yc_away.cpp yc_col.cpp yc_compopt.cpp yc_exec.cpp yc_fake.cpp yc_getroom.cpp yc_getrusage.cpp yc_getstatus.cpp yc_help.cpp yc_invisible.cpp yc_j.cpp yc_ko.cpp yc_m.cpp yc_md5.cpp yc_me.cpp yc_morph.cpp yc_msg.cpp yc_q.cpp yc_reload.cpp yc_ren.cpp yc_s.cpp yc_set.cpp yc_template.cpp yc_time.cpp yc_topic.cpp yc_uptime.cpp yc_version.cpp +SRCS=yc_about.cpp yc_all.cpp yc_away.cpp yc_col.cpp yc_compopt.cpp yc_exec.cpp yc_fake.cpp yc_getroom.cpp yc_getrusage.cpp yc_help.cpp yc_invisible.cpp yc_j.cpp yc_ko.cpp yc_m.cpp yc_md5.cpp yc_me.cpp yc_morph.cpp yc_msg.cpp yc_q.cpp yc_reload.cpp yc_ren.cpp yc_s.cpp yc_set.cpp yc_template.cpp yc_time.cpp yc_topic.cpp yc_uptime.cpp yc_users.cpp yc_version.cpp MODS=$(addprefix ../../../mods/commands/, $(SRCS:.cpp=.so)) CC=g++ INCLUDES=`cat ../../includes.add` @@ -17,6 +17,8 @@ mods: infotext $(MODS) clean: @echo Cleaning command modules @if test -d ../../../mods/commands; then rm -Rf ../../../mods/commands; fi +../../../mods/commands/yc_about.so: yc_about.cpp +../../../mods/commands/yc_all.so: yc_all.cpp ../../../mods/commands/yc_away.so: yc_away.cpp ../../../mods/commands/yc_col.so: yc_col.cpp ../../../mods/commands/yc_compopt.so: yc_compopt.cpp @@ -24,7 +26,6 @@ clean: ../../../mods/commands/yc_fake.so: yc_fake.cpp ../../../mods/commands/yc_getroom.so: yc_getroom.cpp ../../../mods/commands/yc_getrusage.so: yc_getrusage.cpp -../../../mods/commands/yc_getstatus.so: yc_getstatus.cpp ../../../mods/commands/yc_help.so: yc_help.cpp ../../../mods/commands/yc_invisible.so: yc_invisible.cpp ../../../mods/commands/yc_j.so: yc_j.cpp @@ -43,4 +44,5 @@ clean: ../../../mods/commands/yc_time.so: yc_time.cpp ../../../mods/commands/yc_topic.so: yc_topic.cpp ../../../mods/commands/yc_uptime.so: yc_uptime.cpp +../../../mods/commands/yc_users.so: yc_users.cpp ../../../mods/commands/yc_version.so: yc_version.cpp diff --git a/src/mods/commands/Makefile.in b/src/mods/commands/Makefile.in index 42884b6..ce8c00f 100644..100755 --- a/src/mods/commands/Makefile.in +++ b/src/mods/commands/Makefile.in @@ -4,9 +4,9 @@ INCLUDES=`cat ../../includes.add` CFLAGS=`cat ../cflags.add` all: mods $(MODS): + @echo -n "Compiling command module `basename $@` " @if ! test -d `dirname $@`; then mkdir -p `dirname $@`; fi @$(CC) $(CFLAGS) $(INCLUDES) -shared -s -o $@ `echo $(notdir $@) | sed s/.so/.cpp/` - @echo -n "Command module `basename $@ | sed s/\.so// | sed s/yc_//` " @du -hc $@ | tail -n 1 | sed s/total// | sed "s/ //g" infotext: @echo Compiling command modules diff --git a/src/mods/commands/yc_about.cpp b/src/mods/commands/yc_about.cpp index b4449a1..086e126 100644 --- a/src/mods/commands/yc_about.cpp +++ b/src/mods/commands/yc_about.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_about.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,54 +6,54 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - string s_searched_user( *iter ); - bool b_found; - user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); - - if ( b_found ) - { - string s_msg = "<b>" + p_searched_user->get_colored_name() + "</b>" +extern "C" { + int extern_function(void *v_arg) + { + + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + string s_searched_user( *iter ); + bool b_found; + user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); + + if ( b_found ) + { + string s_msg = "<b>" + p_searched_user->get_colored_name() + "</b>" + p_conf->get_elem("chat.msgs.userhasstatus") + "<b>" + tool::int2string(p_searched_user->get_status()) - + "</b>, " + + "</b>, " + p_conf->get_elem("chat.msgs.userinroom") + "<b>" - + p_searched_user->get_room()->get_name() - + "</b><br>\n" + + p_searched_user->get_room()->get_name() + + "</b><br>\n" + p_conf->get_elem("chat.msgs.lastactivity") + "<b>" + tool::int2string((int)( p_searched_user->get_last_activity())) - + "</b><br>\n"; - p_user->msg_post( &s_msg ); - } - else - { - string s_msg = "<font color=\"#" + + "</b><br>\n"; + p_user->msg_post( &s_msg ); + } + + else + { + string s_msg = "<font color=\"#" + p_conf->get_elem("chat.html.errorcolor") - + "\"><b>" + + "\"><b>" + s_searched_user + "</b> " + p_conf->get_elem("chat.msgs.err.notavailable") + "</font><br>\n"; - p_user->msg_post( &s_msg ); + p_user->msg_post( &s_msg ); - } - } + } + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_all.cpp b/src/mods/commands/yc_all.cpp index 24edb56..c4c9cdf 100644..100755 --- a/src/mods/commands/yc_all.cpp +++ b/src/mods/commands/yc_all.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_all.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../chat/chat.h" /* @@ -30,44 +6,43 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params= (vector<string>*) c->elem[2]; // param array - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - - string s_tmp = ""; - string s_msg = ""; - - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - for ( iter = params->begin(); iter != params->end(); iter++ ) - s_tmp.append( *iter + " " ); - - s_msg = p_timr->get_time() + " <b><font color=\"#" - + p_conf->get_elem("chat.html.sysmsgcolor") - + "\"> " - + p_conf->get_elem("chat.msgs.system"); - - p_chat->string_replacer(&s_tmp); - s_msg.append( s_tmp + "</font></b><br>\n" ); - p_chat->msg_post( &s_msg ); - return 0; - } - - s_msg = p_conf->colored_error_msg("chat.msgs.err.wrongcommandusage"); - p_user->msg_post(s_msg); - return 0; - } +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params= (vector<string>*) c->elem[2]; // param array + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + + string s_tmp = ""; + string s_msg = ""; + + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + for ( iter = params->begin(); iter != params->end(); iter++ ) + s_tmp.append( *iter + " " ); + + s_msg = p_timr->get_time() + " <b><font color=\"#" + + p_conf->get_elem("chat.html.sysmsgcolor") + + "\"> " + + p_conf->get_elem("chat.msgs.system"); + + p_chat->string_replacer(&s_tmp); + s_msg.append( s_tmp + "</font></b><br>\n" ); + p_chat->msg_post( &s_msg ); + return 0; + } + + s_msg = p_conf->colored_error_msg("chat.msgs.err.wrongcommandusage"); + p_user->msg_post(s_msg); + return 0; + } } diff --git a/src/mods/commands/yc_away.cpp b/src/mods/commands/yc_away.cpp index 0e879fc..af4a4a5 100644..100755 --- a/src/mods/commands/yc_away.cpp +++ b/src/mods/commands/yc_away.cpp @@ -1,96 +1,70 @@ -/*:* - *: File: ./src/mods/commands/yc_away.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - vector<string> *params = (vector<string>*) c->elem[2]; // param array - - string s_msg; - string s_away; - string s_col; - - vector<string>::iterator iter; - - string s_time = p_timr->get_time(); - - s_away.append( s_time ).append( " " ); - - s_msg = s_time - + " " - + p_user->get_colored_bold_name() - + " " - + p_conf->get_elem("chat.msgs.setmodeaway") - + "<font color=" + p_user->get_col2() + ">"; - - if ( params->size() > 0 ) - { - s_msg.append(": "); - for ( iter = params->begin(); iter != params->end(); iter++ ) - { - s_msg.append( " " + *iter ); - s_away.append( *iter + " " ); - } - } - else - { - s_msg.append("."); - } - - s_msg.append( "</font><br>\n" ); - - room* p_room = p_user->get_room(); - - // Remove ' from away message: - auto unsigned int pos; - - do - { - pos = s_away.find_first_of( "'" ); - if ( pos == string::npos ) - break; - s_away.replace( pos, 1, "\"" ); - } - while (true); - - p_user->set_away( true, s_away ); - p_room->reload_onlineframe(); - p_room->msg_post ( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + vector<string> *params = (vector<string>*) c->elem[2]; // param array + + string s_msg; + string s_away; + string s_col; + + vector<string>::iterator iter; + + string s_time = p_timr->get_time(); + + s_away.append( s_time ).append( " " ); + + s_msg = s_time + + " " + + p_user->get_colored_bold_name() + + " " + + p_conf->get_elem("chat.msgs.setmodeaway") + + "<font color=" + p_user->get_col2() + ">"; + + if ( params->size() > 0 ) + { + s_msg.append(": "); + for ( iter = params->begin(); iter != params->end(); iter++ ) + { + s_msg.append( " " + *iter ); + s_away.append( *iter + " " ); + } + } + + else + { + s_msg.append("."); + } + + s_msg.append( "</font><br>\n" ); + + room* p_room = p_user->get_room(); + + // Remove ' from away message: + auto unsigned int pos; + + do { + pos = s_away.find_first_of( "'" ); + if ( pos == string::npos ) + break; + s_away.replace( pos, 1, "\"" ); + } while (true); + + p_user->set_away( true, s_away ); + p_room->reload_onlineframe(); + p_room->msg_post ( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_col.cpp b/src/mods/commands/yc_col.cpp index dca1bde..4449278 100644..100755 --- a/src/mods/commands/yc_col.cpp +++ b/src/mods/commands/yc_col.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_col.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../wrap.h" #include "../../chat/room.h" @@ -34,79 +10,76 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - - user *p_user = (user*)c->elem[1]; // the corresponding user - vector<string> *params= (vector<string>*) c->elem[2]; // param array - - string s_color; - string s_color2; - - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - if ( params->empty() ) - { - s_color = p_conf->get_elem( "chat.html.user.color1" ); - s_color2 = p_conf->get_elem( "chat.html.user.color2" ); - } - else - { - s_color = (string) params->front(); - params->erase( params->begin() ); - if ( ! params->empty() ) - s_color2 = (string) params->front(); - else - s_color2 = p_conf->get_elem( "chat.html.user.color1" ); - } - - s_color = tool::to_lower( s_color ); - s_color2 = tool::to_lower( s_color2 ); - - if( valid_color(s_color) != 1 ) - { - string *answerstring=new string(s_color + " is not a valid color.<br>\n"); - p_user->msg_post( answerstring ); - } - else if( valid_color(s_color2) != 1 ) - { - string *answerstring=new string( s_color2 + " is not a valid color.<br>\n"); - p_user->msg_post( answerstring ); - } - else - { - string *answerstring=new string(p_timr->get_time() + " " + p_user->get_colored_bold_name()+ " changes color to <font color=\"#" - + s_color + "\">" + s_color + "</font> <font color=\"#" - + s_color2 + "\">" + s_color2 + "</font><br>\n"); - p_user->get_room()->msg_post( answerstring ); - p_user->set_col1(s_color); - p_user->set_col2(s_color2); - p_user->get_room()->reload_onlineframe(); - } - - return 0; - } - int valid_color( string s_color ) - { - - if(s_color.size()!=6) - return 0; - string valid="abcdef0123456789"; - for(int i=0;i<s_color.size();i++) - { - string s_char=s_color.substr(i,1); - if(valid.find(s_char)==string::npos) - return 0; - } - - return 1; - } +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + + user *p_user = (user*)c->elem[1]; // the corresponding user + vector<string> *params= (vector<string>*) c->elem[2]; // param array + + string s_color; + string s_color2; + + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + if ( params->empty() ) + { + s_color = p_conf->get_elem( "chat.html.user.color1" ); + s_color2 = p_conf->get_elem( "chat.html.user.color2" ); + } + + else + { + s_color = (string) params->front(); + params->erase( params->begin() ); + if ( ! params->empty() ) + s_color2 = (string) params->front(); + else + s_color2 = p_conf->get_elem( "chat.html.user.color1" ); + } + + s_color = tool::to_lower( s_color ); + s_color2 = tool::to_lower( s_color2 ); + + if( valid_color(s_color) != 1 ) + { + string *answerstring=new string(s_color + " is not a valid color.<br>\n"); + p_user->msg_post( answerstring ); + } + else if( valid_color(s_color2) != 1 ) + { + string *answerstring=new string( s_color2 + " is not a valid color.<br>\n"); + p_user->msg_post( answerstring ); + } + else + { + string *answerstring=new string(p_timr->get_time() + " " + p_user->get_colored_bold_name()+ " changes color to <font color=\"#" + + s_color + "\">" + s_color + "</font> <font color=\"#" + + s_color2 + "\">" + s_color2 + "</font><br>\n"); + p_user->get_room()->msg_post( answerstring ); + p_user->set_col1(s_color); + p_user->set_col2(s_color2); + } + + return 0; + } + int valid_color( string s_color ){ + + if(s_color.size()!=6) return 0; + string valid="abcdef0123456789"; + for(int i=0;i<s_color.size();i++) + { + string s_char=s_color.substr(i,1); + if(valid.find(s_char)==string::npos) + return 0; + } + + return 1; + } } diff --git a/src/mods/commands/yc_compopt.cpp b/src/mods/commands/yc_compopt.cpp index 43e5e1b..ad6ae99 100644..100755 --- a/src/mods/commands/yc_compopt.cpp +++ b/src/mods/commands/yc_compopt.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_compopt.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../msgs.h" #include "../../chat/user.h" @@ -31,17 +7,16 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - user *p_user = (user*)c->elem[1]; // the corresponding user - p_user->msg_post( tool::ychat_version() + " " + UNAME + "<br>\n" + COMPOPT + "<br>\n"); +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + user *p_user = (user*)c->elem[1]; // the corresponding user + p_user->msg_post( tool::ychat_version() + " " + UNAME + "<br>\n" + COMPOPT + "<br>\n"); - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_exec.cpp b/src/mods/commands/yc_exec.cpp index 6f2d533..f912c20 100644..100755 --- a/src/mods/commands/yc_exec.cpp +++ b/src/mods/commands/yc_exec.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_exec.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" @@ -33,58 +9,58 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + vector<string> *params = (vector<string>*) c->elem[2]; // param array - user* p_user = (user*) c->elem[1]; // the corresponding user - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - vector<string> *params = (vector<string>*) c->elem[2]; // param array + string s_command; + string s_msg = p_timr->get_time(); + string s_output; - string s_command; - string s_msg = p_timr->get_time(); - string s_output; + vector<string>::iterator iter; + for ( iter = params->begin(); iter != params->end(); iter++ ) + s_command.append( " " + *iter ); - vector<string>::iterator iter; - for ( iter = params->begin(); iter != params->end(); iter++ ) - s_command.append( " " + *iter ); + s_command.append(" 2>error.log"); - s_command.append(" 2>error.log"); + s_msg.append( " " + s_command + "<br>\n" ); - s_msg.append( " " + s_command + "<br>\n" ); + p_user->msg_post( &s_msg ); - p_user->msg_post( &s_msg ); + FILE *file; + char buffer[READBUF]; - FILE *file; - char buffer[READBUF]; + if( (file=popen(s_command.c_str(), "r")) == NULL ) + { + s_output = "<font color=\"#" + + p_conf->get_elem("chat.html.errorcolor") + + p_conf->get_elem("chat.msgs.err.execcommand") + + "</font><br>\n"; + p_user->msg_post( &s_output ); + } - if( (file=popen(s_command.c_str(), "r")) == NULL ) - { - s_output = "<font color=\"#" - + p_conf->get_elem("chat.html.errorcolor") - + p_conf->get_elem("chat.msgs.err.execcommand") - + "</font><br>\n"; - p_user->msg_post( &s_output ); - } - else - { - s_output.append("<hr>\n"); - while(true) - { - if(fgets(buffer, READBUF, file) == NULL) - break; + else + { + s_output.append("<hr>\n"); + while(true) + { + if(fgets(buffer, READBUF, file) == NULL) + break; - s_output.append( string(buffer) + "<br>\n" ); - } + s_output.append( string(buffer) + "<br>\n" ); + } - p_user->msg_post( &s_output ); - pclose(file); - } + p_user->msg_post( &s_output ); + pclose(file); + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_fake.cpp b/src/mods/commands/yc_fake.cpp index 3eb1442..c708841 100644..100755 --- a/src/mods/commands/yc_fake.cpp +++ b/src/mods/commands/yc_fake.cpp @@ -1,54 +1,29 @@ -/*:* - *: File: ./src/mods/commands/yc_fake.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - bool b_fake = p_user->get_fake(); - - string s_msg = (b_fake == 1 - ? p_conf->get_elem("chat.msgs.unsetmodefake") + "<br>\n" - : p_conf->get_elem("chat.msgs.setmodefake") + "<br>\n"); - - - p_user->set_fake( !b_fake ); - p_user->get_room()->reload_onlineframe(); - p_user->msg_post ( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + bool b_fake = p_user->get_fake(); + + string s_msg = (b_fake == 1 + ? p_conf->get_elem("chat.msgs.unsetmodefake") + "<br>\n" + : p_conf->get_elem("chat.msgs.setmodefake") + "<br>\n"); + + + p_user->set_fake( !b_fake ); + p_user->get_room()->reload_onlineframe(); + p_user->msg_post ( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_getroom.cpp b/src/mods/commands/yc_getroom.cpp index 4b22d81..87e2d25 100644..100755 --- a/src/mods/commands/yc_getroom.cpp +++ b/src/mods/commands/yc_getroom.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_getroom.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,48 +6,48 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - string s_searched_user( *iter ); - bool b_found; - user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); - - if ( b_found ) - { - string s_msg = "<b>" + p_searched_user->get_colored_name() + "</b>" +extern "C" { + int extern_function(void *v_arg) + { + + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + string s_searched_user( *iter ); + bool b_found; + user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); + + if ( b_found ) + { + string s_msg = "<b>" + p_searched_user->get_colored_name() + "</b>" + p_conf->get_elem("chat.msgs.userinroom") + "<b>" - + p_searched_user->get_room()->get_name() - + "</b><br>\n"; - p_user->msg_post( &s_msg ); - } - else - { - string s_msg = "<font color=\"#" + + p_searched_user->get_room()->get_name() + + "</b><br>\n"; + p_user->msg_post( &s_msg ); + } + + else + { + string s_msg = "<font color=\"#" + p_conf->get_elem("chat.html.errorcolor") - + "\"><b>" + + "\"><b>" + s_searched_user + "</b> " + p_conf->get_elem("chat.msgs.err.notavailable") + "</font><br>\n"; - p_user->msg_post( &s_msg ); + p_user->msg_post( &s_msg ); - } - } + } + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_getrusage.cpp b/src/mods/commands/yc_getrusage.cpp index 56a7fbb..83dcbb9 100644..100755 --- a/src/mods/commands/yc_getrusage.cpp +++ b/src/mods/commands/yc_getrusage.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_getrusage.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <stdio.h> #include <sys/types.h> #include <sys/time.h> @@ -42,40 +18,39 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - rusage* p_rusage = new rusage; - getrusage( RUSAGE_SELF, p_rusage ); - char c_msg[1024]; - - /* see man getrusage */ - - sprintf(c_msg, "getrusage:<br>\nmaxrss: %D (max resident set size)<br>\nixrss: %D (integral shared text memory size)<br>\nidrss: %D (integral unshared data size)<br>\nisrss %D (integral unshared stack size)<br>\nminflt: %D (page reclaims)<br>\nmajflt: %D (page faults)<br>\nnswap: %D (swaps)<br>\ninblock: %D (block input operations)<br>\noublock: %D (block output operations)<br>\nmsgsnd: %D (messages sent)<br>\nmsgrcv: %D (messages received)<br>\nnsignals: %D (signals received)<br>\nnvcsw: %D (voluntary context switches)<br>\nnivcsw: %D (involuntary context switches)<br>\n", - p_rusage->ru_maxrss, - p_rusage->ru_ixrss, - p_rusage->ru_idrss, - p_rusage->ru_isrss, - p_rusage->ru_minflt, - p_rusage->ru_majflt, - p_rusage->ru_nswap, - p_rusage->ru_inblock, - p_rusage->ru_oublock, - p_rusage->ru_msgsnd, - p_rusage->ru_msgrcv, - p_rusage->ru_nsignals, - p_rusage->ru_nvcsw, - p_rusage->ru_nivcsw - ); - - p_user->msg_post( new string( c_msg ) ); - - return 0; - } +extern "C" { + int valid_color( string ); + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + rusage* p_rusage = new rusage; + getrusage( RUSAGE_SELF, p_rusage ); + char c_msg[1024]; + + /* see man getrusage */ + + sprintf(c_msg, "getrusage:<br>\nmaxrss: %D (max resident set size)<br>\nixrss: %D (integral shared text memory size)<br>\nidrss: %D (integral unshared data size)<br>\nisrss %D (integral unshared stack size)<br>\nminflt: %D (page reclaims)<br>\nmajflt: %D (page faults)<br>\nnswap: %D (swaps)<br>\ninblock: %D (block input operations)<br>\noublock: %D (block output operations)<br>\nmsgsnd: %D (messages sent)<br>\nmsgrcv: %D (messages received)<br>\nnsignals: %D (signals received)<br>\nnvcsw: %D (voluntary context switches)<br>\nnivcsw: %D (involuntary context switches)<br>\n", + p_rusage->ru_maxrss, + p_rusage->ru_ixrss, + p_rusage->ru_idrss, + p_rusage->ru_isrss, + p_rusage->ru_minflt, + p_rusage->ru_majflt, + p_rusage->ru_nswap, + p_rusage->ru_inblock, + p_rusage->ru_oublock, + p_rusage->ru_msgsnd, + p_rusage->ru_msgrcv, + p_rusage->ru_nsignals, + p_rusage->ru_nvcsw, + p_rusage->ru_nivcsw + ); + + p_user->msg_post( new string( c_msg ) ); + + return 0; + } } diff --git a/src/mods/commands/yc_help.cpp b/src/mods/commands/yc_help.cpp index 33faf60..41899c3 100644..100755 --- a/src/mods/commands/yc_help.cpp +++ b/src/mods/commands/yc_help.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_help.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/user.h" @@ -31,46 +7,45 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - string s_msg = ""; - - if (params->size() >= 1) - { - vector<string>::iterator iter = params->begin(); - - string s_help = p_conf->get_elem("chat.msgs.help." + *iter); - - if ( s_help != "" ) - { - s_msg.append("<b>" + *iter + ":</b> " + s_help + "<br>\n"); - p_user->msg_post( &s_msg ); - return 0; - } - - s_msg.append(*iter + " " + p_conf->get_elem("chat.msgs.err.notavailable")); - } - else - { - s_msg.append(p_conf->get_elem("chat.msgs.err.wrongcommandusage")); - } - - s_msg = "<font color=\"#" - + p_conf->get_elem("chat.html.errorcolor") - + "\"> " - + s_msg - + "</font><br>\n"; - - p_user->msg_post( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + string s_msg = ""; + + if (params->size() >= 1) + { + vector<string>::iterator iter = params->begin(); + + string s_help = p_conf->get_elem("chat.msgs.help." + *iter); + + if ( s_help != "" ) { + s_msg.append("<b>" + *iter + ":</b> " + s_help + "<br>\n"); + p_user->msg_post( &s_msg ); + return 0; + } + + s_msg.append(*iter + " " + p_conf->get_elem("chat.msgs.err.notavailable")); + } + + else + { + s_msg.append(p_conf->get_elem("chat.msgs.err.wrongcommandusage")); + } + + s_msg = "<font color=\"#" + + p_conf->get_elem("chat.html.errorcolor") + + "\"> " + + s_msg + + "</font><br>\n"; + + p_user->msg_post( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_invisible.cpp b/src/mods/commands/yc_invisible.cpp index 5eea510..b78d934 100644..100755 --- a/src/mods/commands/yc_invisible.cpp +++ b/src/mods/commands/yc_invisible.cpp @@ -1,55 +1,30 @@ -/*:* - *: File: ./src/mods/commands/yc_invisible.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - bool b_invisible = p_user->get_invisible(); - - string s_msg = b_invisible - ? p_conf->get_elem("chat.msgs.setmodeinvisible") - + "<br>\n" - : p_conf->get_elem("chat.msgs.unsetmodeinvisible") - + "<br>\n"; - - p_user->set_invisible( !b_invisible ); - p_user->get_room()->reload_onlineframe(); - p_user->msg_post ( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + bool b_invisible = p_user->get_invisible(); + + string s_msg = b_invisible + ? p_conf->get_elem("chat.msgs.setmodeinvisible") + + "<br>\n" + : p_conf->get_elem("chat.msgs.unsetmodeinvisible") + + "<br>\n"; + + p_user->set_invisible( !b_invisible ); + p_user->get_room()->reload_onlineframe(); + p_user->msg_post ( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_j.cpp b/src/mods/commands/yc_j.cpp index 15e97cc..903e49b 100644..100755 --- a/src/mods/commands/yc_j.cpp +++ b/src/mods/commands/yc_j.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_j.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/user.h" #include "../../chat/room.h" @@ -31,98 +7,99 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string> *) c->elem[2]; // param array - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - gcol* p_gcol = (gcol*) ((dynamic_wrap*)c->elem[3])->GCOL; - - if ( ! params->empty() ) - { - vector<string> ::iterator iter; - - string s_room; - - for ( iter = params->begin(); iter != params->end(); iter++ ) - { - s_room.append( *iter ); - if ( iter+1 != params->end() ) - s_room.append(" "); - } - - int i_max_room_len = tool::string2int( p_conf->get_elem("chat.maxlength.roomname") ); - if ( i_max_room_len < s_room.length() ) - s_room = s_room.substr(0, i_max_room_len ); - - if ( tool::to_lower(s_room) == p_user->get_room()->get_lowercase_name() ) - { - string s_msg = "<font color=\"" + p_conf->get_elem("chat.html.errorcolor") + "\">" - + p_conf->get_elem("chat.msgs.err.alreadyinroom") + "<b>" - + p_user->get_room()->get_name() + "</b></font><br>\n"; - p_user->msg_post( &s_msg ); - } - else - { - string s_user = p_timr->get_time() + " " + p_user->get_colored_bold_name(); - string s_msg = s_user + p_conf->get_elem( "chat.msgs.userleavesroom" ) + "<b>"; - string s_msg2 = s_user + p_conf->get_elem( "chat.msgs.userentersroom" ) + "<b>"; - - bool b_flag; - room* p_room = p_chat->get_room( s_room , b_flag ); - - // if room does not exist add room to list! - if ( p_room == NULL ) - { - p_room = p_gcol->get_room_from_garbage_or_new( s_room ); - - s_msg.append( s_room + "</b><br>\n" ); - s_msg2.append( s_room + "</b><br>\n" ); - - room* p_room_old = p_user->get_room(); - - string s_name_lowercase = p_user->get_lowercase_name(); - p_user->get_room()->del_elem( s_name_lowercase ); +extern "C" { + int extern_function(void *v_arg) + { - p_gcol->lock_mutex(); - if ( p_room_old != NULL ) - p_room_old->msg_post( &s_msg ); - p_gcol->unlock_mutex(); + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string> *) c->elem[2]; // param array + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + gcol* p_gcol = (gcol*) ((dynamic_wrap*)c->elem[3])->GCOL; - p_room->add_user( p_user ); - p_chat->add_elem( p_room ); - p_room->msg_post( &s_msg2 ); - } - else // p_room != NULL + if ( ! params->empty() ) { - s_msg.append( p_room->get_name() + "</b><br>\n" ); - s_msg2.append( p_room->get_name() + "</b><br>\n" ); - - room* p_room_old = p_user->get_room(); - - string s_name_lowercase = p_user->get_lowercase_name(); - p_user->get_room()->del_elem( s_name_lowercase ); - - p_gcol->lock_mutex(); - if ( p_room_old != NULL ) - p_room_old->msg_post( &s_msg ); - p_gcol->unlock_mutex(); - - p_room->add_user( p_user ); - p_room->msg_post( &s_msg2 ); - } - } - } - - return 0; - } + vector<string> ::iterator iter; + + string s_room; + + for ( iter = params->begin(); iter != params->end(); iter++ ) + { + s_room.append( *iter ); + if ( iter+1 != params->end() ) + s_room.append(" "); + } + + int i_max_room_len = tool::string2int( p_conf->get_elem("chat.maxlength.roomname") ); + if ( i_max_room_len < s_room.length() ) + s_room = s_room.substr(0, i_max_room_len ); + + if ( tool::to_lower(s_room) == p_user->get_room()->get_lowercase_name() ) + { + string s_msg = "<font color=\"" + p_conf->get_elem("chat.html.errorcolor") + "\">" + + p_conf->get_elem("chat.msgs.err.alreadyinroom") + "<b>" + + p_user->get_room()->get_name() + "</b></font><br>\n"; + p_user->msg_post( &s_msg ); + } + + else + { + string s_user = p_timr->get_time() + " " + p_user->get_colored_bold_name(); + string s_msg = s_user + p_conf->get_elem( "chat.msgs.userleavesroom" ) + "<b>"; + string s_msg2 = s_user + p_conf->get_elem( "chat.msgs.userentersroom" ) + "<b>"; + + bool b_flag; + room* p_room = p_chat->get_room( s_room , b_flag ); + + // if room does not exist add room to list! + if ( p_room == NULL ) + { + p_room = p_gcol->get_room_from_garbage_or_new( s_room ); + + s_msg.append( s_room + "</b><br>\n" ); + s_msg2.append( s_room + "</b><br>\n" ); + + room* p_room_old = p_user->get_room(); + + string s_name_lowercase = p_user->get_lowercase_name(); + p_user->get_room()->del_elem( s_name_lowercase ); + + p_gcol->lock_mutex(); + if ( p_room_old != NULL ) + p_room_old->msg_post( &s_msg ); + p_gcol->unlock_mutex(); + + p_room->add_user( p_user ); + p_chat->add_elem( p_room ); + p_room->msg_post( &s_msg2 ); + } + + else // p_room != NULL + { + s_msg.append( p_room->get_name() + "</b><br>\n" ); + s_msg2.append( p_room->get_name() + "</b><br>\n" ); + + room* p_room_old = p_user->get_room(); + + string s_name_lowercase = p_user->get_lowercase_name(); + p_user->get_room()->del_elem( s_name_lowercase ); + + p_gcol->lock_mutex(); + if ( p_room_old != NULL ) + p_room_old->msg_post( &s_msg ); + p_gcol->unlock_mutex(); + + p_room->add_user( p_user ); + p_room->msg_post( &s_msg2 ); + } + } + } + + return 0; + } } diff --git a/src/mods/commands/yc_ko.cpp b/src/mods/commands/yc_ko.cpp index 40592eb..ac32ac7 100644..100755 --- a/src/mods/commands/yc_ko.cpp +++ b/src/mods/commands/yc_ko.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_ko.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,67 +6,67 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - string s_searched_user( *iter ); - bool b_found; - user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); - - if ( b_found ) - { - - string s_msg = p_timr->get_time() + " " +extern "C" { + int extern_function(void *v_arg) + { + + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + string s_searched_user( *iter ); + bool b_found; + user* p_searched_user = p_chat->get_user( s_searched_user, b_found ); + + if ( b_found ) + { + + string s_msg = p_timr->get_time() + " " + p_user->get_colored_bold_name() + p_conf->get_elem( "chat.msgs.userkicksout1" ) + p_searched_user->get_colored_bold_name() + p_conf->get_elem( "chat.msgs.userkicksout2" ) + p_searched_user->get_room()->get_bold_name() - + "<br>\n"; + + "<br>\n"; - room* p_room1 = p_user->get_room(); - room* p_room2 = p_searched_user->get_room(); + room* p_room1 = p_user->get_room(); + room* p_room2 = p_searched_user->get_room(); - p_room1->msg_post( &s_msg ); + p_room1->msg_post( &s_msg ); - if ( p_room1->get_lowercase_name() != - p_room2->get_lowercase_name() ) - p_room2->msg_post( &s_msg ); + if ( p_room1->get_lowercase_name() != + p_room2->get_lowercase_name() ) + p_room2->msg_post( &s_msg ); - string s_kick = "<script confuage=JavaScript>top.location.href='/" + string s_kick = "<script confuage=JavaScript>top.location.href='/" + p_conf->get_elem("httpd.startsite") + "';</script>"; - p_searched_user->msg_post( &s_kick ); - p_searched_user->set_online(false); - } - else - { - string s_msg = "<font color=\"#" + p_searched_user->msg_post( &s_kick ); + p_searched_user->set_online(false); + } + + else + { + string s_msg = "<font color=\"#" + p_conf->get_elem("chat.html.errorcolor") - + "\"><b>" + + "\"><b>" + s_searched_user + "</b> " + p_conf->get_elem("chat.msgs.err.notavailable") + "</font><br>\n"; - p_user->msg_post( &s_msg ); - } - } + p_user->msg_post( &s_msg ); + } + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_m.cpp b/src/mods/commands/yc_m.cpp index fa63719..a93cc3b 100644..100755 --- a/src/mods/commands/yc_m.cpp +++ b/src/mods/commands/yc_m.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_m.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../chat/user.h" #include "../../chat/room.h" @@ -31,38 +7,37 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params= (vector<string>*) c->elem[2]; // param array - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - string s_msg = ""; - - if ( p_conf->get_elem("chat.printalwaystime") == "true" ) - s_msg = p_timr->get_time() + " "; - - s_msg.append( "<i>" + p_user->get_colored_name() - + " <font color=\"#" + p_user->get_col2() - + "\">" ); - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - for ( iter = params->begin(); iter != params->end(); iter++ ) - s_msg.append( *iter + " " ); - } - - s_msg.append( "</font></i><br>\n" ); - p_user->get_room()->msg_post( &s_msg ); - - return 0; - } +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params= (vector<string>*) c->elem[2]; // param array + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + string s_msg = ""; + + if ( p_conf->get_elem("chat.printalwaystime") == "true" ) + s_msg = p_timr->get_time() + " "; + + s_msg.append( "<i>" + p_user->get_colored_name() + + " <font color=\"#" + p_user->get_col2() + + "\">" ); + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + for ( iter = params->begin(); iter != params->end(); iter++ ) + s_msg.append( *iter + " " ); + } + + s_msg.append( "</font></i><br>\n" ); + p_user->get_room()->msg_post( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_md5.cpp b/src/mods/commands/yc_md5.cpp index 4e81ede..d79d952 100644..100755 --- a/src/mods/commands/yc_md5.cpp +++ b/src/mods/commands/yc_md5.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_md5.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/user.h" #include "../../contrib/crypt/md5.h" @@ -32,47 +8,47 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - if (params->size() >= 2) - { - vector<string>::iterator iter; - string s_string = ""; - string s_salt = ""; - - for (iter = params->begin(); iter+1 != params->end(); ++iter) - { - s_string.append(*iter); - } - - s_salt = *iter; - - string s_msg = "Crypt: <b>" + s_string + "</b>, Salt: <b>" - + s_salt + "</b> = <b>" + - + md5::MD5Crypt(s_string.c_str(), s_salt.c_str()) - + "</b><br>\n"; - p_user->msg_post( &s_msg ); - } - else - { - string s_msg = "<font color=\"#" - + p_conf->get_elem("chat.html.errorcolor") - + "\"> " - + p_conf->get_elem("ERR_WRONG_COMMAND_USAGE") - + "</font><br>\n"; - p_user->msg_post( &s_msg ); - - } - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + if (params->size() >= 2) + { + vector<string>::iterator iter; + string s_string = ""; + string s_salt = ""; + + for (iter = params->begin(); iter+1 != params->end(); ++iter) + { + s_string.append(*iter); + } + + s_salt = *iter; + + string s_msg = "Crypt: <b>" + s_string + "</b>, Salt: <b>" + + s_salt + "</b> = <b>" + + + md5::MD5Crypt(s_string.c_str(), s_salt.c_str()) + + "</b><br>\n"; + p_user->msg_post( &s_msg ); + } + + else + { + string s_msg = "<font color=\"#" + + p_conf->get_elem("chat.html.errorcolor") + + "\"> " + + p_conf->get_elem("ERR_WRONG_COMMAND_USAGE") + + "</font><br>\n"; + p_user->msg_post( &s_msg ); + + } + + return 0; + } } diff --git a/src/mods/commands/yc_me.cpp b/src/mods/commands/yc_me.cpp index d105723..66d54da 100644..100755 --- a/src/mods/commands/yc_me.cpp +++ b/src/mods/commands/yc_me.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_me.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../chat/user.h" #include "../../chat/room.h" @@ -31,39 +7,38 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params= (vector<string>*) c->elem[2]; // param array - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params= (vector<string>*) c->elem[2]; // param array + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - string s_msg = ""; + string s_msg = ""; - if ( p_conf->get_elem("chat.printalwaystime") == "true" ) - s_msg = p_timr->get_time() + " "; + if ( p_conf->get_elem("chat.printalwaystime") == "true" ) + s_msg = p_timr->get_time() + " "; - s_msg.append( "<i><font color=\"#" +p_user->get_col1() + "\">" - + p_user->get_name() + " "); + s_msg.append( "<i><font color=\"#" +p_user->get_col1() + "\">" + + p_user->get_name() + " "); - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - for ( iter = params->begin(); iter != params->end(); iter++ ) - s_msg.append( *iter + " " ); - } + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + for ( iter = params->begin(); iter != params->end(); iter++ ) + s_msg.append( *iter + " " ); + } - s_msg.append( "</font></i><br>\n" ); - p_user->get_room()->msg_post( &s_msg ); + s_msg.append( "</font></i><br>\n" ); + p_user->get_room()->msg_post( &s_msg ); - return 0; + return 0; - } + } } diff --git a/src/mods/commands/yc_morph.cpp b/src/mods/commands/yc_morph.cpp index 22a8174..cf1f448 100644..100755 --- a/src/mods/commands/yc_morph.cpp +++ b/src/mods/commands/yc_morph.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_morph.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/user.h" #include "../../chat/room.h" #include "../../tool/tool.h" @@ -32,44 +8,45 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c = (container*) v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *p_params = (vector<string>*) c->elem[2]; // param array - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - if ( p_params->empty() ) - { - string s_msg = p_conf->colored_error_msg("chat.msgs.err.wrongcommandusage"); - p_user->msg_post(s_msg); - } - else - { - string s_morphed_name = p_params->at(0); - - if ( tool::to_lower(s_morphed_name) != p_user->get_lowercase_name() ) - { - string s_msg = p_conf->colored_error_msg("chat.msgs.err.morphnick"); - p_user->msg_post(s_msg); - } - else - { - string s_msg = p_timr->get_time() + " " + p_user->get_colored_bold_name() + p_conf->get_elem( "chat.msgs.usermorphs" ) + "<font color=\"#" + p_user->get_col1() + "\"><b>" + s_morphed_name + "</b></font><br>\n"; - - room* p_room = p_user->get_room(); - p_room->msg_post( &s_msg ); - p_user->set_name( s_morphed_name ); - p_room->reload_onlineframe(); - } - } - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c = (container*) v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *p_params = (vector<string>*) c->elem[2]; // param array + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + if ( p_params->empty() ) + { + string s_msg = p_conf->colored_error_msg("chat.msgs.err.wrongcommandusage"); + p_user->msg_post(s_msg); + } + + else + { + string s_morphed_name = p_params->at(0); + + if ( tool::to_lower(s_morphed_name) != p_user->get_lowercase_name() ) + { + string s_msg = p_conf->colored_error_msg("chat.msgs.err.morphnick"); + p_user->msg_post(s_msg); + } + + else + { + string s_msg = p_timr->get_time() + " " + p_user->get_colored_bold_name() + p_conf->get_elem( "chat.msgs.usermorphs" ) + "<font color=\"#" + p_user->get_col1() + "\"><b>" + s_morphed_name + "</b></font><br>\n"; + + room* p_room = p_user->get_room(); + p_room->msg_post( &s_msg ); + p_user->set_name( s_morphed_name ); + p_room->reload_onlineframe(); + } + } + + return 0; + } } diff --git a/src/mods/commands/yc_msg.cpp b/src/mods/commands/yc_msg.cpp index 8889e9f..33beee4 100644..100755 --- a/src/mods/commands/yc_msg.cpp +++ b/src/mods/commands/yc_msg.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_msg.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/user.h" #include "../../chat/room.h" /* @@ -30,63 +6,63 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - string s_whisper_user( *iter ); - bool b_found; - user* p_whisper_user = p_chat->get_user( s_whisper_user, b_found ); - - if ( b_found ) - { - string s_time = ""; - if ( p_conf->get_elem("chat.printalwaystime") == "true" ) - s_time = p_timr->get_time() + " "; - - string s_msg = s_time + "<i> " + p_conf->get_elem("chat.msgs.whisperto") + " " + p_whisper_user->get_colored_name() + ": <font color=\"#" + p_user->get_col2() + "\">"; - - string s_whisper_msg = s_time + "<i>" + p_user->get_colored_name() + " " + p_conf->get_elem("chat.msgs.whisper") + ": <font color=\"#" + p_user->get_col2() + "\">"; - - string s_tmp = ""; - for ( iter++; iter != params->end(); iter++ ) - s_tmp.append( *iter + " " ); - - p_chat->string_replacer(&s_tmp); - - s_msg .append( s_tmp + "</font></i><br>\n" ); - s_whisper_msg.append( s_tmp + "</font></i><br>\n" ); - - p_user ->msg_post( &s_msg ); - p_whisper_user->msg_post( &s_whisper_msg ); - } - else - { - string s_msg = "<font color=\"#" +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + string s_whisper_user( *iter ); + bool b_found; + user* p_whisper_user = p_chat->get_user( s_whisper_user, b_found ); + + if ( b_found ) + { + string s_time = ""; + if ( p_conf->get_elem("chat.printalwaystime") == "true" ) + s_time = p_timr->get_time() + " "; + + string s_msg = s_time + "<i> " + p_conf->get_elem("chat.msgs.whisperto") + " " + p_whisper_user->get_colored_name() + ": <font color=\"#" + p_user->get_col2() + "\">"; + + string s_whisper_msg = s_time + "<i>" + p_user->get_colored_name() + " " + p_conf->get_elem("chat.msgs.whisper") + ": <font color=\"#" + p_user->get_col2() + "\">"; + + string s_tmp = ""; + for ( iter++; iter != params->end(); iter++ ) + s_tmp.append( *iter + " " ); + + p_chat->string_replacer(&s_tmp); + + s_msg .append( s_tmp + "</font></i><br>\n" ); + s_whisper_msg.append( s_tmp + "</font></i><br>\n" ); + + p_user ->msg_post( &s_msg ); + p_whisper_user->msg_post( &s_whisper_msg ); + } + + else + { + string s_msg = "<font color=\"#" + p_conf->get_elem("chat.html.errorcolor") - + "\"><b>" + + "\"><b>" + s_whisper_user + "</b> " + p_conf->get_elem("chat.msgs.err.notavailable") + "</font><br>\n"; - p_user->msg_post( &s_msg ); - } - } + p_user->msg_post( &s_msg ); + } + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_q.cpp b/src/mods/commands/yc_q.cpp index 37f472c..4c9584d 100644..100755 --- a/src/mods/commands/yc_q.cpp +++ b/src/mods/commands/yc_q.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_q.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../chat/user.h" @@ -32,23 +8,22 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - user* p_user = (user*)c->elem[1]; +extern "C" { + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + user* p_user = (user*)c->elem[1]; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - string s_quit = "<script confuage=JavaScript>top.location.href='/" - + p_conf->get_elem("httpd.startsite") - + "';</script>"; + string s_quit = "<script confuage=JavaScript>top.location.href='/" + + p_conf->get_elem("httpd.startsite") + + "';</script>"; - p_user->msg_post( &s_quit ); - p_user->set_online(false); + p_user->msg_post( &s_quit ); + p_user->set_online(false); - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_reload.cpp b/src/mods/commands/yc_reload.cpp index 2fe7522..8b9cd0a 100644..100755 --- a/src/mods/commands/yc_reload.cpp +++ b/src/mods/commands/yc_reload.cpp @@ -1,49 +1,24 @@ -/*:* - *: File: ./src/mods/commands/yc_reload.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - - string s_msg = p_conf->get_elem("chat.msgs.reloadonlineframe") - + "<br>\n"; - - p_user->get_room()->reload_onlineframe(); - p_user->msg_post ( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + + string s_msg = p_conf->get_elem("chat.msgs.reloadonlineframe") + + "<br>\n"; + + p_user->get_room()->reload_onlineframe(); + p_user->msg_post ( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_ren.cpp b/src/mods/commands/yc_ren.cpp index 90de221..9735d8e 100644..100755 --- a/src/mods/commands/yc_ren.cpp +++ b/src/mods/commands/yc_ren.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_ren.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/user.h" #include "../../chat/room.h" @@ -31,68 +7,68 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c = (container*) v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params = (vector<string>*) c->elem[2]; // param array - - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - if ( ! params->empty() ) - { - vector<string>::iterator iter; - - string s_room; - - for ( iter = params->begin(); iter != params->end(); iter++ ) - { - s_room.append( *iter ); - if ( iter+1 != params->end() ) - s_room.append(" "); - } - - int i_max_room_len = tool::string2int( p_conf->get_elem("chat.maxlength.roomname") ); - if ( i_max_room_len < s_room.length() ) - s_room = s_room.substr(0, i_max_room_len ); - - bool b_found; - string s_room_lower = tool::to_lower(s_room); - room* p_room = p_user->get_room(); - - if ( s_room_lower != p_room->get_lowercase_name() && - NULL != p_chat->get_room( s_room_lower , b_found ) ) - { - string s_msg = "<font color=\"#" +extern "C" { + int extern_function(void *v_arg) + { + container *c = (container*) v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params = (vector<string>*) c->elem[2]; // param array + + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + if ( ! params->empty() ) + { + vector<string>::iterator iter; + + string s_room; + + for ( iter = params->begin(); iter != params->end(); iter++ ) + { + s_room.append( *iter ); + if ( iter+1 != params->end() ) + s_room.append(" "); + } + + int i_max_room_len = tool::string2int( p_conf->get_elem("chat.maxlength.roomname") ); + if ( i_max_room_len < s_room.length() ) + s_room = s_room.substr(0, i_max_room_len ); + + bool b_found; + string s_room_lower = tool::to_lower(s_room); + room* p_room = p_user->get_room(); + + if ( s_room_lower != p_room->get_lowercase_name() && + NULL != p_chat->get_room( s_room_lower , b_found ) ) + { + string s_msg = "<font color=\"#" + p_conf->get_elem("chat.html.errorcolor") - + "\">" + + "\">" + p_conf->get_elem("chat.msgs.err.roomexists") + "</font><br>\n"; - p_user->msg_post( &s_msg ); - } - else - { - string s_msg = p_timr->get_time() + " " - + p_user->get_colored_bold_name() + p_user->msg_post( &s_msg ); + } + + else + { + string s_msg = p_timr->get_time() + " " + + p_user->get_colored_bold_name() + p_conf->get_elem( "chat.msgs.userrenamesroom" ) + "<b>" + s_room + "</b><br>\n"; - p_chat->del_elem( p_room->get_lowercase_name() ); - p_room->set_name( s_room ); - p_chat->add_elem( p_room ); - p_room->msg_post( &s_msg ); - p_room->reload_onlineframe(); - } - } + p_chat->del_elem( p_room->get_lowercase_name() ); + p_room->set_name( s_room ); + p_chat->add_elem( p_room ); + p_room->msg_post( &s_msg ); + p_room->reload_onlineframe(); + } + } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_s.cpp b/src/mods/commands/yc_s.cpp index 42213ac..30a6892 100644..100755 --- a/src/mods/commands/yc_s.cpp +++ b/src/mods/commands/yc_s.cpp @@ -1,72 +1,47 @@ -/*:* - *: File: ./src/mods/commands/yc_s.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/user.h" #include "../../chat/room.h" using namespace std; -extern "C" -{ - string to_upper( string &s_msg ) - { - char* c_msg = (char*) s_msg.c_str(); - - for ( int i = 0; i < strlen( c_msg ); i++ ) - c_msg[i] = toupper( c_msg[i] ); - - return string( c_msg ); - }; - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - vector<string> *params= (vector<string>*) c->elem[2]; // param array - - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - string s_time = ""; - if ( p_conf->get_elem("chat.printalwaystime") == "true" ) - s_time = p_timr->get_time() + " "; - - string s_msg = s_time + "<i>" + p_user->get_colored_name() + " " + p_conf->get_elem("chat.msgs.scream") + " <font color=\"#" + p_user->get_col2() + "\"><b>"; - - if ( ! params->empty() ) - { - vector<string>::iterator iter = params->begin(); - for ( iter = params->begin(); iter != params->end(); iter++ ) - s_msg.append( to_upper(*iter) + " " ); - } - - s_msg.append( "</b></font></i><br>\n" ); - p_user->get_room()->msg_post( &s_msg ); - - return 0; - - } +extern "C" { + string to_upper( string &s_msg ) + { + char* c_msg = (char*) s_msg.c_str(); + + for ( int i = 0; i < strlen( c_msg ); i++ ) + c_msg[i] = toupper( c_msg[i] ); + + return string( c_msg ); + }; + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + vector<string> *params= (vector<string>*) c->elem[2]; // param array + + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + string s_time = ""; + if ( p_conf->get_elem("chat.printalwaystime") == "true" ) + s_time = p_timr->get_time() + " "; + + string s_msg = s_time + "<i>" + p_user->get_colored_name() + " " + p_conf->get_elem("chat.msgs.scream") + " <font color=\"#" + p_user->get_col2() + "\"><b>"; + + if ( ! params->empty() ) + { + vector<string>::iterator iter = params->begin(); + for ( iter = params->begin(); iter != params->end(); iter++ ) + s_msg.append( to_upper(*iter) + " " ); + } + + s_msg.append( "</b></font></i><br>\n" ); + p_user->get_room()->msg_post( &s_msg ); + + return 0; + + } } diff --git a/src/mods/commands/yc_set.cpp b/src/mods/commands/yc_set.cpp index 8d59908..a18b5e9 100644..100755 --- a/src/mods/commands/yc_set.cpp +++ b/src/mods/commands/yc_set.cpp @@ -1,124 +1,101 @@ -/*:* - *: File: ./src/mods/commands/yc_set.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../chat/room.h" #include "../../chat/user.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - - vector<string> *params = (vector<string>*) c->elem[2]; // param array - - bool b_invalid_syntax = 0; - - if ( params->size() >= 3 ) - { - string s_msg; - string s_command_name = params->at(0); - string s_option = params->at(1); - string s_newval = params->at(2); - - if ( s_option == "status" ) - { - const char* c_newval = s_newval.c_str(); - if ( isdigit( c_newval[0] ) ) - { - int i_newval = c_newval[0] - '0'; - - s_msg = p_timr->get_time() - + " " - + p_user->get_colored_bold_name() - + " " - + p_conf->get_elem("chat.msgs.setcommandstatus") - + " (" - + s_command_name + "," + s_newval + "," - + tool::int2string( p_chat->get_command_disabled(s_command_name)) - + ")<br>\n"; +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + + vector<string> *params = (vector<string>*) c->elem[2]; // param array + + bool b_invalid_syntax = 0; + + if ( params->size() >= 3 ) + { + string s_msg; + string s_command_name = params->at(0); + string s_option = params->at(1); + string s_newval = params->at(2); + + if ( s_option == "status" ) + { + const char* c_newval = s_newval.c_str(); + if ( isdigit( c_newval[0] ) ) + { + int i_newval = c_newval[0] - '0'; + + s_msg = p_timr->get_time() + + " " + + p_user->get_colored_bold_name() + + " " + + p_conf->get_elem("chat.msgs.setcommandstatus") + + " (" + + s_command_name + "," + s_newval + "," + + tool::int2string( p_chat->get_command_disabled(s_command_name)) + + ")<br>\n"; + + p_user->get_room()->msg_post(&s_msg); + p_chat->set_command_status( s_command_name, i_newval ); + } + } + else if ( s_option == "disable" ) + { + const char* c_newval = s_newval.c_str(); + if ( isdigit( c_newval[0] ) ) + { + int i_newval = c_newval[0] - '0'; + + if ( i_newval != 0 ) + i_newval = 1; - p_user->get_room()->msg_post(&s_msg); - p_chat->set_command_status( s_command_name, i_newval ); + s_newval = tool::int2string(i_newval); + + s_msg = p_timr->get_time() + + " " + + p_user->get_colored_bold_name() + + " " + + p_conf->get_elem("chat.msgs.setcommandstatus") + + " (" + + s_command_name + "," + + tool::int2string( p_chat->get_command_status(s_command_name)) + + "," + s_newval + ")<br>\n"; + + p_user->get_room()->msg_post(&s_msg); + p_chat->set_command_disabled( s_command_name, (bool)i_newval ); + } + } + + else + { + b_invalid_syntax = 1; + } + } - } - else if ( s_option == "disable" ) - { - const char* c_newval = s_newval.c_str(); - if ( isdigit( c_newval[0] ) ) + + else { - int i_newval = c_newval[0] - '0'; - - if ( i_newval != 0 ) - i_newval = 1; - - s_newval = tool::int2string(i_newval); - - s_msg = p_timr->get_time() - + " " - + p_user->get_colored_bold_name() - + " " - + p_conf->get_elem("chat.msgs.setcommandstatus") - + " (" - + s_command_name + "," - + tool::int2string( p_chat->get_command_status(s_command_name)) - + "," + s_newval + ")<br>\n"; - - p_user->get_room()->msg_post(&s_msg); - p_chat->set_command_disabled( s_command_name, (bool)i_newval ); + b_invalid_syntax = 1; + } + + if ( b_invalid_syntax ) + { + string s_msg = "<font color=\"#" + + p_conf->get_elem("chat.html.errorcolor") + + "\">" + + p_conf->get_elem("chat.msgs.err.wrongcommandusage") + + "</font><br>\n"; + p_user->msg_post( &s_msg ); } - } - else - { - b_invalid_syntax = 1; - } - - } - else - { - b_invalid_syntax = 1; - } - - if ( b_invalid_syntax ) - { - string s_msg = "<font color=\"#" - + p_conf->get_elem("chat.html.errorcolor") - + "\">" - + p_conf->get_elem("chat.msgs.err.wrongcommandusage") - + "</font><br>\n"; - p_user->msg_post( &s_msg ); - } - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_template.cpp b/src/mods/commands/yc_template.cpp index a49bb69..e0aa009 100644..100755 --- a/src/mods/commands/yc_template.cpp +++ b/src/mods/commands/yc_template.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_template.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../chat/user.h" @@ -31,19 +7,18 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*)c->elem[1]; // the corresponding user - vector<string> *params=(vector<string>*)c->elem[2]; // param array - - string *quitstring=new string("Text to send<br>"); - p_user->msg_post( quitstring ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*)c->elem[1]; // the corresponding user + vector<string> *params=(vector<string>*)c->elem[2]; // param array + + string *quitstring=new string("Text to send<br>"); + p_user->msg_post( quitstring ); + + return 0; + } } diff --git a/src/mods/commands/yc_time.cpp b/src/mods/commands/yc_time.cpp index 31198a1..c22e542 100644..100755 --- a/src/mods/commands/yc_time.cpp +++ b/src/mods/commands/yc_time.cpp @@ -1,46 +1,21 @@ -/*:* - *: File: ./src/mods/commands/yc_time.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - string s_msg = p_conf->get_elem("chat.msgs.servertime") + p_timr->get_time() + "<br>\n"; - - p_user->msg_post( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + string s_msg = p_conf->get_elem("chat.msgs.servertime") + p_timr->get_time() + "<br>\n"; + + p_user->msg_post( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_topic.cpp b/src/mods/commands/yc_topic.cpp index b2dfed5..5541dc4 100644..100755 --- a/src/mods/commands/yc_topic.cpp +++ b/src/mods/commands/yc_topic.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_topic.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../tool/tool.h" #include "../../incl.h" #include "../../chat/room.h" @@ -29,74 +5,74 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user* p_user = (user*) c->elem[1]; // the corresponding user - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - vector<string> *params = (vector<string>*) c->elem[2]; // param array - - string s_msg; - string s_topic; - string s_col; - - room* p_room = p_user->get_room(); - - if ( ! params->empty() ) - { - vector<string>::iterator iter; - - s_col = "<font color=\"" + p_user->get_col1() + "\">"; - - s_msg = p_timr->get_time() - + " " - + p_user->get_colored_bold_name() - + " " - + p_conf->get_elem("chat.msgs.topic") - + s_col; - - for ( iter = params->begin(); iter != params->end(); iter++ ) - { - s_msg.append( " " + *iter ); - s_topic.append( *iter + " " ); - } - s_msg.append( "</font>" ); - - int i_topic_length = tool::string2int(p_conf->get_elem("chat.maxlength.topic")); - if ( s_topic.length() > i_topic_length ) - { - s_topic = s_topic.substr(0, i_topic_length ); - s_topic.append(" ... "); - - string s_private_msg = "<font color=#" + p_conf->get_elem("chat.html.errorcolor") - + ">" + p_conf->get_elem( "chat.msgs.topiccut" ) + "</font><br>"; - - p_user->msg_post ( &s_private_msg ); - } - - s_topic = "( " + s_topic + ")"; - p_room->set_topic( s_topic, p_user->get_col1() ); - } - else - { - s_msg = p_timr->get_time() - + " " - + p_user->get_colored_bold_name() - + " " - + p_conf->get_elem("chat.msgs.topicdelete"); - - p_room->set_topic( "" ); - } - - s_msg.append( "<script confuage='JavaScript'>parent.online.location.reload();</script><br>\n" ); - - p_room->msg_post ( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user* p_user = (user*) c->elem[1]; // the corresponding user + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + vector<string> *params = (vector<string>*) c->elem[2]; // param array + + string s_msg; + string s_topic; + string s_col; + + room* p_room = p_user->get_room(); + + if ( ! params->empty() ) + { + vector<string>::iterator iter; + + s_col = "<font color=\"" + p_user->get_col1() + "\">"; + + s_msg = p_timr->get_time() + + " " + + p_user->get_colored_bold_name() + + " " + + p_conf->get_elem("chat.msgs.topic") + + s_col; + + for ( iter = params->begin(); iter != params->end(); iter++ ) + { + s_msg.append( " " + *iter ); + s_topic.append( *iter + " " ); + } + s_msg.append( "</font>" ); + + int i_topic_length = tool::string2int(p_conf->get_elem("chat.maxlength.topic")); + if ( s_topic.length() > i_topic_length ) + { + s_topic = s_topic.substr(0, i_topic_length ); + s_topic.append(" ... "); + + string s_private_msg = "<font color=#" + p_conf->get_elem("chat.html.errorcolor") + + ">" + p_conf->get_elem( "chat.msgs.topiccut" ) + "</font><br>"; + + p_user->msg_post ( &s_private_msg ); + } + + s_topic = "( " + s_topic + ")"; + p_room->set_topic( s_topic, p_user->get_col1() ); + } + + else + { + s_msg = p_timr->get_time() + + " " + + p_user->get_colored_bold_name() + + " " + + p_conf->get_elem("chat.msgs.topicdelete"); + + p_room->set_topic( "" ); + } + + s_msg.append( "<script confuage='JavaScript'>parent.online.location.reload();</script><br>\n" ); + + p_room->msg_post ( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_uptime.cpp b/src/mods/commands/yc_uptime.cpp index c86f440..5fe0929 100644..100755 --- a/src/mods/commands/yc_uptime.cpp +++ b/src/mods/commands/yc_uptime.cpp @@ -1,46 +1,21 @@ -/*:* - *: File: ./src/mods/commands/yc_uptime.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - - user *p_user = (user*) c->elem[1]; // the corresponding user - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; - - string s_msg = p_conf->get_elem("chat.msgs.uptime") + p_timr->get_uptime() + "<br>\n"; - - p_user->msg_post( &s_msg ); - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + + user *p_user = (user*) c->elem[1]; // the corresponding user + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + timr* p_timr = (timr*) ((dynamic_wrap*)c->elem[3])->TIMR; + + string s_msg = p_conf->get_elem("chat.msgs.uptime") + p_timr->get_uptime() + "<br>\n"; + + p_user->msg_post( &s_msg ); + + return 0; + } } diff --git a/src/mods/commands/yc_users.cpp b/src/mods/commands/yc_users.cpp index f5cf3fc..74253b7 100644..100755 --- a/src/mods/commands/yc_users.cpp +++ b/src/mods/commands/yc_users.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_users.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/chat.h" #include "../../chat/user.h" /* @@ -30,23 +6,22 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; - conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; - user *p_user = (user*)c->elem[1]; +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + chat* p_chat = (chat*) ((dynamic_wrap*)c->elem[3])->CHAT; + conf* p_conf = (conf*) ((dynamic_wrap*)c->elem[3])->CONF; + user *p_user = (user*)c->elem[1]; - string s_list; - p_chat->get_user_list(s_list); - p_user->msg_post( p_conf->get_elem("chat.msgs.userlist") + - "<br><table>" + s_list + "</table>\n"); + string s_list; + p_chat->get_user_list(s_list); + p_user->msg_post( p_conf->get_elem("chat.msgs.userlist") + + "<br><table>" + s_list + "</table>\n"); - return 0; - } + return 0; + } } diff --git a/src/mods/commands/yc_version.cpp b/src/mods/commands/yc_version.cpp index 797b6c7..d64fabd 100644..100755 --- a/src/mods/commands/yc_version.cpp +++ b/src/mods/commands/yc_version.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/commands/yc_version.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include <iostream> #include "../../msgs.h" #include "../../chat/user.h" @@ -31,17 +7,16 @@ using namespace std; -extern "C" -{ - int valid_color( string ); - - int extern_function(void *v_arg) - { - container *c=(container *)v_arg; - user *p_user = (user*)c->elem[1]; // the corresponding user - p_user->msg_post( tool::ychat_version() + "<br>\n"); +extern "C" { + int valid_color( string ); + + int extern_function(void *v_arg) + { + container *c=(container *)v_arg; + user *p_user = (user*)c->elem[1]; // the corresponding user + p_user->msg_post( tool::ychat_version() + "<br>\n"); - return 0; - } + return 0; + } } diff --git a/src/mods/html/CVS/Entries b/src/mods/html/CVS/Entries index f24016f..7b982b6 100644 --- a/src/mods/html/CVS/Entries +++ b/src/mods/html/CVS/Entries @@ -1,9 +1,9 @@ /Makefile/1.22/Mon Feb 14 18:01:22 2005// /Makefile.in/1.8/Thu Jul 8 14:39:03 2004// -/yc_admin.cpp/1.6/Wed Feb 16 21:28:55 2005// -/yc_colors.cpp/1.8/Wed Feb 16 21:28:55 2005// -/yc_help.cpp/1.11/Wed Feb 16 21:28:55 2005// -/yc_loggedin.cpp/1.2/Wed Feb 16 21:28:55 2005// -/yc_options.cpp/1.8/Wed Feb 16 21:28:55 2005// -/yc_register.cpp/1.11/Wed Feb 16 21:28:55 2005// +/yc_admin.cpp/1.5/Fri Jan 7 21:00:19 2005// +/yc_colors.cpp/1.7/Fri Jan 7 21:00:19 2005// +/yc_help.cpp/1.10/Fri Jan 7 21:00:19 2005// +/yc_loggedin.cpp/1.1/Mon Feb 14 18:01:22 2005// +/yc_options.cpp/1.7/Fri Jan 7 21:00:19 2005// +/yc_register.cpp/1.10/Fri Jan 7 21:00:19 2005// D diff --git a/src/mods/html/Makefile b/src/mods/html/Makefile index 6fc4cc5..98deaf7 100644 --- a/src/mods/html/Makefile +++ b/src/mods/html/Makefile @@ -1,4 +1,4 @@ -SRCS=yc_admin.cpp yc_colors.cpp yc_help.cpp yc_options.cpp yc_register.cpp +SRCS=yc_admin.cpp yc_colors.cpp yc_help.cpp yc_loggedin.cpp yc_options.cpp yc_register.cpp MODS=$(addprefix ../../../mods/html/, $(SRCS:.cpp=.so)) CC=g++ INCLUDES=`cat ../../includes.add` @@ -20,5 +20,6 @@ clean: ../../../mods/html/yc_admin.so: yc_admin.cpp ../../../mods/html/yc_colors.so: yc_colors.cpp ../../../mods/html/yc_help.so: yc_help.cpp +../../../mods/html/yc_loggedin.so: yc_loggedin.cpp ../../../mods/html/yc_options.so: yc_options.cpp ../../../mods/html/yc_register.so: yc_register.cpp diff --git a/src/mods/html/Makefile.in b/src/mods/html/Makefile.in index 4b7c728..30f1782 100644..100755 --- a/src/mods/html/Makefile.in +++ b/src/mods/html/Makefile.in @@ -4,12 +4,12 @@ INCLUDES=`cat ../../includes.add` CFLAGS=`cat ../cflags.add` all: mods $(MODS): + @echo -n "Compiling html module `basename $@` " @if ! test -d `dirname $@`; then mkdir -p `dirname $@`; fi @$(CC) $(CFLAGS) $(INCLUDES) -shared -s -o $@ `echo $(notdir $@) | sed s/.so/.cpp/` - @echo -n "HTML module `basename $@ | sed s/\.so// | sed s/yc_//` " @du -hc $@ | tail -n 1 | sed s/total// | sed "s/ //g" infotext: - @echo Compiling HTML modules + @echo Compiling html modules mods: infotext $(MODS) @echo "Num of html modules: " @ls ../../../mods/html/*.so | wc -l diff --git a/src/mods/html/yc_admin.cpp b/src/mods/html/yc_admin.cpp index 9201021..b6b979e 100644 --- a/src/mods/html/yc_admin.cpp +++ b/src/mods/html/yc_admin.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_admin.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" #include "../../tool/tool.h" @@ -31,66 +7,63 @@ using namespace std; -extern "C" -{ - string replace_chars(string s_string) - { - s_string = tool::replace(s_string, "<", "<"); - s_string = tool::replace(s_string, ">", ">"); - s_string = tool::replace(s_string, "\n", "<br>"); - return s_string; - } - - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - user* p_user = (user*) c->elem[2]; - conf* p_conf = (conf*) p_wrap->CONF; - string* p_content = &(*((map<string,string>*) c->elem[1]))["content"]; - - vector<string>* p_vec_keys = p_conf->get_key_vector(); - sort(p_vec_keys->begin(), p_vec_keys->end()); - vector<string>::iterator p_vec_keys_iter = p_vec_keys->begin(); - - p_content->append( "Currently are " + tool::int2string(p_vec_keys->size()) + " options available!<br><br>\n"); - p_content->append( "<table bordercolor=\"1\">\n" ); - - for( ;p_vec_keys_iter != p_vec_keys->end(); ++p_vec_keys_iter ) - { - - if ( p_vec_keys_iter->find(".descr") != string::npos ) - continue; - - p_content->append( "<tr><td>\n<font color=\"#FFFFFF\"><b>" + *p_vec_keys_iter + "\n</b></font></td></tr>\n" ); - - string s_descr = p_conf->get_elem(*p_vec_keys_iter + ".descr"); - if ( s_descr.length() - > 0 ) - { - p_content->append( "<tr><td><font color=\"#CCCCCC\">\n" ); - p_content->append( replace_chars(p_conf->get_elem(*p_vec_keys_iter + ".descr")) ); - p_content->append( "\n</font></td></tr>\n" ); - } - - p_content->append( "<tr><td>\n" ); - - // Hide some fields! - if ( p_vec_keys_iter->find(".password") - != string::npos - || p_vec_keys_iter->find("base.user") != string::npos - || p_vec_keys_iter->find(".dbname") != string::npos ) - p_content->append( "X X X X X X X X X X" ); - - else - p_content->append( replace_chars(p_conf->get_elem(*p_vec_keys_iter)) ); - - p_content->append( "<br><br></td></tr>\n" ); - } // while - - p_content->append( "</table>\n<br>\n" ); - - return 0; - } +extern "C" { + string replace_chars(string s_string) { + s_string = tool::replace(s_string, "<", "<"); + s_string = tool::replace(s_string, ">", ">"); + s_string = tool::replace(s_string, "\n", "<br>"); + return s_string; + } + + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + user* p_user = (user*) c->elem[2]; + conf* p_conf = (conf*) p_wrap->CONF; + string* p_content = &(*((map<string,string>*) c->elem[1]))["content"]; + + vector<string>* p_vec_keys = p_conf->get_key_vector(); + sort(p_vec_keys->begin(), p_vec_keys->end()); + vector<string>::iterator p_vec_keys_iter = p_vec_keys->begin(); + + + p_content->append( "Currently are " + tool::int2string(p_vec_keys->size()) + " options available!<br><br>\n"); + + p_content->append( "<table bordercolor=\"1\">\n" ); + + for( ;p_vec_keys_iter != p_vec_keys->end(); ++p_vec_keys_iter ) { + + if ( p_vec_keys_iter->find(".descr") != string::npos ) + continue; + + p_content->append( "<tr><td>\n<font color=\"#FFFFFF\"><b>" + *p_vec_keys_iter + "\n</b></font></td></tr>\n" ); + + string s_descr = p_conf->get_elem(*p_vec_keys_iter + ".descr"); + if ( s_descr.length() > 0 ) + { + p_content->append( "<tr><td><font color=\"#CCCCCC\">\n" ); + p_content->append( replace_chars(p_conf->get_elem(*p_vec_keys_iter + ".descr")) ); + p_content->append( "\n</font></td></tr>\n" ); + } + + p_content->append( "<tr><td>\n" ); + + // Hide some fields! + if ( p_vec_keys_iter->find(".password") != string::npos + || p_vec_keys_iter->find("base.user") != string::npos + || p_vec_keys_iter->find(".dbname") != string::npos ) + p_content->append( "X X X X X X X X X X" ); + + else + p_content->append( replace_chars(p_conf->get_elem(*p_vec_keys_iter)) ); + + p_content->append( "<br><br></td></tr>\n" ); + } // while + + p_content->append( "</table>\n<br>\n" ); + + return 0; + } } diff --git a/src/mods/html/yc_colors.cpp b/src/mods/html/yc_colors.cpp index 4f717ad..6d2c5ab 100644..100755 --- a/src/mods/html/yc_colors.cpp +++ b/src/mods/html/yc_colors.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_colors.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,32 +6,30 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - conf* p_conf = (conf*) p_wrap->CONF; - string* p_col1 = &(*((map<string,string>*) c->elem[1]))["col1"]; - string* p_col2 = &(*((map<string,string>*) c->elem[1]))["col2"]; - string* p_flag = &(*((map<string,string>*) c->elem[1]))["flag"]; - user* p_user = (user*) c->elem[2]; - - p_col1->erase(0); - p_col2->erase(0); - - p_col1->append( p_user->get_col1() ); - p_col2->append( p_user->get_col2() ); - - if ( *p_flag == "submit" ) - { - string* p_msgs = &(*((map<string,string>*) c->elem[1]) - )["msgs"]; - p_msgs->append( p_conf->get_elem( "chat.msgs.optionschanged" ) ); - } - - return 0; - } +extern "C" { + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + conf* p_conf = (conf*) p_wrap->CONF; + string* p_col1 = &(*((map<string,string>*) c->elem[1]))["col1"]; + string* p_col2 = &(*((map<string,string>*) c->elem[1]))["col2"]; + string* p_flag = &(*((map<string,string>*) c->elem[1]))["flag"]; + user* p_user = (user*) c->elem[2]; + + p_col1->erase(0); + p_col2->erase(0); + + p_col1->append( p_user->get_col1() ); + p_col2->append( p_user->get_col2() ); + + if ( *p_flag == "submit" ) + { + string* p_msgs = &(*((map<string,string>*) c->elem[1]))["msgs"]; + p_msgs->append( p_conf->get_elem( "chat.msgs.optionschanged" ) ); + } + + return 0; + } } diff --git a/src/mods/html/yc_help.cpp b/src/mods/html/yc_help.cpp index b7a0237..4d6db03 100644..100755 --- a/src/mods/html/yc_help.cpp +++ b/src/mods/html/yc_help.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_help.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,45 +6,43 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - user* p_user = (user*) c->elem[2]; - - modl* p_modl = (modl*) p_wrap->MODL; - conf* p_conf = (conf*) p_wrap->CONF; - chat* p_chat = (chat*) p_wrap->CHAT; - string* s_content = &(*((map<string,string>*) c->elem[1]))["content"]; - - vector<string>* p_vec_keys = p_modl->get_mod_vector(); - - sort(p_vec_keys->begin(), p_vec_keys->end()); - vector<string>::iterator p_vec_keys_iter = p_vec_keys->begin(); - - while( p_vec_keys_iter != p_vec_keys->end() ) - { - - if ( p_vec_keys_iter->find( "mods/commands/", 0 ) != string::npos ) - { - - string s_command_name = p_vec_keys_iter->substr(17); - s_command_name.erase( s_command_name.find( ".so" ) ); - - if ( !p_chat->get_command_disabled( s_command_name ) && - p_chat->get_command_status( s_command_name ) >= p_user->get_status()) - { - s_content->append( "<table bordercolor=\"1\">\n" ); - s_content->append( "<tr><td><font color=\"#FFFFFF\"><b>/" + s_command_name + "</b></font></td></tr>\n" ); - s_content->append( "<tr><td>" + p_conf->get_elem("chat.msgs.help." + s_command_name) + "</td></tr>\n" ); - s_content->append( "</table>\n<br>\n" ); +extern "C" { + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + user* p_user = (user*) c->elem[2]; + modl* p_modl = (modl*) p_wrap->MODL; + conf* p_conf = (conf*) p_wrap->CONF; + chat* p_chat = (chat*) p_wrap->CHAT; + string* s_content = &(*((map<string,string>*) c->elem[1]))["content"]; + + vector<string>* p_vec_keys = p_modl->get_mod_vector(); + + sort(p_vec_keys->begin(), p_vec_keys->end()); + vector<string>::iterator p_vec_keys_iter = p_vec_keys->begin(); + + while( p_vec_keys_iter != p_vec_keys->end() ) { + + if ( p_vec_keys_iter->find( "mods/commands/", 0 ) != string::npos ) + { + + string s_command_name = p_vec_keys_iter->substr(17); + s_command_name.erase( s_command_name.find( ".so" ) ); + + if ( !p_chat->get_command_disabled( s_command_name ) && + p_chat->get_command_status( s_command_name ) >= p_user->get_status()) + { + s_content->append( "<table bordercolor=\"1\">\n" ); + s_content->append( "<tr><td><font color=\"#FFFFFF\"><b>/" + s_command_name + "</b></font></td></tr>\n" ); + s_content->append( "<tr><td>" + p_conf->get_elem("chat.msgs.help." + s_command_name) + "</td></tr>\n" ); + s_content->append( "</table>\n<br>\n" ); + } + } + p_vec_keys_iter++; } - } - p_vec_keys_iter++; - } - return 0; - } + + return 0; + } } diff --git a/src/mods/html/yc_loggedin.cpp b/src/mods/html/yc_loggedin.cpp index 6f7d020..f8d57b1 100644..100755 --- a/src/mods/html/yc_loggedin.cpp +++ b/src/mods/html/yc_loggedin.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_loggedin.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../chat/chat.h" /* @@ -30,24 +6,23 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - chat* p_chat = (chat*) p_wrap->CHAT; - map<string,string>* p_map = (map<string,string>*) c->elem[1]; +extern "C" { + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + chat* p_chat = (chat*) p_wrap->CHAT; + map<string,string>* p_map = (map<string,string>*) c->elem[1]; - /* - string s_list; - p_chat->get_user_list(s_list); - (*p_map)["USERLIST"] = s_list; - */ +/* + string s_list; + p_chat->get_user_list(s_list); + (*p_map)["USERLIST"] = s_list; +*/ - p_chat->get_user_list((*p_map)["USERLIST"]); + p_chat->get_user_list((*p_map)["USERLIST"]); - return 0; - } + return 0; + } } diff --git a/src/mods/html/yc_options.cpp b/src/mods/html/yc_options.cpp index 71d5eef..47c3153 100644..100755 --- a/src/mods/html/yc_options.cpp +++ b/src/mods/html/yc_options.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_options.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,51 +6,50 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - conf* p_conf = (conf*) p_wrap->CONF; - string* p_flag = &(*((map<string,string>*) c->elem[1]))["flag"]; - string* p_email = &(*((map<string,string>*) c->elem[1]))["email"]; - string* p_pass = &(*((map<string,string>*) c->elem[1]))["pass"]; - string* p_newpass = &(*((map<string,string>*) c->elem[1]))["newpass"]; - string* p_newpass2 = &(*((map<string,string>*) c->elem[1]))["newpass2"]; - user* p_user = (user*) c->elem[2]; - - if ( *p_flag == "submit" ) - { - string* p_msgs = &(*((map<string,string>*) c->elem[1]) - )["msgs"]; - - // If the password has to be changed: - if ( *p_pass != "" || *p_newpass != "" || *p_newpass2 != "" ) - { - if ( p_user->get_pass() != *p_pass ) +extern "C" { + int extern_function(void *v_arg) + { + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + conf* p_conf = (conf*) p_wrap->CONF; + string* p_flag = &(*((map<string,string>*) c->elem[1]))["flag"]; + string* p_email = &(*((map<string,string>*) c->elem[1]))["email"]; + string* p_pass = &(*((map<string,string>*) c->elem[1]))["pass"]; + string* p_newpass = &(*((map<string,string>*) c->elem[1]))["newpass"]; + string* p_newpass2 = &(*((map<string,string>*) c->elem[1]))["newpass2"]; + user* p_user = (user*) c->elem[2]; + + if ( *p_flag == "submit" ) { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.changepassword" ) ); - return 0; + string* p_msgs = &(*((map<string,string>*) c->elem[1]))["msgs"]; + + // If the password has to be changed: + if ( *p_pass != "" || *p_newpass != "" || *p_newpass2 != "" ) + { + if ( p_user->get_pass() != *p_pass ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.changepassword" ) ); + return 0; + } + + if ( *p_newpass != *p_newpass2 ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.changepassword2" ) ); + return 0; + } + p_user->set_pass( *p_newpass ); + } + + p_user->set_email( *p_email ); + p_msgs->append( p_conf->get_elem( "chat.msgs.optionschanged" ) ); } - if ( *p_newpass != *p_newpass2 ) + else { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.changepassword2" ) ); - return 0; + p_email->append( p_user->get_email() ); } - p_user->set_pass( *p_newpass ); - } - - p_user->set_email( *p_email ); - p_msgs->append( p_conf->get_elem( "chat.msgs.optionschanged" ) ); - } - else - { - p_email->append( p_user->get_email() ); - } - return 0; - } + return 0; + } } diff --git a/src/mods/html/yc_register.cpp b/src/mods/html/yc_register.cpp index e39deaf..5d65b50 100644..100755 --- a/src/mods/html/yc_register.cpp +++ b/src/mods/html/yc_register.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/mods/html/yc_register.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../../incl.h" /* @@ -30,91 +6,88 @@ using namespace std; -extern "C" -{ - int extern_function(void *v_arg) - { +extern "C" { + int extern_function(void *v_arg) + { #ifdef DATABASE - container* c = (container*) v_arg; - dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; - conf* p_conf = (conf*) p_wrap->CONF; - data* p_data = (data*) p_wrap->DATA; - string* p_msgs = &(*((map<string,string>*) c->elem[1]))["INFO"]; - string* p_nick = &(*((map<string,string>*) c->elem[1]))["nick"]; - string* p_email = &(*((map<string,string>*) c->elem[1]))["email"]; - string* p_pass = &(*((map<string,string>*) c->elem[1]))["pass"]; - string* p_pass2 = &(*((map<string,string>*) c->elem[1]))["pass2"]; - string* p_request = &(*((map<string,string>*) c->elem[1]))["request"]; - user* p_user = (user*) c->elem[2]; - string s_nick = *p_nick; - - - p_user->set_name( "!" + s_nick ); - p_user->set_has_sess( false ); - *p_nick = tool::to_lower(*p_nick); - - if ( *p_pass != *p_pass2 ) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.registerpassword" ) ) - ; - } - - // prove if the nick is alphanumeric: - else if ( ! tool::is_alpha_numeric( *p_nick ) ) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.alpnum" ) ) - ; - } - - // prove if the nick is too long: - else if ( p_nick->length() > tool::string2int( p_conf->get_elem("chat.maxlength.username") - ) ) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.nicklength" ) ); - } - else if ( p_pass->length() > tool::string2int( p_conf->get_elem("chat.maxlength.password") - ) ) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.passlength" ) ); - } - else if ( p_email->length() > tool::string2int( p_conf->get_elem("chat.maxlength.emailaddress") - ) ) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.emaillength" ) ); - } - else - { - hashmap<string> result_map = p_data->select_user_data( *p_nick, "selectnick" ); - if (result_map["nick"] == *p_nick) - { - p_msgs->append( p_conf->get_elem( "chat.msgs.err.registerexists" ) ); - } - else - { - p_user->set_name( s_nick ); - p_msgs->append( p_conf->get_elem( "chat.msgs.registernick" ) ); - p_request->replace( 0, p_request->length(), p_conf->get_elem("httpd.startsite") ); - - map<string,string> map_insert = *((map<string,string>*) c->elem[1]); - map_insert["password"] = *p_pass; - map_insert["color1"] = p_conf->get_elem("chat.html.user.color1"); - map_insert["color2"] = p_conf->get_elem("chat.html.user.color2"); - map_insert["registerdate"] = tool::int2string((int)tool::unixtime()); - - p_user->set_pass( map_insert["password"] ); - p_user->set_email( map_insert["email"] ); - p_user->set_col1( map_insert["color1"] ); - p_user->set_col2( map_insert["color2"] ); - p_user->set_is_reg( 1 ); - p_user->set_status( tool::string2int(p_conf->get_elem("chat.defaultrang") ) ); - - p_data->insert_user_data( *p_nick, "registernick", map_insert ); - } - } - - return 0; -#endif + container* c = (container*) v_arg; + dynamic_wrap* p_wrap = (dynamic_wrap*) c->elem[0]; + conf* p_conf = (conf*) p_wrap->CONF; + data* p_data = (data*) p_wrap->DATA; + string* p_msgs = &(*((map<string,string>*) c->elem[1]))["INFO"]; + string* p_nick = &(*((map<string,string>*) c->elem[1]))["nick"]; + string* p_email = &(*((map<string,string>*) c->elem[1]))["email"]; + string* p_pass = &(*((map<string,string>*) c->elem[1]))["pass"]; + string* p_pass2 = &(*((map<string,string>*) c->elem[1]))["pass2"]; + string* p_request = &(*((map<string,string>*) c->elem[1]))["request"]; + user* p_user = (user*) c->elem[2]; + string s_nick = *p_nick; + + + p_user->set_name( "!" + s_nick ); + p_user->set_has_sess( false ); + *p_nick = tool::to_lower(*p_nick); + + if ( *p_pass != *p_pass2 ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.registerpassword" ) ); + } + + // prove if the nick is alphanumeric: + else if ( ! tool::is_alpha_numeric( *p_nick ) ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.alpnum" ) ); + } + + // prove if the nick is too long: + else if ( p_nick->length() > tool::string2int( p_conf->get_elem("chat.maxlength.username") ) ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.nicklength" ) ); + } - } + else if ( p_pass->length() > tool::string2int( p_conf->get_elem("chat.maxlength.password") ) ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.passlength" ) ); + } + + else if ( p_email->length() > tool::string2int( p_conf->get_elem("chat.maxlength.emailaddress") ) ) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.emaillength" ) ); + } + + else + { + map<string,string> result_map = p_data->select_user_data( *p_nick, "selectnick" ); + if (result_map["nick"] == *p_nick) + { + p_msgs->append( p_conf->get_elem( "chat.msgs.err.registerexists" ) ); + } + + else + { + p_user->set_name( s_nick ); + p_msgs->append( p_conf->get_elem( "chat.msgs.registernick" ) ); + p_request->replace( 0, p_request->length(), p_conf->get_elem("httpd.startsite") ); + + map<string,string> map_insert = *((map<string,string>*) c->elem[1]); + map_insert["password"] = *p_pass; + map_insert["color1"] = p_conf->get_elem("chat.html.user.color1"); + map_insert["color2"] = p_conf->get_elem("chat.html.user.color2"); + map_insert["registerdate"] = tool::int2string((int)tool::unixtime()); + + p_user->set_pass( map_insert["password"] ); + p_user->set_email( map_insert["email"] ); + p_user->set_col1( map_insert["color1"] ); + p_user->set_col2( map_insert["color2"] ); + p_user->set_is_reg( 1 ); + p_user->set_status( tool::string2int(p_conf->get_elem("chat.defaultrang") ) ); + + p_data->insert_user_data( *p_nick, "registernick", map_insert ); + } + } + + return 0; +#endif + } } diff --git a/src/msgs.h b/src/msgs.h index 4d90afc..1a6b659 100644..100755 --- a/src/msgs.h +++ b/src/msgs.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/msgs.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef MSGS_H #define MSGS_H @@ -60,8 +36,7 @@ #define GARROOM "Garbage: Added room " #define GARUSER "Garbage: Added user " #define GARUSE2 "Garbage: Recycle user " -#define LISTERR "Sock: Listen error " -#define LOGGINI "Logging: Init on " +#define LISTERR "Sock: Listen error " #define LOGERR1 "Logging: Could not open logfile " #define LOGERR2 "Logging: No filename specified " #define LOGINER "Chat: Login failed (password), nick: " @@ -70,37 +45,32 @@ #define LOGINE2 "Chat: Login failed (nick length), nick: " #define LOGINE3 "Chat: Login failed (room length), nick/room: " #define LOGINE4 "Chat: Login failed (guests disabled), nick: " -#define LOGINE5 "Chat: Login failed (not enough threads), nick: " #define MODULEC "Modl: Caching " #define MODULER "Modl: Requesting " #define MODUNLO "Modl: Unloading all modules " #define MODRELO "Modl: Reloading all modules " #ifdef DATABASE -#define MYSQLQU "MySQL: " -#define MYSQLQ2 "MySQL: Adding query " +#define MYSQLQU "MySQL: " +#define MYSQLQ2 "MySQL: Adding query " #define MYSQLE1 "MySQL: Error running mysql_init " #endif -#ifdef CTCSEGV -#define SIGNSEG "Signal: Received SIGSEGV" -#endif - #define NCURADM "ADMINISTRATOR's MAIN MENU" #define NCURMSG "SERVER SYSTEM MESSAGES" #define NCURSE0 "HTTP server: " #define NCURSE1 "Thread pool: " #define NCURSE2 "Data stats: " -#define NCURSE3 "Chat stats: " -#define NCURSE4 "Caching: " +#define NCURSE3 "Chat stats: " +#define NCURSE4 "Caching: " #define NEWREQU "Sock: New request " #define NEWROOM "Chat: New room " #define NEWUSER "Chat: New user " #define OFFFOUND "HTML: File not found " #define PERMSTD "Reading standard command exec permissions" -#define POOLER1 "Pool: Did not allocate all threads (" +#define POOLERR "Pool: Malloc error " #define POOLER2 "Pool: Max pool size reached (" -#define POOLFLL "Pool: Allocating new threads (" +#define POOLFLL "Pool: Allocating new thread (" #define READERR "Sock: Read error " #define REMROOM "Garbage: Removing room " #define REMUSER "Garbage: Removing user " @@ -109,16 +79,11 @@ #define SEPERAT "-----------------------" #define SESSION "Session: Count " #define SESSDMP "Session: Dump of session" -#define SESSERR "Session: Could not find session " -#define SESSEXI "Session: New TempID already exists, recalc." #define SHELLER "Shell: Could not execute command" #define SHELLEX "Shell: Executing the following command:" -#define SIGSIGV "Signal: SIGV received!" #define STATUPR "Stats: Updated rusage history" #define STATRSS "Stats: Max resident set size " #define REUROOM "Garbage: Reusing room object " -#define SOCKER1 "Sock: Can't create socket, aborting" -#define SOCKUNS "Sock: Starting hypertext transport [HTTP]" #define SOCKCLN "Sock: Initializing a client socket at " #define SOCKCON "Sock: Connecting to " #define SOCKCRT "Sock: Created socket on " @@ -126,8 +91,7 @@ #define SOCKERR "Sock: Can't create socket, trying next port " #define SOCKER2 "Sock: Unknown hostname " #define SOCKRDY "Sock: Server socket is ready " -#define SOCKCAC "Sock: Caching IP " -#define SOCKCA2 "Sock: Cleaning IP cache (" +#define SSLINIT "SSL: Initializing OpenSSL" #define TECACHE "HTML: Caching document " #define THRDSTR "Thread: Running" #define TIMERAT "Timer: User autoaway timeout " @@ -139,22 +103,20 @@ #define XMLREAD "XML: Reading " #define XMLERR "XML Error: " #define XMLER1 "XML Error: Unable to load file " -#define VERSION "0.7.9.5" -#define BRANCH "STABLE" -#define BUILDNR 3809 -#define UNAME "FreeBSD 6.0-RELEASE i386" -#define COMPOPT "Using built-in specs.; Configured with: FreeBSD/i386 system compiler; Thread model: posix; gcc version 3.4.4 [FreeBSD] 20050518; 3.4; g++" +#define VERSION "0.7.5" +#define BRANCH "RELEASE" +#define BUILDNR 3213 +#define UNAME "FreeBSD 5.3-RELEASE-p2 i386" +#define COMPOPT "Using built-in specs.; Configured with: FreeBSD/i386 system compiler; Thread model: posix; gcc version 3.4.2 [FreeBSD] 20040728; 3.4; g++" #define YCUSAGE "Usage: ./ychat {h|v}|{o confkey confvalue}\n" -#define HEADER1 "HTTP/1.1 200 OK\r\n" -#define HEADER2 "Server: yChat/" VERSION "-" BRANCH "\r\n" +#define HEADER1 "HTTP/1.0 200 OK\r\n" +#define HEADER2 "Server: yChat/" VERSION "-" BRANCH "\r\n" #define HEADER3 "Cache-control: no-cache\r\n" -#define HEADER4 "Pragma: no-cache\r\n" +#define HEADER4 "Pragma: no-cache\r\n" #define HEADER5 "Transfer-Encoding: chunked\r\n" -#define HEADER6 "Connection: keep-alive\r\n" +#define HEADER6 "Connection: keep-alive\r\n" #define HEADER7 "Content-Length: "; #define HEADER8 "Content-Type: "; -#define HEADER8b "; charset=ISO-8859-1\r\n"; -#define HEADER9 "Allow: GET\r\n"; #endif diff --git a/src/name.cpp b/src/name.cpp index 134fd11..fd9f33b 100644..100755 --- a/src/name.cpp +++ b/src/name.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/name.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef NAME_CPP #define NAME_CPP @@ -32,42 +8,42 @@ using namespace std; name::name() { - pthread_mutex_init( &mut_s_name, NULL); + pthread_mutex_init( &mut_s_name, NULL); } name::name( string s_name ) { - pthread_mutex_init( &mut_s_name, NULL); - set_name( s_name ); + pthread_mutex_init( &mut_s_name, NULL); + set_name( s_name ); } name::~name() { - pthread_mutex_destroy( &mut_s_name ); + pthread_mutex_destroy( &mut_s_name ); } string -name::get_name() +name::get_name() { - string s_ret; - pthread_mutex_lock ( &mut_s_name ); - s_ret = s_name; - pthread_mutex_unlock( &mut_s_name ); - return s_ret; + string s_ret; + pthread_mutex_lock ( &mut_s_name ); + s_ret = s_name; + pthread_mutex_unlock( &mut_s_name ); + return s_ret; } string -name::get_lowercase_name() +name::get_lowercase_name() { - return tool::to_lower( get_name() ); + return tool::to_lower( get_name() ); } void name::set_name( string s_name ) { - pthread_mutex_lock ( &mut_s_name ); - this->s_name = s_name; - pthread_mutex_unlock( &mut_s_name ); + pthread_mutex_lock ( &mut_s_name ); + this->s_name = s_name; + pthread_mutex_unlock( &mut_s_name ); } #endif diff --git a/src/name.h b/src/name.h index 26040f5..1e79c0e 100644..100755 --- a/src/name.h +++ b/src/name.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/name.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "incl.h" #ifndef NAME_H @@ -32,17 +8,17 @@ using namespace std; class name { protected: - string s_name; // object's name. - pthread_mutex_t mut_s_name; + string s_name; // object's name. + pthread_mutex_t mut_s_name; public: - virtual string get_name ( ); - virtual string get_lowercase_name ( ); - virtual void set_name ( string s_name ); + virtual string get_name ( ); + virtual string get_lowercase_name ( ); + virtual void set_name ( string s_name ); - name(); - name( string s_name ); // a standard constructor. - ~name(); + name(); + name( string s_name ); // a standard constructor. + ~name(); }; #endif diff --git a/src/ncur/menu.cpp b/src/ncur/menu.cpp index f28c4ef..3243df9 100644..100755 --- a/src/ncur/menu.cpp +++ b/src/ncur/menu.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/ncur/menu.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "menu.h" @@ -30,111 +6,113 @@ #ifndef MENU_CPP #define MENU_CPP -using namespace std; +using namespace std; menu::menu( int i_startx, int i_starty, int i_width, int i_height, char *c_header, char **choices, int i_numchoices, const chtype ch ) { - this->i_startx = i_startx; - this->i_starty = i_starty; - this->i_height = i_height; - this->i_width = i_width; - this->c_header = c_header; - this->choices = choices; - this->i_numchoices = i_numchoices; - - initialize( ch ); + this->i_startx = i_startx; + this->i_starty = i_starty; + this->i_height = i_height; + this->i_width = i_width; + this->c_header = c_header; + this->choices = choices; + this->i_numchoices = i_numchoices; + + initialize( ch ); } menu::~menu() { - /* - wborder(win, ' ', ' ', ' ',' ',' ',' ',' ',' '); - wrefresh(win); - delwin(win); - */ + /* + wborder(win, ' ', ' ', ' ',' ',' ',' ',' ',' '); + wrefresh(win); + delwin(win); + */ } void menu::initialize( const chtype ch ) { - this->i_highlight = 1; - this->i_choice = 0; + this->i_highlight = 1; + this->i_choice = 0; - win = newwin( i_height, i_width, i_starty, i_startx ); - wbkgd(win, ch); + win = newwin( i_height, i_width, i_starty, i_startx ); + wbkgd(win, ch); } void menu::display() { - int x, y, i; - - x = 2; - y = 2; + int x, y, i; - box( win, 0, 0 ); - mvwprintw( win, y++, x, "%s", c_header ); + x = 2; + y = 2; - for( i = 0; i < i_numchoices; i++ ) - { - ++y; + box( win, 0, 0 ); + mvwprintw( win, y++, x, "%s", c_header ); - if( i_highlight == i+1 ) // Highlight the current selection. - { - wattron( win, A_REVERSE); - mvwprintw( win, y, x, "%d. %s", i, choices[i]); - wattroff( win, A_REVERSE); - } else + for( i = 0; i < i_numchoices; i++ ) { - mvwprintw( win, y, x, "%d. %s", i, choices[i]); + ++y; + + if( i_highlight == i+1 ) // Highlight the current selection. + { + wattron( win, A_REVERSE); + mvwprintw( win, y, x, "%d. %s", i, choices[i]); + wattroff( win, A_REVERSE); + } + + else + { + mvwprintw( win, y, x, "%d. %s", i, choices[i]); + } } - } - wrefresh( win ); + wrefresh( win ); } void menu::start( void (*swich_case_menu_action)(int) ) { - refresh(); - bool b_flag = 1; + refresh(); + bool b_flag = 1; - while( b_flag ) - { - keypad(win, 1); - display(); - c = wgetch( win ); - - switch(c) + while( b_flag ) { - case KEY_UP: - if( i_highlight == 1 ) - i_highlight = i_numchoices; - else - --i_highlight; - break; - - case KEY_DOWN: - if( i_highlight == i_numchoices ) - i_highlight = 1; - else - ++i_highlight; - break; - - case 10: - i_choice = i_highlight; - break; - - default: - mvprintw( NCUR_MENU_CHAR_X, NCUR_MENU_CHAR_Y, "%3d %c ", c, c); - refresh(); - break; + keypad(win, 1); + display(); + c = wgetch( win ); + + switch(c) + { + case KEY_UP: + if( i_highlight == 1 ) + i_highlight = i_numchoices; + else + --i_highlight; + break; + + case KEY_DOWN: + if( i_highlight == i_numchoices ) + i_highlight = 1; + else + ++i_highlight; + break; + + case 10: + i_choice = i_highlight; + break; + + default: + mvprintw( NCUR_MENU_CHAR_X, NCUR_MENU_CHAR_Y, "%3d %c ", c, c); + refresh(); + break; + } + + // Menu action. + ( *swich_case_menu_action ) ( i_choice ); + i_choice = 0; } - - // Menu action. - ( *swich_case_menu_action ) ( i_choice ); - i_choice = 0; - } } #endif diff --git a/src/ncur/menu.h b/src/ncur/menu.h index f0dee8b..d931be3 100644..100755 --- a/src/ncur/menu.h +++ b/src/ncur/menu.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/ncur/menu.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef NCURSES @@ -36,27 +12,27 @@ using namespace std; class menu { private: - char **choices; - char *c_header; + char **choices; + char *c_header; - int i_startx, i_starty, i_width, i_height, i_highlight, i_choice, - i_numchoices, c; + int i_startx, i_starty, i_width, i_height, i_highlight, i_choice, + i_numchoices, c; - WINDOW *win; + WINDOW *win; - void initialize( const chtype ch ); + void initialize( const chtype ch ); public: - explicit menu( int i_startx, int i_starty, int i_width, int i_height, char *c_header, char **choices, int i_numchoices, const chtype ch ); - ~menu( ); + explicit menu( int i_startx, int i_starty, int i_width, int i_height, char *c_header, char **choices, int i_numchoices, const chtype ch ); + ~menu( ); - void display(); - void start( void (*swich_case_menu_action)(int) ); + void display(); + void start( void (*swich_case_menu_action)(int) ); - void activate_menu_win() - { - keypad(win, 1); - } + void activate_menu_win() + { + keypad(win, 1); + } }; #endif diff --git a/src/ncur/ncur.cpp b/src/ncur/ncur.cpp index e97823c..9da9488 100644..100755 --- a/src/ncur/ncur.cpp +++ b/src/ncur/ncur.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/ncur/ncur.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef NCUR_CPP #define NCUR_CPP @@ -30,284 +6,279 @@ #ifdef CLI #include "../cli/cli.h" #endif -#include "../sign.h" using namespace std; #ifdef NCURSES -const string GMAKE_PARAMS[] = - { "clean_base", "clean_modules", "all" - }; +const string GMAKE_PARAMS[] = { "clean_base", "clean_modules", "all" }; const int GMAKE_ELEMENTS = 3; ncur::ncur( ) { - p_messagelist = new list<char*>; - pthread_mutex_init( &mut_messages, NULL ); - pthread_mutex_init( &mut_is_ready, NULL ); - i_message_length = 45; - b_is_ready = false; + p_messagelist = new list<char*>; + pthread_mutex_init( &mut_messages, NULL ); + pthread_mutex_init( &mut_is_ready, NULL ); + i_message_length = 45; + b_is_ready = false; } ncur::~ncur() { - pthread_mutex_destroy( &mut_messages ); - pthread_mutex_destroy( &mut_is_ready ); + pthread_mutex_destroy( &mut_messages ); + pthread_mutex_destroy( &mut_is_ready ); } void ncur::start( void *p_void ) { - ncur::init_ncurses(); - - char *choices[] = { - "Unload all modules ", //<< - "Reload all modules ", //<< - //>>" ", - //>>" ", - "Clear template cache ", - "Run garbage collector ", //<< - //>>" ", - "Show max res. set size ", - "Compile changed sources ", - "Recompile all sources ", - "Show source stats ", - "Command line interface ", - //<<* + ncur::init_ncurses(); + + char *choices[] = { + "Unload all modules ", //<< + "Reload all modules ", //<< + //>>" ", + //>>" ", + "Clear template cache ", + "Run garbage collector ", //<< + //>>" ", + "Show max res. set size ", + "Compile changed sources ", + "Recompile all sources ", + "Show source stats ", + "Command line interface ", + //<<* #ifdef DATABASE - "Close DB connections ", + "Close DB connections ", #else - " ", + " ", #endif - //*>> - //>>" ", - "Shut down server" - }; + //*>> + //>>" ", + "Shut down server" + }; - p_serveroutput = newwin( 19, 49, 1, 31 ); - wbkgd(p_serveroutput, COLOR_PAIR(1)); + p_serveroutput = newwin( 19, 49, 1, 31 ); + wbkgd(p_serveroutput, COLOR_PAIR(1)); - box ( p_serveroutput, 0, 0 ); - mvwprintw( p_serveroutput, 2, 2, NCURMSG ); - wrefresh ( p_serveroutput ); + box ( p_serveroutput, 0, 0 ); + mvwprintw( p_serveroutput, 2, 2, NCURMSG ); + wrefresh ( p_serveroutput ); - print( string("yChat ") + VERSION ); + print( string("yChat ") + VERSION ); - p_menu = new menu( 1, 1, 30, 19, NCURADM, choices, 11, COLOR_PAIR(1)); + p_menu = new menu( 1, 1, 30, 19, NCURADM, choices, 11, COLOR_PAIR(1)); - mvprintw(NCUR_SERVER_HEADER_X,NCUR_SERVER_HEADER_Y, NCURSE0); - mvprintw(NCUR_POOL_HEADER_X,NCUR_POOL_HEADER_Y, NCURSE1); - mvprintw(NCUR_DATA_HEADER_X,NCUR_DATA_HEADER_Y, NCURSE2); //<< - mvprintw(NCUR_CHAT_HEADER_X,NCUR_CHAT_HEADER_Y, NCURSE3); //<< - mvprintw(NCUR_CACHED_HEADER_X,NCUR_CACHED_HEADER_Y, NCURSE4); + mvprintw(NCUR_SERVER_HEADER_X,NCUR_SERVER_HEADER_Y, NCURSE0); + mvprintw(NCUR_POOL_HEADER_X,NCUR_POOL_HEADER_Y, NCURSE1); + mvprintw(NCUR_DATA_HEADER_X,NCUR_DATA_HEADER_Y, NCURSE2); //<< + mvprintw(NCUR_CHAT_HEADER_X,NCUR_CHAT_HEADER_Y, NCURSE3); //<< + mvprintw(NCUR_CACHED_HEADER_X,NCUR_CACHED_HEADER_Y, NCURSE4); - wrap::HTML->print_cached(0); + wrap::HTML->print_cached(0); - is_ready(true); - wrap::SMAN->print_init_ncurses(); //<< - wrap::STAT->print_num_rooms(); //<< + is_ready(true); + wrap::SMAN->print_init_ncurses(); //<< + wrap::STAT->print_num_rooms(); //<< - p_menu->start( &switch_main_menu_ ); + p_menu->start( &switch_main_menu_ ); - shutdown(); + shutdown(); } void ncur::shutdown() { - ncur::close_ncurses(); + ncur::close_ncurses(); } void ncur::print( string *p_msg ) { - print( *p_msg ); + print( *p_msg ); } void ncur::print( string s_msg ) { - print( (char*)s_msg.c_str() ); + print( (char*)s_msg.c_str() ); } void ncur::print( char* c_print ) { - // Removing \n - if ( strlen(c_print) > i_message_length ) - { - string s_tmp(c_print); - print( s_tmp.substr( 0, i_message_length ) ); - print( s_tmp.substr( i_message_length, s_tmp.length()-i_message_length ) ); - return; - } - - int i; - char* c_temp = new char[i_message_length]; - memcpy( c_temp, c_print, strlen(c_print) ); + // Removing \n + if ( strlen(c_print) > i_message_length ) + { + string s_tmp(c_print); + print( s_tmp.substr( 0, i_message_length ) ); + print( s_tmp.substr( i_message_length, s_tmp.length()-i_message_length ) ); + return; + } - for ( i = strlen(c_print); i < i_message_length; ++i ) - c_temp[i] = ' '; + int i; + char* c_temp = new char[i_message_length]; + memcpy( c_temp, c_print, strlen(c_print) ); - c_temp[i] = '\0'; + for ( i = strlen(c_print); i < i_message_length; ++i ) + c_temp[i] = ' '; - pthread_mutex_lock( &mut_messages ); + c_temp[i] = '\0'; - if ( p_messagelist->size() > 12 ) - { - char* c_front = p_messagelist->front(); - p_messagelist->pop_front(); - free(c_front); - } + pthread_mutex_lock( &mut_messages ); - p_messagelist->push_back( c_temp ); + if ( p_messagelist->size() > 12 ) + { + char* c_front = p_messagelist->front(); + p_messagelist->pop_front(); + free(c_front); + } + p_messagelist->push_back( c_temp ); - if ( is_ready() ) - { - list<char*>::iterator iter; - iter = p_messagelist->begin(); - for ( i = 4; i < 18 && iter != p_messagelist->end(); ++i, ++iter ) + if ( is_ready() ) + { + list<char*>::iterator iter; + iter = p_messagelist->begin(); + + for ( i = 4; i < 18 && iter != p_messagelist->end(); ++i, ++iter ) mvwprintw( p_serveroutput, i, 2, *iter ); - wrefresh ( p_serveroutput ); - } + wrefresh ( p_serveroutput ); + } - pthread_mutex_unlock( &mut_messages ); + pthread_mutex_unlock( &mut_messages ); } void ncur::switch_main_menu_( int i_choice ) { - int i; - - if( i_choice != 0 ) - switch ( i_choice ) - { - //<<* - case 1: - wrap::MODL->unload_modules(); - mvprintw( 20,2, "Unloaded all modules "); - refresh(); - break; - case 2: - wrap::MODL->reload_modules(); - mvprintw( 20,2, "Reloaded all modules "); - refresh(); - break; - //*>> - case 3: - wrap::HTML->clear_cache(); - mvprintw( 20,2, "Cleared the template cache "); - refresh(); - break; - case 4: - //<<* - if ( ! wrap::GCOL->remove_garbage() ) - wrap::NCUR->print( GAROFFNE ); - mvprintw( 20,2, "Garbage collector activated "); - //*>> - refresh(); - break; - case 5: - mvprintw( 20,2, "Showing max resident set size in memory "); - wrap::NCUR->print( STATRSS + string("(") + tool::int2string( - wrap::STAT->get_ru_maxrss()) + string(")")); - break; - case 6: - tool::shell_command( string(GMAKE), METH_NCURSES); - break; - case 7: - for ( i = 0; i < GMAKE_ELEMENTS; i++ ) - tool::shell_command( GMAKE + GMAKE_PARAMS[i], METH_NCURSES); - break; - case 8: - tool::shell_command( string(GMAKE) + " stats", METH_NCURSES); - break; - case 9: -#ifdef CLI - - wrap::NCUR->is_ready(false); - refresh(); /* Print it on to the real screen */ - - def_prog_mode(); /* Save the tty modes */ - endwin(); /* End curses mode temporarily */ - delete new cli(); /* Start CLI mode */ - reset_prog_mode(); /* Return to the previous tty mode*/ - /* stored by def_prog_mode() */ - refresh(); /* Do refresh() to restore the */ - /* Screen contents */ - wrap::NCUR->is_ready(true); - wrap::NCUR->activate_menu_win(); + int i; + + if( i_choice != 0 ) + switch ( i_choice ) + { + //<<* + case 1: + wrap::MODL->unload_modules(); + mvprintw( 20,2, "Unloaded all modules "); + refresh(); + break; + case 2: + wrap::MODL->reload_modules(); + mvprintw( 20,2, "Reloaded all modules "); + refresh(); + break; + //*>> + case 3: + wrap::HTML->clear_cache(); + mvprintw( 20,2, "Cleared the template cache "); + refresh(); + break; + case 4: + //<<* + if ( ! wrap::GCOL->remove_garbage() ) + wrap::NCUR->print( GAROFFNE ); + mvprintw( 20,2, "Garbage collector activated "); + //*>> + refresh(); + break; + case 5: + mvprintw( 20,2, "Showing max resident set size in memory "); + wrap::NCUR->print( STATRSS + string("(") + tool::int2string( + wrap::STAT->get_ru_maxrss()) + string(")")); + break; + case 6: + tool::shell_command( string(GMAKE), METH_NCURSES); + break; + case 7: + for ( i = 0; i < GMAKE_ELEMENTS; i++ ) + tool::shell_command( GMAKE + GMAKE_PARAMS[i], METH_NCURSES); + break; + case 8: + tool::shell_command( string(GMAKE) + " stats", METH_NCURSES); + break; + case 9: +#ifdef CLI + wrap::NCUR->is_ready(false); + refresh(); /* Print it on to the real screen */ + + def_prog_mode(); /* Save the tty modes */ + endwin(); /* End curses mode temporarily */ + new cli(); /* Start CLI mode */ + reset_prog_mode(); /* Return to the previous tty mode*/ + /* stored by def_prog_mode() */ + refresh(); /* Do refresh() to restore the */ + /* Screen contents */ + wrap::NCUR->is_ready(true); + wrap::NCUR->activate_menu_win(); #else - - mvprintw( 20,2, "CLI mode has not been compiled in! "); + mvprintw( 20,2, "CLI mode has not been compiled in! "); #endif - - break; - case 10: + break; + case 10: #ifdef DATABASE - - wrap::DATA->disconnect_all_connections(); //<< + wrap::DATA->disconnect_all_connections(); //<< #endif - - break; - - case 11: // Shut down server - sign::terminate_received(0); - break; - - default: - mvprintw( 20,2, "Selection # %d not yet implemented!", i_choice-1); - wrap::NCUR->print( "Selection not yet implemented!" ); - refresh(); - break; - } + break; + + case 11: // Shut down server + if ( ! wrap::GCOL->remove_garbage() ) //<< + wrap::NCUR->print( GAROFFNE ); //<< + mvprintw( 21,2, "Good bye !"); + close_ncurses(); + exit(0); + break; + + default: + mvprintw( 20,2, "Selection # %d not yet implemented!", i_choice-1); + wrap::NCUR->print( "Selection not yet implemented!" ); + refresh(); + break; + } } void ncur::init_ncurses() { - initscr(); - start_color(); - clear(); - noecho(); - cbreak(); // Line buffering disabled. pass on everything - init_pair(1, COLOR_BLACK, COLOR_CYAN); - mvprintw( 0,2, (char*)(tool::ychat_version()).c_str()); - curs_set(0); - refresh(); + initscr(); + start_color(); + clear(); + noecho(); + cbreak(); // Line buffering disabled. pass on everything + init_pair(1, COLOR_WHITE, COLOR_BLUE); + mvprintw( 0,2, (char*)(tool::ychat_version()).c_str()); + refresh(); } void ncur::close_ncurses() { - refresh(); - clrtoeol(); - refresh(); - endwin(); + refresh(); + clrtoeol(); + refresh(); + endwin(); } void ncur::is_ready( bool b_is_ready ) { - pthread_mutex_lock( &mut_is_ready ); - this->b_is_ready = b_is_ready; - pthread_mutex_unlock( &mut_is_ready ); + pthread_mutex_lock( &mut_is_ready ); + this->b_is_ready = b_is_ready; + pthread_mutex_unlock( &mut_is_ready ); } bool ncur::is_ready() { - bool b_ret; - pthread_mutex_lock( &mut_is_ready ); - b_ret = b_is_ready; - pthread_mutex_unlock( &mut_is_ready ); - return b_ret; + bool b_ret; + pthread_mutex_lock( &mut_is_ready ); + b_ret = b_is_ready; + pthread_mutex_unlock( &mut_is_ready ); + return b_ret; } #endif diff --git a/src/ncur/ncur.h b/src/ncur/ncur.h index aa4bba3..53849d0 100644..100755 --- a/src/ncur/ncur.h +++ b/src/ncur/ncur.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/ncur/ncur.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifdef NCURSES @@ -40,35 +16,34 @@ using namespace std; class ncur : public thro { private: - friend class sign; - menu* p_menu; - WINDOW* p_serveroutput; - list<char*>* p_messagelist; // contains the messages for p_serveroutput! - int i_message_length; // the maximum length of a system message! - bool b_is_ready; // is set to TRUE if the admin interface is initialized. - static void init_ncurses(); - static void close_ncurses(); + menu* p_menu; + WINDOW* p_serveroutput; + list<char*>* p_messagelist; // contains the messages for p_serveroutput! + int i_message_length; // the maximum length of a system message! + bool b_is_ready; // is set to TRUE if the admin interface is initialized. + static void init_ncurses(); + static void close_ncurses(); - pthread_mutex_t mut_messages; - pthread_mutex_t mut_is_ready; + pthread_mutex_t mut_messages; + pthread_mutex_t mut_is_ready; public: - ncur(); - ~ncur(); - - void start( void *p_void ); - void print( char* c_print ); - void print( string s_msg ); - void print( string* p_msg ); - void is_ready( bool b_is_ready ); - bool is_ready(); - static void switch_main_menu_( int i_choice ); - void shutdown(); - - void activate_menu_win() - { - p_menu->activate_menu_win(); - } + ncur( ); // a standard constructor. + ~ncur( ); + + void start( void *p_void ); + void print( char* c_print ); + void print( string s_msg ); + void print( string* p_msg ); + void is_ready( bool b_is_ready ); + bool is_ready(); + static void switch_main_menu_( int i_choice ); + void shutdown(); + + void activate_menu_win() + { + p_menu->activate_menu_win(); + } }; #endif diff --git a/src/reqp.cpp b/src/reqp.cpp index ee455e4..8186764 100644..100755 --- a/src/reqp.cpp +++ b/src/reqp.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/reqp.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef REQP_CPP #define REQP_CPP @@ -30,14 +6,13 @@ using namespace std; -#define HEADER HEADER1 HEADER2 HEADER3 HEADER4 HEADER9 +#define HEADER HEADER1 HEADER2 HEADER3 HEADER4 #define STREAM HEADER5 HEADER6 const string reqp::s_http = HEADER; -const string reqp::s_http_stream = STREAM; -const string reqp::s_http_colength = HEADER7; -const string reqp::s_http_cotype = HEADER8; -const string reqp::s_http_cotype_add = HEADER8b; +const string reqp::s_http_stream = STREAM; +const string reqp::s_http_colength = HEADER7; +const string reqp::s_http_cotype = HEADER8; reqp::reqp( ) {} @@ -45,356 +20,373 @@ reqp::reqp( ) void reqp::get_request_parameters( string s_parameters, map<string,string>& map_params ) { - string s_tmp; - unsigned i_pos, i_pos2; + string s_tmp; + unsigned i_pos, i_pos2; - while( (i_pos = s_parameters.find("&")) != string::npos ) - { - s_tmp = s_parameters.substr(0, i_pos ); + while( (i_pos = s_parameters.find("&")) != string::npos ) + { + s_tmp = s_parameters.substr(0, i_pos ); - if ( (i_pos2 = s_tmp.find("=")) != string::npos ) - map_params[ s_tmp.substr(0, i_pos2) ] = tool::replace( s_tmp.substr( i_pos2+1 ), "\\AND", "&"); + if ( (i_pos2 = s_tmp.find("=")) != string::npos ) + map_params[ s_tmp.substr(0, i_pos2) ] = tool::replace( s_tmp.substr( i_pos2+1 ), "\\AND", "&"); - s_parameters = s_parameters.substr( i_pos + 1 ); - } + s_parameters = s_parameters.substr( i_pos + 1 ); + } - // Get the last request parameter, which does not have a "&" on the end! - if( (i_pos = s_parameters.find("=")) != string::npos ) - map_params[ s_parameters.substr(0, i_pos) ] = s_parameters.substr( i_pos+1 ); + // Get the last request parameter, which does not have a "&" on the end! + if( (i_pos = s_parameters.find("=")) != string::npos ) + map_params[ s_parameters.substr(0, i_pos) ] = s_parameters.substr( i_pos+1 ); - //map<string,string>::iterator iter; - //for ( iter = map_params.begin(); iter != map_params.end(); ++iter ) - //cout << ">>>" << iter->first << "=" << iter->second << endl; + //map<string,string>::iterator iter; + //for ( iter = map_params.begin(); iter != map_params.end(); ++iter ) + //cout << ">>>" << iter->first << "=" << iter->second << endl; } string -reqp::get_url( string s_req, map<string, string> &map_params, int& i_postpayloadoffset ) +reqp::get_url( int &i_sock, string s_req, map<string,string> &map_params ) { - unsigned i_pos, i_pos2; - string s_vars( "" ); - string s_ret; - int i_req; - - // GET request - if ( s_req.find("GET") != string::npos) - { - // Be sure that the GET request has minimum length - if ( s_req.length() > 5 ) + unsigned i_pos, i_pos2; + string s_vars( "" ); + string s_ret; + int i_req; + + // GET request + if ( s_req.find("GET") != string::npos) { + // Be sure that the GET request has minimum length + if ( s_req.length() > 5 ) + { // Get rid of "GET /" if ( (i_pos = s_req.find("\n")) == string::npos ) - i_pos = s_req.length() - 1; + i_pos = s_req.length() - 1; - s_req = s_req.substr(5, i_pos - 5); + s_req = s_req.substr(5, i_pos - 5); - // Get HTML site to be displayed + // Get HTML site to be displayed if ( (i_pos = s_req.find("?")) == string::npos ) { - if ( (i_pos2 = s_req.find(" HTTP")) != string::npos ) - s_ret = url_decode( s_req.substr(0, i_pos2)); + if ( (i_pos2 = s_req.find(" HTTP")) != string::npos ) + s_ret = url_decode( s_req.substr(0, i_pos2)); } + else { - s_ret = url_decode( s_req.substr(0, i_pos) ); - - // Get request parameters: - if ( (i_pos2 = s_req.find(" HTTP")) != string::npos ) - { - s_req = url_decode( s_req.substr(i_pos + 1, i_pos2 - i_pos - 1) ); - get_request_parameters( s_req, map_params ); - } + s_ret = url_decode( s_req.substr(0, i_pos) ); + + // Get request parameters: + if ( (i_pos2 = s_req.find(" HTTP")) != string::npos ) + { + s_req = url_decode( s_req.substr(i_pos + 1, i_pos2 - i_pos - 1) ); + get_request_parameters( s_req, map_params ); + } } + } } - } - // POST request - else - { - if ( (i_pos2 = s_req.find("HTTP")) != string::npos ) + // POST request + else { - if (i_pos2 > 13) - { - s_ret = url_decode( s_req.substr(6,i_pos2-7) ); - - //wrap::system_message(s_req); - //wrap::system_message(string("data offset=") + tool::int2string(i_postpayloadoffset)); - i_pos = s_req.find("event=",i_postpayloadoffset ); - if(i_pos != string::npos) - { - get_request_parameters( url_decode( s_req.substr(i_pos) ), map_params); - } + if ( (i_pos2 = s_req.find("HTTP")) != string::npos ) + { + if ( 13 < i_pos2 ) + { + s_ret = url_decode( s_req.substr(6,i_pos2-7) ); + + int i_len = s_ret.length(); + int i_len2 = s_req.length()-1; + + s_req = s_req.substr( i_len < i_len2 ? i_len : i_len2 ); + + if ( (i_pos = s_req.find("event=")) == string::npos) + { + char c_req[POSTBUF]; + i_len = read(i_sock, c_req, POSTBUF); + s_req = c_req; + s_req = s_req.substr(0, i_len); + + if ( (i_pos = s_req.find("event=")) != string::npos ) + get_request_parameters( url_decode( s_req.substr(i_pos) ), map_params ); + } + else + { + get_request_parameters( url_decode( s_req.substr(i_pos) ), map_params ); + } } + } } - } - #ifdef VERBOSE - wrap::system_message( REQUEST + s_ret ); + wrap::system_message( REQUEST + s_ret ); #endif - if ( s_ret.empty() ) - s_ret = wrap::CONF->get_elem( "httpd.startsite" ); - - else - s_ret = remove_dots(s_ret); + if ( s_ret.empty() ) + s_ret = wrap::CONF->get_elem( "httpd.startsite" ); - map_params["request"] = s_ret; + else + s_ret = remove_dots(s_ret); + + map_params["request"] = s_ret; - return s_ret; + return s_ret; } string -reqp::get_content_type(string &s_file) +reqp::get_content_type( string s_file ) { - string s_ext(tool::get_extension( s_file )); + string s_ext(tool::get_extension( s_file )); - if( s_ext == "" ) - s_ext = "default"; + if( s_ext == "" ) + s_ext = "default"; - return wrap::CONF->get_elem( "httpd.contenttypes." + s_ext ); + return wrap::CONF->get_elem( "httpd.contenttypes." + s_ext ); } void reqp::parse_headers( string s_req, map<string,string> &map_params ) { - int pos = s_req.find("\n"); - - if (pos != string::npos) - { - map_params["QUERY_STRING"] = tool::trim(s_req.substr(0,pos-1)); + int pos = s_req.find("\n"); - int pos2; - do + if (pos != string::npos) { - string s_line( s_req.substr(0, pos) ); - pos2 = s_line.find(":"); + map_params["QUERY_STRING"] = tool::trim(s_req.substr(0,pos-1)); - if (pos2 != string::npos && s_line.length() > pos2+1) + int pos2; + do + { + string s_line( s_req.substr(0, pos) ); + pos2 = s_line.find(":"); + + if (pos2 != string::npos && s_line.length() > pos2+1) map_params[ tool::trim(s_line.substr(0, pos2)) ] = tool::trim(s_line.substr(pos2+1)); - s_req = s_req.substr( s_line.size() + 1 ); - pos = s_req.find("\n"); - } - while( pos != string::npos); - } // if + s_req = s_req.substr( s_line.size() + 1 ); + pos = s_req.find("\n"); + } + while( pos != string::npos); + } // if } int reqp::htoi(string *p_str) { - int value, c; - c = p_str->at(0); + int value, c; + c = p_str->at(0); - if( isupper(c) ) - c = tolower(c); + if( isupper(c) ) + c = tolower(c); - value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; + value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; - c = p_str->at(1); + c = p_str->at(1); - if( isupper(c) ) - c = tolower(c); + if( isupper(c) ) + c = tolower(c); - value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; + value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; - return value; + return value; } string reqp::url_decode( string s_url ) { - string s_dest = ""; - int i_len = s_url.size(); - int i_prv = i_len - 2; - - char c; - for( int i = 0; i < i_len; ++i) - { - c = s_url.at(i); - if( c == '+' ) - { - s_dest += " "; - } - else if (c == '%' && i < i_prv) - { - string s_tmp = s_url.substr(i+1, 2); - c = (char) htoi(&s_tmp); - s_dest += c; - i += 2; - } - else + string s_dest = ""; + int i_len = s_url.size(); + int i_prv = i_len - 2; + + char c; + for( int i = 0; i < i_len; ++i) { - s_dest += c; + c = s_url.at(i); + if( c == '+' ) + { + s_dest += " "; + } + + else if (c == '%' && i < i_prv) + { + string s_tmp = s_url.substr(i+1, 2); + c = (char) htoi(&s_tmp); + s_dest += c; + i += 2; + } + + else + { + s_dest += c; + } } - } - return s_dest; + return s_dest; } string reqp::get_from_header( string s_req, string s_hdr ) { - unsigned i_pos[2]; - if ( (i_pos[0] = s_req.find( s_hdr, 0 )) == string::npos ) - return ""; + unsigned i_pos[2]; + if ( (i_pos[0] = s_req.find( s_hdr, 0 )) == string::npos ) + return ""; - if ( (i_pos[1] = s_req.find( "\n", i_pos[0]) ) == string::npos ) - return ""; + if ( (i_pos[1] = s_req.find( "\n", i_pos[0]) ) == string::npos ) + return ""; - unsigned i_len = s_hdr.length(); - return s_req.substr( i_pos[0] + i_len, i_pos[1] - i_pos[0] - i_len - 1 ); + unsigned i_len = s_hdr.length(); + return s_req.substr( i_pos[0] + i_len, i_pos[1] - i_pos[0] - i_len - 1 ); } string -reqp::parse( socketcontainer *p_sock, string s_req, map<string,string> &map_params, int &i_postpayloadoffset ) +reqp::parse( int &i_sock, string s_req, map<string,string> &map_params ) { + // store all request informations in map_params. store the url in + // map_params["request"]. + get_url( i_sock, s_req, map_params ); - // store all request informations in map_params. store the url in - // map_params["request"]. - get_url( s_req, map_params, i_postpayloadoffset ); - - parse_headers( s_req, map_params ); - string s_event( map_params["event"] ); - - map_params["content-type"] = get_content_type( map_params["request"] ); - - string s_rep( "" ); + parse_headers( s_req, map_params ); + string s_event( map_params["event"] ); - //<<* - // check the event variable. - if ( ! s_event.empty() ) - { - // login procedure. - if ( s_event == "login" ) - { - wrap::CHAT->login( map_params ); - } - else if ( s_event == "register" ) - { - user* p_user = new user; - map_params["INFO"] = ""; - run_html_mod( s_event, map_params, p_user ); - wrap::GCOL->add_user_to_garbage( p_user ); - } - else - { - sess *p_sess = wrap::SMAN->get_session( map_params["tmpid"] ); - user *p_user = NULL; + map_params["content-type"] = get_content_type( map_params["request"] ); - if( p_sess != NULL ) - { - p_user = p_sess->get_user(); - } - else - { - wrap::system_message(SESSERR); - return s_rep; - } + string s_rep( "" ); - if ( ! p_user ) - { - map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.notonline" ); - map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. - } - else + //<<* + // check the event variable. + if ( ! s_event.empty() ) { - map_params["nick"] = p_user->get_name().c_str(); - - // if a message input. - if ( s_event == "input" ) + // login procedure. + if ( s_event == "login" ) { - if ( p_user ) - { - p_user->check_restore_away(); - wrap::CHAT->post( p_user, map_params ); - } + wrap::CHAT->login( map_params ); } - // if a chat stream - else if ( s_event == "stream" ) + else if ( s_event == "register" ) { - string s_msg ( wrap::HTML->parse( map_params ) ); - p_user->msg_post( &s_msg); - wrap::SOCK->chat_stream( p_sock, p_user, map_params ); + user* p_user = new user; + map_params["INFO"] = ""; + run_html_mod( s_event, map_params, p_user ); + wrap::GCOL->add_user_to_garbage( p_user ); } - // if a request for the online list of the active room. - else if ( s_event == "online" ) + else { - wrap::HTML->online_list( p_user, map_params ); + sess *p_sess = wrap::SMAN->get_session( map_params["tmpid"] ); + user *p_user = NULL; + + if( p_sess != NULL ) + { + p_user = p_sess->get_user(); + } + + else + { + return s_rep; + } + + if ( ! p_user ) + { + map_params["INFO"] = wrap::CONF->get_elem( "chat.msgs.err.notonline" ); + map_params["request"] = wrap::CONF->get_elem( "httpd.startsite" ); // redirect to the startpage. + } + + else + { + map_params["nick"] = p_user->get_name().c_str(); + + // if a message input. + if ( s_event == "input" ) + { + if ( p_user ) + { + p_user->check_restore_away(); + wrap::CHAT->post( p_user, map_params ); + } + } + + // if a chat stream + else if ( s_event == "stream" ) + { + string s_msg ( wrap::HTML->parse( map_params ) ); + p_user->msg_post( &s_msg); + wrap::SOCK->chat_stream( i_sock, p_user, map_params ); + } + + // if a request for the online list of the active room. + else if ( s_event == "online" ) + { + wrap::HTML->online_list( p_user, map_params ); + } + + else if ( s_event != "input" ) + { + run_html_mod( s_event, map_params, p_user ); + } + } } - else //if ( s_event != "input" ) - { - run_html_mod( s_event, map_params, p_user ); - } - } + } + //*>> + + if ( wrap::CONF->get_elem("httpd.enablecgi").compare("true") == 0 && + string::npos != map_params["request"].find(".cgi") ) + { + s_rep.append( tool::shell_command( + wrap::CONF->get_elem("httpd.templatedir") + map_params["request"], + METH_RETSTRING ) ); + } + + else + { + // parse and get the requested html-template and also use + // the values stored in map_params for %%KEY%% substituations. + s_rep.append( wrap::HTML->parse( map_params ) ); } - } - //*>> - - if ( wrap::CONF->get_elem("httpd.enablecgi").compare("true") == 0 && - string::npos != map_params["request"].find(".cgi") ) - { - s_rep.append( tool::shell_command( - wrap::CONF->get_elem("httpd.templatedir") + map_params["request"], - METH_RETSTRING ) ); - } - else - { - // parse and get the requested html-template and also use - // the values stored in map_params for %%KEY%% substituations. - s_rep.append( wrap::HTML->parse( map_params ) ); - } - - // create the http header. - - string s_resp(s_http); - if ( s_event.compare("stream") == 0 ) - s_resp.append( s_http_stream ); - - s_resp.append( s_http_colength + tool::int2string(s_rep.size()) + "\r\n" + - s_http_cotype + map_params["content-type"] + - s_http_cotype_add + "\r\n" ); - - s_resp.append(s_rep); - - - // return the parsed html-template. - return s_resp; + + // create the http header. + + string s_resp(s_http); + if ( s_event.compare("stream") == 0 ) + s_resp.append( s_http_stream ); + + s_resp.append( s_http_colength + tool::int2string(s_rep.size()) + "\n" + + map_params["content-type"] + "\r\n\r\n" ); + + s_resp.append(s_rep); + + + // return the parsed html-template. + return s_resp; } //<<* -void +void reqp::run_html_mod( string s_event, map<string,string> &map_params, user* p_user ) { - container *c = new container; - - c->elem[0] = (void*) wrap::WRAP; - c->elem[1] = (void*) &map_params; - c->elem[2] = (void*) p_user; + container *c = new container; - string s_mod = wrap::CONF->get_elem("httpd.modules.htmldir") + "yc_" + s_event + ".so"; + c->elem[0] = (void*) wrap::WRAP; + c->elem[1] = (void*) &map_params; + c->elem[2] = (void*) p_user; - dynmod* p_module = wrap::MODL->get_module( s_mod, p_user->get_name() ); + string s_mod = wrap::CONF->get_elem("httpd.modules.htmldir") + "yc_" + s_event + ".so"; - if ( p_module != NULL ) - ( *( p_module->the_func ) ) ( static_cast<void*>(c) ); + dynmod* p_module = wrap::MODL->get_module( s_mod ); + + if ( p_module != NULL ) + ( *( p_module->the_func ) ) ( (void*) c ); - delete c; + delete c; } //*>> string reqp::remove_dots( string s_ret ) { - // remove ".." from the request. - unsigned i_pos; + // remove ".." from the request. + unsigned pos; - if ( (i_pos = s_ret.find( ".." )) != string::npos ) - return remove_dots(s_ret.substr(0, i_pos)); + if( (pos = s_ret.find( ".." )) != string::npos) + return s_ret.substr(0, pos); - return s_ret; + return s_ret; } #endif diff --git a/src/reqp.h b/src/reqp.h index de49262..9fec7e2 100644..100755 --- a/src/reqp.h +++ b/src/reqp.h @@ -1,66 +1,41 @@ -/*:* - *: File: ./src/reqp.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "incl.h" #ifndef REQP_H #define REQP_H -#include "maps/hashmap.h" +#include <map> using namespace std; class reqp { private: - static const string s_http; - static const string s_http_stream; - static const string s_http_colength; - static const string s_http_cotype; - static const string s_http_cotype_add; - - // returns the request url from thr client's http request header - // until the first "?" and stores all request parameter values - // ( behind "?" ) into map_params. - string get_url( string s_req, map<string,string> &map_params, int& i_postpayloadoffset ); - // returns a specific value of the client's http request header. - // ( s.t. like the User-Agent, Referer etc... ). - string get_from_header( string s_req, string s_hdr ); - - int htoi( string *p_str ); - void run_html_mod( string s_event, map<string,string> &map_params, user* p_user ); //<< - // Removes double dots ".." - string remove_dots( string s_req ); - - // Parses "event=bla?blu=bli&sadasda=asddds ..." string and stores them in the map - void get_request_parameters( string s_parameters, map<string,string>& map_params ); + static const string s_http; + static const string s_http_stream; + static const string s_http_colength; + static const string s_http_cotype; + + // returns the request url from thr client's http request header + // until the first "?" and stores all request parameter values + // ( behind "?" ) into map_params. + string get_url( int &i_sock, string s_req, map<string,string> &map_params ); + // returns a specific value of the client's http request header. + // ( s.t. like the User-Agent, Referer etc... ). + string get_from_header( string s_req, string s_hdr ); + + int htoi( string *p_str ); + void run_html_mod( string s_event, map<string,string> &map_params, user* p_user ); //<< + // Removes double dots ".." + string remove_dots( string s_req ); + + // Parses "event=bla?blu=bli&sadasda=asddds ..." string and stores them in the map + void get_request_parameters( string s_parameters, map<string,string>& map_params ); public: - reqp( ); - string parse( socketcontainer* p_sock, string s_req, map<string,string> &map_params, int &i_postpayloadoffset ); - string url_decode ( string s_url ); - string get_content_type( string& s_file ); - void parse_headers( string s_req, map<string,string> &map_params ); + reqp( ); + string parse( int &i_sock, string s_req, map<string,string> &map_params ); + string url_decode ( string s_url ); + string get_content_type( string s_file ); + void parse_headers( string s_req, map<string,string> &map_params ); }; #endif diff --git a/src/sock/CVS/Entries b/src/sock/CVS/Entries index e95afc6..4cdca42 100644 --- a/src/sock/CVS/Entries +++ b/src/sock/CVS/Entries @@ -1,3 +1,3 @@ -/sock.cpp/1.21/Wed Feb 16 21:28:55 2005// -/sock.h/1.9/Wed Feb 16 21:28:55 2005// +/sock.cpp/1.20/Mon Feb 14 17:33:09 2005// +/sock.h/1.8/Thu Feb 10 19:55:24 2005// D diff --git a/src/sock/sock.cpp b/src/sock/sock.cpp index 8a020d7..c08a3cd 100644..100755 --- a/src/sock/sock.cpp +++ b/src/sock/sock.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/sock/sock.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef SOCK_CPP #define SOCK_CPP @@ -29,515 +5,296 @@ #include <errno.h> #include <sys/types.h> #include <unistd.h> - #include "sock.h" +#include "../chat/chat.h" +#include "../chat/user.h" using namespace std; sock::sock() { - this->b_run = true; - this->i_req = 0; - this->req_parser = new reqp(); + this->b_run = true; + this->i_req = 0; + this->i_threads = 0; + this->req_parser = new reqp(); + this->thrd_pool = new pool(); #ifdef LOGGING + this->log_daemon = new logd( wrap::CONF->get_elem( "httpd.logging.accessfile" ), - this->log_daemon = new logd( wrap::CONF->get_elem( "httpd.logging.accessfile" ), - - wrap::CONF->get_elem( "httpd.logging.access_lines" ) ); + wrap::CONF->get_elem( "httpd.logging.accesslines" ) ); #endif } -int -sock::_send(socketcontainer *p_sock, const char *sz, int len) -{ - - return send( p_sock->i_sock, sz, len, 0 ); -} - -int -sock::_read(socketcontainer *p_sock, char *sz, int len) -{ - - return read( p_sock->i_sock, sz, len ); -} - -int -sock::_close(socketcontainer *p_sock) +sock::~sock() { - shutdown( p_sock->i_sock, 2 ); - close ( p_sock->i_sock ); - delete p_sock; } //<<* void -sock::chat_stream( socketcontainer *p_sock, user *p_user, map<string,string> &map_params ) +sock::chat_stream( int i_sock, user *p_user, map<string,string> &map_params ) { - string s_msg( "\n" ); - - for ( int i = 0; i < PUSHSTR; i++ ) - _send(p_sock,s_msg.c_str(), s_msg.size()); + string s_msg( "\n" ); - pthread_mutex_t mutex; - pthread_mutex_init( &mutex, NULL ); - pthread_mutex_lock( &mutex ); + for ( int i = 0; i < PUSHSTR; i++ ) + send( i_sock, s_msg.c_str(), s_msg.size(), 0 ); - do - { - s_msg = p_user->get_mess( ); + pthread_mutex_t mutex; + pthread_mutex_init( &mutex, NULL ); + pthread_mutex_lock( &mutex ); - if ( 0 > _send( p_sock, s_msg.c_str(), s_msg.size() ) ) + do { - p_user->set_online( false ); - break; - } + s_msg = p_user->get_mess( ); - pthread_cond_wait( &(p_user->cond_message), &mutex ); - } - while( p_user->get_online() ); + if ( 0 > send( i_sock, s_msg.c_str(), s_msg.size(), 0 ) ) + { + p_user->set_online( false ); + break; + } - pthread_mutex_destroy( &mutex ); + pthread_cond_wait( &(p_user->cond_message), &mutex ); + } + while( p_user->get_online() ); - // if there is still a message to send: - s_msg = p_user->get_mess( ); + pthread_mutex_destroy( &mutex ); + + // if there is still a message to send: + s_msg = p_user->get_mess( ); - if ( ! s_msg.empty() ) - _send( p_sock, s_msg.c_str(), s_msg.size()); + if ( ! s_msg.empty() ) + send( i_sock, s_msg.c_str(), s_msg.size(), 0 ); - // remove the user from its room. - string s_user( p_user->get_name() ); - string s_user_lowercase( p_user->get_lowercase_name() ); + // remove the user from its room. + string s_user( p_user->get_name() ); + string s_user_lowercase( p_user->get_lowercase_name() ); - p_user->get_room()->del_elem( s_user_lowercase ); + p_user->get_room()->del_elem( s_user_lowercase ); - // post the room that the user has left the chat. - s_msg = wrap::TIMR->get_time() + " " + // post the room that the user has left the chat. + s_msg = wrap::TIMR->get_time() + " " + p_user->get_colored_bold_name() + wrap::CONF->get_elem( "chat.msgs.userleaveschat" ) + "<br>\n"; - p_user->get_room()->msg_post( &s_msg ); - p_user->get_room()->reload_onlineframe(); + p_user->get_room()->msg_post( &s_msg ); + p_user->get_room()->reload_onlineframe(); #ifdef VERBOSE - - cout << REMUSER << s_user << endl; + cout << REMUSER << s_user << endl; #endif - wrap::GCOL->add_user_to_garbage( p_user ); + wrap::GCOL->add_user_to_garbage( p_user ); } //*>> int -sock::_make_server_socket( int i_port ) +sock::make_server_socket( int i_port ) { - size_t i_sock; - struct sockaddr_in name; - - // create the server socket. - i_sock = socket (PF_INET, SOCK_STREAM, 0); - if (i_sock < 0) - { - wrap::system_message( SOCKERR ); - - if ( ++i_port > MAXPORT ) - exit(1); - - wrap::system_message( SOCKERR ); - - return _make_server_socket( i_port ); - } - - // give the server socket a name. - name.sin_family = AF_INET; - name.sin_port = htons(i_port); - name.sin_addr.s_addr = htonl(INADDR_ANY); - int i_optval = 1; - - setsockopt( i_sock, SOL_SOCKET, SO_REUSEADDR, (char*)&i_optval, sizeof(int) ); + size_t i_sock; + struct sockaddr_in name; - if ( bind(i_sock, (struct sockaddr *) &name, sizeof (name)) < 0 ) - { - - wrap::system_message( BINDERR ); - - if ( ++i_port > MAXPORT ) - exit(1); - - wrap::system_message( string(SOCKERR) + tool::int2string(i_port) ); - - // Rerun recursive. - return _make_server_socket( i_port ); - } - - wrap::system_message( SOCKCRT + string("localhost:") + tool::int2string(i_port) ); - - i_server_port = i_port; - i_server_sock = i_sock; - - return i_sock; -} - -string -sock::read_http_line(socketcontainer *p_sock) -{ - string s_line; - int i_total = 0; - int i_read = 0; - char ch; - - do - { - i_read = _read(p_sock, &ch, sizeof(ch)); - - if(i_read <= 0) - return ""; - - s_line += ch; - i_total++; - } - while((ch != '\n') && i_total < MAXLENGTH); - - if(ch != '\n') - /* - ** the games people play - */ - return ""; - - return s_line; -} -int -sock::read_http(socketcontainer *p_sock, char *c_zbuf, int i_buflen, int &i_postpayloadoffset) -{ - /* - ** 1) Read the first line - ** 2) If GET, handle as such - ** 3) If POST, handle as such - */ - char ch; - int i_read; - int i_ret = -1; - int x,z; - - string s_content_length; - string s_cl; - string s_post_return; - string s_line = read_http_line(p_sock); - - i_postpayloadoffset = 0; - if(s_line.length() <= 0) - return -1; - - /* - ** GET yada\r\n Followed by stuff we don't care about :) heh. - ** 01234 - */ - /* - ** POST yada\r\n - ** xxxxx - ** Content-Length: NNN\n - ** \n - */ - if(s_line.substr(0,3) == "GET") - { - if(s_line.length() > i_buflen) + // create the server socket. + i_sock = socket (PF_INET, SOCK_STREAM, 0); + if (i_sock < 0) { - /* - ** Buffer overflow - */ - return -1; - } - else - { - memcpy(c_zbuf,s_line.c_str(),s_line.length()); - return s_line.length(); - } - } - - else - { - /* - ** POST yada - ** 01234 - */ - if(s_line.substr(0,4) != "POST") - return -1; - - /* - ** Get us to the Content-Length: - */ - s_post_return += s_line; - i_postpayloadoffset += s_line.length(); - - for(x=0 ;x < MAXLINES; x++) - { - s_line = read_http_line(p_sock); - s_post_return += s_line; - i_postpayloadoffset += s_line.length(); - - if (s_line.compare(0, 15, "Content-Length:")) - continue; - - // Match found on Content-Length:... process, and then break out and get us to the promised land - s_content_length = s_line.substr( 16 /*strlen("Content-Length: ")*/, - s_line.length() - 16 /*strlen("Content-Length: ")*/); + wrap::system_message( SOCKERR ); - /* - ** Content-Length: 333\n - ** 0123456789abcdefghijklmnopqrstuvwxyzAB - */ + if ( ++i_port > MAXPORT ) + exit(1); - z = 0; + wrap::system_message( SOCKERR ); - do - { - ch = s_content_length[z]; - if(isdigit(ch)) - s_cl += ch; - - z++; - - } - while(ch != '\n'); - - break; + return make_server_socket( i_port ); } - if(s_cl.length() <= 0) - return -1; - - z = atoi(s_cl.c_str()); + // give the server socket a name. + name.sin_family = AF_INET; + name.sin_port = htons(i_port); + name.sin_addr.s_addr = htonl(INADDR_ANY); + int i_optval = 1; - /* - ** If we are going to overflow the buffer just by the payload, leave - ** of, if z did not convert correctly. (should have been ok by isdigit) - */ - if(z > i_buflen || z < 0) - return -1; + setsockopt( i_sock, SOL_SOCKET, SO_REUSEADDR, (char*)&i_optval, sizeof(int) ); - /* - ** We have MAXLINES to get to the blank line separating POST data. - */ - for(x=0 ;x < MAXLINES; x++) + if ( bind(i_sock, (struct sockaddr *) &name, sizeof (name)) < 0 ) { - s_line = read_http_line(p_sock); - s_post_return += s_line; - i_postpayloadoffset += s_line.length(); - if(s_line == "\r\n") - break; - } + wrap::system_message( BINDERR ); - /* - ** funny business - */ - if(x == MAXLINES) - return -1; + if ( ++i_port > MAXPORT ) + exit(1); - for(x=0; x < z; x++) - { - if(_read(p_sock,&ch,sizeof(ch)) != 1) - return -1; + wrap::system_message( string(SOCKERR) + tool::int2string(i_port) ); - s_post_return += ch; + // Rerun recursive. + return make_server_socket( i_port ); } - if(s_post_return.length() > i_buflen) - return -1; + wrap::system_message( SOCKCRT + string("localhost:") + tool::int2string(i_port) ); + +#ifdef NCURSES + mvprintw( NCUR_PORT_X,NCUR_PORT_Y, "Port: %d ", i_port); + refresh(); +#endif - memcpy(c_zbuf,s_post_return.c_str(),s_post_return.length()); - return s_post_return.length(); - } + return i_sock; } int -sock::read_write(socketcontainer* p_sock) +sock::read_write( int* p_sock ) { - int i_postpayloadoffset; - int i_sock = p_sock->i_sock; - - char c_req[READSOCK]; + int i_sock = *p_sock; + char c_req[READSOCK]; + int i_bytes = read(i_sock, c_req, READSOCK); - memset(c_req,0,sizeof(c_req)); - - int i_bytes = read_http(p_sock, c_req, READSOCK-1,i_postpayloadoffset); - - if (i_bytes <= 0) - { - wrap::system_message( READERR ); - } + if (i_bytes <= 0) + { + wrap::system_message( READERR ); + } - else - { - // stores the request params. - map<string,string> map_params; + else + { + // stores the request params. + map<string,string> map_params; - // get the s_rep ( s_html response which will be send imediatly to the client - struct sockaddr_in client; - size_t size = sizeof(client); + // get the s_rep ( s_html response which will be send imediatly to the client + struct sockaddr_in client; + size_t size = sizeof(client); - getpeername(i_sock, (struct sockaddr *)&client, &size); +#ifdef CYGWIN + getpeername( i_sock, (struct sockaddr *)&client, (int*)&size); +#else + getpeername( i_sock, (struct sockaddr *)&client, &size); +#endif - uint32_t &s_addr = client.sin_addr.s_addr; - if ( (map_params["REMOTE_ADDR"] = get_elem(s_addr)) == "" ) - { - map_params["REMOTE_ADDR"] = string(inet_ntoa(client.sin_addr)); - set_elem(map_params["REMOTE_ADDR"], s_addr); - wrap::system_message(SOCKCAC+map_params["REMOTE_ADDR"]); - } + map_params["REMOTE_ADDR"] = inet_ntoa(client.sin_addr); + //map_params["REMOTE_PORT"] = ntohs(client.sin_port); - string s_rep = req_parser->parse(p_sock, string(c_req), map_params, i_postpayloadoffset); + string s_rep = req_parser->parse( i_sock, string( c_req ), map_params ); #ifdef LOGGING - - log_daemon->log_access(map_params); + log_daemon->log_access(map_params); #endif - // send s_rep to the client. - _send(p_sock, s_rep.c_str(), s_rep.size()); + // send s_rep to the client. + send(i_sock, s_rep.c_str(), s_rep.size(), 0); - // dont need those vals anymore. - map_params.clear(); + // dont need those vals anymore. + map_params.clear(); - _close(p_sock); - return 0; - } + shutdown( i_sock, 2 ); + close ( i_sock ); - _close(p_sock); - return 1; -} + return 0; + } -void -sock::_main_loop_init() -{ - wrap::system_message(SOCKUNS); -} + shutdown( i_sock, 2 ); + close ( i_sock ); -socketcontainer* -sock::_create_container(int &i_sock) -{ - socketcontainer* p_sock = new socketcontainer; - p_sock->i_sock = i_sock; - return p_sock; + return 1; } int sock::start() { - wrap::system_message( SOCKSRV ); - pool* p_pool = wrap::POOL; - int i_sock = i_server_sock; + wrap::system_message( SOCKSRV ); #ifdef NCURSES - - print_hits(); - p_pool->print_pool_size(); + print_hits(); + thrd_pool->print_pool_size(); #endif - int i_port = tool::string2int( wrap::CONF->get_elem( "httpd.serverport" ) ); - _main_loop_init(); - - int i; - fd_set active_fd_set, read_fd_set; - struct sockaddr_in clientname; - size_t size; - - if (listen (i_sock, 1) < 0) - { - wrap::system_message( LISTERR ); - exit( EXIT_FAILURE ); - } + int i_port = tool::string2int( wrap::CONF->get_elem( "httpd.serverport" ) ); + int i_sock, i; + fd_set active_fd_set, read_fd_set; + struct sockaddr_in clientname; + size_t size; - wrap::system_message( SOCKRDY ); - // initialize the set of active sockets. - FD_ZERO (&active_fd_set); - FD_SET (i_sock, &active_fd_set); + // create the server socket and set it up to accept connections. + i_sock = make_server_socket ( i_port ); - print_server_port(); - - while( b_run ) - { - // block until input arrives on one or more active sockets. - read_fd_set = active_fd_set; - if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) + if (listen (i_sock, 1) < 0) { - wrap::system_message( SELCERR ); - + wrap::system_message( LISTERR ); exit( EXIT_FAILURE ); } - // service all the sockets with input pending. - for ( i = 0; i < FD_SETSIZE; i++ ) - if ( FD_ISSET (i, &read_fd_set) ) - { - if ( i == i_sock ) - { - // connection request on original socket. - ++i_req; - -#ifdef NCURSES - - print_hits(); -#endif + wrap::system_message( SOCKRDY ); - int i_new_sock; - size = sizeof(clientname); - i_new_sock = accept (i_sock, (struct sockaddr *) &clientname, &size); + // initialize the set of active sockets. + FD_ZERO (&active_fd_set); + FD_SET (i_sock, &active_fd_set); -#ifdef VERBOSE - - wrap::system_message(NEWREQU - + tool::int2string(i_req) + " " - + string(inet_ntoa( clientname.sin_addr )) + ":" - + tool::int2string(ntohs ( clientname.sin_port )) - ); -#endif - - FD_SET (i_new_sock, &active_fd_set); - - } - else + while( b_run ) + { + // block until input arrives on one or more active sockets. + read_fd_set = active_fd_set; + if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) { - socketcontainer *p_sock = _create_container(i); - p_pool->run( (void*) p_sock ); - FD_CLR( i, &active_fd_set ); + wrap::system_message( SELCERR ); + + exit( EXIT_FAILURE ); } - } - } -} -void -sock::clean_ipcache() -{ - int i_ipcachesize = wrap::CONF->get_int("httpd.ipcachesize"); - int i_currentsize = size(); + // service all the sockets with input pending. + for ( i = 0; i < FD_SETSIZE; i++ ) + if ( FD_ISSET (i, &read_fd_set) ) + { + if ( i == i_sock ) + { + // connection request on original socket. + ++i_req; - if ( i_currentsize > 0 && (i_ipcachesize == 0 || i_ipcachesize <= i_currentsize) ) - { - wrap::system_message( - SOCKCA2+tool::int2string(i_currentsize)+","+tool::int2string(i_ipcachesize)+")"); #ifdef NCURSES - clear(); + print_hits(); +#endif + int i_new_sock; + size = sizeof(clientname); +#ifdef CYGWIN + i_new_sock = accept (i_sock, (struct sockaddr *) &clientname, (int*)&size); +#else + i_new_sock = accept (i_sock, (struct sockaddr *) &clientname, &size); #endif - } -} -#ifdef NCURSES -void -sock::print_server_port() { - mvprintw( NCUR_PORT_X,NCUR_PORT_Y, "Port: %d ", i_server_port); - refresh(); + if (i_new_sock < 0) + { + wrap::system_message( ACCPERR ); + close(i_new_sock); + } + + else + { +#ifdef VERBOSE + wrap::system_message(NEWREQU + + tool::int2string(i_req) + " " + + string(inet_ntoa( clientname.sin_addr )) + ":" + + tool::int2string(ntohs ( clientname.sin_port )) + ); +#endif + FD_SET (i_new_sock, &active_fd_set); + } + } + + else + { + int *p_sock = new int; + *p_sock = i; + thrd_pool->run( (void*) p_sock ); + FD_CLR( i, &active_fd_set ); + } + } + } } +#ifdef NCURSES void sock::print_hits() { - if ( wrap::NCUR->is_ready() ) - { - mvprintw( NCUR_HITS_X,NCUR_HITS_Y, "Hits: %d ", i_req); - refresh(); - } + if ( wrap::NCUR->is_ready() ) + { + mvprintw( NCUR_HITS_X,NCUR_HITS_Y, "Hits: %d ", i_req); + refresh(); + } } #endif diff --git a/src/sock/sock.h b/src/sock/sock.h index 914c366..7023be5 100644..100755 --- a/src/sock/sock.h +++ b/src/sock/sock.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/sock/sock.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef SOCK_H @@ -34,79 +10,59 @@ #include <netinet/in.h> #include <netdb.h> +#include "../thrd/pool.h" #include "../reqp.h" #include "../chat/user.h" - -#include "../thrd/pool.h" -#include "../maps/shashmap.h" - #ifdef LOGGING #include "../logd.h" #endif using namespace std; -class sock : public shashmap - < string, uint32_t, self_hash<uint32_t>, equals_allocator<uint32_t> > +class sock { -protected: -#ifdef LOGGING +private: + // total number of server requests. + unsigned long long i_req; - logd *log_daemon; // the log daemon + bool b_run; // true while socket manager is running. + reqp *req_parser; // parses the http requests from clients. + pool *thrd_pool; // the thread pool. +#ifdef LOGGING + logd *log_daemon; // the log daemon #endif + char *c_buffer; // char buffer! + int i_threads; // total amount of threads inside the thread pool. - int i_server_sock; - int i_server_port; - - // total number of server requests. - unsigned long long i_req; - bool b_run; // true while socket manager is running. - reqp *req_parser; // parses the http requests from clients. - char *c_buffer; // char buffer! - pthread_mutex_t mut_hits; - - static string inet_ntoa_callback(void* p_void); + pthread_mutex_t mut_hits; public: - // creates a server socket. - int read_http(socketcontainer *p_sock, char *c_zbuf, int i_buflen, int &i_payloadoffset); - string read_http_line(socketcontainer *p_sock); + // creates a server socket. + int make_server_socket( int i_port ); - // small inline methods: - bool get_server_() const - { - return b_run; - } - // small inline methods: - bool get_run() const - { - return b_run; - } - bool set_run( bool b_run ) - { - this->b_run = b_run; - } + // small inline methods: + bool get_run() const + { + return b_run; + } - sock(); + bool set_run( bool b_run ) + { + this->b_run = b_run; + } - int read_write( socketcontainer* p_sock ); + sock( ); + ~sock( ); - int start(); - void clean_ipcache(); + int read_write( int* p_sock ); + int start(); - // the chat stream there all the chat messages will sent through. - void chat_stream( socketcontainer* p_sock, user* p_user, map<string,string> &map_params ); //<< - virtual inline int _send(socketcontainer *p_sock, const char *sz, int len); - virtual inline int _read(socketcontainer *p_sock, char *sz, int len); - virtual inline int _close(socketcontainer *p_sock); - virtual void _main_loop_init(); - virtual inline socketcontainer* _create_container(int& i_sock); - virtual int _make_server_socket(int i_port); + // the chat stream there all the chat messages will sent through. + static void chat_stream( int i_sock, user* p_user, map<string,string> &map_params ); //<< #ifdef NCURSES - void print_server_port(); - void print_hits(); + void print_hits(); #endif - }; + #endif diff --git a/src/stats.cpp b/src/stats.cpp index 7fba04d..95d8ab1 100644 --- a/src/stats.cpp +++ b/src/stats.cpp @@ -145,4 +145,5 @@ stats::print_num_rooms() } #endif //*>> + #endif diff --git a/src/stats.h b/src/stats.h index 647f504..608232e 100644 --- a/src/stats.h +++ b/src/stats.h @@ -4,11 +4,11 @@ #define STATS_H #include "tool/tool.h" + #include <stdio.h> #include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> -#include <iostream> using namespace std; diff --git a/src/thrd/pool.cpp b/src/thrd/pool.cpp index a27beac..ef7b0a3 100644..100755 --- a/src/thrd/pool.cpp +++ b/src/thrd/pool.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/thrd/pool.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef POOL_CPP #define POOL_CPP @@ -29,153 +5,220 @@ using namespace std; +int pool::i_thrd_used = 0; + pool::pool() { - pthread_mutex_init(&mut_threads, 0); - pthread_mutex_init(&mut_queue_tasks, 0); - pthread_mutex_init(&mut_num_avail_threads, 0); - pthread_cond_init(&cond_new_task, 0); - - i_num_total_threads = 0; - i_num_avail_threads = tool::string2int( wrap::CONF->get_elem( "httpd.thread.initpoolsize" ) ); - increase_pool(i_num_avail_threads); + i_thrd_pool_size = tool::string2int( wrap::CONF->get_elem( "httpd.thread.initpoolsize" ) ); + i_thrd_pool_queue = tool::string2int( wrap::CONF->get_elem( "httpd.thread.queuesize" ) ); + tpool_init( &thread_pool, i_thrd_pool_size, i_thrd_pool_queue); } -pool::~pool() +void +pool::tpool_init( tpool_t *tpoolp, int num_worker_threads, int max_queue_size) { - pthread_mutex_lock(&mut_queue_tasks); - while (!queue_tasks.empty()) - { - delete queue_tasks.front(); - queue_tasks.pop(); - } - pthread_mutex_unlock(&mut_queue_tasks); - - pthread_mutex_destroy(&mut_threads); - pthread_mutex_destroy(&mut_queue_tasks); - pthread_mutex_destroy(&mut_num_avail_threads); - pthread_cond_destroy(&cond_new_task); -} + int i, rtn; + tpool_t tpool; -int -pool::increase_pool(int i_num) -{ - wrap::system_message(POOLFLL + tool::int2string(i_num) +","+tool::int2string(i_num_total_threads)+")"); - int i_max_pool_size = tool::string2int( wrap::CONF->get_elem( "httpd.thread.maxpoolsize" ) ); + // allocate a pool data structure + if (( tpool = (tpool_t) malloc( sizeof( struct tpool ) ) ) == 0 ) + { + wrap::system_message( POOLERR ); + exit(-1); + } + + // initialize th fields + tpool->num_threads = num_worker_threads; + tpool->max_queue_size = max_queue_size; - for ( int i = 0; i < i_num; ++i ) - { - if ( i_max_pool_size != 0 && i_num_total_threads >= i_max_pool_size ) + if ( ( tpool->threads = (pthread_t*) malloc( sizeof(pthread_t)*num_worker_threads ) ) == 0 ) { - wrap::system_message(POOLER2+tool::int2string(i_max_pool_size)+")"); - wrap::system_message(POOLER1+tool::int2string(i)+")"); - return i; + wrap::system_message( POOLERR ); + exit(-1); } - ++i_num_total_threads; - pthread_t p_pthread; - pthread_create(&p_pthread, 0, wait_for_task, (void*) this ); - } + tpool->cur_queue_size = 0; + tpool->queue_head = 0; + tpool->queue_tail = 0; - return i_num; -} + if ( ( rtn = pthread_mutex_init( &(tpool->queue_lock), 0 ) ) != 0 ) + { + string s_err( "pthread_mutex_init " ); + s_err.append( strerror( rtn ) ); -void -pool::add_task( void(*p_func)(void*), void* p_void ) -{ - pthread_mutex_lock(&mut_queue_tasks); - queue_tasks.push(new task(p_func, p_void)); - pthread_mutex_unlock(&mut_queue_tasks); + wrap::system_message( s_err ); + + exit(-1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_not_empty), 0 ) ) != 0 ) + { + string s_err( "pthread_cond_init (1): " ); + s_err.append( strerror( rtn ) ); - pthread_cond_signal(&cond_new_task); + wrap::system_message( s_err ); + exit(1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_not_full), 0 ) ) != 0 ) + { + string s_err( "pthread_cond_init (2): " ); + s_err.append( strerror( rtn ) ); + + wrap::system_message( s_err ); + + exit(1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_empty), 0 ) ) != 0 ) + { + string s_err( "pthread_mutex_init " ); + s_err.append( strerror( rtn ) ); + + wrap::system_message( s_err ); + + exit(1); + } + + // create threads + for ( i = 0; i < num_worker_threads; ++i ) + pthread_create( &(tpool->threads[i]) , 0, tpool_thread, (void*)tpool ); + + *tpoolp = tpool; } void* -pool::wait_for_task( void* p_void ) +pool::tpool_thread( void* p_void ) { - pool* p_pool = static_cast<pool*>(p_void); + tpool_t tpool = (tpool_t) p_void; + tpool_work_t *my_workp; - for (;;) - { + for( pthread_mutex_lock( &(tpool->queue_lock) );; + pthread_mutex_lock( &(tpool->queue_lock) ), --i_thrd_used ) + { #ifdef NCURSES - p_pool->print_pool_size(); + print_threads(i_thrd_used); #endif - pthread_mutex_lock(&p_pool->mut_threads); - pthread_cond_wait(&p_pool->cond_new_task, &p_pool->mut_threads); + while (tpool->cur_queue_size == 0) + pthread_cond_wait( &(tpool->queue_not_empty), &(tpool->queue_lock) ); - pthread_mutex_lock(&p_pool->mut_num_avail_threads); - if ( --p_pool->i_num_avail_threads < 5 ) - { - int i_size = 9 - p_pool->i_num_avail_threads; - i_size = p_pool->increase_pool(i_size); - p_pool->i_num_avail_threads += i_size; - } - pthread_mutex_unlock(&p_pool->mut_num_avail_threads); + my_workp = tpool->queue_head; + tpool->cur_queue_size--; - pthread_mutex_lock(&p_pool->mut_queue_tasks); - task* p_task = p_pool->queue_tasks.front(); - p_pool->queue_tasks.pop(); - pthread_mutex_unlock(&p_pool->mut_queue_tasks); + if ( tpool->cur_queue_size == 0) + tpool->queue_head = tpool->queue_tail = 0; - pthread_mutex_unlock(&p_pool->mut_threads); + else + tpool->queue_head = my_workp->next; - (*(p_task->p_func))(p_task->p_void); - delete p_task; + if ( tpool->cur_queue_size == ( tpool->max_queue_size - 1 ) ) + pthread_cond_signal( &(tpool->queue_not_full) ); - pthread_mutex_lock(&p_pool->mut_num_avail_threads); - p_pool->i_num_avail_threads++; - pthread_mutex_unlock(&p_pool->mut_num_avail_threads); - } + if ( tpool->cur_queue_size == 0 ) + pthread_cond_signal( &(tpool->queue_empty) ); - return 0; -} + pthread_mutex_unlock( &(tpool->queue_lock) ); -void -pool::run(void* p_void) -{ - add_task(run_func, p_void); + (*(my_workp->routine))(my_workp->p_void); + + free(my_workp); + } } -void -pool::run_func(void *p_void) +void pool::run_func( void *p_void ) { - socketcontainer* p_sock = static_cast<socketcontainer*>(p_void); - wrap::SOCK->read_write(p_sock); + int* p_sock = (int*)p_void; + wrap::SOCK->read_write( p_sock ); + delete p_sock; } -bool -pool::allow_user_login() +int +pool::tpool_add_work( tpool_t tpool, void(*routine)(void*), void* p_void ) /// { - pthread_mutex_lock(&mut_num_avail_threads); - if ( i_num_avail_threads < 2 ) - { - int i_max_pool_size = tool::string2int( wrap::CONF->get_elem( "httpd.thread.maxpoolsize" ) ); - if ( i_max_pool_size != 0 && i_max_pool_size == i_num_total_threads ) + tpool_work_t *workp; + pthread_mutex_lock( &(tpool->queue_lock) ); + + if ( ++i_thrd_used == tpool->num_threads ) { - pthread_mutex_unlock(&mut_num_avail_threads); - return false; + int i_max_pool_size = tool::string2int( wrap::CONF->get_elem( "httpd.thread.maxpoolsize" ) ); + if ( i_max_pool_size != 0 && i_thrd_used > i_max_pool_size ) + { + wrap::system_message(POOLER2+tool::int2string(i_thrd_used)+")"); + } + + else + { + int i_size = tpool->num_threads + 1; + + wrap::system_message(POOLFLL+tool::int2string(i_size)+")"); + + tpool->threads = (pthread_t*)realloc((void*)tpool->threads, sizeof(pthread_t)*tpool->num_threads); + + for ( int i = tpool->num_threads; i < i_size; ++i ) + pthread_create( &(tpool->threads[i]) , 0, tpool_thread, (void*)tpool ); + + i_thrd_pool_size = tpool->num_threads = i_size; +#ifdef NCURSES + print_pool_size(); +#endif + } } - } - pthread_mutex_unlock(&mut_num_avail_threads); - return true; +#ifdef NCURSES + print_threads(i_thrd_used); +#endif + + while (tpool->cur_queue_size == tpool->max_queue_size) + pthread_cond_wait( &(tpool->queue_not_full), &(tpool->queue_lock) ); + + // allocate work structure: + workp = (tpool_work_t*) malloc( sizeof( tpool_work_t ) ); + + workp->routine = routine; + workp->p_void = p_void; + workp->next = 0; + + if (tpool->cur_queue_size == 0 ) + { + tpool->queue_tail = tpool->queue_head = workp; + } + + else + { + (tpool->queue_tail)->next = workp; + tpool->queue_tail = workp; + } + + tpool->cur_queue_size++; + pthread_cond_signal( &tpool->queue_not_empty ); + pthread_mutex_unlock( &(tpool->queue_lock) ); + + return 0; } #ifdef NCURSES void +pool::print_threads(int i_thrd_used) +{ + if ( wrap::NCUR->is_ready() ) + { + mvprintw( NCUR_POOL_RUNNING_X,NCUR_POOL_RUNNING_Y, "In use: %d ", i_thrd_used); + refresh(); + } +} + +void pool::print_pool_size() { - if ( wrap::NCUR->is_ready() ) - { - pthread_mutex_lock(&mut_num_avail_threads); - mvprintw( NCUR_POOL_WAIT_X,NCUR_POOL_WAIT_Y, "Wait/Tot: %d/%d ", i_num_avail_threads, i_num_total_threads); - mvprintw( NCUR_POOL_RUNNING_X,NCUR_POOL_RUNNING_Y, "Running: %d ", i_num_total_threads-i_num_avail_threads); - pthread_mutex_unlock(&mut_num_avail_threads); - refresh(); - } + if ( wrap::NCUR->is_ready() ) + { + mvprintw( NCUR_POOL_SIZE_X,NCUR_POOL_SIZE_Y, "Size: %d %d", i_thrd_pool_size, i_thrd_pool_queue ); + refresh(); + } } #endif + #endif diff --git a/src/thrd/pool.h b/src/thrd/pool.h index 0fe97f3..cbd1e83 100644..100755 --- a/src/thrd/pool.h +++ b/src/thrd/pool.h @@ -1,78 +1,64 @@ -/*:* - *: File: ./src/thrd/pool.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef POOL_H #define POOL_H -#include <queue> - using namespace std; class pool { private: - friend class thro; + static int i_thrd_used; - struct task - { - void(*p_func)(void*); - void *p_void; + typedef struct tpool_work { + void (*routine)(void*); /// + void *p_void; + struct tpool_work *next; + } + tpool_work_t; - task(void(*p_func)(void*), void *p_void) + typedef struct tpool { - this->p_func = p_func; - this->p_void = p_void; - } - }; + // pool characteristics: + int num_threads; + int max_queue_size; + + // pool state + pthread_t *threads; + int cur_queue_size; - pthread_mutex_t mut_threads; - pthread_mutex_t mut_queue_tasks; - pthread_mutex_t mut_num_avail_threads; - pthread_cond_t cond_new_task; + tpool_work_t *queue_head; + tpool_work_t *queue_tail; - int i_num_avail_threads; - int i_num_total_threads; + pthread_mutex_t queue_lock; + pthread_cond_t queue_not_empty; + pthread_cond_t queue_not_full; + pthread_cond_t queue_empty; + } + *tpool_t; + + int i_thrd_pool_size; + int i_thrd_pool_queue; - queue<task*> queue_tasks; + tpool_t thread_pool; - int increase_pool(int i_num); - void add_task( void(*p_func)(void*), void* p_void ); - static void* wait_for_task(void *p_void); - static void run_func(void *p_void); + void tpool_init( tpool_t *tpoolp, int num_worker_threads, int max_queue_size); + int tpool_add_work( tpool_t tpool, void(*routine)(void*), void* p_void ); + static void* tpool_thread( void *p_void); + static void run_func( void *p_void ); public: - pool(); - ~pool(); + pool(); - void run(void* p_void); - bool allow_user_login(); + // inline (speed)! + void run( void *p_void ) + { + tpool_add_work( thread_pool, run_func, p_void ); + } #ifdef NCURSES - - void print_pool_size(); + void print_pool_size(); + static void print_threads(int i_thrd_used); #endif }; diff --git a/src/thrd/thro.cpp b/src/thrd/thro.cpp index 04372b3..739ba0e 100644 --- a/src/thrd/thro.cpp +++ b/src/thrd/thro.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/thrd/thro.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef THRO_CPP #define THRO_CPP @@ -30,38 +6,39 @@ using namespace std; thro::thro() -{} +{ +} thro::~thro() -{} +{ +} void thro::run() { - void *p_void; - run( p_void ); + void *p_void; + run( p_void ); } void thro::run( void *p_void ) { - elem.p_thro = this; - elem.p_void = p_void; - //wrap::POOL->add_task(start_, &elem); - pthread_create( &pthread, NULL, start_, &elem ); + elem.p_thro = this; + elem.p_void = p_void; + pthread_create( &pthread, NULL, start_, &elem ); } void* thro::start_( void *p_void ) { - elements *e = (elements*) p_void; - e->p_thro->start( e->p_void ); + elements *e = (elements*) p_void; + e->p_thro->start( e->p_void ); } void thro::start( void *p_void ) { - wrap::system_message( THRDSTR ); + wrap::system_message( THRDSTR ); } #endif diff --git a/src/thrd/thro.h b/src/thrd/thro.h index 76e5a51..9ad1e3e 100644 --- a/src/thrd/thro.h +++ b/src/thrd/thro.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/thrd/thro.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef THRO_H @@ -32,23 +8,21 @@ using namespace std; class thro { private: - pthread_t pthread; + pthread_t pthread; - struct elements - { - thro *p_thro; - void *p_void; - } - elem; + struct elements { + thro *p_thro; + void *p_void; + } elem; - static void *start_( void *p_void ); + static void* start_( void *p_void ); public: - thro( ); - ~thro( ); - void run(); - void run( void *p_void ); - virtual void start( void *p_void ); + thro( ); + ~thro( ); + void run(); + void run( void *p_void ); + virtual void start( void *p_void ); }; #endif diff --git a/src/time/timo.cpp b/src/time/timo.cpp index 210431b..d00bafe 100644..100755 --- a/src/time/timo.cpp +++ b/src/time/timo.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/time/timo.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef TIMO_CPP #define TIMO_CPP @@ -31,32 +7,32 @@ using namespace std; timo::timo() { - pthread_mutex_init( &mut_t_time, NULL ); + pthread_mutex_init( &mut_t_time, NULL ); } timo::~timo() { - pthread_mutex_destroy( &mut_t_time ); + pthread_mutex_destroy( &mut_t_time ); } double timo::get_last_activity( ) { - double d_ret; + double d_ret; - pthread_mutex_lock ( &mut_t_time ); - d_ret = wrap::TIMR->get_time_diff( t_time ); - pthread_mutex_unlock( &mut_t_time ); + pthread_mutex_lock ( &mut_t_time ); + d_ret = wrap::TIMR->get_time_diff( t_time ); + pthread_mutex_unlock( &mut_t_time ); - return d_ret; + return d_ret; } void timo::renew_timeout( ) { - pthread_mutex_lock ( &mut_t_time ); - time( &t_time ); - pthread_mutex_unlock( &mut_t_time ); + pthread_mutex_lock ( &mut_t_time ); + time( &t_time ); + pthread_mutex_unlock( &mut_t_time ); } #endif diff --git a/src/time/timo.h b/src/time/timo.h index b48f5eb..4eaecf8 100644..100755 --- a/src/time/timo.h +++ b/src/time/timo.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/time/timo.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef TIMO_H @@ -32,15 +8,15 @@ using namespace std; class timo // timeout class { protected: - time_t t_time; // last activity time. - pthread_mutex_t mut_t_time; + time_t t_time; // last activity time. + pthread_mutex_t mut_t_time; public: - timo( ); - ~timo( ); + timo( ); + ~timo( ); - double get_last_activity(); - void renew_timeout(); + double get_last_activity(); + void renew_timeout(); }; #endif diff --git a/src/time/timr.cpp b/src/time/timr.cpp index c9c82ee..12b5972 100644..100755 --- a/src/time/timr.cpp +++ b/src/time/timr.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/time/timr.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef TIMR_CPP #define TIMR_CPP @@ -39,7 +15,7 @@ timr::timr() pthread_mutex_init( &mut_s_uptime, NULL); pthread_mutex_init( &mut_i_offset, NULL); - i_time_offset = tool::string2int( wrap::CONF->get_elem("chat.timeoffset") ); + i_time_offset = tool::string2int( wrap::CONF->get_elem("chat.timeoffset") ); wrap::system_message( TIMEROF + tool::int2string( i_time_offset ) ); s_time = "00:00:00"; @@ -56,58 +32,56 @@ timr::~timr() bool timr::get_timer_active() const { - return b_timer_active; + return b_timer_active; } int -timr::get_offset() +timr::get_offset() { - pthread_mutex_lock ( &mut_i_offset ); - int i_ret_val = i_time_offset; - pthread_mutex_unlock( &mut_i_offset ); - return i_ret_val; + pthread_mutex_lock ( &mut_i_offset ); + int i_ret_val = i_time_offset; + pthread_mutex_unlock( &mut_i_offset ); + return i_ret_val; } void timr::start( void *v_ptr ) { - wrap::system_message( TIMERTH ); + wrap::system_message( TIMERTH ); #ifdef NCURSES - - print_time( ); + print_time( ); #endif - time_t clock_start; - time_t clock_now; + time_t clock_start; + time_t clock_now; - time( &clock_start ); - tm time_start = *localtime( &clock_start ); - tm time_now; + time( &clock_start ); + tm time_start = *localtime( &clock_start ); + tm time_now; - while ( get_timer_active() ) - { - // sleep a second! - usleep( 1000000 ); + while ( get_timer_active() ) + { + // sleep a second! + usleep( 1000000 ); - // get the current time! - time( &clock_now ); + // get the current time! + time( &clock_now ); - time_now = *localtime( &clock_now ); + time_now = *localtime( &clock_now ); - // set the current time && the current ychat uptime! - set_time( difftime( clock_now, clock_start ), - time_now.tm_sec, time_now.tm_min, time_now.tm_hour ); + // set the current time && the current ychat uptime! + set_time( difftime( clock_now, clock_start ), + time_now.tm_sec, time_now.tm_min, time_now.tm_hour ); #ifdef NCURSES - - if (wrap::NCUR->is_ready()) + if (wrap::NCUR->is_ready()) print_time( ); -#endif +#endif - // run every minute: - if ( time_now.tm_sec == 0 ) - { + // run every minute: + if ( time_now.tm_sec == 0 ) + { #ifdef SERVMSG cout << TIMERUP << get_uptime() << endl; #endif @@ -119,44 +93,43 @@ timr::start( void *v_ptr ) wrap::CHAT->check_timeout( p_timeout_settings ); delete p_timeout_settings; - string s_ping = "<!-- PING! //-->\n"; + string s_ping = "<!-- PING! //-->\n"; wrap::CHAT->msg_post( &s_ping ); #ifdef DATABASE // Disconnecting idle database conenction wrap::DATA->check_data_con_timeout(); #endif - //*>> - // Run every ten minutes: + //*>> + + // run every ten minutes: if ( time_now.tm_min % 10 == 0 ) { - - wrap::SOCK->clean_ipcache(); - // Run every hour - if ( time_now.tm_min % 60 == 0 ) - { - wrap::GCOL->remove_garbage(); //<< - - // Run every day - if (time_now.tm_min == 0 || time_now.tm_min == 60 ) - if (time_now.tm_hour == 0 || time_now.tm_hour == 24) - wrap::STAT->update_rusage_history(); - } + // run every hour + if ( time_now.tm_hour % 60 == 0 ) + { + wrap::GCOL->remove_garbage(); //<< + + // run every day + if (time_now.tm_min == 0 || time_now.tm_min == 60 ) + if (time_now.tm_hour == 0 || time_now.tm_hour == 24) + wrap::STAT->update_rusage_history(); + } } + } } - } } #ifdef NCURSES void timr::print_time( ) { - if ( !wrap::NCUR->is_ready() ) - return; + if ( !wrap::NCUR->is_ready() ) + return; - mvprintw( NCUR_TIME_X, NCUR_TIME_Y, "Time: %s ", get_time().c_str()); - mvprintw( NCUR_UPTIME_X, NCUR_UPTIME_Y, "Uptime: %s ", get_uptime().c_str()); - refresh(); + mvprintw( NCUR_TIME_X, NCUR_TIME_Y, "Time: %s ", get_time().c_str()); + mvprintw( NCUR_UPTIME_X, NCUR_UPTIME_Y, "Uptime: %s ", get_uptime().c_str()); + refresh(); } #endif @@ -164,55 +137,55 @@ void timr::set_time( double d_uptime, int i_cur_seconds, int i_cur_minutes, int i_cur_hours ) { - int i_hours = (int) d_uptime / 3600; - int i_minutes = (int) d_uptime / 60; - - while ( i_minutes >= 60 ) - i_minutes -= 60; + int i_hours = (int) d_uptime / 3600; + int i_minutes = (int) d_uptime / 60; - while ( d_uptime >= 60 ) - d_uptime -= 60; + while ( i_minutes >= 60 ) + i_minutes -= 60; - // Calculate offset time - i_cur_hours += get_offset(); + while ( d_uptime >= 60 ) + d_uptime -= 60; - for ( int i = 24-i_cur_hours; i < 0; i = 24-i_cur_hours ) - i_cur_hours =- i; + // Calculate offset time + i_cur_hours += get_offset(); - if (i_cur_hours == 24) - i_cur_hours = 0; + for ( int i = 24-i_cur_hours; i < 0; i = 24-i_cur_hours ) + i_cur_hours =- i; - pthread_mutex_lock ( &mut_s_time ); - s_time = add_zero_to_front( tool::int2string( i_cur_hours ) ) + ":" + - add_zero_to_front( tool::int2string( i_cur_minutes ) ) + ":" + - add_zero_to_front( tool::int2string( i_cur_seconds ) ); - pthread_mutex_unlock( &mut_s_time ); + if (i_cur_hours == 24) + i_cur_hours = 0; + + pthread_mutex_lock ( &mut_s_time ); + s_time = add_zero_to_front( tool::int2string( i_cur_hours ) ) + ":" + + add_zero_to_front( tool::int2string( i_cur_minutes ) ) + ":" + + add_zero_to_front( tool::int2string( i_cur_seconds ) ); + pthread_mutex_unlock( &mut_s_time ); - pthread_mutex_lock ( &mut_s_uptime ); - s_uptime = add_zero_to_front( tool::int2string( i_hours ) ) + ":" + - add_zero_to_front( tool::int2string( i_minutes ) ) + ":" + - add_zero_to_front( tool::int2string( (int) d_uptime ) ); - pthread_mutex_unlock( &mut_s_uptime ); + pthread_mutex_lock ( &mut_s_uptime ); + s_uptime = add_zero_to_front( tool::int2string( i_hours ) ) + ":" + + add_zero_to_front( tool::int2string( i_minutes ) ) + ":" + + add_zero_to_front( tool::int2string( (int) d_uptime ) ); + pthread_mutex_unlock( &mut_s_uptime ); } string timr::add_zero_to_front( string s_time ) { - if ( s_time.length() == 1 ) - { - string s_new = "0" + s_time; - return s_new; - } + if ( s_time.length() == 1 ) + { + string s_new = "0" + s_time; + return s_new; + } - return s_time; + return s_time; } double timr::get_time_diff( time_t &clock_diff ) { - time_t clock_now; - time( &clock_now ); + time_t clock_now; + time( &clock_now ); - return difftime(clock_now, clock_diff); + return difftime(clock_now, clock_diff); } #endif diff --git a/src/time/timr.h b/src/time/timr.h index d04394b..46234b3 100644..100755 --- a/src/time/timr.h +++ b/src/time/timr.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/time/timr.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef TIMR_H @@ -36,53 +12,52 @@ using namespace std; class timr : public thro { private: - bool b_timer_active; - int i_time_offset; - string s_uptime; - string s_time; - - pthread_mutex_t mut_s_time; - pthread_mutex_t mut_s_uptime; - pthread_mutex_t mut_i_offset; - + bool b_timer_active; + int i_time_offset; + string s_uptime; + string s_time; + + pthread_mutex_t mut_s_time; + pthread_mutex_t mut_s_uptime; + pthread_mutex_t mut_i_offset; + public: - timr(); - ~timr(); + timr(); + ~timr(); - bool get_timer_active() const; - void start( void *v_ptr ); + bool get_timer_active() const; + void start( void *v_ptr ); #ifdef NCURSES - - void print_time(); + void print_time(); #endif - void set_time( double d_uptime, int i_cur_seconds, int i_cur_minutes, int i_cur_hours ); - string add_zero_to_front( string s_time ); - - // inline for dynamic module access! - string - get_time( ) - { - string s_ret; - pthread_mutex_lock ( &mut_s_time ); - s_ret = this->s_time; - pthread_mutex_unlock( &mut_s_time ); - return s_ret; - } - - string - get_uptime( ) - { - string s_ret; - pthread_mutex_lock ( &mut_s_uptime ); - s_ret = this->s_uptime; - pthread_mutex_unlock( &mut_s_uptime ); - return s_ret; - } - - int get_offset(); - double get_time_diff( time_t &clock_diff ); + void set_time( double d_uptime, int i_cur_seconds, int i_cur_minutes, int i_cur_hours ); + string add_zero_to_front( string s_time ); + + // inline for dynamic module access! + string + get_time( ) + { + string s_ret; + pthread_mutex_lock ( &mut_s_time ); + s_ret = this->s_time; + pthread_mutex_unlock( &mut_s_time ); + return s_ret; + } + + string + get_uptime( ) + { + string s_ret; + pthread_mutex_lock ( &mut_s_uptime ); + s_ret = this->s_uptime; + pthread_mutex_unlock( &mut_s_uptime ); + return s_ret; + } + + int get_offset(); + double get_time_diff( time_t &clock_diff ); }; #endif diff --git a/src/tool/dir.cpp b/src/tool/dir.cpp index e91f227..ae48d5f 100644 --- a/src/tool/dir.cpp +++ b/src/tool/dir.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/tool/dir.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef DIR_CPP #define DIR_CPP @@ -31,60 +7,60 @@ using namespace std; dir::dir() { - b_open = false; + b_open = false; } dir::~dir() { - vec_dir.clear(); - close_dir(); + vec_dir.clear(); + close_dir(); } bool dir::open_dir( char *c_dir ) { - string s_dir( c_dir ); - return open_dir( s_dir ); + string s_dir( c_dir ); + return open_dir( s_dir ); } bool dir::open_dir( string &s_dir ) { - if ( b_open ) - return false; + if ( b_open ) + return false; - p_d = opendir( s_dir.c_str() ); + p_d = opendir( s_dir.c_str() ); - if ( p_d == NULL ) - return false; // Could not open dir. + if ( p_d == NULL ) + return false; // Could not open dir. - b_open = true; + b_open = true; - return true; // Could open dir with success. + return true; // Could open dir with success. } void dir::close_dir() { - if ( b_open && p_d != NULL ) - { - closedir( p_d ); - b_open = false; - } + if ( b_open && p_d != NULL ) + { + closedir( p_d ); + b_open = false; + } } void dir::read_dir() { - if ( p_d != NULL ) - while( p_ep = readdir( p_d ) ) - vec_dir.push_back( string( p_ep->d_name ) ); + if ( p_d != NULL ) + while( p_ep = readdir( p_d ) ) + vec_dir.push_back( string( p_ep->d_name ) ); } -vector<string> +vector<string> dir::get_dir_vec() { - return vec_dir; + return vec_dir; } #endif diff --git a/src/tool/dir.h b/src/tool/dir.h index f77839e..22ec510 100644 --- a/src/tool/dir.h +++ b/src/tool/dir.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/tool/dir.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef DIR_H #define DIR_H @@ -40,20 +16,20 @@ using namespace std; class dir { private: - bool b_open; - DIR *p_d; - struct dirent *p_ep; - vector<string> vec_dir; + bool b_open; + DIR *p_d; + struct dirent *p_ep; + vector<string> vec_dir; public: - dir(); - ~dir(); - - bool open_dir( char *c_dir ); - bool open_dir( string &s_dir ); - void close_dir(); - void read_dir(); - vector<string> get_dir_vec(); + dir(); + ~dir(); + + bool open_dir( char *c_dir ); + bool open_dir( string &s_dir ); + void close_dir(); + void read_dir(); + vector<string> get_dir_vec(); }; #endif diff --git a/src/tool/tool.cpp b/src/tool/tool.cpp index 8a470cd..dec9bdb 100644 --- a/src/tool/tool.cpp +++ b/src/tool/tool.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/tool/tool.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef TOOL_CPP #define TOOL_CPP @@ -38,136 +14,135 @@ bool tool::is_alpha_numeric( string &s_digit ) { - const char *p_digit = s_digit.c_str(); - int i_len = strlen( p_digit ); + const char *p_digit = s_digit.c_str(); + int i_len = strlen( p_digit ); - for( int i=0; i<i_len; i++ ) - { - if ( ! isalnum( *p_digit ) ) - return false; - p_digit++; - } + for( int i=0; i<i_len; i++ ) + { + if ( ! isalnum( *p_digit ) ) + return false; + p_digit++; + } - return true; + return true; } string tool::int2string( int i_int ) { - char buf[64]; - sprintf(buf, "%d", i_int); - return buf; + char buf[64]; + sprintf(buf, "%d", i_int); + return buf; } long tool::unixtime() { - time_t clock; - return (long) time( &clock ); + time_t clock; + return (long) time( &clock ); } int tool::string2int( string s_digit ) { - const char *p_digit = s_digit.c_str(); - int i_res = 0; - - // Convert each digit char and add into result. - while (*p_digit >= '0' && *p_digit <='9') - { - i_res = (i_res * 10) + (*p_digit - '0'); - p_digit++; - } - - // Check that there were no non-digits at end. - if (*p_digit != 0) - { - return -1; - } - - return i_res; + const char *p_digit = s_digit.c_str(); + int i_res = 0; + + // Convert each digit char and add into result. + while (*p_digit >= '0' && *p_digit <='9') + { + i_res = (i_res * 10) + (*p_digit - '0'); + p_digit++; + } + + // Check that there were no non-digits at end. + if (*p_digit != 0) + { + return -1; + } + + return i_res; } string tool::to_lower( string s_str ) { - string s_tmp(""); + string s_tmp(""); - for( int i = 0; i < s_str.size() ;i++ ) - s_tmp = s_tmp + (char) tolower( s_str.at(i) ); + for( int i = 0; i < s_str.size() ;i++ ) + s_tmp = s_tmp + (char) tolower( s_str.at(i) ); - return s_tmp; + return s_tmp; } void tool::strip_html( string *p_str) { - int i_pos; - - if( (i_pos=p_str->find("<", 0)) == string::npos ) - return; - - while(true) - { - p_str->replace(i_pos, 1, "<"); + int i_pos; - if( (i_pos = p_str->find("<", 0)) == string::npos ) + if( (i_pos=p_str->find("<", 0)) == string::npos ) return; - } + + while(true) + { + p_str->replace(i_pos, 1, "<"); + + if( (i_pos = p_str->find("<", 0)) == string::npos ) + return; + } } string tool::ychat_version() { - return "yChat " + string(VERSION) - + "-" + string(BRANCH) - + " Build " + int2string(BUILDNR); + return "yChat " + string(VERSION) + + "-" + string(BRANCH) + + " Build " + int2string(BUILDNR); } list<string> -tool::split_string(string s_string, string s_split) -{ - list<string> list_ret; - unsigned i_pos, i_len = s_split.length(); +tool::split_string(string s_string, string s_split) { + list<string> list_ret; + unsigned i_pos, i_len = s_split.length(); - while ( (i_pos = s_string.find(s_split)) != string::npos ) - { - list_ret.push_back( s_string.substr(0, i_pos) ); - s_string = s_string.substr( i_pos + i_len ); - } + while ( (i_pos = s_string.find(s_split)) != string::npos ) + { + list_ret.push_back( s_string.substr(0, i_pos) ); + s_string = s_string.substr( i_pos + i_len ); + } - list_ret.push_back( s_string ); + list_ret.push_back( s_string ); - return list_ret; + return list_ret; } string tool::trim( string s_str ) { - if( s_str.empty() ) - return s_str; + if( s_str.empty() ) + return s_str; - char c_cur = s_str[0]; - int i_pos = 0; + char c_cur = s_str[0]; + int i_pos = 0; - // left trim - while ( c_cur == ' '|| c_cur == '\n' || c_cur == '\r' ) - { - s_str.erase(i_pos,1); - c_cur = s_str[++i_pos]; - } + // left trim + while ( c_cur == ' '|| c_cur == '\n' || c_cur == '\r' ) + { + s_str.erase(i_pos,1); + c_cur = s_str[++i_pos]; + } - // right trim - i_pos = s_str.size(); - c_cur = s_str[s_str.size()]; + // right trim + i_pos = s_str.size(); + c_cur = s_str[s_str.size()]; - while ( c_cur == ' ' || c_cur == '\n' || c_cur == '\0' || c_cur == '\r' ) - { - s_str.erase(i_pos, 1); - c_cur = s_str[--i_pos]; - } + while ( c_cur == ' ' || c_cur == '\n' || c_cur == '\0' || c_cur == '\r' ) + { + s_str.erase(i_pos, 1); + c_cur = s_str[--i_pos]; + } - return s_str; + return s_str; } char* @@ -175,8 +150,7 @@ tool::clean_char( char* c_str ) { // Ralf: for ( char* c_pos = c_str; *c_pos != '\0'; ++c_pos ) - if ( iscntrl(*c_pos) ) - *c_pos = ' '; + if ( iscntrl(*c_pos) ) *c_pos = ' '; return c_str; } @@ -184,80 +158,80 @@ tool::clean_char( char* c_str ) string tool::replace( string s_string, string s_search, string s_replace ) { - unsigned i_pos[2]; + unsigned i_pos[2]; - for ( i_pos[0] = s_string.find( s_search ); - i_pos[0] != string::npos; - i_pos[0] = s_string.find( s_search, i_pos[1] ) ) - { - s_string.replace( i_pos[0], s_search.length(), s_replace ); - i_pos[1] = i_pos[0] + s_replace.length(); - } + for ( i_pos[0] = s_string.find( s_search ); + i_pos[0] != string::npos; + i_pos[0] = s_string.find( s_search, i_pos[1] ) ) + { + s_string.replace( i_pos[0], s_search.length(), s_replace ); + i_pos[1] = i_pos[0] + s_replace.length(); + } - return s_string; + return s_string; } string tool::get_extension( string s_file ) { - int i_pos = s_file.find_last_of("."); + int i_pos = s_file.find_last_of("."); - if( i_pos != string::npos ) - { - string s_ext = s_file.substr(i_pos+1, s_file.size()-i_pos-1 ); - for( int i = 0; i < s_ext.size(); ++i ) - s_ext[i] = tolower(s_ext[i]); + if( i_pos != string::npos ) + { + string s_ext = s_file.substr(i_pos+1, s_file.size()-i_pos-1 ); + for( int i = 0; i < s_ext.size(); ++i ) + s_ext[i] = tolower(s_ext[i]); - return to_lower(s_ext); - } + return to_lower(s_ext); + } - return ""; + return ""; } char* tool::int2char( int i_int ) { - char *buf = new char[64]; - sprintf(buf, "%d", i_int); - return buf; + char *buf = new char[64]; + sprintf(buf, "%d", i_int); + return buf; } string tool::shell_command( string s_command, method m_method ) { - FILE *file; - char buf[READBUF]; - char *c_pos; - string s_ret = ""; - - wrap::system_message(SHELLEX); - wrap::system_message(s_command); - - if( (file=popen(s_command.c_str(), "r")) == NULL ) - { - wrap::system_message( SHELLER ); - } - else - { - while(true) + FILE *file; + char buf[READBUF]; + char *c_pos; + string s_ret = ""; + + wrap::system_message(SHELLEX); + wrap::system_message(s_command); + + if( (file=popen(s_command.c_str(), "r")) == NULL ) { + wrap::system_message( SHELLER ); + } + + else + { + while(true) + { if(fgets(buf, READBUF, file) == NULL) - break; - - switch (m_method) - { - case METH_NCURSES: - wrap::system_message( clean_char(buf) ); - break; - default: - s_ret.append("\n" + string(buf)); + break; + + switch (m_method) { + case METH_NCURSES: + wrap::system_message( clean_char(buf) ); + break; + default: + s_ret.append("\n" + string(buf)); } // switch - } + } - pclose(file); - } + pclose(file); + } - return s_ret; + return s_ret; } #endif diff --git a/src/tool/tool.h b/src/tool/tool.h index e293e5e..b296514 100644 --- a/src/tool/tool.h +++ b/src/tool/tool.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/tool/tool.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef TOOL_H #define TOOL_H @@ -34,20 +10,20 @@ using namespace std; class tool { public: - static list<string> split_string(string s_string, string s_split); - static bool is_alpha_numeric( string &s_digit ); - static char* int2char( int i_int ); - static char* clean_char( char* c_str); - static string trim( string s_str ); - static string replace( string s_string, string s_search, string s_replace ); - static string int2string( int i_int ); - static long unixtime(); - static int string2int( string s_digit ); - static string get_extension( string s_file ); - static string to_lower( string s_str ); - static void strip_html( string *p_str ); - static string shell_command( string s_command, method m_method ); - static string ychat_version(); + static list<string> split_string(string s_string, string s_split); + static bool is_alpha_numeric( string &s_digit ); + static char* int2char( int i_int ); + static char* clean_char( char* c_str); + static string trim( string s_str ); + static string replace( string s_string, string s_search, string s_replace ); + static string int2string( int i_int ); + static long unixtime(); + static int string2int( string s_digit ); + static string get_extension( string s_file ); + static string to_lower( string s_str ); + static void strip_html( string *p_str ); + static string shell_command( string s_command, method m_method ); + static string ychat_version(); }; #endif diff --git a/src/wrap.cpp b/src/wrap.cpp index 3120b70..a0e1443 100644..100755 --- a/src/wrap.cpp +++ b/src/wrap.cpp @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/wrap.cpp - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef WRAP_CPP #define WRAP_CPP @@ -30,140 +6,39 @@ using namespace std; //<<* -chat* wrap::CHAT = NULL; +chat* wrap::CHAT; #ifdef DATABASE -data* wrap::DATA = NULL; +data* wrap::DATA; #endif -gcol* wrap::GCOL = NULL; -sman* wrap::SMAN = NULL; -modl* wrap::MODL = NULL; +gcol* wrap::GCOL; +sman* wrap::SMAN; +modl* wrap::MODL; //*>> -conf* wrap::CONF = NULL; -html* wrap::HTML = NULL; +conf* wrap::CONF; +html* wrap::HTML; #ifdef LOGGING -logd* wrap::LOGD = NULL; +logd* wrap::LOGD; #endif #ifdef NCURSES -ncur* wrap::NCUR = NULL; +ncur* wrap::NCUR; #endif -sock* wrap::SOCK = NULL; -stats* wrap::STAT = NULL; -timr* wrap::TIMR = NULL; -pool* wrap::POOL = NULL; -dynamic_wrap* wrap::WRAP = NULL; +sock* wrap::SOCK; +stats* wrap::STAT; +timr* wrap::TIMR; +dynamic_wrap* wrap::WRAP; void wrap::system_message( string s_message ) { #ifdef NCURSES - if(NCUR) - { - NCUR->print( s_message ); - } - - else - { - cout << s_message << endl; - } + wrap::NCUR->print( s_message ); #endif - #ifdef SERVMSG - cout << s_message << endl; + cout << s_message << endl; #endif - #ifdef LOGGING - - LOGD->log_simple_line( s_message + "\n" ); + wrap::LOGD->log_simple_line( s_message + "\n" ); #endif } - -void -wrap::init_wrapper(map<string,string>* p_main_loop_params) -{ - // Init the dynamic wrapper (is needed to pass all wrapped objects through a single pointer). - WRAP = new dynamic_wrap; - - // Init the config manager. - WRAP->CONF = CONF = new conf( CONFILE, p_main_loop_params ); - delete p_main_loop_params, - - // Init the statistic manager. - WRAP->STAT = STAT = new stats; - - // Init the html-template manager. - WRAP->HTML = HTML = new html; - -#ifdef LOGGING - // Init the system message logd - WRAP->LOGD = LOGD = new logd( CONF->get_elem("httpd.logging.systemfile"), - CONF->get_elem("httpd.logging.systemlines") ); -#endif - - //<<* - // Init the session manager. - WRAP->SMAN = SMAN = new sman; - //*>> - // Init the socket manager. - int i_port = tool::string2int( wrap::CONF->get_elem( "httpd.serverport" ) ); - - WRAP->SOCK = SOCK = new sock; - - // create the server socket and set it up to accept connections. - if(SOCK->_make_server_socket ( i_port ) <= 0) - { - system_message(SOCKER1); - exit(-1); - } - -#ifdef NCURSES - - WRAP->NCUR = NCUR = new ncur; // init the ncurses admin interface. - NCUR->run(); // run the thread - - // Wait until ncurses interface has been initialized. - do - { - usleep(1000); - } - while ( ! NCUR->is_ready() ); - - HTML->print_cached(0); -#else -#ifdef CLI - - cli* p_cli = new cli; - p_cli->run(); -#endif -#endif - - // Init the thread pool - WRAP->POOL = POOL = new pool; - - //<<* - // Init the chat manager. - WRAP->CHAT = CHAT = new chat; - //*>> - - // Init the system timer. - WRAP->TIMR = TIMR = new timr; - - //<<* - // Init the module-loader manager. - WRAP->MODL = MODL = new modl; - - // Init the garbage collector - WRAP->GCOL = GCOL = new gcol; - - // Init the data manager. -#ifdef DATABASE - - WRAP->DATA = DATA = new data; -#endif - //*>> - - // Run threads - TIMR->run(); -} - #endif diff --git a/src/wrap.h b/src/wrap.h index 2b9d1b5..214227e 100644..100755 --- a/src/wrap.h +++ b/src/wrap.h @@ -1,38 +1,7 @@ -/*:* - *: File: ./src/wrap.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.7.9.5-RELEASE - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #ifndef WRAP_H #define WRAP_H #include "incl.h" - - -struct socketcontainer -{ - int i_sock; -}; - #ifdef DATABASE #include "data/data.h" #endif @@ -46,109 +15,82 @@ struct socketcontainer //<<* #include "modl.h" //*>> - #ifdef NCURSES #include "ncur/ncur.h" -#else -#ifdef CLI -#include "cli/cli.h" #endif -#endif - #include "chat/sman.h" - #include "sock/sock.h" -#include "monitor/stats.h" +#include "stats.h" #include "time/timr.h" -#include "thrd/pool.h" - using namespace std; - -class dynamic_wrap +class dynamic_wrap { -public: - //<<* - chat* CHAT; + public: + //<<* + chat* CHAT; #ifdef DATABASE - - data* DATA; + data* DATA; #endif + gcol* GCOL; + sman* SMAN; + modl* MODL; + //*>> - gcol* GCOL; - sman* SMAN; - modl* MODL; - //*>> - - conf* CONF; - html* HTML; + conf* CONF; + html* HTML; #ifdef LOGGING - - logd* LOGD; + logd* LOGD; #endif #ifdef NCURSES - - ncur* NCUR; + ncur* NCUR; #endif - - sock* SOCK; - stats* STAT; - timr* TIMR; - pool* POOL; + sock* SOCK; + stats* STAT; + timr* TIMR; }; class wrap { public: - static void system_message( char* c_message ) - { - wrap::system_message( string(c_message) ); - } + static void system_message( char* c_message ) + { + wrap::system_message( string(c_message) ); + } - static void system_message( string* p_message ) - { - wrap::system_message( *p_message ); - } + static void system_message( string* p_message ) + { + wrap::system_message( *p_message ); + } - static void system_message( string s_message ); + static void system_message( string s_message ); - static void init_wrapper(map<string,string>* p_main_loop_params); - - //<<* - static chat* CHAT; + //<<* + static chat* CHAT; #ifdef DATABASE - - static data* DATA; + static data* DATA; #endif - - static gcol* GCOL; - static sman* SMAN; + static gcol* GCOL; + static sman* SMAN; #ifdef IRCBOT - - static ybot* YBOT; + static ybot* YBOT; #endif + static modl* MODL; + //*>> - static modl* MODL; - //*>> - - static conf* CONF; - static html* HTML; + static conf* CONF; + static html* HTML; #ifdef LOGGING - - static logd* LOGD; + static logd* LOGD; #endif #ifdef NCURSES - - static ncur* NCUR; + static ncur* NCUR; #endif - - static sock* SOCK; - static stats* STAT; - static timr* TIMR; - static pool* POOL; - static dynamic_wrap* WRAP; + static sock* SOCK; + static stats* STAT; + static timr* TIMR; + static dynamic_wrap* WRAP; }; - #endif |
